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