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