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