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