op_switch_char broken for rope strings after JSRopeString layout rewrite
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2019-03-05  Saam barati  <sbarati@apple.com>
2
3         op_switch_char broken for rope strings after JSRopeString layout rewrite
4         https://bugs.webkit.org/show_bug.cgi?id=195339
5         <rdar://problem/48592545>
6
7         Reviewed by Yusuke Suzuki.
8
9         When we did the JSString rewrite, we accidentally broke LLInt's switch_char
10         for rope strings. That change made it so that we always go to the slow path
11         for ropes. That's wrong. The slow path should only be taken when the rope
12         is of length 1. For lengths other than 1, we need to fall through to the
13         default case. This patch fixes this.
14
15         * llint/LowLevelInterpreter32_64.asm:
16         * llint/LowLevelInterpreter64.asm:
17         * runtime/JSString.h:
18
19 2019-03-05  Yusuke Suzuki  <ysuzuki@apple.com>
20
21         [JSC] Should check exception for JSString::toExistingAtomicString
22         https://bugs.webkit.org/show_bug.cgi?id=195337
23
24         Reviewed by Keith Miller, Saam Barati, and Mark Lam.
25
26         We missed the exception check for JSString::toExistingAtomicString while it can resolve
27         a rope and throw an OOM exception. This patch adds necessary exception checks. This patch
28         fixes test failures in debug build, reported in https://bugs.webkit.org/show_bug.cgi?id=194375#c93.
29
30         * dfg/DFGOperations.cpp:
31         * jit/JITOperations.cpp:
32         (JSC::getByVal):
33         * llint/LLIntSlowPaths.cpp:
34         (JSC::LLInt::getByVal):
35         * runtime/CommonSlowPaths.cpp:
36         (JSC::SLOW_PATH_DECL):
37
38 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
39
40         Unreviewed, build fix for debug builds after r242397
41
42         * runtime/JSString.h:
43
44 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
45
46         [JSC] Store bits for JSRopeString in 3 stores
47         https://bugs.webkit.org/show_bug.cgi?id=195234
48
49         Reviewed by Saam Barati.
50
51         This patch cleans up the initialization of JSRopeString fields in DFG and FTL.
52         Previously, we store some part of data separately. Instead, this patch calculates
53         the data first by bit operations and store calculated data with fewer stores.
54
55         This patch also cleans up is8Bit and isSubstring flags. We put them in lower bits
56         of the first fiber instead of the upper 16 bits. Since we only have 3 bit flags, (isRope, is8Bit, isSubstring),
57         we can put them into the lower 3 bits, they are always empty due to alignment.
58
59         * bytecode/AccessCase.cpp:
60         (JSC::AccessCase::generateImpl): A bit clean up of StringLength IC to give a chance of unnecessary mov removal.
61         * dfg/DFGSpeculativeJIT.cpp:
62         (JSC::DFG::SpeculativeJIT::canBeRope):
63         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
64         (JSC::DFG::SpeculativeJIT::compileMakeRope):
65         * dfg/DFGSpeculativeJIT.h:
66         * ftl/FTLAbstractHeapRepository.cpp:
67         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
68         * ftl/FTLAbstractHeapRepository.h:
69         * ftl/FTLLowerDFGToB3.cpp:
70         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
71         (JSC::FTL::DFG::LowerDFGToB3::isRopeString):
72         (JSC::FTL::DFG::LowerDFGToB3::isNotRopeString):
73         * runtime/JSString.cpp:
74         (JSC::JSString::visitChildren):
75         * runtime/JSString.h:
76         (JSC::JSString::is8Bit const):
77         (JSC::JSString::isSubstring const):
78         * tools/JSDollarVM.cpp:
79         (JSC::functionCreateNullRopeString):
80         (JSC::JSDollarVM::finishCreation):
81
82 2019-03-04  Joseph Pecoraro  <pecoraro@apple.com>
83
84         ITMLKit Inspector: Data Bindings / Associated Data for nodes
85         https://bugs.webkit.org/show_bug.cgi?id=195290
86         <rdar://problem/48304019>
87
88         Reviewed by Devin Rousso.
89
90         * inspector/protocol/DOM.json:
91
92 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
93
94         [JSC] Make Reflect lazily-allocated by dropping @Reflect references from builtin JS
95         https://bugs.webkit.org/show_bug.cgi?id=195250
96
97         Reviewed by Saam Barati.
98
99         By removing @Reflect from builtin JS, we can make Reflect object allocation lazy.
100         We move @ownKeys function from @Reflect to @Object to remove @Reflect reference.
101
102         We also remove m_intlObject field from JSGlobalObject since we no longer use it.
103
104         * builtins/BuiltinNames.h:
105         * builtins/GlobalOperations.js:
106         (globalPrivate.copyDataProperties):
107         (globalPrivate.copyDataPropertiesNoExclusions):
108         * runtime/JSGlobalObject.cpp:
109         (JSC::createReflectProperty):
110         (JSC::JSGlobalObject::init):
111         (JSC::JSGlobalObject::visitChildren):
112         * runtime/JSGlobalObject.h:
113         * runtime/ObjectConstructor.cpp:
114         (JSC::ObjectConstructor::finishCreation):
115         (JSC::objectConstructorOwnKeys):
116         * runtime/ReflectObject.cpp:
117         (JSC::ReflectObject::finishCreation):
118
119 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
120
121         [JSC] Offer @makeTypeError instead of exposing @TypeError
122         https://bugs.webkit.org/show_bug.cgi?id=193858
123
124         Reviewed by Mark Lam.
125
126         Instead of exposing @TypeError, we expose @makeTypeError function.
127         And we make TypeError and Error lazily-allocated objects in non JIT environment.
128         In JIT environment, only TypeError becomes lazily-allocated since WebAssembly errors
129         touch Error prototype anyway. But we can make them lazy in a subsequent patch.
130
131         * builtins/AsyncFromSyncIteratorPrototype.js:
132         * builtins/AsyncGeneratorPrototype.js:
133         (globalPrivate.asyncGeneratorEnqueue):
134         * builtins/BuiltinNames.h:
135         * builtins/PromiseOperations.js:
136         (globalPrivate.createResolvingFunctions.resolve):
137         * runtime/JSGlobalObject.cpp:
138         (JSC::JSGlobalObject::initializeErrorConstructor):
139         (JSC::JSGlobalObject::init):
140         (JSC::JSGlobalObject::visitChildren):
141         * runtime/JSGlobalObject.h:
142         (JSC::JSGlobalObject::errorPrototype const):
143         (JSC::JSGlobalObject::errorStructure const):
144         * runtime/JSGlobalObjectFunctions.cpp:
145         (JSC::globalFuncMakeTypeError):
146         * runtime/JSGlobalObjectFunctions.h:
147
148 2019-03-04  Carlos Garcia Campos  <cgarcia@igalia.com>
149
150         [GLib] Returning G_TYPE_OBJECT from a constructor does not work
151         https://bugs.webkit.org/show_bug.cgi?id=195206
152
153         Reviewed by Žan Doberšek.
154
155         We are freeing the newly created object before returning from the constructor.
156
157         * API/glib/JSCCallbackFunction.cpp:
158         (JSC::JSCCallbackFunction::construct):
159
160 2019-03-02  Darin Adler  <darin@apple.com>
161
162         Retire legacy dtoa function and DecimalNumber class
163         https://bugs.webkit.org/show_bug.cgi?id=195253
164
165         Reviewed by Daniel Bates.
166
167         * runtime/NumberPrototype.cpp:
168         (JSC::numberProtoFuncToExponential): Removed dependency on NumberToStringBufferLength,
169         using NumberToStringBuffer instead. Also tweaked style of implementation a bit.
170
171 2019-03-01  Darin Adler  <darin@apple.com>
172
173         Finish removing String::format
174         https://bugs.webkit.org/show_bug.cgi?id=194893
175
176         Reviewed by Daniel Bates.
177
178         * bytecode/CodeBlock.cpp:
179         (JSC::CodeBlock::nameForRegister): Use makeString instead of String::format,
180         using the new "pad" function.
181
182 2019-03-01  Christopher Reid  <chris.reid@sony.com>
183
184         [PlayStation] Upstream playstation's remote inspector server
185         https://bugs.webkit.org/show_bug.cgi?id=193806
186
187         Reviewed by Joseph Pecoraro.
188
189         Upstreaming PlayStation's Remote Inspector implementation.
190         It is using a JSON RPC protocol over TCP sockets.
191         This inspector implementation is planned to also support running on a WinCairo Client and Server.
192
193         * PlatformPlayStation.cmake:
194         * SourcesGTK.txt:
195         * SourcesWPE.txt:
196         * inspector/remote/RemoteConnectionToTarget.cpp: Renamed from Source/JavaScriptCore/inspector/remote/glib/RemoteConnectionToTargetGlib.cpp.
197         * inspector/remote/RemoteInspector.h:
198         * inspector/remote/playstation/RemoteInspectorConnectionClient.h: Added.
199         * inspector/remote/playstation/RemoteInspectorConnectionClientPlayStation.cpp: Added.
200         * inspector/remote/playstation/RemoteInspectorMessageParser.h: Added.
201         * inspector/remote/playstation/RemoteInspectorMessageParserPlayStation.cpp: Added.
202         * inspector/remote/playstation/RemoteInspectorPlayStation.cpp: Added.
203         * inspector/remote/playstation/RemoteInspectorServer.h: Added.
204         * inspector/remote/playstation/RemoteInspectorServerPlayStation.cpp: Added.
205         * inspector/remote/playstation/RemoteInspectorSocket.h: Added.
206         * inspector/remote/playstation/RemoteInspectorSocketClient.h: Added.
207         * inspector/remote/playstation/RemoteInspectorSocketClientPlayStation.cpp: Added.
208         * inspector/remote/playstation/RemoteInspectorSocketPlayStation.cpp: Added.
209         * inspector/remote/playstation/RemoteInspectorSocketServer.h: Added.
210         * inspector/remote/playstation/RemoteInspectorSocketServerPlayStation.cpp: Added.
211
212 2019-03-01  Saam Barati  <sbarati@apple.com>
213
214         Create SPI to crash if a JSC VM is created
215         https://bugs.webkit.org/show_bug.cgi?id=195231
216         <rdar://problem/47717990>
217
218         Reviewed by Mark Lam.
219
220         * API/JSVirtualMachine.mm:
221         (+[JSVirtualMachine setCrashOnVMCreation:]):
222         * API/JSVirtualMachinePrivate.h:
223         * runtime/VM.cpp:
224         (JSC::VM::VM):
225         (JSC::VM::setCrashOnVMCreation):
226         * runtime/VM.h:
227
228 2019-03-01  Yusuke Suzuki  <ysuzuki@apple.com>
229
230         [JSC] Fix FTL build on ARM32_64 by adding stubs for JSRopeString::offsetOfXXX
231         https://bugs.webkit.org/show_bug.cgi?id=195235
232
233         Reviewed by Saam Barati.
234
235         This is a workaround until https://bugs.webkit.org/show_bug.cgi?id=195234 is done.
236
237         * runtime/JSString.h:
238
239 2019-03-01  Yusuke Suzuki  <ysuzuki@apple.com>
240
241         [JSC] Use runtime calls for DFG MakeRope if !CPU(ADDRESS64)
242         https://bugs.webkit.org/show_bug.cgi?id=195221
243
244         Reviewed by Mark Lam.
245
246         ARM32_64 builds DFG 64bit, but the size of address is 32bit. Make DFG MakeRope a runtime call not only for DFG 32_64,
247         but also DFG 64 with !CPU(ADDRESS64). This patch unifies compileMakeRope again, and use a runtime call for !CPU(ADDRESS64).
248
249         * dfg/DFGSpeculativeJIT.cpp:
250         (JSC::DFG::SpeculativeJIT::compileMakeRope):
251         * dfg/DFGSpeculativeJIT32_64.cpp:
252         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
253         * dfg/DFGSpeculativeJIT64.cpp:
254         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
255
256 2019-03-01  Justin Fan  <justin_fan@apple.com>
257
258         [Web GPU] 32-bit builds broken by attempt to disable WebGPU on 32-bit
259         https://bugs.webkit.org/show_bug.cgi?id=195191
260
261         Rubber-stamped by Dean Jackson.
262
263         Dropping support for 32-bit entirely, so I'm intentionally leaving 32-bit broken.
264
265         * Configurations/FeatureDefines.xcconfig:
266
267 2019-03-01  Dominik Infuehr  <dinfuehr@igalia.com>
268
269         Fix debug builds with GCC
270         https://bugs.webkit.org/show_bug.cgi?id=195205
271
272         Unreviewed. Fix debug builds in GCC by removing
273         the constexpr-keyword for this function.
274
275         * runtime/CachedTypes.cpp:
276         (JSC::tagFromSourceCodeType):
277
278 2019-03-01  Dominik Infuehr  <dinfuehr@igalia.com>
279
280         [ARM] Fix assembler warnings in ctiMasmProbeTrampoline
281         https://bugs.webkit.org/show_bug.cgi?id=195164
282
283         Reviewed by Mark Lam.
284
285         Short branches in IT blocks are deprecated in AArch32. In addition the
286         the conditional branch was the only instruction in the IT block. Short
287         branches are able to encode the condition code themselves, the additional
288         IT instruction is not needed.
289
290         The assembler was also warning that writing into APSR without a bitmask
291         was deprecated. Therefore use APSR_nzcvq instead, this generates the same
292         instruction encoding.
293
294         * assembler/MacroAssemblerARMv7.cpp:
295
296 2019-02-28  Tadeu Zagallo  <tzagallo@apple.com>
297
298         Remove CachedPtr::m_isEmpty and CachedOptional::m_isEmpty fields
299         https://bugs.webkit.org/show_bug.cgi?id=194999
300
301         Reviewed by Saam Barati.
302
303         These fields are unnecessary, since we can just check that m_offset
304         has not been initialized (I added VariableLengthObject::isEmpty for
305         that). They also add 7-byte padding to these classes, which is pretty
306         bad given how frequently CachedPtr is used.
307
308         * runtime/CachedTypes.cpp:
309         (JSC::CachedObject::operator new[]):
310         (JSC::VariableLengthObject::allocate):
311         (JSC::VariableLengthObject::isEmpty const):
312         (JSC::CachedPtr::encode):
313         (JSC::CachedPtr::decode const):
314         (JSC::CachedPtr::get const):
315         (JSC::CachedOptional::encode):
316         (JSC::CachedOptional::decode const):
317         (JSC::CachedOptional::decodeAsPtr const):
318
319 2019-02-28  Yusuke Suzuki  <ysuzuki@apple.com>
320
321         [JSC] sizeof(JSString) should be 16
322         https://bugs.webkit.org/show_bug.cgi?id=194375
323
324         Reviewed by Saam Barati.
325
326         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.
327         Both classes cut 16 bytes per instance in GC allocation. This new layout is used in 64bit architectures which has little endianess.
328
329         JSString no longer has length and flags directly. JSString has String, and we query information to this String instead of holding duplicate
330         information in JSString. We embed isRope bit into this String's pointer so that we can convert JSRopeString to JSString in an atomic manner.
331         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.
332
333         The old JSRopeString separately had JSString* fibers along with String. In this patch, we merge the first JSString* fiber and String pointer
334         storage into one to reduce the size of JSRopeString. JSRopeString has three pointer width storage. We pick 48bit effective address of JSString*
335         fibers to compress three fibers + length + flags into three pointer width storage.
336
337         In 64bit architecture, JSString and JSRopeString have the following memory layout to make sizeof(JSString) == 16 and sizeof(JSRopeString) == 32.
338         JSString has only one pointer. We use it for String. length() and is8Bit() queries go to StringImpl. In JSRopeString, we reuse the above pointer
339         place for the 1st fiber. JSRopeString has three fibers so its size is 48. To keep length and is8Bit flag information in JSRopeString, JSRopeString
340         encodes these information into the fiber pointers. is8Bit flag is encoded in the 1st fiber pointer. length is embedded directly, and two fibers
341         are compressed into 12bytes. isRope information is encoded in the first fiber's LSB.
342
343         Since length of JSRopeString should be frequently accessed compared to each fiber, we put length in contiguous 32byte field, and compress 2nd
344         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
345         are not one pointer load operation. To make concurrent collector work correctly, we must initialize 2nd and 3rd fibers at JSRopeString creation
346         and we must not modify these part later.
347
348                      0                        8        10               16                       32                                     48
349         JSString     [   ID      ][  header  ][   String pointer      0]
350         JSRopeString [   ID      ][  header  ][ flags ][ 1st fiber    1][  length  ][2nd lower32][2nd upper16][3rd lower16][3rd upper32]
351                                                                       ^
352                                                                    isRope bit
353
354         Since fibers in JSRopeString are not initialized in atomic pointer store manner, we must initialize all the fiber fields at JSRopeString creation.
355         To achieve this, we modify our JSRopeString::RopeBuilder implementation not to create half-baked JSRopeString.
356
357         This patch also makes an empty JSString singleton per VM. This makes evaluation of JSString in boolean context one pointer comparison. This is
358         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
359         context evaluation is bloated. This patch hides all the JSString::create and JSRopeString::create in the private permission. JSString and JSRopeString
360         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
361         JSRopeString::RopeBuilder not to construct an empty JSRopeString.
362
363         This patch is performance neutral in Speedometer2 and JetStream2. And it improves RAMification by 2.7%.
364
365         * JavaScriptCore.xcodeproj/project.pbxproj:
366         * assembler/MacroAssemblerARM64.h:
367         (JSC::MacroAssemblerARM64::storeZero16):
368         * assembler/MacroAssemblerX86Common.h:
369         (JSC::MacroAssemblerX86Common::storeZero16):
370         (JSC::MacroAssemblerX86Common::store16):
371         * bytecode/AccessCase.cpp:
372         (JSC::AccessCase::generateImpl):
373         * bytecode/InlineAccess.cpp:
374         (JSC::InlineAccess::dumpCacheSizesAndCrash):
375         (JSC::linkCodeInline):
376         (JSC::InlineAccess::isCacheableStringLength):
377         (JSC::InlineAccess::generateStringLength):
378         * bytecode/InlineAccess.h:
379         (JSC::InlineAccess::sizeForPropertyAccess):
380         (JSC::InlineAccess::sizeForPropertyReplace):
381         (JSC::InlineAccess::sizeForLengthAccess):
382         * dfg/DFGOperations.cpp:
383         * dfg/DFGOperations.h:
384         * dfg/DFGSpeculativeJIT.cpp:
385         (JSC::DFG::SpeculativeJIT::compileStringSlice):
386         (JSC::DFG::SpeculativeJIT::compileToLowerCase):
387         (JSC::DFG::SpeculativeJIT::compileGetCharCodeAt):
388         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
389         (JSC::DFG::SpeculativeJIT::compileStringEquality):
390         (JSC::DFG::SpeculativeJIT::compileStringZeroLength):
391         (JSC::DFG::SpeculativeJIT::compileLogicalNotStringOrOther):
392         (JSC::DFG::SpeculativeJIT::emitStringBranch):
393         (JSC::DFG::SpeculativeJIT::emitStringOrOtherBranch):
394         (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage):
395         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
396         (JSC::DFG::SpeculativeJIT::emitPopulateSliceIndex):
397         (JSC::DFG::SpeculativeJIT::compileArraySlice):
398         (JSC::DFG::SpeculativeJIT::compileArrayIndexOf):
399         (JSC::DFG::SpeculativeJIT::speculateStringIdentAndLoadStorage):
400         (JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
401         (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
402         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
403         * dfg/DFGSpeculativeJIT.h:
404         * dfg/DFGSpeculativeJIT32_64.cpp:
405         (JSC::DFG::SpeculativeJIT::compile):
406         (JSC::DFG::SpeculativeJIT::compileMakeRope):
407         * dfg/DFGSpeculativeJIT64.cpp:
408         (JSC::DFG::SpeculativeJIT::compile):
409         (JSC::DFG::SpeculativeJIT::compileMakeRope):
410         * ftl/FTLAbstractHeapRepository.cpp:
411         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
412         * ftl/FTLAbstractHeapRepository.h:
413         * ftl/FTLLowerDFGToB3.cpp:
414         (JSC::FTL::DFG::LowerDFGToB3::compileGetIndexedPropertyStorage):
415         (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength):
416         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
417         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharAt):
418         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharCodeAt):
419         (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
420         (JSC::FTL::DFG::LowerDFGToB3::compileStringToUntypedStrictEquality):
421         (JSC::FTL::DFG::LowerDFGToB3::compileSwitch):
422         (JSC::FTL::DFG::LowerDFGToB3::mapHashString):
423         (JSC::FTL::DFG::LowerDFGToB3::compileMapHash):
424         (JSC::FTL::DFG::LowerDFGToB3::compileHasOwnProperty):
425         (JSC::FTL::DFG::LowerDFGToB3::compileStringSlice):
426         (JSC::FTL::DFG::LowerDFGToB3::compileToLowerCase):
427         (JSC::FTL::DFG::LowerDFGToB3::stringsEqual):
428         (JSC::FTL::DFG::LowerDFGToB3::boolify):
429         (JSC::FTL::DFG::LowerDFGToB3::switchString):
430         (JSC::FTL::DFG::LowerDFGToB3::isRopeString):
431         (JSC::FTL::DFG::LowerDFGToB3::isNotRopeString):
432         (JSC::FTL::DFG::LowerDFGToB3::speculateStringIdent):
433         * jit/AssemblyHelpers.cpp:
434         (JSC::AssemblyHelpers::emitConvertValueToBoolean):
435         (JSC::AssemblyHelpers::branchIfValue):
436         * jit/AssemblyHelpers.h:
437         (JSC::AssemblyHelpers::branchIfRopeStringImpl):
438         (JSC::AssemblyHelpers::branchIfNotRopeStringImpl):
439         * jit/JITInlines.h:
440         (JSC::JIT::emitLoadCharacterString):
441         * jit/Repatch.cpp:
442         (JSC::tryCacheGetByID):
443         * jit/ThunkGenerators.cpp:
444         (JSC::stringGetByValGenerator):
445         (JSC::stringCharLoad):
446         * llint/LowLevelInterpreter.asm:
447         * llint/LowLevelInterpreter32_64.asm:
448         * llint/LowLevelInterpreter64.asm:
449         * runtime/JSString.cpp:
450         (JSC::JSString::createEmptyString):
451         (JSC::JSRopeString::RopeBuilder<RecordOverflow>::expand):
452         (JSC::JSString::dumpToStream):
453         (JSC::JSString::estimatedSize):
454         (JSC::JSString::visitChildren):
455         (JSC::JSRopeString::resolveRopeInternal8 const):
456         (JSC::JSRopeString::resolveRopeInternal8NoSubstring const):
457         (JSC::JSRopeString::resolveRopeInternal16 const):
458         (JSC::JSRopeString::resolveRopeInternal16NoSubstring const):
459         (JSC::JSRopeString::resolveRopeToAtomicString const):
460         (JSC::JSRopeString::convertToNonRope const):
461         (JSC::JSRopeString::resolveRopeToExistingAtomicString const):
462         (JSC::JSRopeString::resolveRopeWithFunction const):
463         (JSC::JSRopeString::resolveRope const):
464         (JSC::JSRopeString::resolveRopeSlowCase8 const):
465         (JSC::JSRopeString::resolveRopeSlowCase const):
466         (JSC::JSRopeString::outOfMemory const):
467         (JSC::JSRopeString::visitFibers): Deleted.
468         (JSC::JSRopeString::clearFibers const): Deleted.
469         * runtime/JSString.h:
470         (JSC::JSString::uninitializedValueInternal const):
471         (JSC::JSString::valueInternal const):
472         (JSC::JSString::JSString):
473         (JSC::JSString::finishCreation):
474         (JSC::JSString::create):
475         (JSC::JSString::offsetOfValue):
476         (JSC::JSString::isRope const):
477         (JSC::JSString::is8Bit const):
478         (JSC::JSString::length const):
479         (JSC::JSString::tryGetValueImpl const):
480         (JSC::JSString::toAtomicString const):
481         (JSC::JSString::toExistingAtomicString const):
482         (JSC::JSString::value const):
483         (JSC::JSString::tryGetValue const):
484         (JSC::JSRopeString::unsafeView const):
485         (JSC::JSRopeString::viewWithUnderlyingString const):
486         (JSC::JSString::unsafeView const):
487         (JSC::JSString::viewWithUnderlyingString const):
488         (JSC::JSString::offsetOfLength): Deleted.
489         (JSC::JSString::offsetOfFlags): Deleted.
490         (JSC::JSString::setIs8Bit const): Deleted.
491         (JSC::JSString::setLength): Deleted.
492         (JSC::JSString::string): Deleted.
493         (JSC::jsStringBuilder): Deleted.
494         * runtime/JSStringInlines.h:
495         (JSC::JSString::~JSString):
496         (JSC::JSString::equal const):
497         * runtime/ObjectPrototype.cpp:
498         (JSC::objectProtoFuncToString):
499         * runtime/RegExpMatchesArray.h:
500         (JSC::createRegExpMatchesArray):
501         * runtime/RegExpObjectInlines.h:
502         (JSC::collectMatches):
503         * runtime/RegExpPrototype.cpp:
504         (JSC::regExpProtoFuncSplitFast):
505         * runtime/SmallStrings.cpp:
506         (JSC::SmallStrings::initializeCommonStrings):
507         (JSC::SmallStrings::createEmptyString): Deleted.
508         * runtime/SmallStrings.h:
509         * runtime/StringPrototype.cpp:
510         (JSC::stringProtoFuncSlice):
511         * runtime/StringPrototypeInlines.h: Added.
512         (JSC::stringSlice):
513
514 2019-02-28  Saam barati  <sbarati@apple.com>
515
516         Unreviewed. Attempt windows build fix after r242239.
517
518         * runtime/CachedTypes.cpp:
519         (JSC::tagFromSourceCodeType):
520
521 2019-02-28  Mark Lam  <mark.lam@apple.com>
522
523         In cloop.rb, rename :int and :uint to :intptr and :uintptr.
524         https://bugs.webkit.org/show_bug.cgi?id=195183
525
526         Reviewed by Yusuke Suzuki.
527
528         Also changed intMemRef and uintMemRef to intptrMemRef and uintptrMemRef respectively.
529
530         * offlineasm/cloop.rb:
531
532 2019-02-28  Saam barati  <sbarati@apple.com>
533
534         Make JSScript:cacheBytecodeWithError update the cache when the script changes
535         https://bugs.webkit.org/show_bug.cgi?id=194912
536
537         Reviewed by Mark Lam.
538
539         Prior to this patch, the JSScript SPI would never check if its cached
540         bytecode were still valid. This would lead the cacheBytecodeWithError
541         succeeding even if the underlying cache were stale. This patch fixes
542         that by making JSScript check if the cache is still valid. If it's not,
543         we will cache bytecode when cacheBytecodeWithError is invoked.
544
545         * API/JSScript.mm:
546         (-[JSScript readCache]):
547         (-[JSScript writeCache:]):
548         * API/tests/testapi.mm:
549         (testBytecodeCacheWithSameCacheFileAndDifferentScript):
550         (testObjectiveCAPI):
551         * runtime/CachedTypes.cpp:
552         (JSC::Decoder::Decoder):
553         (JSC::VariableLengthObject::buffer const):
554         (JSC::CachedPtr::decode const):
555         (JSC::tagFromSourceCodeType):
556         (JSC::GenericCacheEntry::isUpToDate const):
557         (JSC::CacheEntry::isStillValid const):
558         (JSC::GenericCacheEntry::decode const):
559         (JSC::GenericCacheEntry::isStillValid const):
560         (JSC::encodeCodeBlock):
561         (JSC::decodeCodeBlockImpl):
562         (JSC::isCachedBytecodeStillValid):
563         * runtime/CachedTypes.h:
564         * runtime/CodeCache.cpp:
565         (JSC::sourceCodeKeyForSerializedBytecode):
566         (JSC::sourceCodeKeyForSerializedProgram):
567         (JSC::sourceCodeKeyForSerializedModule):
568         (JSC::serializeBytecode):
569         * runtime/CodeCache.h:
570         (JSC::CodeCacheMap::fetchFromDiskImpl):
571         * runtime/Completion.cpp:
572         (JSC::generateProgramBytecode):
573         (JSC::generateBytecode): Deleted.
574         * runtime/Completion.h:
575
576 2019-02-28  Mark Lam  <mark.lam@apple.com>
577
578         cloop.rb shift mask should depend on the word size being shifted.
579         https://bugs.webkit.org/show_bug.cgi?id=195181
580         <rdar://problem/48484164>
581
582         Reviewed by Yusuke Suzuki.
583
584         Previously, we're always masking the shift amount with 0x1f.  This is only correct
585         for 32-bit words.  For 64-bit words, the mask should be 0x3f.  For pointer sized
586         shifts, the mask depends on sizeof(uintptr_t).
587
588         * offlineasm/cloop.rb:
589
590 2019-02-28  Justin Fan  <justin_fan@apple.com>
591
592         [Web GPU] Enable Web GPU only on 64-bit
593         https://bugs.webkit.org/show_bug.cgi?id=195139
594
595         Because Metal is only supported on 64 bit apps.
596
597         Unreviewed build fix.
598
599         * Configurations/FeatureDefines.xcconfig:
600
601 2019-02-27  Mark Lam  <mark.lam@apple.com>
602
603         The parser is failing to record the token location of new in new.target.
604         https://bugs.webkit.org/show_bug.cgi?id=195127
605         <rdar://problem/39645578>
606
607         Reviewed by Yusuke Suzuki.
608
609         Also adjust the token location for the following to be as shown:
610
611             new.target
612             ^
613             super
614             ^
615             import.meta
616             ^
617
618         * parser/Parser.cpp:
619         (JSC::Parser<LexerType>::parseMemberExpression):
620
621 2019-02-27  Yusuke Suzuki  <ysuzuki@apple.com>
622
623         [JSC] mustHandleValues for dead bytecode locals should be ignored in DFG phases
624         https://bugs.webkit.org/show_bug.cgi?id=195144
625         <rdar://problem/47595961>
626
627         Reviewed by Mark Lam.
628
629         DFGMaximalFlushInsertionPhase inserts Flush for all the locals at the end of basic blocks. This enlarges the live ranges of
630         locals in DFG, and it sometimes makes DFG value live while it is dead in bytecode. The issue happens when we use mustHandleValues
631         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.
632         At that time, we attempt to merge AbstractValue with dead mustHandleValue, which is cleared as jsUndefined() in
633         DFG::Plan::cleanMustHandleValuesIfNecessary before start compilation, and crash because jsUndefined() may be irrelevant to the FlushFormat
634         in VariableAccessData.
635
636         This patch makes the type of mustHandleValues Operands<Optional<JSValue>>. We clear dead JSValues in DFG::Plan::cleanMustHandleValuesIfNecessary.
637         And we skip handling dead mustHandleValue in DFG phases.
638
639         * bytecode/Operands.h:
640         (JSC::Operands::isLocal const):
641         (JSC::Operands::isVariable const): Deleted.
642         * dfg/DFGCFAPhase.cpp:
643         (JSC::DFG::CFAPhase::injectOSR):
644         * dfg/DFGDriver.cpp:
645         (JSC::DFG::compileImpl):
646         (JSC::DFG::compile):
647         * dfg/DFGDriver.h:
648         * dfg/DFGJITCode.cpp:
649         (JSC::DFG::JITCode::reconstruct):
650         * dfg/DFGJITCode.h:
651         * dfg/DFGOperations.cpp:
652         * dfg/DFGPlan.cpp:
653         (JSC::DFG::Plan::Plan):
654         (JSC::DFG::Plan::checkLivenessAndVisitChildren):
655         (JSC::DFG::Plan::cleanMustHandleValuesIfNecessary):
656         * dfg/DFGPlan.h:
657         (JSC::DFG::Plan::mustHandleValues const):
658         * dfg/DFGPredictionInjectionPhase.cpp:
659         (JSC::DFG::PredictionInjectionPhase::run):
660         * dfg/DFGTypeCheckHoistingPhase.cpp:
661         (JSC::DFG::TypeCheckHoistingPhase::disableHoistingAcrossOSREntries):
662         * ftl/FTLOSREntry.cpp:
663         (JSC::FTL::prepareOSREntry):
664         * jit/JITOperations.cpp:
665
666 2019-02-27  Simon Fraser  <simon.fraser@apple.com>
667
668         Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
669
670         * bytecode/CodeBlock.cpp:
671         (JSC::CodeBlock::nameForRegister):
672
673 2019-02-27  Robin Morisset  <rmorisset@apple.com>
674
675         DFG: Loop-invariant code motion (LICM) should not hoist dead code
676         https://bugs.webkit.org/show_bug.cgi?id=194945
677         <rdar://problem/48311657>
678
679         Reviewed by Saam Barati.
680
681         * dfg/DFGLICMPhase.cpp:
682         (JSC::DFG::LICMPhase::run):
683
684 2019-02-27  Antoine Quint  <graouts@apple.com>
685
686         Support Pointer Events on macOS
687         https://bugs.webkit.org/show_bug.cgi?id=195008
688         <rdar://problem/47454419>
689
690         Reviewed by Dean Jackson.
691
692         * Configurations/FeatureDefines.xcconfig:
693
694 2019-02-26  Mark Lam  <mark.lam@apple.com>
695
696         Remove poisons in JSCPoison and uses of them.
697         https://bugs.webkit.org/show_bug.cgi?id=195082
698
699         Reviewed by Yusuke Suzuki.
700
701         Also removed unused poisoning code in WriteBarrier, AssemblyHelpers,
702         DFG::SpeculativeJIT, FTLLowerDFGToB3, and FTL::Output.
703
704         * API/JSAPIWrapperObject.h:
705         (JSC::JSAPIWrapperObject::wrappedObject):
706         * API/JSCallbackFunction.h:
707         * API/JSCallbackObject.h:
708         * API/glib/JSAPIWrapperGlobalObject.h:
709         * CMakeLists.txt:
710         * JavaScriptCore.xcodeproj/project.pbxproj:
711         * Sources.txt:
712         * bytecode/AccessCase.cpp:
713         (JSC::AccessCase::generateWithGuard):
714         * dfg/DFGSpeculativeJIT.cpp:
715         (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments):
716         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
717         (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon):
718         (JSC::DFG::SpeculativeJIT::compileGetExecutable):
719         (JSC::DFG::SpeculativeJIT::compileCreateThis):
720         * dfg/DFGSpeculativeJIT.h:
721         (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPoisonedPointer): Deleted.
722         * ftl/FTLLowerDFGToB3.cpp:
723         (JSC::FTL::DFG::LowerDFGToB3::compileGetExecutable):
724         (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength):
725         (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal):
726         (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction):
727         (JSC::FTL::DFG::LowerDFGToB3::weakPointer):
728         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoison): Deleted.
729         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnLoadedType): Deleted.
730         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnType): Deleted.
731         (JSC::FTL::DFG::LowerDFGToB3::weakPoisonedPointer): Deleted.
732         * ftl/FTLOutput.h:
733         (JSC::FTL::Output::weakPoisonedPointer): Deleted.
734         * jit/AssemblyHelpers.cpp:
735         (JSC::AssemblyHelpers::emitDynamicPoison): Deleted.
736         (JSC::AssemblyHelpers::emitDynamicPoisonOnLoadedType): Deleted.
737         (JSC::AssemblyHelpers::emitDynamicPoisonOnType): Deleted.
738         * jit/AssemblyHelpers.h:
739         * jit/JITOpcodes.cpp:
740         (JSC::JIT::emit_op_create_this):
741         * jit/JITPropertyAccess.cpp:
742         (JSC::JIT::emitScopedArgumentsGetByVal):
743         * jit/Repatch.cpp:
744         (JSC::linkPolymorphicCall):
745         * jit/ThunkGenerators.cpp:
746         (JSC::virtualThunkFor):
747         (JSC::nativeForGenerator):
748         (JSC::boundThisNoArgsFunctionCallGenerator):
749         * parser/UnlinkedSourceCode.h:
750         * runtime/ArrayPrototype.h:
751         * runtime/CustomGetterSetter.h:
752         (JSC::CustomGetterSetter::getter const):
753         (JSC::CustomGetterSetter::setter const):
754         * runtime/InitializeThreading.cpp:
755         (JSC::initializeThreading):
756         * runtime/InternalFunction.cpp:
757         (JSC::InternalFunction::getCallData):
758         (JSC::InternalFunction::getConstructData):
759         * runtime/InternalFunction.h:
760         (JSC::InternalFunction::nativeFunctionFor):
761         * runtime/JSArrayBuffer.h:
762         * runtime/JSBoundFunction.h:
763         * runtime/JSCPoison.cpp: Removed.
764         * runtime/JSCPoison.h: Removed.
765         * runtime/JSFunction.h:
766         * runtime/JSGlobalObject.h:
767         * runtime/JSScriptFetchParameters.h:
768         * runtime/JSScriptFetcher.h:
769         * runtime/JSString.h:
770         * runtime/NativeExecutable.cpp:
771         (JSC::NativeExecutable::hashFor const):
772         * runtime/NativeExecutable.h:
773         * runtime/Options.h:
774         * runtime/ScopedArguments.h:
775         * runtime/Structure.cpp:
776         (JSC::StructureTransitionTable::setSingleTransition):
777         * runtime/StructureTransitionTable.h:
778         (JSC::StructureTransitionTable::map const):
779         (JSC::StructureTransitionTable::weakImpl const):
780         (JSC::StructureTransitionTable::setMap):
781         * runtime/WriteBarrier.h:
782         * wasm/WasmB3IRGenerator.cpp:
783         * wasm/WasmInstance.h:
784         * wasm/js/JSToWasm.cpp:
785         (JSC::Wasm::createJSToWasmWrapper):
786         * wasm/js/JSWebAssemblyCodeBlock.h:
787         * wasm/js/JSWebAssemblyInstance.cpp:
788         (JSC::JSWebAssemblyInstance::JSWebAssemblyInstance):
789         (JSC::JSWebAssemblyInstance::visitChildren):
790         * wasm/js/JSWebAssemblyInstance.h:
791         * wasm/js/JSWebAssemblyMemory.h:
792         * wasm/js/JSWebAssemblyModule.h:
793         * wasm/js/JSWebAssemblyTable.cpp:
794         (JSC::JSWebAssemblyTable::JSWebAssemblyTable):
795         (JSC::JSWebAssemblyTable::grow):
796         (JSC::JSWebAssemblyTable::clearFunction):
797         * wasm/js/JSWebAssemblyTable.h:
798         * wasm/js/WasmToJS.cpp:
799         (JSC::Wasm::materializeImportJSCell):
800         (JSC::Wasm::handleBadI64Use):
801         (JSC::Wasm::wasmToJS):
802         * wasm/js/WebAssemblyFunctionBase.h:
803         * wasm/js/WebAssemblyModuleRecord.cpp:
804         (JSC::WebAssemblyModuleRecord::link):
805         (JSC::WebAssemblyModuleRecord::evaluate):
806         * wasm/js/WebAssemblyModuleRecord.h:
807         * wasm/js/WebAssemblyToJSCallee.h:
808         * wasm/js/WebAssemblyWrapperFunction.h:
809
810 2019-02-26  Mark Lam  <mark.lam@apple.com>
811
812         wasmToJS() should purify incoming NaNs.
813         https://bugs.webkit.org/show_bug.cgi?id=194807
814         <rdar://problem/48189132>
815
816         Reviewed by Saam Barati.
817
818         * runtime/JSCJSValue.h:
819         (JSC::jsNumber):
820         * runtime/TypedArrayAdaptors.h:
821         (JSC::IntegralTypedArrayAdaptor::toJSValue):
822         * wasm/js/WasmToJS.cpp:
823         (JSC::Wasm::wasmToJS):
824
825 2019-02-26  Dominik Infuehr  <dinfuehr@igalia.com>
826
827         Fix warnings on ARM and MIPS
828         https://bugs.webkit.org/show_bug.cgi?id=195049
829
830         Reviewed by Mark Lam.
831
832         Fix all warnings on ARM and MIPS.
833
834         * assembler/MacroAssemblerPrinter.cpp:
835         (JSC::Printer::printMemory):
836         * assembler/testmasm.cpp:
837         (JSC::testProbeModifiesStackValues):
838         * bytecode/InByIdStatus.cpp:
839         (JSC::InByIdStatus::computeFor):
840         * runtime/CachedTypes.cpp:
841         (JSC::VariableLengthObject::buffer const):
842         * runtime/JSBigInt.h:
843         * tools/JSDollarVM.cpp:
844         (JSC::codeBlockFromArg):
845
846 2019-02-26  Mark Lam  <mark.lam@apple.com>
847
848         Misc cleanup in StructureIDTable after r242096.
849         https://bugs.webkit.org/show_bug.cgi?id=195063
850
851         Reviewed by Saam Barati.
852
853         * runtime/StructureIDTable.cpp:
854         (JSC::StructureIDTable::allocateID):
855         - RELEASE_ASSERT that the StructureID allocation will succeed.
856
857         * runtime/StructureIDTable.h:
858         (JSC::StructureIDTable::decode):
859         (JSC::StructureIDTable::encode):
860         - Add back a comment that Yusuke requested but was lost when the patch was rolled
861           out and relanded.
862         - Applied bitwise_casts that Saam requested.
863
864 2019-02-26  Mark Lam  <mark.lam@apple.com>
865
866         Gardening: 32-bit build fix after r242096.
867         https://bugs.webkit.org/show_bug.cgi?id=194989
868
869         Not reviewed.
870
871         * jit/AssemblyHelpers.cpp:
872         (JSC::AssemblyHelpers::emitLoadStructure):
873
874 2019-02-26  Mark Lam  <mark.lam@apple.com>
875
876         Unpoison MacroAssemblerCodePtr, ClassInfo pointers, and a few other things.
877         https://bugs.webkit.org/show_bug.cgi?id=195039
878
879         Reviewed by Saam Barati.
880
881         1. Unpoison MacroAssemblerCodePtrs, ReturnAddressPtr.
882         2. Replace PoisonedClassInfoPtr with ClassInfo*.
883         3. Replace PoisonedMasmPtr with const void*.
884         4. Remove all references to CodeBlockPoison, JITCodePoison, and GlobalDataPoison.
885
886         * API/JSCallbackObject.h:
887         * API/JSObjectRef.cpp:
888         (classInfoPrivate):
889         * assembler/MacroAssemblerCodeRef.h:
890         (JSC::FunctionPtr::FunctionPtr):
891         (JSC::FunctionPtr::executableAddress const):
892         (JSC::FunctionPtr::retaggedExecutableAddress const):
893         (JSC::ReturnAddressPtr::ReturnAddressPtr):
894         (JSC::ReturnAddressPtr::value const):
895         (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr):
896         (JSC::MacroAssemblerCodePtr::createFromExecutableAddress):
897         (JSC::MacroAssemblerCodePtr:: const):
898         (JSC::MacroAssemblerCodePtr::operator! const):
899         (JSC::MacroAssemblerCodePtr::operator== const):
900         (JSC::MacroAssemblerCodePtr::hash const):
901         (JSC::MacroAssemblerCodePtr::emptyValue):
902         (JSC::MacroAssemblerCodePtr::deletedValue):
903         (JSC::FunctionPtr<tag>::FunctionPtr):
904         (JSC::MacroAssemblerCodePtr::poisonedPtr const): Deleted.
905         * b3/B3LowerMacros.cpp:
906         * b3/testb3.cpp:
907         (JSC::B3::testInterpreter):
908         * dfg/DFGOSRExitCompilerCommon.h:
909         (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk):
910         * dfg/DFGSpeculativeJIT.cpp:
911         (JSC::DFG::SpeculativeJIT::compileCheckSubClass):
912         (JSC::DFG::SpeculativeJIT::compileNewStringObject):
913         (JSC::DFG::SpeculativeJIT::emitSwitchIntJump):
914         (JSC::DFG::SpeculativeJIT::emitSwitchImm):
915         (JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
916         (JSC::DFG::SpeculativeJIT::emitSwitchChar):
917         * dfg/DFGSpeculativeJIT.h:
918         * ftl/FTLLowerDFGToB3.cpp:
919         (JSC::FTL::DFG::LowerDFGToB3::compileNewStringObject):
920         (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass):
921         * jit/AssemblyHelpers.h:
922         (JSC::AssemblyHelpers::emitAllocateDestructibleObject):
923         * jit/ThunkGenerators.cpp:
924         (JSC::virtualThunkFor):
925         (JSC::boundThisNoArgsFunctionCallGenerator):
926         * runtime/JSCPoison.h:
927         * runtime/JSDestructibleObject.h:
928         (JSC::JSDestructibleObject::classInfo const):
929         * runtime/JSSegmentedVariableObject.h:
930         (JSC::JSSegmentedVariableObject::classInfo const):
931         * runtime/Structure.h:
932         * runtime/VM.h:
933         * wasm/WasmB3IRGenerator.cpp:
934         (JSC::Wasm::B3IRGenerator::addCall):
935         (JSC::Wasm::B3IRGenerator::addCallIndirect):
936         * wasm/WasmBinding.cpp:
937         (JSC::Wasm::wasmToWasm):
938
939 2019-02-26  Mark Lam  <mark.lam@apple.com>
940
941         [Re-landing] Add some randomness into the StructureID.
942         https://bugs.webkit.org/show_bug.cgi?id=194989
943         <rdar://problem/47975563>
944
945         Reviewed by Yusuke Suzuki.
946
947         1. On 64-bit, the StructureID will now be encoded as:
948
949             ----------------------------------------------------------------
950             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
951             ----------------------------------------------------------------
952
953            The entropy bits are chosen at random and assigned when a StructureID is
954            allocated.
955
956         2. Instead of Structure pointers, the StructureIDTable will now contain
957            encodedStructureBits, which is encoded as such:
958
959             ----------------------------------------------------------------
960             | 7 entropy bits |                   57 structure pointer bits |
961             ----------------------------------------------------------------
962
963            The entropy bits here are the same 7 bits used in the encoding of the
964            StructureID for this structure entry in the StructureIDTable.
965
966         3. Retrieval of the structure pointer given a StructureID is now computed as
967            follows:
968
969                 index = structureID >> 7; // with arithmetic shift.
970                 encodedStructureBits = structureIDTable[index];
971                 structure = encodedStructureBits ^ (structureID << 57);
972
973             We use an arithmetic shift for the right shift because that will preserve
974             the nuke bit in the high bit of the index if the StructureID was not
975             decontaminated before use as expected.
976
977         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
978
979         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
980            instead of always being the same as m_capacity.
981
982         6. Change StructureIDTable::s_unusedID's value to 0.
983
984            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
985            StructureID on 64-bit.  Also, there was never any code that initializes unused
986            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
987            is the ID we'll get when the freelist is empty, prompting a resize of the
988            structureIDTable.
989
990         This patch appears to be perf neutral on JetStream 2 run via the cli on a
991         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
992
993         * ftl/FTLLowerDFGToB3.cpp:
994         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
995         * heap/SlotVisitor.cpp:
996         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
997         * jit/AssemblyHelpers.cpp:
998         (JSC::AssemblyHelpers::emitLoadStructure):
999         * jit/AssemblyHelpers.h:
1000         * jit/SpecializedThunkJIT.h:
1001         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
1002         * llint/LowLevelInterpreter.asm:
1003         * llint/LowLevelInterpreter64.asm:
1004         * runtime/StructureIDTable.cpp:
1005         (JSC::StructureIDTable::StructureIDTable):
1006         (JSC::StructureIDTable::makeFreeListFromRange):
1007         (JSC::StructureIDTable::resize):
1008         (JSC::StructureIDTable::allocateID):
1009         (JSC::StructureIDTable::deallocateID):
1010         * runtime/StructureIDTable.h:
1011         (JSC::StructureIDTable::decode):
1012         (JSC::StructureIDTable::encode):
1013         (JSC::StructureIDTable::get):
1014         (JSC::StructureIDTable::isValid):
1015
1016 2019-02-26  Ryan Haddad  <ryanhaddad@apple.com>
1017
1018         Unreviewed, rolling out r242071.
1019
1020         Breaks internal builds.
1021
1022         Reverted changeset:
1023
1024         "Add some randomness into the StructureID."
1025         https://bugs.webkit.org/show_bug.cgi?id=194989
1026         https://trac.webkit.org/changeset/242071
1027
1028 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
1029
1030         [JSC] Fix compilation on 32-bit platforms after r242071
1031         https://bugs.webkit.org/show_bug.cgi?id=195042
1032
1033         Reviewed by Carlos Garcia Campos.
1034
1035         * jit/AssemblyHelpers.cpp:
1036         (JSC::AssemblyHelpers::emitLoadStructure):
1037
1038 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
1039
1040         [JSC] Repeat string created from Array.prototype.join() take too much memory
1041         https://bugs.webkit.org/show_bug.cgi?id=193912
1042
1043         Reviewed by Saam Barati.
1044
1045         Added a fast case in Array.prototype.join when the array is
1046         uninitialized.
1047
1048         * runtime/ArrayPrototype.cpp:
1049         (JSC::canUseFastJoin):
1050         (JSC::fastJoin):
1051         * runtime/JSStringInlines.h:
1052         (JSC::repeatCharacter): moved from StringPrototype.cpp
1053         * runtime/StringPrototype.cpp:
1054
1055 2019-02-25  Mark Lam  <mark.lam@apple.com>
1056
1057         Add some randomness into the StructureID.
1058         https://bugs.webkit.org/show_bug.cgi?id=194989
1059         <rdar://problem/47975563>
1060
1061         Reviewed by Yusuke Suzuki.
1062
1063         1. On 64-bit, the StructureID will now be encoded as:
1064
1065             ----------------------------------------------------------------
1066             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
1067             ----------------------------------------------------------------
1068
1069            The entropy bits are chosen at random and assigned when a StructureID is
1070            allocated.
1071
1072         2. Instead of Structure pointers, the StructureIDTable will now contain
1073            encodedStructureBits, which is encoded as such:
1074
1075             ----------------------------------------------------------------
1076             | 7 entropy bits |                   57 structure pointer bits |
1077             ----------------------------------------------------------------
1078
1079            The entropy bits here are the same 7 bits used in the encoding of the
1080            StructureID for this structure entry in the StructureIDTable.
1081
1082         3. Retrieval of the structure pointer given a StructureID is now computed as
1083            follows:
1084
1085                 index = structureID >> 7; // with arithmetic shift.
1086                 encodedStructureBits = structureIDTable[index];
1087                 structure = encodedStructureBits ^ (structureID << 57);
1088
1089             We use an arithmetic shift for the right shift because that will preserve
1090             the nuke bit in the high bit of the index if the StructureID was not
1091             decontaminated before use as expected.
1092
1093         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
1094
1095         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
1096            instead of always being the same as m_capacity.
1097
1098         6. Change StructureIDTable::s_unusedID's value to 0.
1099
1100            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
1101            StructureID on 64-bit.  Also, there was never any code that initializes unused
1102            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
1103            is the ID we'll get when the freelist is empty, prompting a resize of the
1104            structureIDTable.
1105
1106         This patch appears to be perf neutral on JetStream 2 run via the cli on a
1107         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
1108
1109         * ftl/FTLLowerDFGToB3.cpp:
1110         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
1111         * heap/SlotVisitor.cpp:
1112         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
1113         * jit/AssemblyHelpers.cpp:
1114         (JSC::AssemblyHelpers::emitLoadStructure):
1115         * jit/AssemblyHelpers.h:
1116         * jit/SpecializedThunkJIT.h:
1117         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
1118         * llint/LowLevelInterpreter.asm:
1119         * llint/LowLevelInterpreter64.asm:
1120         * runtime/StructureIDTable.cpp:
1121         (JSC::StructureIDTable::StructureIDTable):
1122         (JSC::StructureIDTable::makeFreeListFromRange):
1123         (JSC::StructureIDTable::resize):
1124         (JSC::StructureIDTable::allocateID):
1125         (JSC::StructureIDTable::deallocateID):
1126         * runtime/StructureIDTable.h:
1127         (JSC::StructureIDTable::decode):
1128         (JSC::StructureIDTable::encode):
1129         (JSC::StructureIDTable::get):
1130         (JSC::StructureIDTable::isValid):
1131
1132 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1133
1134         [JSC] Revert r226885 to make SlotVisitor creation lazy
1135         https://bugs.webkit.org/show_bug.cgi?id=195013
1136
1137         Reviewed by Saam Barati.
1138
1139         We once changed SlotVisitor creation apriori to drop the lock. Also, it turns out that SlotVisitor is memory-consuming.
1140         We should defer SlotVisitor creation until it is actually required. This patch reverts r226885. Even with this patch,
1141         we still hold many SlotVisitors after we execute many parallel markers at least once. But recovering the feature of
1142         dynamically allocating SlotVisitors helps further memory optimizations in this area.
1143
1144         * heap/Heap.cpp:
1145         (JSC::Heap::Heap):
1146         (JSC::Heap::runBeginPhase):
1147         * heap/Heap.h:
1148         * heap/HeapInlines.h:
1149         (JSC::Heap::forEachSlotVisitor):
1150         (JSC::Heap::numberOfSlotVisitors):
1151         * heap/MarkingConstraintSolver.cpp:
1152         (JSC::MarkingConstraintSolver::didVisitSomething const):
1153         * heap/SlotVisitor.h:
1154
1155 2019-02-25  Saam Barati  <sbarati@apple.com>
1156
1157         testb3 and testair should test O0/O1/O2
1158         https://bugs.webkit.org/show_bug.cgi?id=194637
1159
1160         Reviewed by Mark Lam.
1161
1162         This patch makes it so that we run all tests in testair and testb3
1163         in O0, O1, and O2. However, some tests are invalid for O0 and O1.
1164         This patch makes it so we only run those tests in O2. These are
1165         often tests that assert certain optimizations have occurred. There
1166         are also a class of tests that rely on using patchpoints to stress 
1167         the register allocator into only a single valid allocation. The
1168         O0, and sometimes O1, register allocators are not always good enough
1169         to allocate such programs. To make these valid allocators to use, we rely
1170         on the FTL and Wasm to not emit such patchpoints.
1171
1172         * b3/air/testair.cpp:
1173         (main):
1174         * b3/testb3.cpp:
1175         (JSC::B3::compileProc):
1176         (JSC::B3::testAddLoadTwice):
1177         (JSC::B3::testMulLoadTwice):
1178         (JSC::B3::testSimplePatchpointWithOuputClobbersGPArgs):
1179         (JSC::B3::testSimplePatchpointWithOuputClobbersFPArgs):
1180         (JSC::B3::testPatchpointWithEarlyClobber):
1181         (JSC::B3::testSimpleCheck):
1182         (JSC::B3::testCheckFalse):
1183         (JSC::B3::testCheckTrue):
1184         (JSC::B3::testCheckLessThan):
1185         (JSC::B3::testCheckMegaCombo):
1186         (JSC::B3::testCheckTrickyMegaCombo):
1187         (JSC::B3::testCheckTwoMegaCombos):
1188         (JSC::B3::testCheckTwoNonRedundantMegaCombos):
1189         (JSC::B3::testCheckAddImm):
1190         (JSC::B3::testCheckAddImmCommute):
1191         (JSC::B3::testCheckAddImmSomeRegister):
1192         (JSC::B3::testCheckAdd):
1193         (JSC::B3::testCheckAdd64):
1194         (JSC::B3::testCheckAddFold):
1195         (JSC::B3::testCheckAddFoldFail):
1196         (JSC::B3::testCheckAddSelfOverflow64):
1197         (JSC::B3::testCheckAddSelfOverflow32):
1198         (JSC::B3::testCheckSubImm):
1199         (JSC::B3::testCheckSubBadImm):
1200         (JSC::B3::testCheckSub):
1201         (JSC::B3::testCheckSub64):
1202         (JSC::B3::testCheckSubFold):
1203         (JSC::B3::testCheckSubFoldFail):
1204         (JSC::B3::testCheckNeg):
1205         (JSC::B3::testCheckNeg64):
1206         (JSC::B3::testCheckMul):
1207         (JSC::B3::testCheckMulMemory):
1208         (JSC::B3::testCheckMul2):
1209         (JSC::B3::testCheckMul64):
1210         (JSC::B3::testCheckMulFold):
1211         (JSC::B3::testCheckMulFoldFail):
1212         (JSC::B3::testCheckMul64SShr):
1213         (JSC::B3::testLinearScanWithCalleeOnStack):
1214         (JSC::B3::testCheckSelect):
1215         (JSC::B3::testCheckSelectCheckSelect):
1216         (JSC::B3::testCheckSelectAndCSE):
1217         (JSC::B3::testLateRegister):
1218         (JSC::B3::testReduceStrengthCheckBottomUseInAnotherBlock):
1219         (JSC::B3::testSomeEarlyRegister):
1220         (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled2):
1221         (JSC::B3::testPinRegisters):
1222         (JSC::B3::testX86LeaAddAddShlLeft):
1223         (JSC::B3::testX86LeaAddAddShlRight):
1224         (JSC::B3::testX86LeaAddAdd):
1225         (JSC::B3::testX86LeaAddShlRight):
1226         (JSC::B3::testX86LeaAddShlLeftScale1):
1227         (JSC::B3::testX86LeaAddShlLeftScale2):
1228         (JSC::B3::testX86LeaAddShlLeftScale4):
1229         (JSC::B3::testX86LeaAddShlLeftScale8):
1230         (JSC::B3::testLoadBaseIndexShift2):
1231         (JSC::B3::testOptimizeMaterialization):
1232         (JSC::B3::testLICMPure):
1233         (JSC::B3::testLICMPureSideExits):
1234         (JSC::B3::testLICMPureWritesPinned):
1235         (JSC::B3::testLICMPureWrites):
1236         (JSC::B3::testLICMReadsPinned):
1237         (JSC::B3::testLICMReads):
1238         (JSC::B3::testLICMPureNotBackwardsDominant):
1239         (JSC::B3::testLICMPureNotBackwardsDominantFoiledByChild):
1240         (JSC::B3::testLICMControlDependent):
1241         (JSC::B3::testLICMControlDependentNotBackwardsDominant):
1242         (JSC::B3::testLICMReadsWritesDifferentHeaps):
1243         (JSC::B3::testWasmBoundsCheck):
1244         (JSC::B3::run):
1245         (main):
1246
1247 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1248
1249         [JSC] stress/function-constructor-reading-from-global-lexical-environment.js fails in 32bit arch
1250         https://bugs.webkit.org/show_bug.cgi?id=195030
1251         <rdar://problem/48385088>
1252
1253         Reviewed by Saam Barati.
1254
1255         While LLInt64 has checkTDZInGlobalPutToScopeIfNecessary for op_put_to_scope GlobalLexicalVar to check the value in the variable slot is not empty,
1256         this check is missing in LLInt32_64. Previously, this check was subsumed accidentally by the WatchpointSet check in GlobalLexicalVar in `notifyWrite`:
1257         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
1258         before configuring the WatchpointSet in the slow path. But after r241862, WatchpointSet is not used under non-JIT configuration. This skips WatchpointSet
1259         check and LLInt32_64 starts failing tests because of lack of checkTDZInGlobalPutToScopeIfNecessary. This patch adds checkTDZInGlobalPutToScopeIfNecessary
1260         in LLInt32_64 too. This patch fixes the following four failing tests.
1261
1262             stress/function-constructor-reading-from-global-lexical-environment.js.bytecode-cache
1263             stress/function-constructor-reading-from-global-lexical-environment.js.default
1264             stress/global-lexical-variable-tdz.js.bytecode-cache
1265             stress/global-lexical-variable-tdz.js.default
1266
1267         * llint/LowLevelInterpreter32_64.asm:
1268
1269 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1270
1271         [JSC] Make Intl fields lazily-allocated
1272         https://bugs.webkit.org/show_bug.cgi?id=195022
1273
1274         Reviewed by Mark Lam.
1275
1276         This patch makes the following memory footprint optimization in IntlObject.
1277
1278         1. Make IntlObject fields including Intl.Collator lazily-allocated because we already removed direct references from JS builtins to these constructors (@Collator etc.).
1279
1280         2. Move LazyProperty<IntlObject, Structure> structures from IntlObject to JSGlobalObject. This makes sizeof(IntlObject) the same to the other ones of usual runtime Objects,
1281            and drop one MarkedBlock.
1282
1283         * runtime/IntlCollatorConstructor.h:
1284         * runtime/IntlDateTimeFormatConstructor.h:
1285         * runtime/IntlNumberFormatConstructor.h:
1286         * runtime/IntlObject.cpp:
1287         (JSC::createCollatorConstructor):
1288         (JSC::createNumberFormatConstructor):
1289         (JSC::createDateTimeFormatConstructor):
1290         (JSC::createPluralRulesConstructor):
1291         (JSC::IntlObject::finishCreation):
1292         (JSC::IntlObject::visitChildren): Deleted.
1293         * runtime/IntlObject.h:
1294         * runtime/IntlPluralRulesConstructor.h:
1295         * runtime/JSGlobalObject.cpp:
1296         (JSC::JSGlobalObject::init):
1297         (JSC::JSGlobalObject::visitChildren):
1298         (JSC::JSGlobalObject::defaultCollator):
1299         * runtime/JSGlobalObject.h:
1300         (JSC::JSGlobalObject::collatorStructure):
1301         (JSC::JSGlobalObject::numberFormatStructure):
1302         (JSC::JSGlobalObject::dateTimeFormatStructure):
1303         (JSC::JSGlobalObject::pluralRulesStructure):
1304         (JSC::JSGlobalObject::intlObject const): Deleted.
1305         * runtime/JSGlobalObjectFunctions.cpp:
1306         (JSC::globalFuncDateTimeFormat):
1307         * runtime/NumberPrototype.cpp:
1308         (JSC::numberProtoFuncToLocaleString):
1309         * runtime/StringPrototype.cpp:
1310         (JSC::stringProtoFuncLocaleCompare):
1311
1312 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
1313
1314         Avoid hashing CompactVariableEnvironment when decoding CompactVariableMap::Handle
1315         https://bugs.webkit.org/show_bug.cgi?id=194937
1316
1317         Reviewed by Saam Barati.
1318
1319         Hashing the CompactVariableEnvironment is expensive and we could avoid it
1320         when decoding multiple handles to the same environment. This is sound because
1321         a pointer to the same CompactVariableEnvironment will hash the same.
1322
1323         * runtime/CachedTypes.cpp:
1324         (JSC::Decoder::handleForEnvironment const):
1325         (JSC::Decoder::setHandleForEnvironment):
1326         (JSC::CachedCompactVariableMapHandle::decode const):
1327
1328 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
1329
1330         Remove unnecessary WTF:: prefixes in CachedTypes
1331         https://bugs.webkit.org/show_bug.cgi?id=194936
1332
1333         Reviewed by Saam Barati.
1334
1335         Cleanup unnecessary prefixes from Optional, roundUpToMultipleOf and
1336         pageSize.
1337
1338         * runtime/CachedTypes.cpp:
1339         (JSC::Encoder::cachedOffsetForPtr):
1340         (JSC::Encoder::Page::malloc):
1341         (JSC::Encoder::allocateNewPage):
1342         (JSC::CachedPtr::encode):
1343         (JSC::CachedPtr::decode const):
1344         (JSC::CachedOptional::encode):
1345         (JSC::CachedOptional::decode const):
1346
1347 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1348
1349         [JSC] Drop direct references to Intl constructors by rewriting Intl JS builtins in C++
1350         https://bugs.webkit.org/show_bug.cgi?id=194976
1351
1352         Reviewed by Michael Saboff.
1353
1354         This patch paves the way to making IntlObject allocation lazy by removing direct references
1355         to Intl constructors (Intl.Collator etc.) from builtin JS. To achieve that,
1356
1357         1. We implement String.prototype.toLocaleCompare and Number.prototype.toLocaleString in C++
1358            instead of JS builtins. Since these functions end up calling ICU C++ runtime, writing them in
1359            JS does not offer performance improvement.
1360
1361         2. We remove @DateTimeFormat constructor reference, and instead, exposing @dateTimeFormat function,
1362            which returns formatted string directly. We still have JS builtins for DateTimeFormat things
1363            because the initialization of its "options" JSObject involves many get_by_id / put_by_id things,
1364            which are efficient in JS. But we avoid exposing @DateTimeFormat directly, so that Intl constructors
1365            can be lazily allocated.
1366
1367         * CMakeLists.txt:
1368         * DerivedSources-input.xcfilelist:
1369         * DerivedSources.make:
1370         * JavaScriptCore.xcodeproj/project.pbxproj:
1371         * builtins/BuiltinNames.h:
1372         * builtins/DatePrototype.js:
1373         (toLocaleString):
1374         (toLocaleDateString):
1375         (toLocaleTimeString):
1376         * builtins/NumberPrototype.js: Removed.
1377         * builtins/StringPrototype.js:
1378         (intrinsic.StringPrototypeReplaceIntrinsic.replace):
1379         (globalPrivate.getDefaultCollator): Deleted.
1380         * runtime/JSGlobalObject.cpp:
1381         (JSC::JSGlobalObject::init):
1382         (JSC::JSGlobalObject::visitChildren):
1383         (JSC::JSGlobalObject::defaultCollator):
1384         * runtime/JSGlobalObject.h:
1385         * runtime/JSGlobalObjectFunctions.cpp:
1386         (JSC::globalFuncDateTimeFormat):
1387         * runtime/JSGlobalObjectFunctions.h:
1388         * runtime/NumberPrototype.cpp:
1389         (JSC::NumberPrototype::finishCreation):
1390         (JSC::throwVMToThisNumberError):
1391         (JSC::numberProtoFuncToExponential):
1392         (JSC::numberProtoFuncToFixed):
1393         (JSC::numberProtoFuncToPrecision):
1394         (JSC::numberProtoFuncToString):
1395         (JSC::numberProtoFuncToLocaleString):
1396         (JSC::numberProtoFuncValueOf):
1397         * runtime/StringPrototype.cpp:
1398         (JSC::StringPrototype::finishCreation):
1399         (JSC::stringProtoFuncLocaleCompare):
1400
1401 2019-02-24  Devin Rousso  <drousso@apple.com>
1402
1403         Web Inspector: Change the InspectorOverlay to use native rather than canvas
1404         https://bugs.webkit.org/show_bug.cgi?id=105023
1405         <rdar://problem/13443692>
1406
1407         Reviewed by Brian Burg.
1408
1409         * inspector/protocol/OverlayTypes.json: Removed.
1410         Now that the overlay is entirely generated in C++, we no longer need the special prototol
1411         types for transferring data to a JavaScript context.
1412
1413         * inspector/protocol/Debugger.json:
1414         * inspector/agents/InspectorDebuggerAgent.h:
1415         * inspector/agents/InspectorDebuggerAgent.cpp:
1416         (Inspector::InspectorDebuggerAgent::setOverlayMessage): Deleted.
1417         Remove `Debugger.setOverlayMessage` command as it hasn't been used and is no longer supported.
1418
1419         * CMakeLists.txt:
1420         * DerivedSources-input.xcfilelist:
1421         * DerivedSources.make:
1422
1423 2019-02-24  Yusuke Suzuki  <ysuzuki@apple.com>
1424
1425         [JSC] Lazily create sentinel Map and Set buckets
1426         https://bugs.webkit.org/show_bug.cgi?id=194975
1427
1428         Reviewed by Saam Barati.
1429
1430         If VM::canUseJIT() returns false, we can lazily initialize sentinel Map and Set buckets.
1431         This patch adds getters to VM which lazily allocate these buckets. We eagerly initialize
1432         them if VM::canUseJIT() returns true since they can be touched from DFG and FTL.
1433
1434         * bytecode/BytecodeIntrinsicRegistry.cpp:
1435         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
1436         (JSC::BytecodeIntrinsicRegistry::sentinelMapBucketValue):
1437         (JSC::BytecodeIntrinsicRegistry::sentinelSetBucketValue):
1438         * bytecode/BytecodeIntrinsicRegistry.h:
1439         * dfg/DFGByteCodeParser.cpp:
1440         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
1441         * dfg/DFGOperations.cpp:
1442         * dfg/DFGSpeculativeJIT.cpp:
1443         (JSC::DFG::SpeculativeJIT::compileGetMapBucketNext):
1444         * dfg/DFGSpeculativeJIT64.cpp:
1445         (JSC::DFG::SpeculativeJIT::compile):
1446         * ftl/FTLLowerDFGToB3.cpp:
1447         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucket):
1448         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucketNext):
1449         * runtime/MapConstructor.cpp:
1450         (JSC::mapPrivateFuncMapBucketNext):
1451         * runtime/SetConstructor.cpp:
1452         (JSC::setPrivateFuncSetBucketNext):
1453         * runtime/VM.cpp:
1454         (JSC::VM::VM):
1455         (JSC::VM::sentinelSetBucketSlow):
1456         (JSC::VM::sentinelMapBucketSlow):
1457         * runtime/VM.h:
1458         (JSC::VM::sentinelSetBucket):
1459         (JSC::VM::sentinelMapBucket):
1460
1461 2019-02-20  Darin Adler  <darin@apple.com>
1462
1463         Finish removing String::format
1464         https://bugs.webkit.org/show_bug.cgi?id=194893
1465
1466         Reviewed by Daniel Bates.
1467
1468         * bytecode/CodeBlock.cpp:
1469         (JSC::CodeBlock::nameForRegister): Use makeString instead of String::format,
1470         using the new "pad" function.
1471
1472 2019-02-23  Robin Morisset  <rmorisset@apple.com>
1473
1474         Remove dead code: AdjacencyList::justOneChild()
1475         https://bugs.webkit.org/show_bug.cgi?id=194965
1476
1477         Reviewed by Sam Weinig.
1478
1479         * dfg/DFGAdjacencyList.h:
1480         (JSC::DFG::AdjacencyList::justOneChild const): Deleted.
1481
1482 2019-02-23  Michael Catanzaro  <mcatanzaro@igalia.com>
1483
1484         Unreviewed, fix -Wunused-param warning
1485
1486         * jsc.cpp:
1487
1488 2019-02-23  Mark Lam  <mark.lam@apple.com>
1489
1490         Add an exception check and some assertions in StringPrototype.cpp.
1491         https://bugs.webkit.org/show_bug.cgi?id=194962
1492         <rdar://problem/48013416>
1493
1494         Reviewed by Yusuke Suzuki and Saam Barati.
1495
1496         * runtime/StringPrototype.cpp:
1497         (JSC::jsSpliceSubstrings):
1498         (JSC::jsSpliceSubstringsWithSeparators):
1499         (JSC::operationStringProtoFuncReplaceRegExpEmptyStr):
1500
1501 2019-02-23  Keith Miller  <keith_miller@apple.com>
1502
1503         Add new mac target numbers
1504         https://bugs.webkit.org/show_bug.cgi?id=194955
1505
1506         Reviewed by Tim Horton.
1507
1508         * Configurations/Base.xcconfig:
1509         * Configurations/DebugRelease.xcconfig:
1510
1511 2019-02-22  Robin Morisset  <rmorisset@apple.com>
1512
1513         DFGBytecodeParser should not declare that a node won't clobberExit if DFGFixupPhase can later declare it does clobberExit
1514         https://bugs.webkit.org/show_bug.cgi?id=194953
1515         <rdar://problem/47595253>
1516
1517         Reviewed by Saam Barati.
1518
1519         For each node that
1520         (a) may or may not clobberExit depending on their arrayMode
1521         (b) and get their arrayMode from profiling information in DFGBytecodeParser
1522         (c) and can have their arrayMode refined by DFGFixupPhase,
1523         We must make sure to be conservative in the DFGBytecodeParser and treat it as if it unconditionnally clobbered the exit.
1524         Otherwise we will hit a validation failure after fixup if the next node was marked ExitValid and exits to the same semantic origin.
1525
1526         The list of nodes that fit (a) is:
1527         - StringCharAt
1528         - HasIndexProperty
1529         - GetByVal
1530         - PutByValDirect
1531         - PutByVal
1532         - PutByValAlias
1533         - GetIndexedPropertyStorage
1534
1535         Out of these, the following also fit (b) and (c):
1536         - HasIndexedProperty
1537         - GetByVal
1538         - PutByValDirect
1539         - PutByVal
1540
1541         GetByVal already had "m_exitOK = false; // GetByVal must be treated as if it clobbers exit state, since FixupPhase may make it generic."
1542         So we just have to fix the other three the same way.
1543
1544         * dfg/DFGByteCodeParser.cpp:
1545         (JSC::DFG::ByteCodeParser::parseBlock):
1546         (JSC::DFG::ByteCodeParser::handlePutByVal):
1547
1548 2019-02-22  Robin Morisset  <rmorisset@apple.com>
1549
1550         B3ReduceStrength: missing peephole optimizations for binary operations
1551         https://bugs.webkit.org/show_bug.cgi?id=194252
1552
1553         Reviewed by Saam Barati.
1554
1555         Adds several sets of optimizations for BitAnd, BitOr and BitXor.
1556         Using BitAnd distributivity over BitOr and BitXor:
1557           Turn any of these (for Op == BitOr || Op == BitXor):
1558                 Op(BitAnd(x1, x2), BitAnd(x1, x3))
1559                 Op(BitAnd(x2, x1), BitAnd(x1, x3))
1560                 Op(BitAnd(x1, x2), BitAnd(x3, x1))
1561                 Op(BitAnd(x2, x1), BitAnd(x3, x1))
1562            Into this: BitAnd(Op(x2, x3), x1)
1563            And any of these:
1564                 Op(BitAnd(x1, x2), x1)
1565                 Op(BitAnd(x2, x1), x1)
1566                 Op(x1, BitAnd(x1, x2))
1567                 Op(x1, BitAnd(x2, x1))
1568            Into this: BitAnd(Op(x2, x1), x1)
1569            This second set is equivalent to doing x1 => BitAnd(x1, x1), and then applying the first set.
1570         Using de Morgan laws (we represent not as BitXor with allOnes):
1571           BitAnd(BitXor(x1, allOnes), BitXor(x2, allOnes)) => BitXor(BitOr(x1, x2), allOnes)
1572           BitOr(BitXor(x1, allOnes), BitXor(x2, allOnes) => BitXor(BitAnd(x1, x2), allOnes)
1573           BitOr(BitXor(x, allOnes), c) => BitXor(BitAnd(x, ~c), allOnes)
1574           BitAnd(BitXor(x, allOnes), c) => BitXor(BitOr(x, ~c), allOnes)
1575         The latter two are equivalent to doing c => BitXor(~c, allOnes), and then applying the former two.
1576
1577         All of these transformations either reduce the number of operations (which we always do when possible), or bring the expression closer to having:
1578           - BitXor with all ones at the outermost
1579           - then BitAnd
1580           - then other BitXor
1581           - then BitOr at the innermost.
1582         These transformations that don't directly reduce the number of operations are still useful for normalization (helping things like CSE), and also can enable
1583         more optimizations (for example BitXor with all ones can easily cancel each other once they are all at the outermost level).
1584
1585         * b3/B3ReduceStrength.cpp:
1586         * b3/testb3.cpp:
1587         (JSC::B3::testBitAndNotNot):
1588         (JSC::B3::testBitAndNotImm):
1589         (JSC::B3::testBitOrAndAndArgs):
1590         (JSC::B3::testBitOrAndSameArgs):
1591         (JSC::B3::testBitOrNotNot):
1592         (JSC::B3::testBitOrNotImm):
1593         (JSC::B3::testBitXorAndAndArgs):
1594         (JSC::B3::testBitXorAndSameArgs):
1595         (JSC::B3::run):
1596
1597 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
1598
1599         [JSC] putNonEnumerable in JSWrapperMap is too costly
1600         https://bugs.webkit.org/show_bug.cgi?id=194935
1601
1602         Reviewed by Mark Lam.
1603
1604         When we convert Objective-C blocks to JS objects, we need to set up a corresponding function object correctly.
1605         During this allocation, we call [JSValue defineProperty:descriptor] to connect a "prototype" object and "constructor" object.
1606         The problem is that this API has a particularly costly implementation:
1607
1608             [[_context globalObject][@"Object"] invokeMethod:@"defineProperty" withArguments:@[ self, key, descriptor ]];
1609
1610         This wraps each JS objects appear in this code with Objective-C wrapper. And we convert a NSDictionary to JSObject, which
1611         has "writable", "enumerable", "configurable", "value" fields, and call the "defineProperty" JS function through Objective-C wrapper.
1612         This allocates many Objective-C wrappers and JS objects for descriptors. Since JSC has a direct C++ API "defineOwnProperty", we should
1613         bypass these Objective-C APIs and call JSC's code directly.
1614
1615         This patch changes `putNonEnumerable` implementation, from calling [JSValue defineProperty:descriptor] to calling JSC C++ code directly.
1616         We do not change [JSValue defineProperty:descriptor] implementation for now because of two reasons. (1) This is not used in our benchmarks
1617         except for this (converting an Objective-C block to a JS object) one path. And (2) even if we were to re-write [JSValue defineProperty:descriptor]
1618         to be more optimized, we would still want to call the JSC C++ version of defineProperty directly here to avoid NSDictionary allocation for a descriptor.
1619
1620         * API/APIUtils.h:
1621         (setException):
1622         * API/JSWrapperMap.mm:
1623         (putNonEnumerable):
1624         (copyMethodsToObject):
1625         (-[JSObjCClassInfo allocateConstructorAndPrototypeInContext:]):
1626         (-[JSObjCClassInfo wrapperForObject:inContext:]):
1627
1628 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
1629
1630         Unreviewed, build fix after r241954
1631         https://bugs.webkit.org/show_bug.cgi?id=194939
1632
1633         Renaming setCanAccessHeap was incomplete.
1634
1635         * runtime/SmallStrings.cpp:
1636         (JSC::SmallStrings::initializeCommonStrings):
1637         * runtime/VM.cpp:
1638         (JSC::VM::~VM):
1639
1640 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
1641
1642         [JSC] SmallStringsStorage is unnecessary
1643         https://bugs.webkit.org/show_bug.cgi?id=194939
1644
1645         Reviewed by Mark Lam.
1646
1647         SmallStrings hold common small JSStrings. Their underlying StringImpl is also held by SmallStringsStorage.
1648         But it is duplicate since we can get StringImpl from small JSStrings. This patch removes SmallStringsStorage,
1649         and get StringImpls from JSStrings if necessary.
1650
1651         We also add m_canAccessHeap flag to SmallStrings. At the time of VM destruction, JSStrings are destroyed when
1652         VM's Heap is finalized. We must not touch JSStrings before VM's heap (and JSStrings in SmallStrings) is initialized,
1653         and after VM's Heap is destroyed. We add this m_canAccessHeap flag to allow users to get StringImpl during the
1654         this sensitive period. If m_canAccessHeap is false, we get StringImpl from AtomicStringImpl::add.
1655
1656         * runtime/SmallStrings.cpp:
1657         (JSC::SmallStrings::initializeCommonStrings):
1658         (JSC::SmallStrings::singleCharacterStringRep):
1659         (JSC::SmallStringsStorage::rep): Deleted.
1660         (JSC::SmallStringsStorage::SmallStringsStorage): Deleted.
1661         (JSC::SmallStrings::createSingleCharacterString): Deleted.
1662         * runtime/SmallStrings.h:
1663         (JSC::SmallStrings::setCanAccessHeap):
1664         * runtime/VM.cpp:
1665         (JSC::VM::VM):
1666         (JSC::VM::~VM):
1667
1668 2019-02-22  Tadeu Zagallo  <tzagallo@apple.com>
1669
1670         Cache CompactVariableMap::Handle instead of VariableEnvironment for UnlinkedFunctionExecutable
1671         https://bugs.webkit.org/show_bug.cgi?id=194706
1672
1673         Reviewed by Saam Barati.
1674
1675         In https://bugs.webkit.org/show_bug.cgi?id=194583 we started using a
1676         CompactVariableMap::Handle instead of VariableEnvironment for
1677         UnlinkedFunctionExecutables, but we were creating the full environment
1678         to encode the executable in the bytecode cache. This patch changes it so
1679         that we cache the handle instead of the environment. This avoids duplicating
1680         the VariableEnvironment whenever we have to cache two handles that point
1681         to the environment.
1682
1683         * bytecode/UnlinkedFunctionExecutable.h:
1684         * parser/VariableEnvironment.cpp:
1685         (JSC::CompactVariableMap::get):
1686         * parser/VariableEnvironment.h:
1687         * runtime/CachedTypes.cpp:
1688         (JSC::CachedCompactVariableEnvironment::encode):
1689         (JSC::CachedCompactVariableEnvironment::decode const):
1690         (JSC::CachedCompactVariableMapHandle::encode):
1691         (JSC::CachedCompactVariableMapHandle::decode const):
1692         (JSC::CachedFunctionExecutable::encode):
1693         (JSC::CachedFunctionExecutable::decode const):
1694         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1695
1696 2019-02-21  Saam Barati  <sbarati@apple.com>
1697
1698         Update JSScript SPI based on feedback
1699         https://bugs.webkit.org/show_bug.cgi?id=194517
1700
1701         Reviewed by Keith Miller.
1702
1703         This patch updates the JSScript SPI in the following ways:
1704         - JSScript can now represent both modules and programs. This is a property
1705         of the script determined during creation.
1706         - JSScript now takes a sourceURL during construction. For modules, this acts
1707         as the module identifier.
1708         - JSScript now has SPI for writing the cache out to disk. We don't do this
1709         automatically.
1710         - JSScript will load the bytecode cache on creation if it exists.
1711         - We retrofit these new requirements on the prior JSScript SPI that
1712         we're going to remove as soon as we can: https://bugs.webkit.org/show_bug.cgi?id=194909.
1713         Previous SPI assumes all JSScripts are modules. Previous SPI also assigns
1714         a sourceURL to the JSScript based on what the module loader decided the
1715         identifier should be. We'll remove this once we remove the old SPI.
1716         
1717         This patch also adds SPI to JSContext to evaluate a JSScript. For modules,
1718         this is like returning the result of doing dynamic import. For programs,
1719         this does normal program evaluation.
1720         
1721         This patch also fixes a bug in generateBytecode/generateModuleBytecode where
1722         we would try to cache the bytecode even if recursivelyGenerateUnlinkedCodeBlock
1723         returned null. E.g, if the script had a syntax error.
1724         
1725         When writing tests, I also discovered that someone previously broke
1726         testapi. This patch also fixes those failures. They were broken when
1727         we switched to using a testapiScripts directory to hold our test .js
1728         scripts. 
1729
1730         * API/JSAPIGlobalObject.h:
1731         * API/JSAPIGlobalObject.mm:
1732         (JSC::JSAPIGlobalObject::moduleLoaderResolve):
1733         (JSC::JSAPIGlobalObject::moduleLoaderFetch):
1734         (JSC::JSAPIGlobalObject::loadAndEvaluateJSScriptModule):
1735         * API/JSBase.cpp:
1736         (JSEvaluateScriptInternal):
1737         (JSEvaluateScript):
1738         * API/JSBaseInternal.h: Added.
1739         * API/JSContext.mm:
1740         (-[JSContext evaluateScript:withSourceURL:]):
1741         (-[JSContext evaluateJSScript:]):
1742         * API/JSContextPrivate.h:
1743         * API/JSScript.h:
1744         * API/JSScript.mm:
1745         (+[JSScript scriptWithSource:inVirtualMachine:]):
1746         (+[JSScript scriptFromASCIIFile:inVirtualMachine:withCodeSigning:andBytecodeCache:]):
1747         (createError):
1748         (+[JSScript scriptOfType:inVirtualMachine:withSourceURL:andSource:andBytecodeCache:error:]):
1749         (+[JSScript scriptOfType:inVirtualMachine:memoryMappedFromASCIIFile:withSourceURL:andBytecodeCache:error:]):
1750         (-[JSScript cacheBytecodeWithError:]):
1751         (-[JSScript sourceURL]):
1752         (-[JSScript type]):
1753         (-[JSScript jsSourceCode]):
1754         (-[JSScript writeCache:]):
1755         (-[JSScript setSourceURL:]):
1756         (-[JSScript forceRecreateJSSourceCode]):
1757         (-[JSScript writeCache]): Deleted.
1758         (-[JSScript jsSourceCode:]): Deleted.
1759         * API/JSScriptInternal.h:
1760         * API/tests/FunctionOverridesTest.cpp:
1761         (testFunctionOverrides):
1762         * API/tests/testapi.c:
1763         (main):
1764         * API/tests/testapi.mm:
1765         (tempFile):
1766         (testModuleBytecodeCache):
1767         (testProgramBytecodeCache):
1768         (testBytecodeCacheWithSyntaxError):
1769         (testProgramJSScriptException):
1770         (testLoadBasicFileLegacySPI):
1771         (+[JSContextMemoryMappedLoaderDelegate newContext]):
1772         (-[JSContextMemoryMappedLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
1773         (testLoadBasicFile):
1774         (+[JSContextAugmentedLoaderDelegate newContext]):
1775         (-[JSContextAugmentedLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
1776         (testJSScriptURL):
1777         (testObjectiveCAPI):
1778         (testBytecodeCache): Deleted.
1779         * API/tests/testapiScripts/foo.js: Added.
1780         * JavaScriptCore.xcodeproj/project.pbxproj:
1781         * runtime/Completion.cpp:
1782         (JSC::generateBytecode):
1783         (JSC::generateModuleBytecode):
1784
1785 2019-02-21  Mark Lam  <mark.lam@apple.com>
1786
1787         Add more doesGC() assertions.
1788         https://bugs.webkit.org/show_bug.cgi?id=194911
1789         <rdar://problem/48285723>
1790
1791         Reviewed by Saam Barati and Yusuke Suzuki.
1792
1793         * dfg/DFGOSRExit.cpp:
1794         (JSC::DFG::OSRExit::compileOSRExit):
1795         - Set expectDoesGC here because we no longer have to worry about missing store
1796           barriers in optimized code after this point.  This will prevent false positive
1797           assertion failures arising from functions called beneath compileOSRExit().
1798
1799         (JSC::DFG::OSRExit::compileExit):
1800         - Add a comment to explain why the generated ramp needs to set expectDoesGC even
1801           though compileOSRExit() also sets it.  Reason: compileOSRExit() is only called
1802           for the first OSR from this code origin, the generated ramp is called for many
1803           subsequents OSR exits from this code origin.
1804
1805         * ftl/FTLOSRExitCompiler.cpp:
1806         (JSC::FTL::compileStub):
1807         - Added a comment for the equivalent reason to the one above.
1808
1809         (JSC::FTL::compileFTLOSRExit):
1810         - Set expectDoesGC here because we no longer have to worry about missing store
1811           barriers in optimized code after this point.  This will prevent false positive
1812           assertion failures arising from functions called beneath compileFTLOSRExit().
1813
1814         * heap/CompleteSubspace.cpp:
1815         (JSC::CompleteSubspace::tryAllocateSlow):
1816         * heap/CompleteSubspaceInlines.h:
1817         (JSC::CompleteSubspace::allocateNonVirtual):
1818         - assert expectDoesGC.
1819
1820         * heap/DeferGC.h:
1821         (JSC::DeferGC::~DeferGC):
1822         - assert expectDoesGC.
1823         - Also added WTF_FORBID_HEAP_ALLOCATION to DeferGC, DeferGCForAWhile, and DisallowGC
1824           because all 3 should be stack allocated RAII objects.
1825
1826         * heap/GCDeferralContext.h:
1827         * heap/GCDeferralContextInlines.h:
1828         (JSC::GCDeferralContext::~GCDeferralContext):
1829         - Added WTF_FORBID_HEAP_ALLOCATION.
1830         - assert expectDoesGC.
1831
1832         * heap/Heap.cpp:
1833         (JSC::Heap::collectNow):
1834         (JSC::Heap::collectAsync):
1835         (JSC::Heap::collectSync):
1836         (JSC::Heap::stopIfNecessarySlow):
1837         (JSC::Heap::collectIfNecessaryOrDefer):
1838         * heap/HeapInlines.h:
1839         (JSC::Heap::acquireAccess):
1840         (JSC::Heap::stopIfNecessary):
1841         * heap/LargeAllocation.cpp:
1842         (JSC::LargeAllocation::tryCreate):
1843         * heap/LocalAllocatorInlines.h:
1844         (JSC::LocalAllocator::allocate):
1845         - conservatively assert expectDoesGC on these functions that may trigger a GC
1846           though they don't always do.
1847
1848         * runtime/DisallowScope.h:
1849         - DisallowScope should be stack allocated because it's an RAII object.
1850
1851         * runtime/JSCellInlines.h:
1852         (JSC::tryAllocateCellHelper):
1853         - Remove the expectDoesGC assertion because it is now covered by assertions in
1854           CompleteSubspace, LargeAllocation, and LocalAllocator.
1855
1856         * runtime/RegExpMatchesArray.h:
1857         (JSC::createRegExpMatchesArray):
1858         - assert expectDoesGC.
1859
1860 2019-02-21  Yusuke Suzuki  <ysuzuki@apple.com>
1861
1862         [JSC] Use Fast Malloc as much as possible
1863         https://bugs.webkit.org/show_bug.cgi?id=194316
1864
1865         Reviewed by Mark Lam.
1866
1867         We should use Fast Malloc as much as possible to offer the whole memory view to bmalloc.
1868
1869         * inspector/scripts/codegen/cpp_generator_templates.py:
1870         * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
1871         * inspector/scripts/tests/generic/expected/enum-values.json-result:
1872         * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
1873         * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
1874         * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
1875         * jit/ExecutableAllocator.h:
1876         * jsc.cpp:
1877         * runtime/JSRunLoopTimer.h:
1878         * tools/VMInspector.h:
1879         * wasm/WasmThunks.h:
1880
1881 2019-02-20  Yusuke Suzuki  <ysuzuki@apple.com>
1882
1883         [JSC] Remove WatchpointSet creation for SymbolTable entries if VM::canUseJIT() returns false
1884         https://bugs.webkit.org/show_bug.cgi?id=194891
1885
1886         Reviewed by Geoffrey Garen.
1887
1888         WatchpointSet in SymbolTable is used to fold the value into a constant in JIT tiers. And it is
1889         not useful under the non-JIT mode. This patch avoids creation of WatchpointSet in SymbolTable
1890         if VM::canUseJIT() returns false.
1891
1892         * llint/LowLevelInterpreter32_64.asm:
1893         * llint/LowLevelInterpreter64.asm:
1894         * runtime/SymbolTable.cpp:
1895         (JSC::SymbolTableEntry::addWatchpoint): Deleted.
1896         * runtime/SymbolTable.h:
1897         (JSC::SymbolTableEntry::isWatchable const):
1898         (JSC::SymbolTableEntry::watchpointSet):
1899
1900 2019-02-20  Mark Lam  <mark.lam@apple.com>
1901
1902         Add code to validate expected GC activity modelled by doesGC() against what the runtime encounters.
1903         https://bugs.webkit.org/show_bug.cgi?id=193938
1904         <rdar://problem/47616277>
1905
1906         Reviewed by Michael Saboff, Saam Barati, and Robin Morisset.
1907
1908         In DFG::SpeculativeJIT::compile() and FTL::LowerDFGToB3::compileNode(), before
1909         emitting code / B3IR for each DFG node, we emit a write to set Heap::m_expectDoesGC
1910         to the value returned by doesGC() for that node.  In the runtime (i.e. in allocateCell()
1911         and functions that can resolve a rope), we assert that Heap::m_expectDoesGC is
1912         true.
1913
1914         This validation code is currently only enabled for debug builds.  It is disabled
1915         for release builds by default, but it can easily be made to run on release builds
1916         as well by forcing ENABLE_DFG_DOES_GC_VALIDATION to 1 in Heap.h.
1917
1918         To allow this validation code to run on release builds as well, the validation uses
1919         RELEASE_ASSERT instead of ASSERT.
1920
1921         To ensure that Heap.h is #include'd for all files that needs to do this validation
1922         (so that the validation code is accidentally disabled), we guard the validation
1923         code with an if conditional on constexpr bool validateDFGDoesGC (instead of using
1924         a #if ENABLE(DFG_DOES_GC_VALIDATION)).  This way, if Heap.h isn't #include'd, the
1925         validation code will fail to build (no silent failures).
1926
1927         Currently, all JSC tests and Layout tests should pass with this validation enabled
1928         in debug builds.  We'll only see new failures if there's a regression or if new
1929         tests reveal a previously untested code path that has an undetected issue.
1930
1931         * dfg/DFGOSRExit.cpp:
1932         (JSC::DFG::OSRExit::executeOSRExit):
1933         (JSC::DFG::OSRExit::compileExit):
1934         * dfg/DFGSpeculativeJIT64.cpp:
1935         (JSC::DFG::SpeculativeJIT::compile):
1936         * ftl/FTLLowerDFGToB3.cpp:
1937         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
1938         * ftl/FTLOSRExitCompiler.cpp:
1939         (JSC::FTL::compileStub):
1940         * heap/Heap.h:
1941         (JSC::Heap::expectDoesGC const):
1942         (JSC::Heap::setExpectDoesGC):
1943         (JSC::Heap::addressOfExpectDoesGC):
1944         * jit/JITArithmetic.cpp:
1945         (JSC::JIT::emit_compareAndJump):
1946         * runtime/JSCellInlines.h:
1947         (JSC::tryAllocateCellHelper):
1948         * runtime/JSString.h:
1949         (JSC::jsSingleCharacterString):
1950         (JSC::JSString::toAtomicString const):
1951         (JSC::JSString::toExistingAtomicString const):
1952         (JSC::JSString::value const):
1953         (JSC::JSString::tryGetValue const):
1954         (JSC::JSRopeString::unsafeView const):
1955         (JSC::JSRopeString::viewWithUnderlyingString const):
1956         (JSC::JSString::unsafeView const):
1957
1958 2019-02-20  Andy Estes  <aestes@apple.com>
1959
1960         [Xcode] Add SDKVariant.xcconfig to various Xcode projects
1961         https://bugs.webkit.org/show_bug.cgi?id=194869
1962
1963         Rubber-stamped by Jer Noble.
1964
1965         * JavaScriptCore.xcodeproj/project.pbxproj:
1966
1967 2019-02-19  Joseph Pecoraro  <pecoraro@apple.com>
1968
1969         Web Inspector: Improve ES6 Class instances in Heap Snapshot instances view
1970         https://bugs.webkit.org/show_bug.cgi?id=172848
1971         <rdar://problem/25709212>
1972
1973         Reviewed by Mark Lam.
1974
1975         * heap/HeapSnapshotBuilder.h:
1976         * heap/HeapSnapshotBuilder.cpp:
1977         Update the snapshot version. Change the node's 0 | 1 internal value
1978         to be a 32bit bit flag. This is nice in that it is both compatible
1979         with the previous snapshot version and the same size. We can use more
1980         flags in the future.
1981
1982         (JSC::HeapSnapshotBuilder::json):
1983         In cases where the classInfo gives us "Object" check for a better
1984         class name by checking (o).__proto__.constructor.name. We avoid this
1985         check in cases where (o).hasOwnProperty("constructor") which is the
1986         case for most Foo.prototype objects. Otherwise this would get the
1987         name of the Foo superclass for the Foo.prototype object.
1988
1989         * runtime/JSObject.cpp:
1990         (JSC::JSObject::calculatedClassName):
1991         Handle some possible edge cases that were not handled before, such as
1992         a JSObject without a GlobalObject or an object which doesn't
1993         have a default getPrototype. Try to make the code a little clearer.
1994
1995 2019-02-19  Truitt Savell  <tsavell@apple.com>
1996
1997         Unreviewed, rolling out r241784.
1998
1999         Broke all OpenSource builds.
2000
2001         Reverted changeset:
2002
2003         "Web Inspector: Improve ES6 Class instances in Heap Snapshot
2004         instances view"
2005         https://bugs.webkit.org/show_bug.cgi?id=172848
2006         https://trac.webkit.org/changeset/241784
2007
2008 2019-02-19  Joseph Pecoraro  <pecoraro@apple.com>
2009
2010         Web Inspector: Improve ES6 Class instances in Heap Snapshot instances view
2011         https://bugs.webkit.org/show_bug.cgi?id=172848
2012         <rdar://problem/25709212>
2013
2014         Reviewed by Mark Lam.
2015
2016         * heap/HeapSnapshotBuilder.h:
2017         * heap/HeapSnapshotBuilder.cpp:
2018         Update the snapshot version. Change the node's 0 | 1 internal value
2019         to be a 32bit bit flag. This is nice in that it is both compatible
2020         with the previous snapshot version and the same size. We can use more
2021         flags in the future.
2022
2023         (JSC::HeapSnapshotBuilder::json):
2024         In cases where the classInfo gives us "Object" check for a better
2025         class name by checking (o).__proto__.constructor.name. We avoid this
2026         check in cases where (o).hasOwnProperty("constructor") which is the
2027         case for most Foo.prototype objects. Otherwise this would get the
2028         name of the Foo superclass for the Foo.prototype object.
2029
2030         * runtime/JSObject.cpp:
2031         (JSC::JSObject::calculatedClassName):
2032         Handle some possible edge cases that were not handled before, such as
2033         a JSObject without a GlobalObject or an object which doesn't
2034         have a default getPrototype. Try to make the code a little clearer.
2035
2036 2019-02-19  Robin Morisset  <rmorisset@apple.com>
2037
2038         B3-O2 incorrectly optimizes this subtest
2039         https://bugs.webkit.org/show_bug.cgi?id=194625
2040
2041         Reviewed by Saam Barati.
2042
2043         Trivial fix. Instead of doing
2044             if (!cond) foo else bar => if (cond) bar else foo
2045         B3LowerToAir was doing
2046             if (x^C) foo else bar => if (cond) bar else foo whenever C&1, even if C was for example 3.
2047
2048         * b3/B3LowerToAir.cpp:
2049         * b3/testb3.cpp:
2050         (JSC::B3::testBitNotOnBooleanAndBranch32):
2051         (JSC::B3::testNotOnBooleanAndBranch32): Added.
2052
2053 2019-02-19  Robin Morisset  <rmorisset@apple.com>
2054
2055         CachedCall should not consider it UNLIKELY that it will not stack overflow
2056         https://bugs.webkit.org/show_bug.cgi?id=194831
2057
2058         Reviewed by Mark Lam.
2059
2060         * interpreter/CachedCall.h:
2061         (JSC::CachedCall::CachedCall):
2062
2063 2019-02-19  Mark Lam  <mark.lam@apple.com>
2064
2065         Fix DFG doesGC() for TryGetById and ProfileType nodes.
2066         https://bugs.webkit.org/show_bug.cgi?id=194821
2067         <rdar://problem/48206690>
2068
2069         Reviewed by Saam Barati.
2070
2071         Fix doesGC() for the following nodes:
2072
2073             ProfileType:
2074                 calls operationProcessTypeProfilerLogDFG(), which can calculatedClassName(),
2075                 which can call JSString::tryGetValue(), which can resolve a rope.
2076
2077             TryGetById:
2078                 calls operationTryGetByIdOptimize(), which can startWatchingPropertyForReplacements()
2079                 on a structure, which can allocate StructureRareData.
2080
2081         * dfg/DFGDoesGC.cpp:
2082         (JSC::DFG::doesGC):
2083
2084 2019-02-18  Yusuke Suzuki  <ysuzuki@apple.com>
2085
2086         [JSC] Introduce JSNonDestructibleProxy for JavaScriptCore.framework's GlobalThis
2087         https://bugs.webkit.org/show_bug.cgi?id=194799
2088
2089         Reviewed by Saam Barati.
2090
2091         JSProxy is destructible one because we have JSWindowProxy which has ref counted object.
2092         However, JavaScriptCore.framework's JSProxy for GlobalThis does not need to be destructible.
2093         This is important since we need to separate Heap subspaces between destructible and non-destructible objects.
2094         If we can put more and more objects in non-destructible status, we can get rid of low-usage MarkedBlock.
2095         This patch adds JSNonDestructibleProxy, which is not destructible JSProxy. While it inherits JSDestructibleObject,
2096         we can make the subclass still non-destructible thanks to Subspace mechanism. This drops one more low-usage MarkedBlock.
2097
2098         * CMakeLists.txt:
2099         * JavaScriptCore.xcodeproj/project.pbxproj:
2100         * Sources.txt:
2101         * runtime/JSGlobalObject.cpp:
2102         (JSC::JSGlobalObject::resetPrototype):
2103         (JSC::JSGlobalObject::finishCreation):
2104         * runtime/JSNonDestructibleProxy.cpp: Added.
2105         * runtime/JSNonDestructibleProxy.h: Added.
2106         (JSC::JSNonDestructibleProxy::subspaceFor):
2107         (JSC::JSNonDestructibleProxy::create):
2108         (JSC::JSNonDestructibleProxy::createStructure):
2109         (JSC::JSNonDestructibleProxy::JSNonDestructibleProxy):
2110         * runtime/JSProxy.h:
2111         (JSC::JSProxy::JSProxy):
2112
2113 2019-02-19  Robin Morisset  <rmorisset@apple.com>
2114
2115         B3ReduceStrength::simplifyCFG() could do a lot more on each iteration
2116         https://bugs.webkit.org/show_bug.cgi?id=194475
2117
2118         Reviewed by Saam Barati.
2119
2120         B3ReduceStrength::simplifyCFG() does three optimizations (which I will call A, B and C):
2121         - A makes any terminal that points to a block that is empty except for a jump point to that jump's target instead.
2122         - B transforms any branch or switch that points to a single block into a jump
2123         - C finds blocks ending with jumps, whose successor has a single predecessor, and inline that successor block in place of the jump
2124
2125         It currently is limited in the following way:
2126         - A and C can only fire once per block per iteration
2127         - B can create jumps that would trigger A, but they may not be seen until the next iteration
2128
2129         Both problems are mitigated by going through the blocks in post-order, so that when a block is optimized most of its successors have already been optimized.
2130         In a sense it is the symmetric of the peephole optimizer that goes in pre-order so that when an instruction is optimized most of its children have already been optimized.
2131
2132         On JetStream2 it reduces the average number of iterations from 3.35 to 3.24.
2133
2134         * b3/B3ReduceStrength.cpp:
2135
2136 2019-02-19  Tadeu Zagallo  <tzagallo@apple.com>
2137
2138         Move bytecode cache-related filesystem code out of CodeCache
2139         https://bugs.webkit.org/show_bug.cgi?id=194675
2140
2141         Reviewed by Saam Barati.
2142
2143         The code is only used for the bytecode-cache tests, so it should live in
2144         jsc.cpp rather than in the CodeCache. The logic now lives in ShellSourceProvider,
2145         which overrides the a virtual method in SourceProvider, `cacheBytecode`,
2146         in order to write the cache to disk.
2147
2148         * jsc.cpp:
2149         (ShellSourceProvider::create):
2150         (ShellSourceProvider::~ShellSourceProvider):
2151         (ShellSourceProvider::cachePath const):
2152         (ShellSourceProvider::loadBytecode):
2153         (ShellSourceProvider::ShellSourceProvider):
2154         (jscSource):
2155         (GlobalObject::moduleLoaderFetch):
2156         (functionDollarEvalScript):
2157         (runWithOptions):
2158         * parser/SourceProvider.h:
2159         (JSC::SourceProvider::cacheBytecode const):
2160         * runtime/CodeCache.cpp:
2161         (JSC::writeCodeBlock):
2162         * runtime/CodeCache.h:
2163         (JSC::CodeCacheMap::fetchFromDiskImpl):
2164
2165 2019-02-18  Dominik Infuehr  <dinfuehr@igalia.com>
2166
2167         [ARM] Fix crash with sampling profiler
2168         https://bugs.webkit.org/show_bug.cgi?id=194772
2169
2170         Reviewed by Mark Lam.
2171
2172         sampling-profiler-richards.js was crashing with an enabled sampling profiler. add32
2173         did not update the stack pointer in a single instruction. The src register was first
2174         moved into the stack pointer, the immediate imm was added in a subsequent instruction.
2175
2176         This was problematic when a signal handler was invoked before applying the immediate,
2177         when the stack pointer is still set to the temporary value. Avoid this by calculating src+imm in
2178         a temporary register and then move it in one go into the stack pointer.
2179
2180         * assembler/MacroAssemblerARMv7.h:
2181         (JSC::MacroAssemblerARMv7::add32):
2182
2183 2019-02-18  Mark Lam  <mark.lam@apple.com>
2184
2185         Fix DFG doesGC() for CompareEq/Less/LessEq/Greater/GreaterEq and CompareStrictEq nodes.
2186         https://bugs.webkit.org/show_bug.cgi?id=194800
2187         <rdar://problem/48183773>
2188
2189         Reviewed by Yusuke Suzuki.
2190
2191         Fix doesGC() for the following nodes:
2192
2193             CompareEq:
2194             CompareLess:
2195             CompareLessEq:
2196             CompareGreater:
2197             CompareGreaterEq:
2198             CompareStrictEq:
2199                 Only return false (i.e. does not GC) for child node use kinds that have
2200                 been vetted to not do anything that can GC.  For all other use kinds
2201                 (including StringUse and BigIntUse), we return true (i.e. does GC).
2202
2203         * dfg/DFGDoesGC.cpp:
2204         (JSC::DFG::doesGC):
2205
2206 2019-02-16  Darin Adler  <darin@apple.com>
2207
2208         Continue reducing use of String::format, now focusing on hex: "%p", "%x", etc.
2209         https://bugs.webkit.org/show_bug.cgi?id=194752
2210
2211         Reviewed by Daniel Bates.
2212
2213         * heap/HeapSnapshotBuilder.cpp:
2214         (JSC::HeapSnapshotBuilder::json): Added back the "0x" that was removed when changing
2215         this file to use appendUnsignedAsHex instead of "%p". The intent at that time was to
2216         keep behavior the same, so let's do that.
2217
2218         * parser/Lexer.cpp:
2219         (JSC::Lexer<T>::invalidCharacterMessage const): Use makeString and hex instead of
2220         String::format and "%04x".
2221
2222 2019-02-18  Yusuke Suzuki  <ysuzuki@apple.com>
2223
2224         [JSC] Add LazyClassStructure::getInitializedOnMainThread
2225         https://bugs.webkit.org/show_bug.cgi?id=194784
2226         <rdar://problem/48154820>
2227
2228         Reviewed by Mark Lam.
2229
2230         LazyClassStructure::get and LazyProperty::get functions do not allow compiler threads to call them. But for booleanPrototype, numberPrototype and symbolPrototype cases,
2231         we would like to call them from compiler threads. We eagerly initialize them if VM::canUseJIT() is true, so that compiler threads can safely call LazyClassStructure::get
2232         and LazyProperty::get for booleanPrototype, numberPrototype and symbolPrototype. But still assertion hits because the assertion requires that these functions need to be
2233         called in non compiler threads. Calling `getConcurrently()` is not possible since symbolPrototype() function is called from both the main thread and compiler threads,
2234         and we would like to lazily initialize SymbolPrototype object if it is called from the main thread, which can happen with non-JIT configuration.
2235
2236         This patch adds `getInitializedOnMainThread()`. Compiler threads can call it only when we know that the value is already initialized on the main thread. The main thread
2237         can call it at anytime and this function lazily initializes the value. This is useful to make some of prototypes lazy with non-JIT configuration: With non-JIT configuration,
2238         this function is always called from the main thread and it initializes the value lazily. Non-JIT configuration does not care about compiler threads since they do not exist.
2239         With JIT configuration, we eagerly initialize them in JSGlobalObject::init so that `getInitializedOnMainThread()` always succeeds.
2240
2241         Basically, `getInitializedOnMainThread()` is `get` with different assertion location: While `get` always crashes if it is called from compiler threads, `getInitializedOnMainThread()`
2242         crashes only when actual initialization happens on compiler threads. We do not merge them since `get` is still useful to find accidental initialization from compiler threads.
2243
2244         * runtime/JSGlobalObject.h:
2245         (JSC::JSGlobalObject::booleanPrototype const):
2246         (JSC::JSGlobalObject::numberPrototype const):
2247         (JSC::JSGlobalObject::symbolPrototype const):
2248         * runtime/LazyClassStructure.h:
2249         (JSC::LazyClassStructure::getInitializedOnMainThread const):
2250         (JSC::LazyClassStructure::prototypeInitializedOnMainThread const):
2251         (JSC::LazyClassStructure::constructorInitializedOnMainThread const):
2252         * runtime/LazyProperty.h:
2253         (JSC::LazyProperty::get const):
2254         (JSC::LazyProperty::getInitializedOnMainThread const):
2255
2256 2019-02-18  Joseph Pecoraro  <pecoraro@apple.com>
2257
2258         Web Inspector: Better categorize CPU usage per-thread / worker
2259         https://bugs.webkit.org/show_bug.cgi?id=194564
2260
2261         Reviewed by Devin Rousso.
2262
2263         * inspector/protocol/CPUProfiler.json:
2264         Add additional properties per-Event, and new per-Thread object info.
2265
2266 2019-02-18  Tadeu Zagallo  <tzagallo@apple.com>
2267
2268         Bytecode cache should a have a boot-specific validation
2269         https://bugs.webkit.org/show_bug.cgi?id=194769
2270         <rdar://problem/48149509>
2271
2272         Reviewed by Keith Miller.
2273
2274         Add the boot UUID to the cached bytecode to enforce that it is not reused
2275         across reboots.
2276
2277         * runtime/CachedTypes.cpp:
2278         (JSC::Encoder::malloc):
2279         (JSC::GenericCacheEntry::GenericCacheEntry):
2280         (JSC::GenericCacheEntry::tag const):
2281         (JSC::CacheEntry::CacheEntry):
2282         (JSC::CacheEntry::decode const):
2283         (JSC::GenericCacheEntry::decode const):
2284         (JSC::encodeCodeBlock):
2285
2286 2019-02-18  Eric Carlson  <eric.carlson@apple.com>
2287
2288         Add MSE logging configuration
2289         https://bugs.webkit.org/show_bug.cgi?id=194719
2290         <rdar://problem/48122151>
2291
2292         Reviewed by Joseph Pecoraro.
2293
2294         * inspector/ConsoleMessage.cpp:
2295         (Inspector::messageSourceValue):
2296         * inspector/protocol/Console.json:
2297         * inspector/scripts/codegen/generator.py:
2298         * runtime/ConsoleTypes.h:
2299
2300 2019-02-18  Tadeu Zagallo  <tzagallo@apple.com>
2301
2302         Add version number to cached bytecode
2303         https://bugs.webkit.org/show_bug.cgi?id=194768
2304         <rdar://problem/48147968>
2305
2306         Reviewed by Saam Barati.
2307
2308         Add a version number to the bytecode cache that should be unique per build.
2309
2310         * CMakeLists.txt:
2311         * DerivedSources-output.xcfilelist:
2312         * DerivedSources.make:
2313         * runtime/CachedTypes.cpp:
2314         (JSC::Encoder::malloc):
2315         (JSC::GenericCacheEntry::GenericCacheEntry):
2316         (JSC::CacheEntry::CacheEntry):
2317         (JSC::CacheEntry::encode):
2318         (JSC::CacheEntry::decode const):
2319         (JSC::GenericCacheEntry::decode const):
2320         (JSC::decodeCodeBlockImpl):
2321         * runtime/CodeCache.h:
2322         (JSC::CodeCacheMap::fetchFromDiskImpl):
2323
2324 2019-02-17  Saam Barati  <sbarati@apple.com>
2325
2326         WasmB3IRGenerator models some effects incorrectly
2327         https://bugs.webkit.org/show_bug.cgi?id=194038
2328
2329         Reviewed by Keith Miller.
2330
2331         * wasm/WasmB3IRGenerator.cpp:
2332         (JSC::Wasm::B3IRGenerator::restoreWasmContextInstance):
2333         (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState):
2334         These two functions were using global state instead of the
2335         arguments passed into the function.
2336
2337         (JSC::Wasm::B3IRGenerator::addOp<F64ConvertUI64>):
2338         (JSC::Wasm::B3IRGenerator::addOp<OpType::F32ConvertUI64>):
2339         (JSC::Wasm::B3IRGenerator::addOp<OpType::I64TruncUF64>):
2340         (JSC::Wasm::B3IRGenerator::addOp<OpType::I64TruncUF32>):
2341         Any patchpoint that allows scratch register usage must
2342         also say that it clobbers the scratch registers.
2343
2344 2019-02-17  Saam Barati  <sbarati@apple.com>
2345
2346         Deadlock when adding a Structure property transition and then doing incremental marking
2347         https://bugs.webkit.org/show_bug.cgi?id=194767
2348
2349         Reviewed by Mark Lam.
2350
2351         This can happen in the following scenario:
2352         
2353         You have a Structure S. S is on the mark stack. Then:
2354         1. S grabs its lock
2355         2. S adds a new property transition
2356         3. We find out we need to do some incremental marking
2357         4. We mark S
2358         5. visitChildren on S will try to grab its lock
2359         6. We are now in a deadlock
2360
2361         * heap/Heap.cpp:
2362         (JSC::Heap::performIncrement):
2363         * runtime/Structure.cpp:
2364         (JSC::Structure::addNewPropertyTransition):
2365
2366 2019-02-17  David Kilzer  <ddkilzer@apple.com>
2367
2368         Unreviewed, rolling out r241620.
2369
2370         "Causes use-after-free crashes running layout tests with ASan and GuardMalloc."
2371         (Requested by ddkilzer on #webkit.)
2372
2373         Reverted changeset:
2374
2375         "[WTF] Add environment variable helpers"
2376         https://bugs.webkit.org/show_bug.cgi?id=192405
2377         https://trac.webkit.org/changeset/241620
2378
2379 2019-02-17  Commit Queue  <commit-queue@webkit.org>
2380
2381         Unreviewed, rolling out r241612.
2382         https://bugs.webkit.org/show_bug.cgi?id=194762
2383
2384         "It regressed JetStream2 parsing tests by ~40%" (Requested by
2385         saamyjoon on #webkit).
2386
2387         Reverted changeset:
2388
2389         "Move bytecode cache-related filesystem code out of CodeCache"
2390         https://bugs.webkit.org/show_bug.cgi?id=194675
2391         https://trac.webkit.org/changeset/241612
2392
2393 2019-02-16  Yusuke Suzuki  <ysuzuki@apple.com>
2394
2395         [JSC] JSWrapperObject should not be destructible
2396         https://bugs.webkit.org/show_bug.cgi?id=194743
2397
2398         Reviewed by Saam Barati.
2399
2400         JSWrapperObject should be just a wrapper object for JSValue, thus, it should not be a JSDestructibleObject.
2401         Currently it is destructible object because DateInstance uses it. This patch changes Base of DateInstance from
2402         JSWrapperObject to JSDestructibleObject, and makes JSWrapperObject non-destructible.
2403
2404         * runtime/BigIntObject.cpp:
2405         (JSC::BigIntObject::BigIntObject):
2406         * runtime/BooleanConstructor.cpp:
2407         (JSC::BooleanConstructor::finishCreation):
2408         * runtime/BooleanObject.cpp:
2409         (JSC::BooleanObject::BooleanObject):
2410         * runtime/BooleanObject.h:
2411         * runtime/DateInstance.cpp:
2412         (JSC::DateInstance::DateInstance):
2413         (JSC::DateInstance::finishCreation):
2414         * runtime/DateInstance.h:
2415         * runtime/DatePrototype.cpp:
2416         (JSC::dateProtoFuncGetTime):
2417         (JSC::dateProtoFuncSetTime):
2418         (JSC::setNewValueFromTimeArgs):
2419         (JSC::setNewValueFromDateArgs):
2420         (JSC::dateProtoFuncSetYear):
2421         * runtime/JSCPoison.h:
2422         * runtime/JSWrapperObject.h:
2423         (JSC::JSWrapperObject::JSWrapperObject):
2424         * runtime/NumberObject.cpp:
2425         (JSC::NumberObject::NumberObject):
2426         * runtime/NumberObject.h:
2427         * runtime/StringConstructor.cpp:
2428         (JSC::StringConstructor::finishCreation):
2429         * runtime/StringObject.cpp:
2430         (JSC::StringObject::StringObject):
2431         * runtime/StringObject.h:
2432         (JSC::StringObject::internalValue const):
2433         * runtime/SymbolObject.cpp:
2434         (JSC::SymbolObject::SymbolObject):
2435         * runtime/SymbolObject.h:
2436
2437 2019-02-16  Yusuke Suzuki  <ysuzuki@apple.com>
2438
2439         [JSC] Shrink UnlinkedFunctionExecutable
2440         https://bugs.webkit.org/show_bug.cgi?id=194733
2441
2442         Reviewed by Mark Lam.
2443
2444         UnlinkedFunctionExecutable has sourceURLDirective and sourceMappingURLDirective. These
2445         directives can be found in the comment of non typical function's source code (Program,
2446         Eval code, and Global function from function constructor etc.), and tricky thing is that
2447         SourceProvider's directives are updated by Parser. The reason why we have these fields in
2448         UnlinkedFunctionExecutable is that we need to update the SourceProvider's directives even
2449         if we skip parsing by using CodeCache. These fields are effective only if (1)
2450         UnlinkedFunctionExecutable is for non typical function things, and (2) it has sourceURLDirective
2451         or sourceMappingURLDirective. This is rare enough to purge them to a separated
2452         UnlinkedFunctionExecutable::RareData to make UnlinkedFunctionExecutable small.
2453         sizeof(UnlinkedFunctionExecutable) is very important since it is super frequently allocated
2454         cell. Furthermore, the current JSC allocates two MarkedBlocks for UnlinkedFunctionExecutable
2455         in JSGlobalObject initialization, but the usage of the second MarkedBlock is quite low (8%).
2456         If we can reduce the size of UnlinkedFunctionExecutable, we can make them one MarkedBlock.
2457         Since UnlinkedFunctionExecutable is allocated from IsoSubspace, we do not need to fit it to
2458         one of size class.
2459
2460         This patch adds RareData to UnlinkedFunctionExecutable and move some rare datas into RareData.
2461         And kill one MarkedBlock allocation in JSC initialization phase.
2462
2463         * bytecode/UnlinkedFunctionExecutable.cpp:
2464         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2465         (JSC::UnlinkedFunctionExecutable::ensureRareDataSlow):
2466         * bytecode/UnlinkedFunctionExecutable.h:
2467         * debugger/DebuggerLocation.cpp:
2468         (JSC::DebuggerLocation::DebuggerLocation):
2469         * inspector/ScriptDebugServer.cpp:
2470         (Inspector::ScriptDebugServer::dispatchDidParseSource):
2471         * parser/Lexer.h:
2472         (JSC::Lexer::sourceURLDirective const):
2473         (JSC::Lexer::sourceMappingURLDirective const):
2474         (JSC::Lexer::sourceURL const): Deleted.
2475         (JSC::Lexer::sourceMappingURL const): Deleted.
2476         * parser/Parser.h:
2477         (JSC::Parser<LexerType>::parse):
2478         * parser/SourceProvider.h:
2479         (JSC::SourceProvider::sourceURLDirective const):
2480         (JSC::SourceProvider::sourceMappingURLDirective const):
2481         (JSC::SourceProvider::setSourceURLDirective):
2482         (JSC::SourceProvider::setSourceMappingURLDirective):
2483         (JSC::SourceProvider::sourceURL const): Deleted. We rename it from sourceURL to sourceURLDirective
2484         since it is the correct name.
2485         (JSC::SourceProvider::sourceMappingURL const): Deleted. We rename it from sourceMappingURL to
2486         sourceMappingURLDirective since it is the correct name.
2487         * runtime/CachedTypes.cpp:
2488         (JSC::CachedSourceProviderShape::encode):
2489         (JSC::CachedFunctionExecutableRareData::encode):
2490         (JSC::CachedFunctionExecutableRareData::decode const): CachedFunctionExecutable did not have
2491         sourceMappingURL to sourceMappingURLDirective. So this patch keeps the same logic.
2492         (JSC::CachedFunctionExecutable::rareData const):
2493         (JSC::CachedFunctionExecutable::encode):
2494         (JSC::CachedFunctionExecutable::decode const):
2495         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2496         * runtime/CodeCache.cpp:
2497         (JSC::CodeCache::getUnlinkedGlobalCodeBlock):
2498         (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
2499         * runtime/CodeCache.h:
2500         (JSC::generateUnlinkedCodeBlockImpl):
2501         * runtime/FunctionExecutable.h:
2502         * runtime/SamplingProfiler.cpp:
2503         (JSC::SamplingProfiler::StackFrame::url):
2504
2505 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2506
2507         [JSC] Remove unused global private variables
2508         https://bugs.webkit.org/show_bug.cgi?id=194741
2509
2510         Reviewed by Joseph Pecoraro.
2511
2512         There are some private functions and constants that are no longer referenced from builtin JS code.
2513         This patch cleans up them.
2514
2515         * builtins/BuiltinNames.h:
2516         * builtins/ObjectConstructor.js:
2517         (entries):
2518         * runtime/JSGlobalObject.cpp:
2519         (JSC::JSGlobalObject::init):
2520
2521 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2522
2523         [JSC] Lazily create empty RegExp
2524         https://bugs.webkit.org/show_bug.cgi?id=194735
2525
2526         Reviewed by Keith Miller.
2527
2528         Some scripts do not have any RegExp. In that case, allocating MarkedBlock for RegExp is costly.
2529         Previously, there was always one RegExp, "empty RegExp". This patch lazily creates it and drop
2530         one MarkedBlock.
2531
2532         * runtime/JSGlobalObject.cpp:
2533         (JSC::JSGlobalObject::init):
2534         * runtime/RegExpCache.cpp:
2535         (JSC::RegExpCache::ensureEmptyRegExpSlow):
2536         (JSC::RegExpCache::initialize): Deleted.
2537         * runtime/RegExpCache.h:
2538         (JSC::RegExpCache::ensureEmptyRegExp):
2539         (JSC::RegExpCache::emptyRegExp const): Deleted.
2540         * runtime/RegExpCachedResult.cpp:
2541         (JSC::RegExpCachedResult::lastResult):
2542         * runtime/RegExpCachedResult.h:
2543         * runtime/VM.cpp:
2544         (JSC::VM::VM):
2545
2546 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2547
2548         [JSC] Make builtin objects more lazily initialized under non-JIT mode
2549         https://bugs.webkit.org/show_bug.cgi?id=194727
2550
2551         Reviewed by Saam Barati.
2552
2553         Boolean, Symbol, and Number constructors and prototypes are initialized eagerly, but this is largely
2554         because concurrent compiler can touch NumberPrototype etc. when traversing object's prototypes. This
2555         means that eager initialization is not necessary under non-JIT mode. While we can investigate all the
2556         accesses to these prototypes from the concurrent compiler threads, this "lazily initialize under non-JIT"
2557         is safe and beneficial to non-JIT mode. This patch lazily initializes them under non-JIT mode, and
2558         drop some @Number references to avoid eager initialization. This removes some object allocations and 1
2559         MarkedBlock allocation just for Symbols.
2560
2561         * runtime/JSGlobalObject.cpp:
2562         (JSC::JSGlobalObject::init):
2563         (JSC::JSGlobalObject::visitChildren):
2564         * runtime/JSGlobalObject.h:
2565         (JSC::JSGlobalObject::numberToStringWatchpoint):
2566         (JSC::JSGlobalObject::booleanPrototype const):
2567         (JSC::JSGlobalObject::numberPrototype const):
2568         (JSC::JSGlobalObject::symbolPrototype const):
2569         (JSC::JSGlobalObject::booleanObjectStructure const):
2570         (JSC::JSGlobalObject::symbolObjectStructure const):
2571         (JSC::JSGlobalObject::numberObjectStructure const):
2572         (JSC::JSGlobalObject::stringObjectStructure const):
2573
2574 2019-02-15  Michael Saboff  <msaboff@apple.com>
2575
2576         RELEASE_ASSERT at com.apple.JavaScriptCore: JSC::jsSubstringOfResolved
2577         https://bugs.webkit.org/show_bug.cgi?id=194558
2578
2579         Reviewed by Saam Barati.
2580
2581         Added an in bounds check before the read of the next character for Unicode regular expressions
2582         for pattern generation that didn't already have such checks.
2583
2584         * yarr/YarrJIT.cpp:
2585         (JSC::Yarr::YarrGenerator::generatePatternCharacterOnce):
2586         (JSC::Yarr::YarrGenerator::generatePatternCharacterFixed):
2587         (JSC::Yarr::YarrGenerator::generateCharacterClassOnce):
2588         (JSC::Yarr::YarrGenerator::generateCharacterClassFixed):
2589
2590 2019-02-15  Dean Jackson  <dino@apple.com>
2591
2592         Allow emulation of user gestures from Web Inspector console
2593         https://bugs.webkit.org/show_bug.cgi?id=194725
2594         <rdar://problem/48126604>
2595
2596         Reviewed by Joseph Pecoraro and Devin Rousso.
2597
2598         * inspector/agents/InspectorRuntimeAgent.cpp: Add a new optional parameter, emulateUserGesture,
2599         to the evaluate function, and mark the function as override so that PageRuntimeAgent
2600         can change the behaviour.
2601         (Inspector::InspectorRuntimeAgent::evaluate):
2602         * inspector/agents/InspectorRuntimeAgent.h:
2603         * inspector/protocol/Runtime.json:
2604
2605 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2606
2607         [JSC] Do not initialize Wasm related data if Wasm is not enabled
2608         https://bugs.webkit.org/show_bug.cgi?id=194728
2609
2610         Reviewed by Mark Lam.
2611
2612         Under non-JIT mode, these data structures are unnecessary. Should not allocate extra memory for that.
2613
2614         * runtime/InitializeThreading.cpp:
2615         (JSC::initializeThreading):
2616         * runtime/JSLock.cpp:
2617         (JSC::JSLock::didAcquireLock):
2618
2619 2019-02-15  Ross Kirsling  <ross.kirsling@sony.com>
2620
2621         [WTF] Add environment variable helpers
2622         https://bugs.webkit.org/show_bug.cgi?id=192405
2623
2624         Reviewed by Michael Catanzaro.
2625
2626         * inspector/remote/glib/RemoteInspectorGlib.cpp:
2627         (Inspector::RemoteInspector::RemoteInspector):
2628         (Inspector::RemoteInspector::start):
2629         * jsc.cpp:
2630         (startTimeoutThreadIfNeeded):
2631         * runtime/Options.cpp:
2632         (JSC::overrideOptionWithHeuristic):
2633         (JSC::Options::overrideAliasedOptionWithHeuristic):
2634         (JSC::Options::initialize):
2635         * runtime/VM.cpp:
2636         (JSC::enableAssembler):
2637         (JSC::VM::VM):
2638         * tools/CodeProfiling.cpp:
2639         (JSC::CodeProfiling::notifyAllocator):
2640         Utilize WTF::Environment where possible.
2641
2642 2019-02-15  Mark Lam  <mark.lam@apple.com>
2643
2644         SamplingProfiler::stackTracesAsJSON() should escape strings.
2645         https://bugs.webkit.org/show_bug.cgi?id=194649
2646         <rdar://problem/48072386>
2647
2648         Reviewed by Saam Barati.
2649
2650         Ditto for TypeSet::toJSONString() and TypeSet::toJSONString().
2651
2652         * runtime/SamplingProfiler.cpp:
2653         (JSC::SamplingProfiler::stackTracesAsJSON):
2654         * runtime/TypeSet.cpp:
2655         (JSC::TypeSet::toJSONString const):
2656         (JSC::StructureShape::toJSONString const):
2657
2658 2019-02-15  Robin Morisset  <rmorisset@apple.com>
2659
2660         CodeBlock::jettison should clear related watchpoints
2661         https://bugs.webkit.org/show_bug.cgi?id=194544
2662
2663         Reviewed by Mark Lam.
2664
2665         * bytecode/CodeBlock.cpp:
2666         (JSC::CodeBlock::jettison):
2667         * dfg/DFGCommonData.h:
2668         (JSC::DFG::CommonData::clearWatchpoints): Added.
2669         * dfg/CommonData.cpp:
2670         (JSC::DFG::CommonData::clearWatchpoints): Added.
2671
2672 2019-02-15  Tadeu Zagallo  <tzagallo@apple.com>
2673
2674         Move bytecode cache-related filesystem code out of CodeCache
2675         https://bugs.webkit.org/show_bug.cgi?id=194675
2676
2677         Reviewed by Saam Barati.
2678
2679         That code is only used for the bytecode-cache tests, so it should live in
2680         jsc.cpp rather than in the CodeCache.
2681
2682         * jsc.cpp:
2683         (CliSourceProvider::create):
2684         (CliSourceProvider::~CliSourceProvider):
2685         (CliSourceProvider::cachePath const):
2686         (CliSourceProvider::loadBytecode):
2687         (CliSourceProvider::CliSourceProvider):
2688         (jscSource):
2689         (GlobalObject::moduleLoaderFetch):
2690         (functionDollarEvalScript):
2691         (runWithOptions):
2692         * parser/SourceProvider.h:
2693         (JSC::SourceProvider::cacheBytecode const):
2694         * runtime/CodeCache.cpp:
2695         (JSC::writeCodeBlock):
2696         * runtime/CodeCache.h:
2697         (JSC::CodeCacheMap::fetchFromDiskImpl):
2698
2699 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2700
2701         [JSC] DFG, FTL, and Wasm worklist creation should be fenced
2702         https://bugs.webkit.org/show_bug.cgi?id=194714
2703
2704         Reviewed by Mark Lam.
2705
2706         Let's consider about the following extreme case.
2707
2708         1. VM (A) is created.
2709         2. Another VM (B) is created on a different thread.
2710         3. (A) is being destroyed. It calls DFG::existingWorklistForIndexOrNull in a destructor.
2711         4. At the same time, (B) starts using DFG Worklist and it is instantiated in call_once.
2712         5. But (A) reads the pointer directly through DFG::existingWorklistForIndexOrNull.
2713         6. (A) sees the half-baked worklist, which may be in the middle of creation.
2714
2715         This patch puts store-store fence just before putting a pointer to a global variable.
2716         This fence is executed only three times at most, for DFG, FTL, and Wasm worklist initializations.
2717
2718         * dfg/DFGWorklist.cpp:
2719         (JSC::DFG::ensureGlobalDFGWorklist):
2720         (JSC::DFG::ensureGlobalFTLWorklist):
2721         * wasm/WasmWorklist.cpp:
2722         (JSC::Wasm::ensureWorklist):
2723
2724 2019-02-15  Commit Queue  <commit-queue@webkit.org>
2725
2726         Unreviewed, rolling out r241559 and r241566.
2727         https://bugs.webkit.org/show_bug.cgi?id=194710
2728
2729         Causes layout test crashes under GuardMalloc (Requested by
2730         ryanhaddad on #webkit).
2731
2732         Reverted changesets:
2733
2734         "[WTF] Add environment variable helpers"
2735         https://bugs.webkit.org/show_bug.cgi?id=192405
2736         https://trac.webkit.org/changeset/241559
2737
2738         "Unreviewed build fix for WinCairo Debug after r241559."
2739         https://trac.webkit.org/changeset/241566
2740
2741 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2742
2743         [JSC] Do not even allocate JIT worklists in non-JIT mode
2744         https://bugs.webkit.org/show_bug.cgi?id=194693
2745
2746         Reviewed by Mark Lam.
2747
2748         Heap always allocates JIT worklists for Baseline, DFG, and FTL. While they do not have actual threads, Worklist itself already allocates some memory.
2749         And we do not perform any GC operations that are only meaningful in JIT environment.
2750
2751         1. We add VM::canUseJIT() check in Heap's ensureXXXWorklist things to prevent them from being allocated.
2752         2. We remove DFG marking constraint in non-JIT mode.
2753         3. We do not gather conservative roots from scratch buffers under the non-JIT mode (BTW, # of scratch buffers are always zero in non-JIT mode)
2754         4. We do not visit JITStubRoutineSet.
2755         5. Align JITWorklist function names to the other worklists.
2756
2757         * dfg/DFGOSRExitPreparation.cpp:
2758         (JSC::DFG::prepareCodeOriginForOSRExit):
2759         * dfg/DFGPlan.h:
2760         * dfg/DFGWorklist.cpp:
2761         (JSC::DFG::markCodeBlocks): Deleted.
2762         * dfg/DFGWorklist.h:
2763         * heap/Heap.cpp:
2764         (JSC::Heap::completeAllJITPlans):
2765         (JSC::Heap::iterateExecutingAndCompilingCodeBlocks):
2766         (JSC::Heap::gatherScratchBufferRoots):
2767         (JSC::Heap::removeDeadCompilerWorklistEntries):
2768         (JSC::Heap::stopThePeriphery):
2769         (JSC::Heap::suspendCompilerThreads):
2770         (JSC::Heap::resumeCompilerThreads):
2771         (JSC::Heap::addCoreConstraints):
2772         * jit/JITWorklist.cpp:
2773         (JSC::JITWorklist::existingGlobalWorklistOrNull):
2774         (JSC::JITWorklist::ensureGlobalWorklist):
2775         (JSC::JITWorklist::instance): Deleted.
2776         * jit/JITWorklist.h:
2777         * llint/LLIntSlowPaths.cpp:
2778         (JSC::LLInt::jitCompileAndSetHeuristics):
2779         * runtime/VM.cpp:
2780         (JSC::VM::~VM):
2781         (JSC::VM::gatherScratchBufferRoots):
2782         (JSC::VM::gatherConservativeRoots): Deleted.
2783         * runtime/VM.h:
2784
2785 2019-02-15  Saam barati  <sbarati@apple.com>
2786
2787         [WebAssembly] Write a new register allocator for Air O0 and make BBQ use it
2788         https://bugs.webkit.org/show_bug.cgi?id=194036
2789
2790         Reviewed by Yusuke Suzuki.
2791
2792         This patch adds a new Air-O0 backend. Air-O0 runs fewer passes and doesn't
2793         use linear scan for register allocation. Instead of linear scan, Air-O0 does
2794         mostly block-local register allocation, and it does this as it's emitting
2795         code directly. The register allocator uses liveness analysis to reduce
2796         the number of spills. Doing register allocation as we're emitting code
2797         allows us to skip editing the IR to insert spills, which saves a non trivial
2798         amount of compile time. For stack allocation, we give each Tmp its own slot.
2799         This is less than ideal. We probably want to do some trivial live range analysis
2800         in the future. The reason this isn't a deal breaker for Wasm is that this patch
2801         makes it so that we reuse Tmps as we're generating Air IR in the AirIRGenerator.
2802         Because Wasm is a stack machine, we trivially know when we kill a stack value (its last use).
2803         
2804         This patch is another 25% Wasm startup time speedup. It seems to be worth
2805         another 1% on JetStream2.
2806
2807         * JavaScriptCore.xcodeproj/project.pbxproj:
2808         * Sources.txt:
2809         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp: Added.
2810         (JSC::B3::Air::GenerateAndAllocateRegisters::GenerateAndAllocateRegisters):
2811         (JSC::B3::Air::GenerateAndAllocateRegisters::buildLiveRanges):
2812         (JSC::B3::Air::GenerateAndAllocateRegisters::insertBlocksForFlushAfterTerminalPatchpoints):
2813         (JSC::B3::Air::callFrameAddr):
2814         (JSC::B3::Air::GenerateAndAllocateRegisters::flush):
2815         (JSC::B3::Air::GenerateAndAllocateRegisters::spill):
2816         (JSC::B3::Air::GenerateAndAllocateRegisters::alloc):
2817         (JSC::B3::Air::GenerateAndAllocateRegisters::freeDeadTmpsIfNeeded):
2818         (JSC::B3::Air::GenerateAndAllocateRegisters::assignTmp):
2819         (JSC::B3::Air::GenerateAndAllocateRegisters::isDisallowedRegister):
2820         (JSC::B3::Air::GenerateAndAllocateRegisters::prepareForGeneration):
2821         (JSC::B3::Air::GenerateAndAllocateRegisters::generate):
2822         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.h: Added.
2823         * b3/air/AirCode.cpp:
2824         * b3/air/AirCode.h:
2825         * b3/air/AirGenerate.cpp:
2826         (JSC::B3::Air::prepareForGeneration):
2827         (JSC::B3::Air::generateWithAlreadyAllocatedRegisters):
2828         (JSC::B3::Air::generate):
2829         * b3/air/AirHandleCalleeSaves.cpp:
2830         (JSC::B3::Air::handleCalleeSaves):
2831         * b3/air/AirHandleCalleeSaves.h:
2832         * b3/air/AirTmpMap.h:
2833         * runtime/Options.h:
2834         * wasm/WasmAirIRGenerator.cpp:
2835         (JSC::Wasm::AirIRGenerator::didKill):
2836         (JSC::Wasm::AirIRGenerator::newTmp):
2837         (JSC::Wasm::AirIRGenerator::AirIRGenerator):
2838         (JSC::Wasm::parseAndCompileAir):
2839         (JSC::Wasm::AirIRGenerator::addOp<OpType::I64TruncUF64>):
2840         (JSC::Wasm::AirIRGenerator::addOp<OpType::I64TruncUF32>):
2841         * wasm/WasmAirIRGenerator.h:
2842         * wasm/WasmB3IRGenerator.cpp:
2843         (JSC::Wasm::B3IRGenerator::didKill):
2844         * wasm/WasmBBQPlan.cpp:
2845         (JSC::Wasm::BBQPlan::compileFunctions):
2846         * wasm/WasmFunctionParser.h:
2847         (JSC::Wasm::FunctionParser<Context>::parseBody):
2848         (JSC::Wasm::FunctionParser<Context>::parseExpression):
2849         * wasm/WasmValidate.cpp:
2850         (JSC::Wasm::Validate::didKill):
2851
2852 2019-02-14  Saam barati  <sbarati@apple.com>
2853
2854         lowerStackArgs should lower Lea32/64 on ARM64 to Add
2855         https://bugs.webkit.org/show_bug.cgi?id=194656
2856
2857         Reviewed by Yusuke Suzuki.
2858
2859         On arm64, Lea is just implemented as an add. However, Air treats it as an
2860         address with a given width. Because of this width, we were incorrectly
2861         computing whether or not this immediate could fit into the instruction itself
2862         or it needed to be explicitly put into a register. This patch makes
2863         AirLowerStackArgs lower Lea to Add on arm64.
2864
2865         * b3/air/AirLowerStackArgs.cpp:
2866         (JSC::B3::Air::lowerStackArgs):
2867         * b3/air/AirOpcode.opcodes:
2868         * b3/air/testair.cpp:
2869
2870 2019-02-14  Saam Barati  <sbarati@apple.com>
2871
2872         Cache the results of BytecodeGenerator::getVariablesUnderTDZ
2873         https://bugs.webkit.org/show_bug.cgi?id=194583
2874         <rdar://problem/48028140>
2875
2876         Reviewed by Yusuke Suzuki.
2877
2878         This patch makes it so that getVariablesUnderTDZ caches a result of
2879         CompactVariableMap::Handle. getVariablesUnderTDZ is costly when
2880         it's called in an environment where there are a lot of variables.
2881         This patch makes it so we cache its results. This is profitable when
2882         getVariablesUnderTDZ is called repeatedly with the same environment
2883         state. This is common since we call this every time we encounter a
2884         function definition/expression node.
2885
2886         * builtins/BuiltinExecutables.cpp:
2887         (JSC::BuiltinExecutables::createExecutable):
2888         * bytecode/UnlinkedFunctionExecutable.cpp:
2889         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2890         * bytecode/UnlinkedFunctionExecutable.h:
2891         * bytecompiler/BytecodeGenerator.cpp:
2892         (JSC::BytecodeGenerator::popLexicalScopeInternal):
2893         (JSC::BytecodeGenerator::liftTDZCheckIfPossible):
2894         (JSC::BytecodeGenerator::pushTDZVariables):
2895         (JSC::BytecodeGenerator::getVariablesUnderTDZ):
2896         (JSC::BytecodeGenerator::restoreTDZStack):
2897         * bytecompiler/BytecodeGenerator.h:
2898         (JSC::BytecodeGenerator::makeFunction):
2899         * parser/VariableEnvironment.cpp:
2900         (JSC::CompactVariableMap::Handle::Handle):
2901         (JSC::CompactVariableMap::Handle::operator=):
2902         * parser/VariableEnvironment.h:
2903         (JSC::CompactVariableMap::Handle::operator bool const):
2904         * runtime/CodeCache.cpp:
2905         (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
2906
2907 2019-02-14  Yusuke Suzuki  <ysuzuki@apple.com>
2908
2909         [JSC] Non-JIT entrypoints should share NativeJITCode per entrypoint type
2910         https://bugs.webkit.org/show_bug.cgi?id=194659
2911
2912         Reviewed by Mark Lam.
2913
2914         Non-JIT entrypoints create NativeJITCode every time it is called. But it is meaningless since these entry point code are identical.
2915         We should create one per entrypoint type (for function, we should have CodeForCall and CodeForConstruct) and continue to use them.
2916         And we use NativeJITCode instead of DirectJITCode if it does not have difference between usual entrypoint and arity check entrypoint.
2917
2918         * dfg/DFGJITCode.h:
2919         * dfg/DFGJITFinalizer.cpp:
2920         (JSC::DFG::JITFinalizer::finalize):
2921         (JSC::DFG::JITFinalizer::finalizeFunction):
2922         * jit/JITCode.cpp:
2923         (JSC::DirectJITCode::initializeCodeRefForDFG):
2924         (JSC::DirectJITCode::initializeCodeRef): Deleted.
2925         (JSC::NativeJITCode::initializeCodeRef): Deleted.
2926         * jit/JITCode.h:
2927         * llint/LLIntEntrypoint.cpp:
2928         (JSC::LLInt::setFunctionEntrypoint):
2929         (JSC::LLInt::setEvalEntrypoint):
2930         (JSC::LLInt::setProgramEntrypoint):
2931         (JSC::LLInt::setModuleProgramEntrypoint): Retagged is removed since the tag is the same.
2932
2933 2019-02-14  Ross Kirsling  <ross.kirsling@sony.com>
2934
2935         [WTF] Add environment variable helpers
2936         https://bugs.webkit.org/show_bug.cgi?id=192405
2937
2938         Reviewed by Michael Catanzaro.
2939
2940         * inspector/remote/glib/RemoteInspectorGlib.cpp:
2941         (Inspector::RemoteInspector::RemoteInspector):
2942         (Inspector::RemoteInspector::start):
2943         * jsc.cpp:
2944         (startTimeoutThreadIfNeeded):
2945         * runtime/Options.cpp:
2946         (JSC::overrideOptionWithHeuristic):
2947         (JSC::Options::overrideAliasedOptionWithHeuristic):
2948         (JSC::Options::initialize):
2949         * runtime/VM.cpp:
2950         (JSC::enableAssembler):
2951         (JSC::VM::VM):
2952         * tools/CodeProfiling.cpp:
2953         (JSC::CodeProfiling::notifyAllocator):
2954         Utilize WTF::Environment where possible.
2955
2956 2019-02-14  Yusuke Suzuki  <ysuzuki@apple.com>
2957
2958         [JSC] Should have default NativeJITCode
2959         https://bugs.webkit.org/show_bug.cgi?id=194634
2960
2961         Reviewed by Mark Lam.
2962
2963         In JSC_useJIT=false mode, we always create identical NativeJITCode for call and construct when we create NativeExecutable.
2964         This is meaningless since we do not modify NativeJITCode after the creation. This patch adds singleton used as a default one.
2965         Since NativeJITCode (& JITCode) is ThreadSafeRefCounted, we can just share it in a whole process level. This removes 446 NativeJITCode
2966         allocations, which takes 14KB.
2967
2968         * runtime/VM.cpp:
2969         (JSC::jitCodeForCallTrampoline):
2970         (JSC::jitCodeForConstructTrampoline):
2971         (JSC::VM::getHostFunction):
2972
2973 2019-02-14  Tadeu Zagallo  <tzagallo@apple.com>
2974
2975         generateUnlinkedCodeBlockForFunctions shouldn't need to create a FunctionExecutable just to get its source code
2976         https://bugs.webkit.org/show_bug.cgi?id=194576
2977
2978         Reviewed by Saam Barati.
2979
2980         Extract a new function, `linkedSourceCode` from UnlinkedFunctionExecutable::link
2981         and use it in `generateUnlinkedCodeBlockForFunctions` instead.
2982
2983         * bytecode/UnlinkedFunctionExecutable.cpp:
2984         (JSC::UnlinkedFunctionExecutable::linkedSourceCode const):
2985         (JSC::UnlinkedFunctionExecutable::link):
2986         * bytecode/UnlinkedFunctionExecutable.h:
2987         * runtime/CodeCache.cpp:
2988         (JSC::generateUnlinkedCodeBlockForFunctions):
2989
2990 2019-02-14  Tadeu Zagallo  <tzagallo@apple.com>
2991
2992         CachedBitVector's size must be converted from bits to bytes
2993         https://bugs.webkit.org/show_bug.cgi?id=194441
2994
2995         Reviewed by Saam Barati.
2996
2997         CachedBitVector used its size in bits for memcpy. That didn't cause any
2998         issues when encoding, since the size in bits was also used in the allocation,
2999         but would overflow the actual BitVector buffer when decoding.
3000
3001         * runtime/CachedTypes.cpp:
3002         (JSC::CachedBitVector::encode):
3003         (JSC::CachedBitVector::decode const):
3004
3005 2019-02-13  Brian Burg  <bburg@apple.com>
3006
3007         Web Inspector: don't include accessibility role in DOM.Node object payloads
3008         https://bugs.webkit.org/show_bug.cgi?id=194623
3009         <rdar://problem/36384037>
3010
3011         Reviewed by Devin Rousso.
3012
3013         Remove property of DOM.Node that is no longer being sent.
3014
3015         * inspector/protocol/DOM.json:
3016
3017 2019-02-13  Keith Miller  <keith_miller@apple.com> and Yusuke Suzuki  <ysuzuki@apple.com>
3018
3019         We should only make rope strings when concatenating strings long enough.
3020         https://bugs.webkit.org/show_bug.cgi?id=194465
3021
3022         Reviewed by Mark Lam.
3023
3024         This patch stops us from allocating a rope string if the resulting
3025         rope would be smaller than the size of the JSRopeString object we
3026         would need to allocate.
3027
3028         This patch also adds paths so that we don't unnecessarily allocate
3029         JSString cells for primitives we are going to concatenate with a
3030         string anyway.
3031
3032         The important change from the previous one is that we do not apply
3033         the above rule to JSRopeStrings generated by JSStrings. If we convert
3034         it to JSString, comparison of memory consumption becomes the following,
3035         because JSRopeString does not have StringImpl until it is resolved.
3036
3037             sizeof(JSRopeString) v.s. sizeof(JSString) + sizeof(StringImpl) + content
3038
3039         Since sizeof(JSString) + sizeof(StringImpl) is larger than sizeof(JSRopeString),
3040         resolving eagerly increases memory footprint. The point is that we need to
3041         account newly created JSString and JSRopeString from the operands. This is the
3042         reason why this patch adds different thresholds for each jsString functions.
3043
3044         This patch also avoids concatenation for ropes conservatively. Many ropes are
3045         temporary cells. So we do not resolve eagerly if one of operands is already a
3046         rope.
3047
3048         In CLI execution, this change is performance neutral in JetStream2 (run 6 times, 1 for warming up and average in latter 5.).
3049
3050             Before: 159.3778
3051             After:  160.72340000000003
3052
3053         * dfg/DFGOperations.cpp:
3054         * runtime/CommonSlowPaths.cpp:
3055         (JSC::SLOW_PATH_DECL):
3056         * runtime/JSString.h:
3057         (JSC::JSString::isRope const):
3058         * runtime/Operations.cpp:
3059         (JSC::jsAddSlowCase):
3060         * runtime/Operations.h:
3061         (JSC::jsString):
3062         (JSC::jsAddNonNumber):
3063         (JSC::jsAdd):
3064
3065 2019-02-13  Saam Barati  <sbarati@apple.com>
3066
3067         AirIRGenerator::addSwitch switch patchpoint needs to model clobbering the scratch register
3068         https://bugs.webkit.org/show_bug.cgi?id=194610
3069
3070         Reviewed by Michael Saboff.
3071
3072         BinarySwitch might use the scratch register. We must model the
3073         effects of that properly. This is already caught by our br-table
3074         tests on arm64.
3075
3076         * wasm/WasmAirIRGenerator.cpp:
3077         (JSC::Wasm::AirIRGenerator::addSwitch):
3078
3079 2019-02-13  Mark Lam  <mark.lam@apple.com>
3080
3081         Create a randomized free list for new StructureIDs on StructureIDTable resize.
3082         https://bugs.webkit.org/show_bug.cgi?id=194566
3083         <rdar://problem/47975502>
3084
3085         Reviewed by Michael Saboff.
3086
3087         Also isolate 32-bit implementation of StructureIDTable out more so the 64-bit
3088         implementation is a little easier to read.
3089
3090         This patch appears to be perf neutral on JetStream2 (as run from the command line).
3091
3092         * runtime/StructureIDTable.cpp:
3093         (JSC::StructureIDTable::StructureIDTable):
3094         (JSC::StructureIDTable::makeFreeListFromRange):
3095         (JSC::StructureIDTable::resize):
3096         (JSC::StructureIDTable::allocateID):
3097         (JSC::StructureIDTable::deallocateID):
3098         * runtime/StructureIDTable.h:
3099         (JSC::StructureIDTable::get):
3100         (JSC::StructureIDTable::deallocateID):
3101         (JSC::StructureIDTable::allocateID):
3102         (JSC::StructureIDTable::flushOldTables):
3103
3104 2019-02-13  Tadeu Zagallo  <tzagallo@apple.com>
3105
3106         VariableLengthObject::allocate<T> should initialize objects
3107         https://bugs.webkit.org/show_bug.cgi?id=194534
3108
3109         Reviewed by Michael Saboff.
3110
3111         `buffer()` should not be called for empty VariableLengthObjects, but
3112         these cases were not being caught due to the objects not being properly
3113         initialized. Fix it so that allocate calls the constructor and fix the
3114         assertion failues.
3115
3116         * runtime/CachedTypes.cpp:
3117         (JSC::CachedObject::operator new):
3118         (JSC::VariableLengthObject::allocate):
3119         (JSC::CachedVector::encode):
3120         (JSC::CachedVector::decode const):
3121         (JSC::CachedUniquedStringImpl::decode const):
3122         (JSC::CachedBitVector::encode):
3123         (JSC::CachedBitVector::decode const):
3124         (JSC::CachedArray::encode):
3125         (JSC::CachedArray::decode const):
3126         (JSC::CachedImmutableButterfly::CachedImmutableButterfly):
3127         (JSC::CachedBigInt::decode const):
3128
3129 2019-02-13  Tadeu Zagallo  <tzagallo@apple.com>
3130
3131         CodeBlocks read from disk should not be re-written
3132         https://bugs.webkit.org/show_bug.cgi?id=194535
3133
3134         Reviewed by Michael Saboff.
3135
3136         Keep track of which CodeBlocks have been read from disk or have already
3137         been serialized in CodeCache.
3138
3139         * runtime/CodeCache.cpp:
3140         (JSC::CodeCache::write):
3141         * runtime/CodeCache.h:
3142         (JSC::SourceCodeValue::SourceCodeValue):
3143         (JSC::CodeCacheMap::fetchFromDiskImpl):
3144
3145 2019-02-13  Tadeu Zagallo  <tzagallo@apple.com>
3146
3147         SourceCode should be copied when generating bytecode for functions
3148         https://bugs.webkit.org/show_bug.cgi?id=194536
3149
3150         Reviewed by Saam Barati.
3151
3152         The FunctionExecutable might be collected while generating the bytecode
3153         for nested functions, in which case the SourceCode reference would no
3154         longer be valid.
3155
3156         * runtime/CodeCache.cpp:
3157         (JSC::generateUnlinkedCodeBlockForFunctions):
3158
3159 2019-02-12  Saam barati  <sbarati@apple.com>
3160
3161         JSScript needs to retain its cache path NSURL*
3162         https://bugs.webkit.org/show_bug.cgi?id=194577
3163
3164         Reviewed by Tim Horton.
3165
3166         * API/JSScript.mm:
3167         (+[JSScript scriptFromASCIIFile:inVirtualMachine:withCodeSigning:andBytecodeCache:]):
3168         (-[JSScript dealloc]):
3169
3170 2019-02-12  Robin Morisset  <rmorisset@apple.com>
3171
3172         Make B3Value::returnsBool() more precise
3173         https://bugs.webkit.org/show_bug.cgi?id=194457
3174
3175         Reviewed by Saam Barati.
3176
3177         It is currently used repeatedly in B3ReduceStrength, as well as once in B3LowerToAir.
3178         It has a needlessly complex rule for BitAnd, and has no rule for other easy cases such as BitOr or Select.
3179         No new tests added as this should be indirectly tested by the already existing tests.
3180
3181         * b3/B3Value.cpp:
3182         (JSC::B3::Value::returnsBool const):
3183
3184 2019-02-12  Michael Catanzaro  <mcatanzaro@igalia.com>
3185
3186         Unreviewed, fix -Wimplicit-fallthrough warning after r241140
3187         https://bugs.webkit.org/show_bug.cgi?id=194399
3188         <rdar://problem/47889777>
3189
3190         * dfg/DFGDoesGC.cpp:
3191         (JSC::DFG::doesGC):
3192
3193 2019-02-12  Michael Catanzaro  <mcatanzaro@igalia.com>
3194
3195         [WPE][GTK] Unsafe g_unsetenv() use in WebProcessPool::platformInitialize
3196         https://bugs.webkit.org/show_bug.cgi?id=194370
3197
3198         Reviewed by Darin Adler.
3199
3200         Change a couple WTFLogAlways to use g_warning, for good measure. Of course this isn't
3201         necessary, but it will make errors more visible.
3202
3203         * inspector/remote/glib/RemoteInspectorGlib.cpp:
3204         (Inspector::RemoteInspector::start):
3205         (Inspector::dbusConnectionCallAsyncReadyCallback):
3206         * inspector/remote/glib/RemoteInspectorServer.cpp:
3207         (Inspector::RemoteInspectorServer::start):
3208
3209 2019-02-12  Andy Estes  <aestes@apple.com>
3210
3211         [iOSMac] Enable Parental Controls Content Filtering
3212         https://bugs.webkit.org/show_bug.cgi?id=194521
3213         <rdar://39732376>
3214
3215         Reviewed by Tim Horton.
3216
3217         * Configurations/FeatureDefines.xcconfig:
3218
3219 2019-02-11  Mark Lam  <mark.lam@apple.com>
3220
3221         Randomize insertion of deallocated StructureIDs into the StructureIDTable's free list.
3222         https://bugs.webkit.org/show_bug.cgi?id=194512
3223         <rdar://problem/47975465>
3224
3225         Reviewed by Yusuke Suzuki.
3226
3227         * runtime/StructureIDTable.cpp:
3228         (JSC::StructureIDTable::StructureIDTable):
3229         (JSC::StructureIDTable::allocateID):
3230         (JSC::StructureIDTable::deallocateID):
3231         * runtime/StructureIDTable.h:
3232
3233 2019-02-10  Mark Lam  <mark.lam@apple.com>
3234
3235         Remove the RELEASE_ASSERT check for duplicate cases in the BinarySwitch constructor.
3236         https://bugs.webkit.org/show_bug.cgi?id=194493
3237         <rdar://problem/36380852>
3238
3239         Reviewed by Yusuke Suzuki.
3240
3241         Having duplicate cases in the BinarySwitch is not a correctness issue.  It is
3242         however not good for performance and memory usage.  As such, a debug ASSERT will
3243         do.  We'll also do an audit of the clients of BinarySwitch to see if it's
3244         possible to be instantiated with duplicate cases in
3245         https://bugs.webkit.org/show_bug.cgi?id=194492 later.
3246
3247         Also added some value dumps to the RELEASE_ASSERT to help debug the issue when we
3248         see duplicate cases.
3249
3250         * jit/BinarySwitch.cpp:
3251         (JSC::BinarySwitch::BinarySwitch):
3252
3253 2019-02-10  Darin Adler  <darin@apple.com>
3254
3255         Switch uses of StringBuilder with String::format for hex numbers to use HexNumber.h instead
3256         https://bugs.webkit.org/show_bug.cgi?id=194485
3257
3258         Reviewed by Daniel Bates.
3259
3260         * heap/HeapSnapshotBuilder.cpp:
3261         (JSC::HeapSnapshotBuilder::json): Use appendUnsignedAsHex along with
3262         reinterpret_cast<uintptr_t> to replace uses of String::format with "%p".
3263
3264         * runtime/JSGlobalObjectFunctions.cpp:
3265         (JSC::encode): Removed some unneeded casts in StringBuilder code,
3266         including one in a call to appendByteAsHex.
3267         (JSC::globalFuncEscape): Ditto.
3268
3269 2019-02-10  Commit Queue  <commit-queue@webkit.org>
3270
3271         Unreviewed, rolling out r241230.
3272         https://bugs.webkit.org/show_bug.cgi?id=194488
3273
3274         "It regressed JetStream2 by ~6%" (Requested by saamyjoon on
3275         #webkit).
3276
3277         Reverted changeset:
3278
3279         "We should only make rope strings when concatenating strings
3280         long enough."
3281         https://bugs.webkit.org/show_bug.cgi?id=194465
3282         https://trac.webkit.org/changeset/241230
3283
3284 2019-02-10  Saam barati  <sbarati@apple.com>
3285
3286         BBQ-Air: Emit better code for switch
3287         https://bugs.webkit.org/show_bug.cgi?id=194053
3288
3289         Reviewed by Yusuke Suzuki.
3290
3291         Instead of emitting a linear set of jumps for Switch, this patch
3292         makes the BBQ-Air backend emit a binary switch.
3293
3294         * wasm/WasmAirIRGenerator.cpp:
3295         (JSC::Wasm::AirIRGenerator::addSwitch):
3296
3297 2019-02-09  Yusuke Suzuki  <ysuzuki@apple.com>
3298
3299         Unreviewed, Lexer should use isLatin1 implementation in WTF
3300         https://bugs.webkit.org/show_bug.cgi?id=194466
3301
3302         Follow-up after r241233 pointed by Darin.
3303
3304         * parser/Lexer.cpp:
3305         (JSC::isLatin1): Deleted.
3306
3307 2019-02-09  Darin Adler  <darin@apple.com>
3308
3309         Eliminate unnecessary String temporaries by using StringConcatenateNumbers
3310         https://bugs.webkit.org/show_bug.cgi?id=194021
3311
3312         Reviewed by Geoffrey Garen.
3313
3314         * inspector/agents/InspectorConsoleAgent.cpp:
3315         (Inspector::InspectorConsoleAgent::count): Remove String::number and let
3316         makeString do the conversion without allocating/destroying a String.
3317         * inspector/agents/InspectorDebuggerAgent.cpp:
3318         (Inspector::objectGroupForBreakpointAction): Ditto.
3319         (Inspector::InspectorDebuggerAgent::setBreakpointByUrl): Ditto.
3320         (Inspector::InspectorDebuggerAgent::setBreakpoint): Ditto.
3321         * runtime/JSGenericTypedArrayViewInlines.h:
3322         (JSC::JSGenericTypedArrayView<Adaptor>::defineOwnProperty): Ditto.
3323         * runtime/NumberPrototype.cpp:
3324         (JSC::numberProtoFuncToFixed): Use String::numberToStringFixedWidth instead
3325         of calling numberToFixedWidthString to do the same thing.
3326         (JSC::numberProtoFuncToPrecision): Use String::number instead of calling
3327         numberToFixedPrecisionString to do the same thing.
3328         * runtime/SamplingProfiler.cpp:
3329         (JSC::SamplingProfiler::reportTopFunctions): Ditto.
3330
3331 2019-02-09  Yusuke Suzuki  <ysuzuki@apple.com>
3332
3333         Unreviewed, rolling in r241237 again
3334         https://bugs.webkit.org/show_bug.cgi?id=194469
3335
3336         * runtime/JSString.h:
3337         (JSC::jsSubstring):
3338
3339 2019-02-09  Commit Queue  <commit-queue@webkit.org>
3340
3341         Unreviewed, rolling out r241237.
3342         https://bugs.webkit.org/show_bug.cgi?id=194474
3343
3344         Shows significant memory increase in WSL (Requested by
3345         yusukesuzuki on #webkit).
3346
3347         Reverted changeset:
3348
3349         "[WTF] Use BufferInternal StringImpl if substring StringImpl
3350         takes more memory"
3351         https://bugs.webkit.org/show_bug.cgi?id=194469
3352         https://trac.webkit.org/changeset/241237
3353
3354 2019-02-08  Yusuke Suzuki  <ysuzuki@apple.com>
3355
3356         [WTF] Use BufferInternal StringImpl if substring StringImpl takes more memory
3357         https://bugs.webkit.org/show_bug.cgi?id=194469
3358
3359         Reviewed by Geoffrey Garen.