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