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