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