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