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