flattenDictionaryStructure needs to zero properties that have been compressed away
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2018-06-19  Keith Miller  <keith_miller@apple.com>
2
3         flattenDictionaryStructure needs to zero properties that have been compressed away
4         https://bugs.webkit.org/show_bug.cgi?id=186828
5
6         Reviewed by Mark Lam.
7
8         This patch fixes a bunch of crashing Mozilla tests on the bots.
9
10         * runtime/Structure.cpp:
11         (JSC::Structure::flattenDictionaryStructure):
12
13 2018-06-19  Saam Barati  <sbarati@apple.com>
14
15         DirectArguments::create needs to initialize to undefined instead of the empty value
16         https://bugs.webkit.org/show_bug.cgi?id=186818
17         <rdar://problem/38415177>
18
19         Reviewed by Filip Pizlo.
20
21         The bug here is that we will emit code that just loads from DirectArguments as
22         long as the index is within the known capacity of the arguments object (op_get_from_arguments).
23         The arguments object has at least enough capacity to hold the declared parameters.
24         When we materialized this object in OSR exit, we initialized up to to the capacity
25         with JSValue(). In OSR exit, though, we only filled up to the length of the
26         object with actual values. So we'd end up with a DirectArguments object with
27         capacity minus length slots of JSValue(). To fix this, we need initialize up to
28         capacity with jsUndefined during construction. The invariant of this object is
29         that the capacity minus length slots at the end are filled in with jsUndefined.
30
31         * runtime/DirectArguments.cpp:
32         (JSC::DirectArguments::create):
33
34 2018-06-19  Michael Saboff  <msaboff@apple.com>
35
36         Crash in sanitizeStackForVMImpl sometimes when switching threads with same VM
37         https://bugs.webkit.org/show_bug.cgi?id=186827
38
39         Reviewed by Saam Barati.
40
41         Need to set VM::lastStackTop before any possible calls to sanitizeStack().
42
43         * runtime/JSLock.cpp:
44         (JSC::JSLock::didAcquireLock):
45
46 2018-06-19  Tadeu Zagallo  <tzagallo@apple.com>
47
48         ShadowChicken crashes with stack overflow in the LLInt
49         https://bugs.webkit.org/show_bug.cgi?id=186540
50         <rdar://problem/39682133>
51
52         Reviewed by Saam Barati.
53
54         Stack overflows in the LLInt were crashing in ShadowChicken when compiling
55         with debug opcodes because it was accessing the scope of the incomplete top
56         frame, which hadn't been set yet. Check that we have moved past the first
57         opcode (enter) and that the scope is not undefined (enter will
58         initialize it to undefined).
59
60         * interpreter/ShadowChicken.cpp:
61         (JSC::ShadowChicken::update):
62
63 2018-06-19  Keith Miller  <keith_miller@apple.com>
64
65         constructArray variants should take the slow path for subclasses of Array
66         https://bugs.webkit.org/show_bug.cgi?id=186812
67
68         Reviewed by Saam Barati and Mark Lam.
69
70         This patch fixes a crashing test in ObjectInitializationScope where we would
71         allocate a new structure for an indexing type change while initializing
72         a subclass of Array. Since the new array hasn't been fully initialized
73         if the GC ran it would see garbage and we might crash.
74
75         * runtime/JSArray.cpp:
76         (JSC::constructArray):
77         (JSC::constructArrayNegativeIndexed):
78         * runtime/JSArray.h:
79         (JSC::constructArray): Deleted.
80         (JSC::constructArrayNegativeIndexed): Deleted.
81
82 2018-06-19  Saam Barati  <sbarati@apple.com>
83
84         Wasm: Any function argument of type Void should be a validation error
85         https://bugs.webkit.org/show_bug.cgi?id=186794
86         <rdar://problem/41140257>
87
88         Reviewed by Keith Miller.
89
90         * wasm/WasmModuleParser.cpp:
91         (JSC::Wasm::ModuleParser::parseType):
92
93 2018-06-18  Keith Miller  <keith_miller@apple.com>
94
95         JSImmutableButterfly should assert m_header is adjacent to the data
96         https://bugs.webkit.org/show_bug.cgi?id=186795
97
98         Reviewed by Saam Barati.
99
100         * runtime/JSImmutableButterfly.cpp:
101         * runtime/JSImmutableButterfly.h:
102
103 2018-06-18  Keith Miller  <keith_miller@apple.com>
104
105         Unreviewed, fix the build...
106
107         * runtime/JSArray.cpp:
108         (JSC::JSArray::tryCreateUninitializedRestricted):
109
110 2018-06-18  Keith Miller  <keith_miller@apple.com>
111
112         Unreviewed, remove bad assertion.
113
114         * runtime/JSArray.cpp:
115         (JSC::JSArray::tryCreateUninitializedRestricted):
116
117 2018-06-18  Keith Miller  <keith_miller@apple.com>
118
119         Properly zero unused property storage offsets
120         https://bugs.webkit.org/show_bug.cgi?id=186692
121
122         Reviewed by Filip Pizlo.
123
124         Since the concurrent GC might see a property slot before the mutator has actually
125         stored the value there, we need to ensure that slot doesn't have garbage in it.
126
127         Right now when calling constructConvertedArrayStorageWithoutCopyingElements
128         or creating a RegExp matches array, we never cleared the unused
129         property storage. ObjectIntializationScope has also been upgraded
130         to look for our invariants around property storage. Additionally,
131         a new assertion has been added to check for JSValue() when adding
132         a new property.
133
134         We used to put undefined into deleted property offsets. To
135         make things simpler, this patch causes us to store JSValue() there
136         instead.
137
138         Lastly, this patch fixes an issue where we would initialize the
139         array storage of RegExpMatchesArray twice. First with 0 and
140         secondly with the actual result. Now we only zero memory between
141         vector length and public length.
142
143         * runtime/Butterfly.h:
144         (JSC::Butterfly::offsetOfVectorLength):
145         * runtime/ButterflyInlines.h:
146         (JSC::Butterfly::tryCreateUninitialized):
147         (JSC::Butterfly::createUninitialized):
148         (JSC::Butterfly::tryCreate):
149         (JSC::Butterfly::create):
150         (JSC::Butterfly::createOrGrowPropertyStorage):
151         (JSC::Butterfly::createOrGrowArrayRight):
152         (JSC::Butterfly::growArrayRight):
153         (JSC::Butterfly::resizeArray):
154         * runtime/JSArray.cpp:
155         (JSC::JSArray::tryCreateUninitializedRestricted):
156         (JSC::createArrayButterflyInDictionaryIndexingMode): Deleted.
157         * runtime/JSArray.h:
158         (JSC::tryCreateArrayButterfly):
159         * runtime/JSObject.cpp:
160         (JSC::JSObject::createArrayStorageButterfly):
161         (JSC::JSObject::constructConvertedArrayStorageWithoutCopyingElements):
162         (JSC::JSObject::deleteProperty):
163         (JSC::JSObject::shiftButterflyAfterFlattening):
164         * runtime/JSObject.h:
165         * runtime/JSObjectInlines.h:
166         (JSC::JSObject::prepareToPutDirectWithoutTransition):
167         * runtime/ObjectInitializationScope.cpp:
168         (JSC::ObjectInitializationScope::verifyPropertiesAreInitialized):
169         * runtime/ObjectInitializationScope.h:
170         (JSC::ObjectInitializationScope::release):
171         * runtime/RegExpMatchesArray.h:
172         (JSC::tryCreateUninitializedRegExpMatchesArray):
173         (JSC::createRegExpMatchesArray):
174
175         * runtime/Butterfly.h:
176         (JSC::Butterfly::offsetOfVectorLength):
177         * runtime/ButterflyInlines.h:
178         (JSC::Butterfly::tryCreateUninitialized):
179         (JSC::Butterfly::createUninitialized):
180         (JSC::Butterfly::tryCreate):
181         (JSC::Butterfly::create):
182         (JSC::Butterfly::createOrGrowPropertyStorage):
183         (JSC::Butterfly::createOrGrowArrayRight):
184         (JSC::Butterfly::growArrayRight):
185         (JSC::Butterfly::resizeArray):
186         * runtime/JSArray.cpp:
187         (JSC::JSArray::tryCreateUninitializedRestricted):
188         (JSC::createArrayButterflyInDictionaryIndexingMode): Deleted.
189         * runtime/JSArray.h:
190         (JSC::tryCreateArrayButterfly):
191         * runtime/JSObject.cpp:
192         (JSC::JSObject::createArrayStorageButterfly):
193         (JSC::JSObject::constructConvertedArrayStorageWithoutCopyingElements):
194         (JSC::JSObject::deleteProperty):
195         (JSC::JSObject::shiftButterflyAfterFlattening):
196         * runtime/JSObject.h:
197         * runtime/JSObjectInlines.h:
198         (JSC::JSObject::prepareToPutDirectWithoutTransition):
199         * runtime/ObjectInitializationScope.cpp:
200         (JSC::ObjectInitializationScope::verifyPropertiesAreInitialized):
201         * runtime/RegExpMatchesArray.cpp:
202         (JSC::createEmptyRegExpMatchesArray):
203         * runtime/RegExpMatchesArray.h:
204         (JSC::tryCreateUninitializedRegExpMatchesArray):
205         (JSC::createRegExpMatchesArray):
206
207 2018-06-18  Tadeu Zagallo  <tzagallo@apple.com>
208
209         Share structure across instances of classes exported through the ObjC API
210         https://bugs.webkit.org/show_bug.cgi?id=186579
211         <rdar://problem/40969212>
212
213         Reviewed by Saam Barati.
214
215         A new structure was being created for each instance of exported ObjC
216         classes due to setting the prototype in the structure for every object,
217         since prototype transitions are not cached by the structure. Cache the
218         Structure in the JSObjcClassInfo to avoid the transition.
219
220         * API/JSWrapperMap.mm:
221         (-[JSObjCClassInfo wrapperForObject:inContext:]):
222         (-[JSObjCClassInfo structureInContext:]):
223         * API/tests/JSWrapperMapTests.h: Added.
224         * API/tests/JSWrapperMapTests.mm: Added.
225         (+[JSWrapperMapTests testStructureIdentity]):
226         (runJSWrapperMapTests):
227         * API/tests/testapi.mm:
228         (testObjectiveCAPIMain):
229         * JavaScriptCore.xcodeproj/project.pbxproj:
230
231 2018-06-18  Michael Saboff  <msaboff@apple.com>
232
233         Support Unicode 11 in RegExp
234         https://bugs.webkit.org/show_bug.cgi?id=186685
235
236         Reviewed by Mark Lam.
237
238         Updated the UCD tables used to generate RegExp property tables to version 11.0.
239
240         * Scripts/generateYarrUnicodePropertyTables.py:
241         * ucd/CaseFolding.txt:
242         * ucd/DerivedBinaryProperties.txt:
243         * ucd/DerivedCoreProperties.txt:
244         * ucd/DerivedNormalizationProps.txt:
245         * ucd/PropList.txt:
246         * ucd/PropertyAliases.txt:
247         * ucd/PropertyValueAliases.txt:
248         * ucd/ScriptExtensions.txt:
249         * ucd/Scripts.txt:
250         * ucd/UnicodeData.txt:
251         * ucd/emoji-data.txt:
252
253 2018-06-18  Carlos Alberto Lopez Perez  <clopez@igalia.com>
254
255         [WTF] Remove workarounds needed to support libstdc++-4
256         https://bugs.webkit.org/show_bug.cgi?id=186762
257
258         Reviewed by Michael Catanzaro.
259
260         Revert r226299, r226300 r226301 and r226302.
261
262         * API/tests/TypedArrayCTest.cpp:
263         (assertEqualsAsNumber):
264
265 2018-06-16  Michael Catanzaro  <mcatanzaro@igalia.com>
266
267         REGRESSION(r227717): Hardcoded page size causing JSC crashes on platforms with page size bigger than 16 KB
268         https://bugs.webkit.org/show_bug.cgi?id=182923
269
270         Reviewed by Mark Lam.
271
272         The blockSize used by MarkedBlock is incorrect on platforms with pages larger than 16 KB.
273         Upstream Fedora's patch to use a safer 64 KB default. This fixes PowerPC and s390x.
274
275         * heap/MarkedBlock.h:
276
277 2018-06-16  Yusuke Suzuki  <utatane.tea@gmail.com>
278
279         [JSC] Inline JSArray::pushInline and Structure::nonPropertyTransition
280         https://bugs.webkit.org/show_bug.cgi?id=186723
281
282         Reviewed by Mark Lam.
283
284         Now, CoW -> non-CoW transition is heavy path. We inline the part of Structure::nonPropertyTransition
285         to catch the major path. And we also inline JSArray::pushInline well to spread this in operationArrayPushMultiple.
286
287         This patch improves SixSpeed/spread-literal.es5.
288
289                                      baseline                  patched
290
291         spread-literal.es5      114.4140+-4.5146     ^    104.5475+-3.6157        ^ definitely 1.0944x faster
292
293         * runtime/JSArrayInlines.h:
294         (JSC::JSArray::pushInline):
295         * runtime/Structure.cpp:
296         (JSC::Structure::nonPropertyTransitionSlow):
297         (JSC::Structure::nonPropertyTransition): Deleted.
298         * runtime/Structure.h:
299         * runtime/StructureInlines.h:
300         (JSC::Structure::nonPropertyTransition):
301
302 2018-06-16  Yusuke Suzuki  <utatane.tea@gmail.com>
303
304         [DFG] Reduce OSRExit for Kraken/crypto-aes due to CoW array
305         https://bugs.webkit.org/show_bug.cgi?id=186721
306
307         Reviewed by Keith Miller.
308
309         We still have several other OSRExits, but this patch reduces that.
310
311         1. While ArraySlice code accepts CoW arrays, it always emits CheckStructure without CoW Array structures.
312         So DFG emits ArraySlice onto CoW arrays, and always performs OSRExits.
313
314         2. The CoW patch removed ArrayAllocationProfile updates. This makes allocated JSImmutableButterfly
315         non-appropriate.
316
317         These changes a bit fix Kraken/crypto-aes regression.
318
319                                       baseline                  patched
320
321         stanford-crypto-aes        63.718+-2.312      ^      56.140+-0.966         ^ definitely 1.1350x faster
322
323
324         * dfg/DFGByteCodeParser.cpp:
325         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
326         * ftl/FTLOperations.cpp:
327         (JSC::FTL::operationMaterializeObjectInOSR):
328         * runtime/CommonSlowPaths.cpp:
329         (JSC::SLOW_PATH_DECL):
330
331 2018-06-15  Yusuke Suzuki  <utatane.tea@gmail.com>
332
333         [DFG][FTL] Spread onto PhantomNewArrayBuffer assumes JSFixedArray, but JSImmutableButterfly is returned
334         https://bugs.webkit.org/show_bug.cgi?id=186460
335
336         Reviewed by Saam Barati.
337
338         Spread(PhantomNewArrayBuffer) returns JSImmutableButterfly. But it is wrong.
339         We should return JSFixedArray for Spread. This patch adds a code generating
340         a JSFixedArray from JSImmutableButterfly.
341
342         Merging JSFixedArray into JSImmutableButterfly is possible future extension.
343
344         * ftl/FTLLowerDFGToB3.cpp:
345         (JSC::FTL::DFG::LowerDFGToB3::compileSpread):
346         * runtime/JSFixedArray.h:
347
348 2018-06-15  Saam Barati  <sbarati@apple.com>
349
350         Annotate shrinkFootprintWhenIdle with NS_AVAILABLE
351         https://bugs.webkit.org/show_bug.cgi?id=186687
352         <rdar://problem/40071332>
353
354         Reviewed by Keith Miller.
355
356         * API/JSVirtualMachinePrivate.h:
357
358 2018-06-15  Saam Barati  <sbarati@apple.com>
359
360         Make ForceOSRExit CFG pruning in bytecode parser more aggressive by making the original block to ignore be the plan's osrEntryBytecodeIndex
361         https://bugs.webkit.org/show_bug.cgi?id=186648
362
363         Reviewed by Michael Saboff.
364
365         This patch is neutral on SunSpider/bitops-bitwise-and. That test originally
366         regressed with my first version of ForceOSRExit CFG pruning. This patch makes
367         ForceOSRExit CFG pruning more aggressive by not ignoring everything that
368         can reach any loop_hint, but only ignoring blocks that can reach a loop_hint
369         if it's the plan's osr entry bytecode target. The goal is to get a speedometer
370         2 speedup with this change on iOS.
371
372         * dfg/DFGByteCodeParser.cpp:
373         (JSC::DFG::ByteCodeParser::parse):
374
375 2018-06-15  Michael Catanzaro  <mcatanzaro@igalia.com>
376
377         Unreviewed, rolling out r232816.
378
379         Suggested by Caitlin:
380         "this patch clearly does get some things wrong, and it's not
381         easy to find what those things are"
382
383         Reverted changeset:
384
385         "[LLInt] use loadp consistently for
386         get_from_scope/put_to_scope"
387         https://bugs.webkit.org/show_bug.cgi?id=132333
388         https://trac.webkit.org/changeset/232816
389
390 2018-06-14  Michael Saboff  <msaboff@apple.com>
391
392         REGRESSION(232741): Crash running ARES-6
393         https://bugs.webkit.org/show_bug.cgi?id=186630
394
395         Reviewed by Saam Barati.
396
397         The de-duplicating work in r232741 caused a bug in breakCriticalEdge() where it
398         treated edges between identical predecessor->successor pairs independently.
399         This fixes the issue by handling such edges once, using the added intermediate
400         pad for all instances of the edges between the same pairs.
401
402         * dfg/DFGCriticalEdgeBreakingPhase.cpp:
403         (JSC::DFG::CriticalEdgeBreakingPhase::run):
404         (JSC::DFG::CriticalEdgeBreakingPhase::breakCriticalEdge): Deleted.
405
406 2018-06-14  Carlos Garcia Campos  <cgarcia@igalia.com>
407
408         [GTK][WPE] WebDriver: handle acceptInsecureCertificates capability
409         https://bugs.webkit.org/show_bug.cgi?id=186560
410
411         Reviewed by Brian Burg.
412
413         Add SessionCapabilities struct to Client class and unify requestAutomationSession() methods into a single one
414         that always receives the session capabilities.
415
416         * inspector/remote/RemoteInspector.h:
417         * inspector/remote/RemoteInspectorConstants.h:
418         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
419         (Inspector::RemoteInspector::receivedAutomationSessionRequestMessage): Move the parsing of mac capabilities from
420         WebKit here and fill the SessionCapabilities instead.
421         * inspector/remote/glib/RemoteInspectorGlib.cpp:
422         (Inspector::RemoteInspector::requestAutomationSession): Pass SessionCapabilities to the client.
423         * inspector/remote/glib/RemoteInspectorServer.cpp:
424         (Inspector::RemoteInspectorServer::startAutomationSession): Process SessionCapabilities.
425         * inspector/remote/glib/RemoteInspectorServer.h:
426
427 2018-06-13  Adrian Perez de Castro  <aperez@igalia.com>
428
429         [WPE] Trying to access the remote inspector hits an assertion in the UIProcess
430         https://bugs.webkit.org/show_bug.cgi?id=186588
431
432         Reviewed by Carlos Garcia Campos.
433
434         Make both the WPE and GTK+ ports use /org/webkit/inspector as base prefix
435         for resource paths, which avoids needing a switcheroo depending on the port.
436
437         * inspector/remote/glib/RemoteInspectorUtils.cpp:
438
439 2018-06-13  Caitlin Potter  <caitp@igalia.com>
440
441         [LLInt] use loadp consistently for get_from_scope/put_to_scope
442         https://bugs.webkit.org/show_bug.cgi?id=132333
443
444         Reviewed by Mark Lam.
445
446         Using `loadis` for register indexes and `loadp` for constant scopes /
447         symboltables makes sense, but is problematic for big-endian
448         architectures.
449
450         Consistently treating the operand as a pointer simplifies determining
451         how to access the operand, and helps avoid bad accesses and crashes on
452         big-endian ports.
453
454         * bytecode/CodeBlock.cpp:
455         (JSC::CodeBlock::finishCreation):
456         * bytecode/Instruction.h:
457         * jit/JITOperations.cpp:
458         * llint/LLIntSlowPaths.cpp:
459         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
460         * llint/LowLevelInterpreter32_64.asm:
461         * llint/LowLevelInterpreter64.asm:
462         * runtime/CommonSlowPaths.h:
463         (JSC::CommonSlowPaths::tryCachePutToScopeGlobal):
464         (JSC::CommonSlowPaths::tryCacheGetFromScopeGlobal):
465
466 2018-06-13  Keith Miller  <keith_miller@apple.com>
467
468         AutomaticThread should have a way to provide a thread name
469         https://bugs.webkit.org/show_bug.cgi?id=186604
470
471         Reviewed by Filip Pizlo.
472
473         Add names for JSC's automatic threads.
474
475         * dfg/DFGWorklist.cpp:
476         * heap/Heap.cpp:
477         * jit/JITWorklist.cpp:
478         * runtime/VMTraps.cpp:
479         * wasm/WasmWorklist.cpp:
480
481 2018-06-13  Saam Barati  <sbarati@apple.com>
482
483         CFGSimplificationPhase should de-dupe jettisonedBlocks
484         https://bugs.webkit.org/show_bug.cgi?id=186583
485
486         Reviewed by Filip Pizlo.
487
488         When making the predecessors list unique in r232741, it revealed a bug inside
489         of CFG simplification, where we try to remove the same predecessor more than
490         once from a blocks predecessors list. We built the list of blocks to remove
491         from the list of successors, which is not unique, causing us to try to remove
492         the same predecessor more than once. The solution here is to just add to this
493         list of blocks to remove only if the block is not already in the list.
494
495         * dfg/DFGCFGSimplificationPhase.cpp:
496         (JSC::DFG::CFGSimplificationPhase::run):
497
498 2018-06-13  Yusuke Suzuki  <utatane.tea@gmail.com>
499
500         [JSC] Always use Nuke & Set procedure for x86
501         https://bugs.webkit.org/show_bug.cgi?id=186592
502
503         Reviewed by Keith Miller.
504
505         We always use nukeStructureAndStoreButterfly for Contiguous -> ArrayStorage conversion if the architecture is x86.
506         By doing so, we can concurrently load structure and butterfly at least in x86 environment even in non-collector
507         threads.
508
509         * runtime/JSObject.cpp:
510         (JSC::JSObject::convertContiguousToArrayStorage):
511
512 2018-06-12  Saam Barati  <sbarati@apple.com>
513
514         Remove JSVirtualMachine shrinkFootprint when clients move to shrinkFootprintWhenIdle
515         https://bugs.webkit.org/show_bug.cgi?id=186071
516
517         Reviewed by Mark Lam.
518
519         * API/JSVirtualMachine.mm:
520         (-[JSVirtualMachine shrinkFootprint]): Deleted.
521         * API/JSVirtualMachinePrivate.h:
522
523 2018-06-11  Saam Barati  <sbarati@apple.com>
524
525         Reduce graph size by replacing terminal nodes in blocks that have a ForceOSRExit with Unreachable
526         https://bugs.webkit.org/show_bug.cgi?id=181409
527         <rdar://problem/36383749>
528
529         Reviewed by Keith Miller.
530
531         This patch is me redoing r226655. This is a patch I wrote when
532         profiling Speedometer. Fil rolled this change out in r230928. He
533         showed this slowed down a sunspider tests by ~2x. This sunspider
534         regression revealed a real performance bug in the original change:
535         we would kill blocks that reached OSR entry targets, sometimes leading
536         us to not do OSR entry into the DFG, since we could end up deleting
537         entire loops from the CFG. The reason for this is that code that has run
538         ~once and that reaches loops often has ForceOSRExits inside of it. The
539         solution to this is to not perform this optimization on blocks that can
540         reach OSR entry targets.
541         
542         The reason I'm redoing this patch is that it turns out Fil rolling
543         out the change was a Speedometer 2 regression.
544         
545         This is a modified version of the original ChangeLog I wrote in r226655:
546         
547         When I was looking at profiler data for Speedometer, I noticed that one of
548         the hottest functions in Speedometer is around 1100 bytecode operations long.
549         Only about 100 of those bytecode ops ever execute. However, we ended up
550         spending a lot of time compiling basic blocks that never executed. We often
551         plant ForceOSRExit nodes when we parse bytecodes that have a null value profile.
552         This is the case when such a node never executes.
553         
554         This patch makes it so that anytime a block has a ForceOSRExit, and that block
555         can not reach an OSR entry target, we replace its terminal node with an Unreachable
556         node, and remove all nodes after the ForceOSRExit. This cuts down the graph
557         size since it removes control flow edges from the CFG. This allows us to get
558         rid of huge chunks of the CFG in certain programs. When doing this transformation,
559         we also insert Flushes/PhantomLocals to ensure we can recover values that are bytecode
560         live-in to the ForceOSRExit.
561         
562         Using ForceOSRExit as the signal for this is a bit of a hack. It definitely
563         does not get rid of all the CFG that it could. If we decide it's worth
564         it, we could use additional inputs into this mechanism. For example, we could
565         profile if a basic block ever executes inside the LLInt/Baseline, and
566         remove parts of the CFG based on that.
567         
568         When running Speedometer with the concurrent JIT turned off, this patch
569         improves DFG/FTL compile times by around 5%.
570
571         * dfg/DFGByteCodeParser.cpp:
572         (JSC::DFG::ByteCodeParser::addToGraph):
573         (JSC::DFG::ByteCodeParser::inlineCall):
574         (JSC::DFG::ByteCodeParser::parse):
575         * dfg/DFGGraph.cpp:
576         (JSC::DFG::Graph::blocksInPostOrder):
577
578 2018-06-11  Saam Barati  <sbarati@apple.com>
579
580         The NaturalLoops algorithm only works when the list of blocks in a loop is de-duplicated
581         https://bugs.webkit.org/show_bug.cgi?id=184829
582
583         Reviewed by Michael Saboff.
584
585         This patch codifies that a BasicBlock's list of predecessors is de-duplicated.
586         In B3/Air, this just meant writing a validation rule. In DFG, this meant
587         ensuring this property when building up the predecessors list, and also adding
588         a validation rule. The NaturalLoops algorithm relies on this property.
589
590         * b3/B3Validate.cpp:
591         * b3/air/AirValidate.cpp:
592         * b3/testb3.cpp:
593         (JSC::B3::testLoopWithMultipleHeaderEdges):
594         (JSC::B3::run):
595         * dfg/DFGGraph.cpp:
596         (JSC::DFG::Graph::handleSuccessor):
597         * dfg/DFGValidate.cpp:
598
599 2018-06-11  Keith Miller  <keith_miller@apple.com>
600
601         Loading cnn.com in MiniBrowser hits Structure::dump() under DFG::AdaptiveInferredPropertyValueWatchpoint::handleFire  which churns 65KB of memory
602         https://bugs.webkit.org/show_bug.cgi?id=186467
603
604         Reviewed by Simon Fraser.
605
606         This patch adds a LazyFireDetail that wraps ScopedLambda so that
607         we don't actually malloc any strings for firing unless those
608         Strings are actually going to be printed.
609
610         * bytecode/Watchpoint.h:
611         (JSC::LazyFireDetail::LazyFireDetail):
612         * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp:
613         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::handleFire):
614         * dfg/DFGAdaptiveStructureWatchpoint.cpp:
615         (JSC::DFG::AdaptiveStructureWatchpoint::fireInternal):
616         * runtime/ArrayPrototype.cpp:
617         (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::handleFire):
618
619 2018-06-11  Mark Lam  <mark.lam@apple.com>
620
621         Add support for webkit-test-runner jscOptions in DumpRenderTree and WebKitTestRunner.
622         https://bugs.webkit.org/show_bug.cgi?id=186451
623         <rdar://problem/40875792>
624
625         Reviewed by Tim Horton.
626
627         Enhance setOptions() to be able to take a comma separated options string in
628         addition to white space separated options strings.
629
630         * runtime/Options.cpp:
631         (JSC::isSeparator):
632         (JSC::Options::setOptions):
633
634 2018-06-11  Michael Saboff  <msaboff@apple.com>
635
636         JavaScriptCore: Disable 32-bit JIT on Windows
637         https://bugs.webkit.org/show_bug.cgi?id=185989
638
639         Reviewed by Mark Lam.
640
641         Fixed the CLOOP so it can work when COMPUTED_GOTOs are not supported.
642
643         * llint/LLIntData.h:
644         (JSC::LLInt::getCodePtr): Used a reinterpret_cast since Opcode could be an int.
645         * llint/LowLevelInterpreter.cpp: Changed the definition of OFFLINE_ASM_GLOBAL_LABEL to not
646         have a case label because these aren't opcodes.
647         * runtime/Options.cpp: Made assembler related Windows conditional code also conditional
648         on the JIT being enabled.
649         (JSC::recomputeDependentOptions):
650
651 2018-06-11  Michael Saboff  <msaboff@apple.com>
652
653         Test js/regexp-zero-length-alternatives.html fails when RegExpJIT is disabled
654         https://bugs.webkit.org/show_bug.cgi?id=186477
655
656         Reviewed by Filip Pizlo.
657
658         Fixed bug where we were using the wrong frame size for TypeParenthesesSubpatternTerminalBegin
659         YARR interpreter nodes.  This caused us to overwrite other frame information.
660
661         Added frame offset debugging code to YARR interpreter.
662
663         * yarr/YarrInterpreter.cpp:
664         (JSC::Yarr::ByteCompiler::emitDisjunction):
665         (JSC::Yarr::ByteCompiler::dumpDisjunction):
666
667 2018-06-10  Yusuke Suzuki  <utatane.tea@gmail.com>
668
669         [JSC] Array.prototype.sort should rejects null comparator
670         https://bugs.webkit.org/show_bug.cgi?id=186458
671
672         Reviewed by Keith Miller.
673
674         This relaxed behavior is once introduced in r216169 to fix some pages by aligning
675         the behavior to Chrome and Firefox.
676
677         However, now Chrome, Firefox and Edge reject a null comparator. So only JavaScriptCore
678         accepts it. This patch reverts r216169 to align JSC to the other engines and fix
679         the spec issue.
680
681         * builtins/ArrayPrototype.js:
682         (sort):
683
684 2018-06-09  Dan Bernstein  <mitz@apple.com>
685
686         [Xcode] Clean up and modernize some build setting definitions
687         https://bugs.webkit.org/show_bug.cgi?id=186463
688
689         Reviewed by Sam Weinig.
690
691         * Configurations/Base.xcconfig: Removed definition for macOS 10.11. Simplified the
692           definition of WK_PRIVATE_FRAMEWORK_STUBS_DIR now that WK_XCODE_SUPPORTS_TEXT_BASED_STUBS
693           is true for all supported Xcode versions.
694         * Configurations/DebugRelease.xcconfig: Removed definition for macOS 10.11.
695         * Configurations/FeatureDefines.xcconfig: Simplified the definitions of ENABLE_APPLE_PAY and
696           ENABLE_VIDEO_PRESENTATION_MODE now macOS 10.12 is the earliest supported version.
697         * Configurations/Version.xcconfig: Removed definition for macOS 10.11.
698         * Configurations/WebKitTargetConditionals.xcconfig: Removed definitions for macOS 10.11.
699
700 2018-06-09  Dan Bernstein  <mitz@apple.com>
701
702         Added missing file references to the Configuration group.
703
704         * JavaScriptCore.xcodeproj/project.pbxproj:
705
706 2018-06-08  Darin Adler  <darin@apple.com>
707
708         [Cocoa] Remove all uses of NSAutoreleasePool as part of preparation for ARC
709         https://bugs.webkit.org/show_bug.cgi?id=186436
710
711         Reviewed by Anders Carlsson.
712
713         * heap/Heap.cpp: Include FoundationSPI.h rather than directly including
714         objc-internal.h and explicitly declaring the alternative.
715
716 2018-06-08  Wenson Hsieh  <wenson_hsieh@apple.com>
717
718         [WebKit on watchOS] Upstream watchOS source additions to OpenSource (Part 1)
719         https://bugs.webkit.org/show_bug.cgi?id=186442
720         <rdar://problem/40879364>
721
722         Reviewed by Tim Horton.
723
724         * Configurations/FeatureDefines.xcconfig:
725
726 2018-06-08  Tadeu Zagallo  <tzagallo@apple.com>
727
728         jumpTrueOrFalse only takes the fast path for boolean false on 64bit LLInt 
729         https://bugs.webkit.org/show_bug.cgi?id=186446
730         <rdar://problem/40949995>
731
732         Reviewed by Mark Lam.
733
734         On 64bit LLInt, jumpTrueOrFalse did a mask check to take the fast path for
735         boolean literals, but it would only work for false. Change it so that it
736         takes the fast path for true, false, null and undefined.
737
738         * llint/LowLevelInterpreter.asm:
739         * llint/LowLevelInterpreter64.asm:
740
741 2018-06-08  Brian Burg  <bburg@apple.com>
742
743         [Cocoa] Web Automation: include browser name and version in listing for automation targets
744         https://bugs.webkit.org/show_bug.cgi?id=186204
745         <rdar://problem/36950423>
746
747         Reviewed by Darin Adler.
748
749         Ask the client what the reported browser name and version should be, then
750         send this as part of the listing for an automation target.
751
752         * inspector/remote/RemoteInspectorConstants.h:
753         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
754         (Inspector::RemoteInspector::listingForAutomationTarget const):
755
756 2018-06-07  Chris Dumez  <cdumez@apple.com>
757
758         Add base class to get WeakPtrFactory member and avoid some boilerplate code
759         https://bugs.webkit.org/show_bug.cgi?id=186407
760
761         Reviewed by Brent Fulgham.
762
763         Add CanMakeWeakPtr base class to get WeakPtrFactory member and its getter, in
764         order to avoid some boilerplate code in every class needing a WeakPtrFactory.
765         This also gets rid of old-style createWeakPtr() methods in favor of the newer
766         makeWeakPtr().
767
768         * wasm/WasmInstance.h:
769         * wasm/WasmMemory.cpp:
770         (JSC::Wasm::Memory::registerInstance):
771
772 2018-06-07  Tadeu Zagallo  <tzagallo@apple.com>
773
774         Don't try to allocate JIT memory if we don't have the JIT entitlement
775         https://bugs.webkit.org/show_bug.cgi?id=182605
776         <rdar://problem/38271229>
777
778         Reviewed by Mark Lam.
779
780         Check that the current process has the correct entitlements before
781         trying to allocate JIT memory to silence warnings.
782
783         * jit/ExecutableAllocator.cpp:
784         (JSC::allowJIT): Helper that checks entitlements on iOS and returns true in other platforms
785         (JSC::FixedVMPoolExecutableAllocator::FixedVMPoolExecutableAllocator): check allowJIT before trying to allocate
786
787 2018-06-07  Saam Barati  <sbarati@apple.com>
788
789         TierUpCheckInjectionPhase systematically never puts the outer-most loop in an inner loop's vector of outer loops
790         https://bugs.webkit.org/show_bug.cgi?id=186386
791
792         Reviewed by Filip Pizlo.
793
794         This looks like an 8% speedup on Kraken's imaging-gaussian-blur subtest.
795
796         * dfg/DFGTierUpCheckInjectionPhase.cpp:
797         (JSC::DFG::TierUpCheckInjectionPhase::run):
798
799 2018-06-02  Filip Pizlo  <fpizlo@apple.com>
800
801         FunctionRareData::m_objectAllocationProfileWatchpoint is racy
802         https://bugs.webkit.org/show_bug.cgi?id=186237
803
804         Reviewed by Saam Barati.
805
806         We initialize it blind and let it go into auto-watch mode once the DFG adds a watchpoint, but
807         that means that we never notice that it fired if it fires between when the DFG decides to
808         watch it and when it actually adds the watchpoint.
809         
810         Most watchpoints are initialized watched for this purpose. This one had a somewhat good
811         reason for being initialized blind: that's how we knew to ignore changes to the prototype
812         before the first allocation. However, that functionality also arose out of the fact that the
813         rare data is created lazily and usually won't exist until the first allocation.
814         
815         The fix here is to make the watchpoint go into watched mode as soon as we initialize the
816         object allocation profile.
817         
818         It's hard to repro this race, however it started causing spurious test failures for me after
819         bug 164904.
820
821         * runtime/FunctionRareData.cpp:
822         (JSC::FunctionRareData::FunctionRareData):
823         (JSC::FunctionRareData::initializeObjectAllocationProfile):
824
825 2018-06-07  Saam Barati  <sbarati@apple.com>
826
827         Make DFG to FTL OSR entry code more sane by removing bad RELEASE_ASSERTS and making it trigger compiles in outer loops before inner ones
828         https://bugs.webkit.org/show_bug.cgi?id=186218
829         <rdar://problem/38449540>
830
831         Reviewed by Filip Pizlo.
832
833         This patch makes tierUpCommon a tad bit more sane. There are a few things
834         that I did:
835         - There were a few release asserts that were crashing. Those release asserts
836         were incorrect. They were making assumptions about how the code and data
837         structures were ordered that were wrong. This patch removes them. The code
838         was using the loop hierarchy vector to make assumptions about which loop we
839         were currently executing in, which is incorrect. The only information that
840         can be used about where we're currently executing is the bytecode index we're
841         at.
842         - This makes it so that we go back to trying to compile outer loops before
843         inner loops. JF accidentally reverted this behavior that Ben implemented.
844         JF made it so that we just compiled the inner most loop. I make this
845         functionality work by first triggering a compile for the outer most loop
846         that the code is currently executing in and that can perform OSR entry.
847         However, some programs can get stuck in inner loops. The code works by
848         progressively asking inner loops to compile if program execution has not
849         yet reached an outer loop.
850
851         * dfg/DFGOperations.cpp:
852
853 2018-06-06  Guillaume Emont  <guijemont@igalia.com>
854
855         ArityFixup should adjust SP first on 32-bit platforms too
856         https://bugs.webkit.org/show_bug.cgi?id=186351
857
858         Reviewed by Yusuke Suzuki.
859
860         * jit/ThunkGenerators.cpp:
861         (JSC::arityFixupGenerator):
862
863 2018-06-06  Yusuke Suzuki  <utatane.tea@gmail.com>
864
865         [DFG] Compare operations do not respect negative zeros
866         https://bugs.webkit.org/show_bug.cgi?id=183729
867
868         Reviewed by Saam Barati.
869
870         Compare operations do not respect negative zeros. So propagating this can
871         reduce the size of the produced code for negative zero case. This pattern
872         can be seen in Kraken stanford-crypto-aes.
873
874         This also causes an existing bug which converts CompareEq(Int32Only, NonIntAsdouble) to false.
875         However, NonIntAsdouble includes negative zero, which can be equal to Int32 positive zero.
876         This issue is covered by fold-based-on-int32-proof-mul-branch.js, and we fix this.
877
878         * bytecode/SpeculatedType.cpp:
879         (JSC::leastUpperBoundOfStrictlyEquivalentSpeculations):
880         SpecNonIntAsDouble includes negative zero (-0.0), which can be equal to 0 and 0.0.
881         To emphasize this, we use SpecAnyIntAsDouble | SpecNonIntAsDouble directly instead of
882         SpecDoubleReal.
883
884         * dfg/DFGBackwardsPropagationPhase.cpp:
885         (JSC::DFG::BackwardsPropagationPhase::propagate):
886
887 2018-06-06  Saam Barati  <sbarati@apple.com>
888
889         generateConditionsForInstanceOf needs to see if the object has a poly proto structure before assuming it has a constant prototype
890         https://bugs.webkit.org/show_bug.cgi?id=186363
891
892         Rubber-stamped by Filip Pizlo.
893
894         The code was assuming that the object it was creating an OPC for always
895         had a non-poly-proto structure. However, this assumption was wrong. For
896         example, an object in the prototype chain could be poly proto. That type 
897         of object graph would cause a crash in this code. This patch makes it so
898         that we fail to generate an ObjectPropertyConditionSet if we see a poly proto
899         object as we traverse the prototype chain.
900
901         * bytecode/ObjectPropertyConditionSet.cpp:
902         (JSC::generateConditionsForInstanceOf):
903
904 2018-06-05  Brent Fulgham  <bfulgham@apple.com>
905
906         Adjust compile and runtime flags to match shippable state of features
907         https://bugs.webkit.org/show_bug.cgi?id=186319
908         <rdar://problem/40352045>
909
910         Reviewed by Maciej Stachowiak, Jon Lee, and others.
911
912         This patch revises the compile time and runtime state for various features to match their
913         suitability for end-user releases.
914
915         * Configurations/DebugRelease.xcconfig: Update to match WebKit definition of
916         WK_RELOCATABLE_FRAMEWORKS so that ENABLE(EXPERIMENTAL_FEATURES) is defined properly for
917         Cocoa builds.
918         * Configurations/FeatureDefines.xcconfig: Don't build ENABLE_INPUT_TYPE_COLOR
919         or ENABLE_INPUT_TYPE_COLOR_POPOVER.
920         * runtime/Options.h: Only enable INTL_NUMBER_FORMAT_TO_PARTS and INTL_PLURAL_RULES
921         at runtime for non-production builds.
922
923 2018-06-05  Brent Fulgham  <bfulgham@apple.com>
924
925         Revise DEFAULT_EXPERIMENTAL_FEATURES_ENABLED to work properly on Apple builds
926         https://bugs.webkit.org/show_bug.cgi?id=186286
927         <rdar://problem/40782992>
928
929         Reviewed by Dan Bernstein.
930
931         Use the WK_RELOCATABLE_FRAMEWORKS flag (which is always defined for non-production builds)
932         to define ENABLE(EXPERIMENTAL_FEATURES) so that we do not need to manually
933         change this flag when preparing for a production release.
934
935         * Configurations/FeatureDefines.xcconfig: Use WK_RELOCATABLE_FRAMEWORKS to determine
936         whether experimental features should be enabled, and use it to properly define the
937         feature flag.
938
939 2018-06-05  Darin Adler  <darin@apple.com>
940
941         [Cocoa] Update some JavaScriptCore code to be more ready for ARC
942         https://bugs.webkit.org/show_bug.cgi?id=186301
943
944         Reviewed by Anders Carlsson.
945
946         * API/JSContext.mm:
947         (-[JSContext evaluateScript:withSourceURL:]): Use __bridge for typecast.
948         (-[JSContext setName:]): Removed unnecessary call to copy, since the
949         JSStringCreateWithCFString function already reads the characters out
950         of the string and does not retain the string, so there is no need to
951         make an immutable copy. And used __bridge for typecast.
952         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
953         (Inspector::RemoteInspector::receivedProxyApplicationSetupMessage):
954         Ditto.
955
956         * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm:
957         (Inspector::RemoteInspectorXPCConnection::deserializeMessage):
958         Use CFBridgingRelease instead of autorelease for a CF dictionary that
959         we return as an NSDictionary.
960
961 2018-06-04  Keith Miller  <keith_miller@apple.com>
962
963         Remove missing files from JavaScriptCore Xcode project
964         https://bugs.webkit.org/show_bug.cgi?id=186297
965
966         Reviewed by Saam Barati.
967
968         * JavaScriptCore.xcodeproj/project.pbxproj:
969
970 2018-06-04  Keith Miller  <keith_miller@apple.com>
971
972         Add test for CoW conversions in the DFG/FTL
973         https://bugs.webkit.org/show_bug.cgi?id=186295
974
975         Reviewed by Saam Barati.
976
977         Add a function to $vm that returns a JSString containing the
978         dataLog dump of the indexingMode of an Object.
979
980         * tools/JSDollarVM.cpp:
981         (JSC::functionIndexingMode):
982         (JSC::JSDollarVM::finishCreation):
983
984 2018-06-04  Saam Barati  <sbarati@apple.com>
985
986         Set the activeLength of all ScratchBuffers to zero when exiting the VM
987         https://bugs.webkit.org/show_bug.cgi?id=186284
988         <rdar://problem/40780738>
989
990         Reviewed by Keith Miller.
991
992         Simon recently found instances where we leak global objects from the
993         ScratchBuffer. Yusuke found that we forgot to set the active length
994         back to zero when doing catch OSR entry in the DFG/FTL. His solution
995         to this was adding a node that cleared the active length. This is
996         a good node to have, but it's not a complete solution: the DFG/FTL
997         could OSR exit before that node executes, which would cause us to leak
998         the data in it.
999         
1000         This patch makes it so that we set each scratch buffer's active length
1001         to zero on VM exit. This helps prevent leaks for JS code that eventually
1002         exits the VM (which is essentially all code on the web and all API users).
1003
1004         * runtime/VM.cpp:
1005         (JSC::VM::clearScratchBuffers):
1006         * runtime/VM.h:
1007         * runtime/VMEntryScope.cpp:
1008         (JSC::VMEntryScope::~VMEntryScope):
1009
1010 2018-06-04  Keith Miller  <keith_miller@apple.com>
1011
1012         JSLock should clear last exception when releasing the lock
1013         https://bugs.webkit.org/show_bug.cgi?id=186277
1014
1015         Reviewed by Mark Lam.
1016
1017         If we don't clear the last exception we essentially leak the
1018         object and everything referenced by it until another exception is
1019         thrown.
1020
1021         * runtime/JSLock.cpp:
1022         (JSC::JSLock::willReleaseLock):
1023
1024 2018-06-04  Yusuke Suzuki  <utatane.tea@gmail.com>
1025
1026         Get rid of UnconditionalFinalizers and WeakReferenceHarvesters
1027         https://bugs.webkit.org/show_bug.cgi?id=180248
1028
1029         Reviewed by Sam Weinig.
1030
1031         As a final step, this patch removes ListableHandler from JSC.
1032         Nobody uses UnconditionalFinalizers and WeakReferenceHarvesters now.
1033
1034         * CMakeLists.txt:
1035         * JavaScriptCore.xcodeproj/project.pbxproj:
1036         * heap/Heap.h:
1037         * heap/ListableHandler.h: Removed.
1038
1039 2018-06-03  Yusuke Suzuki  <utatane.tea@gmail.com>
1040
1041         LayoutTests/fast/css/parsing-css-matches-7.html always abandons its Document (disabling JIT fixes it)
1042         https://bugs.webkit.org/show_bug.cgi?id=186223
1043
1044         Reviewed by Keith Miller.
1045
1046         After preparing catchOSREntryBuffer, we do not clear the active length of this scratch buffer.
1047         It makes this buffer conservative GC root, and allows it to hold GC objects unnecessarily long.
1048
1049         This patch introduces DFG ClearCatchLocals node, which clears catchOSREntryBuffer's active length.
1050         We model ExtractCatchLocal and ClearCatchLocals appropriately in DFG clobberize too to make
1051         this ClearCatchLocals valid.
1052
1053         The existing tests for ExtractCatchLocal just pass.
1054
1055         * dfg/DFGAbstractHeap.h:
1056         * dfg/DFGAbstractInterpreterInlines.h:
1057         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1058         * dfg/DFGByteCodeParser.cpp:
1059         (JSC::DFG::ByteCodeParser::parseBlock):
1060         * dfg/DFGClobberize.h:
1061         (JSC::DFG::clobberize):
1062         * dfg/DFGDoesGC.cpp:
1063         (JSC::DFG::doesGC):
1064         * dfg/DFGFixupPhase.cpp:
1065         (JSC::DFG::FixupPhase::fixupNode):
1066         * dfg/DFGMayExit.cpp:
1067         * dfg/DFGNodeType.h:
1068         * dfg/DFGOSREntry.cpp:
1069         (JSC::DFG::prepareCatchOSREntry):
1070         * dfg/DFGPredictionPropagationPhase.cpp:
1071         * dfg/DFGSafeToExecute.h:
1072         (JSC::DFG::safeToExecute):
1073         * dfg/DFGSpeculativeJIT.cpp:
1074         (JSC::DFG::SpeculativeJIT::compileClearCatchLocals):
1075         * dfg/DFGSpeculativeJIT.h:
1076         * dfg/DFGSpeculativeJIT32_64.cpp:
1077         (JSC::DFG::SpeculativeJIT::compile):
1078         * dfg/DFGSpeculativeJIT64.cpp:
1079         (JSC::DFG::SpeculativeJIT::compile):
1080         * ftl/FTLCapabilities.cpp:
1081         (JSC::FTL::canCompile):
1082         * ftl/FTLLowerDFGToB3.cpp:
1083         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
1084         (JSC::FTL::DFG::LowerDFGToB3::compileClearCatchLocals):
1085
1086 2018-06-02  Darin Adler  <darin@apple.com>
1087
1088         [Cocoa] Update some code to be more ARC-compatible to prepare for future ARC adoption
1089         https://bugs.webkit.org/show_bug.cgi?id=186227
1090
1091         Reviewed by Dan Bernstein.
1092
1093         * API/JSContext.mm:
1094         (-[JSContext name]): Use CFBridgingRelease instead of autorelease.
1095         * API/JSValue.mm:
1096         (valueToObjectWithoutCopy): Use CFBridgingRelease instead of autorelease.
1097         (containerValueToObject): Use adoptCF instead of autorelease. This is not only more
1098         ARC-compatible, but more efficient.
1099         (valueToString): Use CFBridgingRelease instead of autorelease.
1100
1101 2018-06-02  Caio Lima  <ticaiolima@gmail.com>
1102
1103         [ESNext][BigInt] Implement support for addition operations
1104         https://bugs.webkit.org/show_bug.cgi?id=179002
1105
1106         Reviewed by Yusuke Suzuki.
1107
1108         This patch is implementing support to BigInt Operands into binary "+"
1109         and binary "-" operators. Right now, we have limited support to DFG
1110         and FTL JIT layers, but we plan to fix this support in future
1111         patches.
1112
1113         * jit/JITOperations.cpp:
1114         * runtime/CommonSlowPaths.cpp:
1115         (JSC::SLOW_PATH_DECL):
1116         * runtime/JSBigInt.cpp:
1117         (JSC::JSBigInt::parseInt):
1118         (JSC::JSBigInt::stringToBigInt):
1119         (JSC::JSBigInt::toString):
1120         (JSC::JSBigInt::multiply):
1121         (JSC::JSBigInt::divide):
1122         (JSC::JSBigInt::remainder):
1123         (JSC::JSBigInt::add):
1124         (JSC::JSBigInt::sub):
1125         (JSC::JSBigInt::absoluteAdd):
1126         (JSC::JSBigInt::absoluteSub):
1127         (JSC::JSBigInt::toStringGeneric):
1128         (JSC::JSBigInt::allocateFor):
1129         (JSC::JSBigInt::toNumber const):
1130         (JSC::JSBigInt::getPrimitiveNumber const):
1131         * runtime/JSBigInt.h:
1132         * runtime/JSCJSValueInlines.h:
1133         * runtime/Operations.cpp:
1134         (JSC::jsAddSlowCase):
1135         * runtime/Operations.h:
1136         (JSC::jsSub):
1137
1138 2018-06-02  Commit Queue  <commit-queue@webkit.org>
1139
1140         Unreviewed, rolling out r232439.
1141         https://bugs.webkit.org/show_bug.cgi?id=186238
1142
1143         It breaks gtk-linux-32-release (Requested by caiolima on
1144         #webkit).
1145
1146         Reverted changeset:
1147
1148         "[ESNext][BigInt] Implement support for addition operations"
1149         https://bugs.webkit.org/show_bug.cgi?id=179002
1150         https://trac.webkit.org/changeset/232439
1151
1152 2018-06-01  Yusuke Suzuki  <utatane.tea@gmail.com>
1153
1154         Baseline op_jtrue emits an insane amount of code
1155         https://bugs.webkit.org/show_bug.cgi?id=185708
1156
1157         Reviewed by Filip Pizlo.
1158
1159         op_jtrue / op_jfalse bloats massive amount of code. This patch attempts to reduce the size of this code by,
1160
1161         1. op_jtrue / op_jfalse immediately jumps if the condition met. We add AssemblyHelpers::branchIf{Truthy,Falsey}
1162            to jump directly. This tightens the code.
1163
1164         2. Align our emitConvertValueToBoolean implementation to FTL's boolify function. It emits less code.
1165
1166         This reduces the code size of op_jtrue in x64 from 220 bytes to 164 bytes.
1167
1168         [  12] jtrue             arg1, 6(->18)
1169               0x7f233170162c: mov 0x30(%rbp), %rax
1170               0x7f2331701630: mov %rax, %rsi
1171               0x7f2331701633: xor $0x6, %rsi
1172               0x7f2331701637: test $0xfffffffffffffffe, %rsi
1173               0x7f233170163e: jnz 0x7f2331701654
1174               0x7f2331701644: cmp $0x7, %eax
1175               0x7f2331701647: setz %sil
1176               0x7f233170164b: movzx %sil, %esi
1177               0x7f233170164f: jmp 0x7f2331701705
1178               0x7f2331701654: test %rax, %r14
1179               0x7f2331701657: jz 0x7f233170169c
1180               0x7f233170165d: cmp %r14, %rax
1181               0x7f2331701660: jb 0x7f2331701675
1182               0x7f2331701666: test %eax, %eax
1183               0x7f2331701668: setnz %sil
1184               0x7f233170166c: movzx %sil, %esi
1185               0x7f2331701670: jmp 0x7f2331701705
1186               0x7f2331701675: lea (%r14,%rax), %rsi
1187               0x7f2331701679: movq %rsi, %xmm0
1188               0x7f233170167e: xorps %xmm1, %xmm1
1189               0x7f2331701681: ucomisd %xmm1, %xmm0
1190               0x7f2331701685: jz 0x7f2331701695
1191               0x7f233170168b: mov $0x1, %esi
1192               0x7f2331701690: jmp 0x7f2331701705
1193               0x7f2331701695: xor %esi, %esi
1194               0x7f2331701697: jmp 0x7f2331701705
1195               0x7f233170169c: test %rax, %r15
1196               0x7f233170169f: jnz 0x7f2331701703
1197               0x7f23317016a5: cmp $0x1, 0x5(%rax)
1198               0x7f23317016a9: jnz 0x7f23317016c1
1199               0x7f23317016af: mov 0x8(%rax), %esi
1200               0x7f23317016b2: test %esi, %esi
1201               0x7f23317016b4: setnz %sil
1202               0x7f23317016b8: movzx %sil, %esi
1203               0x7f23317016bc: jmp 0x7f2331701705
1204               0x7f23317016c1: test $0x1, 0x6(%rax)
1205               0x7f23317016c5: jz 0x7f23317016f9
1206               0x7f23317016cb: mov (%rax), %esi
1207               0x7f23317016cd: mov $0x7f23315000c8, %rdx
1208               0x7f23317016d7: mov (%rdx), %rdx
1209               0x7f23317016da: mov (%rdx,%rsi,8), %rsi
1210               0x7f23317016de: mov $0x7f2330de0000, %rdx
1211               0x7f23317016e8: cmp %rdx, 0x18(%rsi)
1212               0x7f23317016ec: jnz 0x7f23317016f9
1213               0x7f23317016f2: xor %esi, %esi
1214               0x7f23317016f4: jmp 0x7f2331701705
1215               0x7f23317016f9: mov $0x1, %esi
1216               0x7f23317016fe: jmp 0x7f2331701705
1217               0x7f2331701703: xor %esi, %esi
1218               0x7f2331701705: test %esi, %esi
1219               0x7f2331701707: jnz 0x7f233170171b
1220
1221         [  12] jtrue             arg1, 6(->18)
1222               0x7f6c8710156c: mov 0x30(%rbp), %rax
1223               0x7f6c87101570: test %rax, %r15
1224               0x7f6c87101573: jnz 0x7f6c871015c8
1225               0x7f6c87101579: cmp $0x1, 0x5(%rax)
1226               0x7f6c8710157d: jnz 0x7f6c87101592
1227               0x7f6c87101583: cmp $0x0, 0x8(%rax)
1228               0x7f6c87101587: jnz 0x7f6c87101623
1229               0x7f6c8710158d: jmp 0x7f6c87101615
1230               0x7f6c87101592: test $0x1, 0x6(%rax)
1231               0x7f6c87101596: jz 0x7f6c87101623
1232               0x7f6c8710159c: mov (%rax), %esi
1233               0x7f6c8710159e: mov $0x7f6c86f000e0, %rdx
1234               0x7f6c871015a8: mov (%rdx), %rdx
1235               0x7f6c871015ab: mov (%rdx,%rsi,8), %rsi
1236               0x7f6c871015af: mov $0x7f6c867e0000, %rdx
1237               0x7f6c871015b9: cmp %rdx, 0x18(%rsi)
1238               0x7f6c871015bd: jnz 0x7f6c87101623
1239               0x7f6c871015c3: jmp 0x7f6c87101615
1240               0x7f6c871015c8: cmp %r14, %rax
1241               0x7f6c871015cb: jb 0x7f6c871015de
1242               0x7f6c871015d1: test %eax, %eax
1243               0x7f6c871015d3: jnz 0x7f6c87101623
1244               0x7f6c871015d9: jmp 0x7f6c87101615
1245               0x7f6c871015de: test %rax, %r14
1246               0x7f6c871015e1: jz 0x7f6c87101602
1247               0x7f6c871015e7: lea (%r14,%rax), %rsi
1248               0x7f6c871015eb: movq %rsi, %xmm0
1249               0x7f6c871015f0: xorps %xmm1, %xmm1
1250               0x7f6c871015f3: ucomisd %xmm1, %xmm0
1251               0x7f6c871015f7: jz 0x7f6c87101615
1252               0x7f6c871015fd: jmp 0x7f6c87101623
1253               0x7f6c87101602: mov $0x7, %r11
1254               0x7f6c8710160c: cmp %r11, %rax
1255               0x7f6c8710160f: jz 0x7f6c87101623
1256
1257         * dfg/DFGSpeculativeJIT32_64.cpp:
1258         (JSC::DFG::SpeculativeJIT::emitBranch):
1259         * dfg/DFGSpeculativeJIT64.cpp:
1260         (JSC::DFG::SpeculativeJIT::emitBranch):
1261         * jit/AssemblyHelpers.cpp:
1262         (JSC::AssemblyHelpers::emitConvertValueToBoolean):
1263         (JSC::AssemblyHelpers::branchIfValue):
1264         * jit/AssemblyHelpers.h:
1265         (JSC::AssemblyHelpers::branchIfTruthy):
1266         (JSC::AssemblyHelpers::branchIfFalsey):
1267         * jit/JIT.h:
1268         * jit/JITInlines.h:
1269         (JSC::JIT::addJump):
1270         * jit/JITOpcodes.cpp:
1271         (JSC::JIT::emit_op_jfalse):
1272         (JSC::JIT::emit_op_jtrue):
1273         * jit/JITOpcodes32_64.cpp:
1274         (JSC::JIT::emit_op_jfalse):
1275         (JSC::JIT::emit_op_jtrue):
1276
1277 2018-06-02  Yusuke Suzuki  <utatane.tea@gmail.com>
1278
1279         [JSC] Remove WeakReferenceHarvester
1280         https://bugs.webkit.org/show_bug.cgi?id=186102
1281
1282         Reviewed by Filip Pizlo.
1283
1284         After several cleanups, now JSWeakMap becomes the last user of WeakReferenceHarvester.
1285         Since JSWeakMap is already managed in IsoSubspace, we can iterate marked JSWeakMap
1286         by using output constraints & Subspace iteration.
1287
1288         This patch removes WeakReferenceHarvester. Instead of managing this linked-list, our
1289         output constraint set iterates marked JSWeakMap by using Subspace.
1290
1291         And we also add locking for JSWeakMap's rehash and output constraint visiting.
1292
1293         Attached microbenchmark does not show any regression.
1294
1295         * API/JSAPIWrapperObject.h:
1296         * CMakeLists.txt:
1297         * JavaScriptCore.xcodeproj/project.pbxproj:
1298         * heap/Heap.cpp:
1299         (JSC::Heap::endMarking):
1300         (JSC::Heap::addCoreConstraints):
1301         * heap/Heap.h:
1302         * heap/SlotVisitor.cpp:
1303         (JSC::SlotVisitor::addWeakReferenceHarvester): Deleted.
1304         * heap/SlotVisitor.h:
1305         * heap/WeakReferenceHarvester.h: Removed.
1306         * runtime/WeakMapImpl.cpp:
1307         (JSC::WeakMapImpl<WeakMapBucket>::visitChildren):
1308         (JSC::WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::visitOutputConstraints):
1309         (JSC::WeakMapImpl<WeakMapBucket<WeakMapBucketDataKeyValue>>::visitOutputConstraints):
1310         (JSC::WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::visitWeakReferences): Deleted.
1311         (JSC::WeakMapImpl<WeakMapBucket<WeakMapBucketDataKeyValue>>::visitWeakReferences): Deleted.
1312         * runtime/WeakMapImpl.h:
1313         (JSC::WeakMapImpl::WeakMapImpl):
1314         (JSC::WeakMapImpl::finishCreation):
1315         (JSC::WeakMapImpl::rehash):
1316         (JSC::WeakMapImpl::makeAndSetNewBuffer):
1317         (JSC::WeakMapImpl::DeadKeyCleaner::target): Deleted.
1318
1319 2018-06-02  Yusuke Suzuki  <utatane.tea@gmail.com>
1320
1321         [JSC] Object.create should have intrinsic
1322         https://bugs.webkit.org/show_bug.cgi?id=186200
1323
1324         Reviewed by Filip Pizlo.
1325
1326         Object.create is used in various JS code. `Object.create(null)` is particularly used
1327         to create empty plain object with null [[Prototype]]. We can find `Object.create(null)`
1328         call in ARES-6/Babylon code.
1329
1330         This patch adds ObjectCreateIntrinsic to JSC. DFG recognizes it and produces ObjectCreate
1331         DFG node. DFG AI and constant folding attempt to convert it to NewObject when prototype
1332         object is null. It offers significant performance boost for `Object.create(null)`.
1333
1334                                                          baseline                  patched
1335
1336         object-create-null                           53.7940+-1.5297     ^     19.8846+-0.6584        ^ definitely 2.7053x faster
1337         object-create-unknown-object-prototype       38.9977+-1.1364     ^     37.2207+-0.6143        ^ definitely 1.0477x faster
1338         object-create-untyped-prototype              22.5632+-0.6917           22.2539+-0.6876          might be 1.0139x faster
1339
1340         * dfg/DFGAbstractInterpreterInlines.h:
1341         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1342         * dfg/DFGByteCodeParser.cpp:
1343         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
1344         * dfg/DFGClobberize.h:
1345         (JSC::DFG::clobberize):
1346         * dfg/DFGConstantFoldingPhase.cpp:
1347         (JSC::DFG::ConstantFoldingPhase::foldConstants):
1348         * dfg/DFGDoesGC.cpp:
1349         (JSC::DFG::doesGC):
1350         * dfg/DFGFixupPhase.cpp:
1351         (JSC::DFG::FixupPhase::fixupNode):
1352         * dfg/DFGNode.h:
1353         (JSC::DFG::Node::convertToNewObject):
1354         * dfg/DFGNodeType.h:
1355         * dfg/DFGOperations.cpp:
1356         * dfg/DFGOperations.h:
1357         * dfg/DFGPredictionPropagationPhase.cpp:
1358         * dfg/DFGSafeToExecute.h:
1359         (JSC::DFG::safeToExecute):
1360         * dfg/DFGSpeculativeJIT.cpp:
1361         (JSC::DFG::SpeculativeJIT::compileObjectCreate):
1362         * dfg/DFGSpeculativeJIT.h:
1363         * dfg/DFGSpeculativeJIT32_64.cpp:
1364         (JSC::DFG::SpeculativeJIT::compile):
1365         * dfg/DFGSpeculativeJIT64.cpp:
1366         (JSC::DFG::SpeculativeJIT::compile):
1367         * ftl/FTLCapabilities.cpp:
1368         (JSC::FTL::canCompile):
1369         * ftl/FTLLowerDFGToB3.cpp:
1370         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
1371         (JSC::FTL::DFG::LowerDFGToB3::compileObjectCreate):
1372         * runtime/Intrinsic.cpp:
1373         (JSC::intrinsicName):
1374         * runtime/Intrinsic.h:
1375         * runtime/JSGlobalObject.cpp:
1376         (JSC::JSGlobalObject::init):
1377         (JSC::JSGlobalObject::visitChildren):
1378         * runtime/JSGlobalObject.h:
1379         (JSC::JSGlobalObject::nullPrototypeObjectStructure const):
1380         * runtime/ObjectConstructor.cpp:
1381
1382 2018-06-02  Caio Lima  <ticaiolima@gmail.com>
1383
1384         [ESNext][BigInt] Implement support for addition operations
1385         https://bugs.webkit.org/show_bug.cgi?id=179002
1386
1387         Reviewed by Yusuke Suzuki.
1388
1389         This patch is implementing support to BigInt Operands into binary "+"
1390         and binary "-" operators. Right now, we have limited support to DFG
1391         and FTL JIT layers, but we plan to fix this support in future
1392         patches.
1393
1394         * jit/JITOperations.cpp:
1395         * runtime/CommonSlowPaths.cpp:
1396         (JSC::SLOW_PATH_DECL):
1397         * runtime/JSBigInt.cpp:
1398         (JSC::JSBigInt::parseInt):
1399         (JSC::JSBigInt::stringToBigInt):
1400         (JSC::JSBigInt::toString):
1401         (JSC::JSBigInt::multiply):
1402         (JSC::JSBigInt::divide):
1403         (JSC::JSBigInt::remainder):
1404         (JSC::JSBigInt::add):
1405         (JSC::JSBigInt::sub):
1406         (JSC::JSBigInt::absoluteAdd):
1407         (JSC::JSBigInt::absoluteSub):
1408         (JSC::JSBigInt::toStringGeneric):
1409         (JSC::JSBigInt::allocateFor):
1410         (JSC::JSBigInt::toNumber const):
1411         (JSC::JSBigInt::getPrimitiveNumber const):
1412         * runtime/JSBigInt.h:
1413         * runtime/JSCJSValueInlines.h:
1414         * runtime/Operations.cpp:
1415         (JSC::jsAddSlowCase):
1416         * runtime/Operations.h:
1417         (JSC::jsSub):
1418
1419 2018-06-01  Wenson Hsieh  <wenson_hsieh@apple.com>
1420
1421         Fix the watchOS build after r232385
1422         https://bugs.webkit.org/show_bug.cgi?id=186203
1423
1424         Reviewed by Keith Miller.
1425
1426         Add a missing header include for JSImmutableButterfly.
1427
1428         * runtime/ArrayPrototype.cpp:
1429
1430 2018-05-29  Yusuke Suzuki  <utatane.tea@gmail.com>
1431
1432         [JSC] Add Symbol.prototype.description getter
1433         https://bugs.webkit.org/show_bug.cgi?id=186053
1434
1435         Reviewed by Keith Miller.
1436
1437         Symbol.prototype.description accessor  is now stage 3[1].
1438         This adds a getter to retrieve [[Description]] value from Symbol.
1439         Previously, Symbol#toString() returns `Symbol(${description})` value.
1440         So users need to extract `description` part if they want it.
1441
1442         [1]: https://tc39.github.io/proposal-Symbol-description/
1443
1444         * runtime/Symbol.cpp:
1445         (JSC::Symbol::description const):
1446         * runtime/Symbol.h:
1447         * runtime/SymbolPrototype.cpp:
1448         (JSC::tryExtractSymbol):
1449         (JSC::symbolProtoGetterDescription):
1450         (JSC::symbolProtoFuncToString):
1451         (JSC::symbolProtoFuncValueOf):
1452
1453 2018-06-01  Yusuke Suzuki  <utatane.tea@gmail.com>
1454
1455         [JSC] Correct values and members of JSBigInt appropriately
1456         https://bugs.webkit.org/show_bug.cgi?id=186196
1457
1458         Reviewed by Darin Adler.
1459
1460         This patch cleans up a bit to select more appropriate values and members of JSBigInt.
1461
1462         1. JSBigInt's structure should be StructureIsImmortal.
1463         2. JSBigInt::allocationSize should be annotated with `inline`.
1464         3. Remove JSBigInt::visitChildren since it is completely the same to JSCell::visitChildren.
1465         4. Remove JSBigInt::finishCreation since it is completely the same to JSCell::finishCreation.
1466
1467         * runtime/JSBigInt.cpp:
1468         (JSC::JSBigInt::allocationSize):
1469         (JSC::JSBigInt::allocateFor):
1470         (JSC::JSBigInt::compareToDouble):
1471         (JSC::JSBigInt::visitChildren): Deleted.
1472         (JSC::JSBigInt::finishCreation): Deleted.
1473         * runtime/JSBigInt.h:
1474
1475 2018-05-30  Yusuke Suzuki  <utatane.tea@gmail.com>
1476
1477         [DFG] InById should be converted to MatchStructure
1478         https://bugs.webkit.org/show_bug.cgi?id=185803
1479
1480         Reviewed by Keith Miller.
1481
1482         MatchStructure is introduced for instanceof optimization. But this node
1483         is also useful for InById node. This patch converts InById to MatchStructure
1484         node with CheckStructures if possible by using InByIdStatus.
1485
1486         Added microbenchmarks show improvements.
1487
1488                                    baseline                  patched
1489
1490         in-by-id-removed       18.1196+-0.8108     ^     16.1702+-0.9773        ^ definitely 1.1206x faster
1491         in-by-id-match         16.3912+-0.2608     ^     15.2736+-0.8173        ^ definitely 1.0732x faster
1492
1493         * JavaScriptCore.xcodeproj/project.pbxproj:
1494         * Sources.txt:
1495         * bytecode/InByIdStatus.cpp: Added.
1496         (JSC::InByIdStatus::appendVariant):
1497         (JSC::InByIdStatus::computeFor):
1498         (JSC::InByIdStatus::hasExitSite):
1499         (JSC::InByIdStatus::computeForStubInfo):
1500         (JSC::InByIdStatus::computeForStubInfoWithoutExitSiteFeedback):
1501         (JSC::InByIdStatus::filter):
1502         (JSC::InByIdStatus::dump const):
1503         * bytecode/InByIdStatus.h: Added.
1504         (JSC::InByIdStatus::InByIdStatus):
1505         (JSC::InByIdStatus::state const):
1506         (JSC::InByIdStatus::isSet const):
1507         (JSC::InByIdStatus::operator bool const):
1508         (JSC::InByIdStatus::isSimple const):
1509         (JSC::InByIdStatus::numVariants const):
1510         (JSC::InByIdStatus::variants const):
1511         (JSC::InByIdStatus::at const):
1512         (JSC::InByIdStatus::operator[] const):
1513         (JSC::InByIdStatus::takesSlowPath const):
1514         * bytecode/InByIdVariant.cpp: Added.
1515         (JSC::InByIdVariant::InByIdVariant):
1516         (JSC::InByIdVariant::attemptToMerge):
1517         (JSC::InByIdVariant::dump const):
1518         (JSC::InByIdVariant::dumpInContext const):
1519         * bytecode/InByIdVariant.h: Added.
1520         (JSC::InByIdVariant::isSet const):
1521         (JSC::InByIdVariant::operator bool const):
1522         (JSC::InByIdVariant::structureSet const):
1523         (JSC::InByIdVariant::structureSet):
1524         (JSC::InByIdVariant::conditionSet const):
1525         (JSC::InByIdVariant::offset const):
1526         (JSC::InByIdVariant::isHit const):
1527         * bytecode/PolyProtoAccessChain.h:
1528         * dfg/DFGByteCodeParser.cpp:
1529         (JSC::DFG::ByteCodeParser::parseBlock):
1530
1531 2018-06-01  Keith Miller  <keith_miller@apple.com>
1532
1533         move should only emit the move if it's actually needed
1534         https://bugs.webkit.org/show_bug.cgi?id=186123
1535
1536         Reviewed by Saam Barati.
1537
1538         This patch relpaces move with moveToDestinationIfNeeded. This
1539         will prevent us from emiting moves to the same location. The old
1540         move, has been renamed to emitMove and made private.
1541
1542         * bytecompiler/BytecodeGenerator.cpp:
1543         (JSC::BytecodeGenerator::BytecodeGenerator):
1544         (JSC::BytecodeGenerator::emitMove):
1545         (JSC::BytecodeGenerator::emitGetGlobalPrivate):
1546         (JSC::BytecodeGenerator::emitGetAsyncIterator):
1547         (JSC::BytecodeGenerator::move): Deleted.
1548         * bytecompiler/BytecodeGenerator.h:
1549         (JSC::BytecodeGenerator::move):
1550         (JSC::BytecodeGenerator::moveToDestinationIfNeeded): Deleted.
1551         * bytecompiler/NodesCodegen.cpp:
1552         (JSC::ThisNode::emitBytecode):
1553         (JSC::SuperNode::emitBytecode):
1554         (JSC::NewTargetNode::emitBytecode):
1555         (JSC::ResolveNode::emitBytecode):
1556         (JSC::TaggedTemplateNode::emitBytecode):
1557         (JSC::ArrayNode::emitBytecode):
1558         (JSC::ObjectLiteralNode::emitBytecode):
1559         (JSC::EvalFunctionCallNode::emitBytecode):
1560         (JSC::FunctionCallResolveNode::emitBytecode):
1561         (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByIdDirect):
1562         (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByIdDirectPrivate):
1563         (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByValDirect):
1564         (JSC::BytecodeIntrinsicNode::emit_intrinsic_toNumber):
1565         (JSC::BytecodeIntrinsicNode::emit_intrinsic_toString):
1566         (JSC::BytecodeIntrinsicNode::emit_intrinsic_toObject):
1567         (JSC::BytecodeIntrinsicNode::emit_intrinsic_idWithProfile):
1568         (JSC::BytecodeIntrinsicNode::emit_intrinsic_isJSArray):
1569         (JSC::BytecodeIntrinsicNode::emit_intrinsic_isProxyObject):
1570         (JSC::BytecodeIntrinsicNode::emit_intrinsic_isRegExpObject):
1571         (JSC::BytecodeIntrinsicNode::emit_intrinsic_isObject):
1572         (JSC::BytecodeIntrinsicNode::emit_intrinsic_isDerivedArray):
1573         (JSC::BytecodeIntrinsicNode::emit_intrinsic_isMap):
1574         (JSC::BytecodeIntrinsicNode::emit_intrinsic_isSet):
1575         (JSC::CallFunctionCallDotNode::emitBytecode):
1576         (JSC::ApplyFunctionCallDotNode::emitBytecode):
1577         (JSC::emitPostIncOrDec):
1578         (JSC::PostfixNode::emitBracket):
1579         (JSC::PostfixNode::emitDot):
1580         (JSC::PrefixNode::emitResolve):
1581         (JSC::PrefixNode::emitBracket):
1582         (JSC::PrefixNode::emitDot):
1583         (JSC::LogicalOpNode::emitBytecode):
1584         (JSC::ReadModifyResolveNode::emitBytecode):
1585         (JSC::AssignResolveNode::emitBytecode):
1586         (JSC::AssignDotNode::emitBytecode):
1587         (JSC::AssignBracketNode::emitBytecode):
1588         (JSC::FunctionNode::emitBytecode):
1589         (JSC::ClassExprNode::emitBytecode):
1590         (JSC::DestructuringAssignmentNode::emitBytecode):
1591         (JSC::ArrayPatternNode::emitDirectBinding):
1592         (JSC::ObjectPatternNode::bindValue const):
1593         (JSC::AssignmentElementNode::bindValue const):
1594         (JSC::ObjectSpreadExpressionNode::emitBytecode):
1595
1596 2018-05-31  Yusuke Suzuki  <utatane.tea@gmail.com>
1597
1598         [Baseline] Store constant directly in emit_op_mov
1599         https://bugs.webkit.org/show_bug.cgi?id=186182
1600
1601         Reviewed by Saam Barati.
1602
1603         In the old code, we first move a constant to a register and store it to the specified address.
1604         But in 64bit JSC, we can directly store a constant to the specified address. This reduces the
1605         generated code size. Since the old code was emitting a constant in a code anyway, this change
1606         never increases the size of the generated code.
1607
1608         * jit/JITInlines.h:
1609         (JSC::JIT::emitGetVirtualRegister):
1610         We remove this obsolete comment. Our OSR relies on the fact that values are stored and loaded
1611         from the stack. If we transfer values in registers without loading values from the stack, it
1612         breaks this assumption.
1613
1614         * jit/JITOpcodes.cpp:
1615         (JSC::JIT::emit_op_mov):
1616
1617 2018-05-31  Caio Lima  <ticaiolima@gmail.com>
1618
1619         [ESNext][BigInt] Implement support for "=<" and ">=" relational operation
1620         https://bugs.webkit.org/show_bug.cgi?id=185929
1621
1622         Reviewed by Yusuke Suzuki.
1623
1624         This patch is introducing support to BigInt operands into ">=" and
1625         "<=" operators.
1626         Here we introduce ```bigIntCompareResult``` that is a helper function
1627         to reuse code between "less than" and "less than or equal" operators.
1628
1629         * runtime/JSBigInt.h:
1630         * runtime/Operations.h:
1631         (JSC::bigIntCompareResult):
1632         (JSC::bigIntCompare):
1633         (JSC::jsLess):
1634         (JSC::jsLessEq):
1635         (JSC::bigIntCompareLess): Deleted.
1636
1637 2018-05-31  Saam Barati  <sbarati@apple.com>
1638
1639         Cache toString results for CoW arrays
1640         https://bugs.webkit.org/show_bug.cgi?id=186160
1641
1642         Reviewed by Keith Miller.
1643
1644         This patch makes it so that we cache the result of toString on
1645         arrays with a CoW butterfly. This cache lives on Heap and is
1646         cleared after every GC. We only cache the toString result when
1647         the CoW butterfly doesn't have a hole (currently, all CoW arrays
1648         have a hole, but this isn't an invariant we want to rely on). The
1649         reason for this is that if there is a hole, the value may be loaded
1650         from the prototype, and the cache may produce a stale result.
1651         
1652         This is a ~4% speedup on the ML subtest in ARES. And is a ~1% overall
1653         progression on ARES.
1654
1655         * heap/Heap.cpp:
1656         (JSC::Heap::finalize):
1657         (JSC::Heap::addCoreConstraints):
1658         * heap/Heap.h:
1659         * runtime/ArrayPrototype.cpp:
1660         (JSC::canUseFastJoin):
1661         (JSC::holesMustForwardToPrototype):
1662         (JSC::isHole):
1663         (JSC::containsHole):
1664         (JSC::fastJoin):
1665         (JSC::arrayProtoFuncToString):
1666
1667 2018-05-31  Saam Barati  <sbarati@apple.com>
1668
1669         PutStructure AI rule needs to call didFoldClobberStructures when the incoming value's structure set is clear
1670         https://bugs.webkit.org/show_bug.cgi?id=186169
1671
1672         Reviewed by Mark Lam.
1673
1674         If we don't do this, the CFA validation rule about StructureID being
1675         clobbered but AI not clobbering or folding a clobber will cause us
1676         to crash. Simon was running into this yesterday on arstechnica.com.
1677         I couldn't come up with a test case for this, but it's obvious
1678         what the issue is by looking at the IR dump at the time of the crash.
1679
1680         * dfg/DFGAbstractInterpreterInlines.h:
1681         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1682
1683 2018-05-31  Saam Barati  <sbarati@apple.com>
1684
1685         JSImmutableButterfly should align its variable storage
1686         https://bugs.webkit.org/show_bug.cgi?id=186159
1687
1688         Reviewed by Mark Lam.
1689
1690         I'm also making the use of reinterpret_cast and bitwise_cast consistent
1691         inside of JSImmutableButterfly. I switched everything to use bitwise_cast.
1692
1693         * runtime/JSImmutableButterfly.h:
1694         (JSC::JSImmutableButterfly::toButterfly const):
1695         (JSC::JSImmutableButterfly::fromButterfly):
1696         (JSC::JSImmutableButterfly::offsetOfData):
1697         (JSC::JSImmutableButterfly::allocationSize):
1698
1699 2018-05-31  Keith Miller  <keith_miller@apple.com>
1700
1701         DFGArrayModes needs to know more about CoW arrays
1702         https://bugs.webkit.org/show_bug.cgi?id=186162
1703
1704         Reviewed by Filip Pizlo.
1705
1706         This patch fixes two issues in DFGArrayMode.
1707
1708         1) fromObserved was missing switch cases for when the only observed ArrayModes are CopyOnWrite.
1709         2) DFGArrayModes needs to track if the ArrayClass is an OriginalCopyOnWriteArray in order
1710         to vend an accurate original structure.
1711
1712         Additionally, this patch fixes some places in Bytecode parsing where we told the array mode
1713         we were doing a read but actually doing a write. Also, DFGArrayMode will now print the
1714         action it is expecting when being dumped.
1715
1716         * bytecode/ArrayProfile.h:
1717         (JSC::hasSeenWritableArray):
1718         * dfg/DFGArrayMode.cpp:
1719         (JSC::DFG::ArrayMode::fromObserved):
1720         (JSC::DFG::ArrayMode::refine const):
1721         (JSC::DFG::ArrayMode::originalArrayStructure const):
1722         (JSC::DFG::arrayActionToString):
1723         (JSC::DFG::arrayClassToString):
1724         (JSC::DFG::ArrayMode::dump const):
1725         (WTF::printInternal):
1726         * dfg/DFGArrayMode.h:
1727         (JSC::DFG::ArrayMode::withProfile const):
1728         (JSC::DFG::ArrayMode::isJSArray const):
1729         (JSC::DFG::ArrayMode::isJSArrayWithOriginalStructure const):
1730         (JSC::DFG::ArrayMode::arrayModesWithIndexingShape const):
1731         * dfg/DFGByteCodeParser.cpp:
1732         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
1733         (JSC::DFG::ByteCodeParser::parseBlock):
1734         * dfg/DFGFixupPhase.cpp:
1735         (JSC::DFG::FixupPhase::fixupNode):
1736         * dfg/DFGSpeculativeJIT.cpp:
1737         (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode):
1738         * ftl/FTLLowerDFGToB3.cpp:
1739         (JSC::FTL::DFG::LowerDFGToB3::isArrayTypeForArrayify):
1740
1741 2018-05-30  Yusuke Suzuki  <utatane.tea@gmail.com>
1742
1743         [JSC] Pass VM& parameter as much as possible
1744         https://bugs.webkit.org/show_bug.cgi?id=186085
1745
1746         Reviewed by Saam Barati.
1747
1748         JSCell::vm() is slow compared to ExecState::vm(). That's why we have bunch of functions in JSCell/JSObject that take VM& as a parameter.
1749         For example, we have JSCell::structure() and JSCell::structure(VM&), the former retrieves VM& from the cell and invokes structure(VM&).
1750         If we can get VM& from ExecState* or the other place, it reduces the inlined code size.
1751         This patch attempts to pass VM& parameter to such functions as much as possible.
1752
1753         * API/APICast.h:
1754         (toJS):
1755         (toJSForGC):
1756         * API/JSCallbackObjectFunctions.h:
1757         (JSC::JSCallbackObject<Parent>::getOwnPropertySlotByIndex):
1758         (JSC::JSCallbackObject<Parent>::deletePropertyByIndex):
1759         (JSC::JSCallbackObject<Parent>::staticFunctionGetter):
1760         * API/JSObjectRef.cpp:
1761         (JSObjectIsConstructor):
1762         * API/JSTypedArray.cpp:
1763         (JSObjectGetTypedArrayBuffer):
1764         * API/JSValueRef.cpp:
1765         (JSValueIsInstanceOfConstructor):
1766         * bindings/ScriptFunctionCall.cpp:
1767         (Deprecated::ScriptFunctionCall::call):
1768         * bindings/ScriptValue.cpp:
1769         (Inspector::jsToInspectorValue):
1770         * bytecode/AccessCase.cpp:
1771         (JSC::AccessCase::generateImpl):
1772         * bytecode/CodeBlock.cpp:
1773         (JSC::CodeBlock::CodeBlock):
1774         * bytecode/ObjectAllocationProfileInlines.h:
1775         (JSC::ObjectAllocationProfile::possibleDefaultPropertyCount):
1776         * bytecode/ObjectPropertyConditionSet.cpp:
1777         (JSC::generateConditionsForInstanceOf):
1778         * bytecode/PropertyCondition.cpp:
1779         (JSC::PropertyCondition::isWatchableWhenValid const):
1780         (JSC::PropertyCondition::attemptToMakeEquivalenceWithoutBarrier const):
1781         * bytecode/StructureStubClearingWatchpoint.cpp:
1782         (JSC::StructureStubClearingWatchpoint::fireInternal):
1783         * debugger/Debugger.cpp:
1784         (JSC::Debugger::detach):
1785         * debugger/DebuggerScope.cpp:
1786         (JSC::DebuggerScope::create):
1787         (JSC::DebuggerScope::put):
1788         (JSC::DebuggerScope::deleteProperty):
1789         (JSC::DebuggerScope::getOwnPropertyNames):
1790         (JSC::DebuggerScope::defineOwnProperty):
1791         * dfg/DFGAbstractInterpreterInlines.h:
1792         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1793         * dfg/DFGAbstractValue.cpp:
1794         (JSC::DFG::AbstractValue::mergeOSREntryValue):
1795         * dfg/DFGArgumentsEliminationPhase.cpp:
1796         * dfg/DFGArrayMode.cpp:
1797         (JSC::DFG::ArrayMode::refine const):
1798         * dfg/DFGByteCodeParser.cpp:
1799         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
1800         (JSC::DFG::ByteCodeParser::handleTypedArrayConstructor):
1801         (JSC::DFG::ByteCodeParser::handleConstantInternalFunction):
1802         (JSC::DFG::ByteCodeParser::check):
1803         * dfg/DFGConstantFoldingPhase.cpp:
1804         (JSC::DFG::ConstantFoldingPhase::foldConstants):
1805         (JSC::DFG::ConstantFoldingPhase::addStructureTransitionCheck):
1806         * dfg/DFGFixupPhase.cpp:
1807         (JSC::DFG::FixupPhase::fixupNode):
1808         * dfg/DFGGraph.cpp:
1809         (JSC::DFG::Graph::tryGetConstantProperty):
1810         * dfg/DFGOperations.cpp:
1811         * dfg/DFGSpeculativeJIT.cpp:
1812         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
1813         * dfg/DFGStrengthReductionPhase.cpp:
1814         (JSC::DFG::StrengthReductionPhase::handleNode):
1815         * ftl/FTLLowerDFGToB3.cpp:
1816         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharAt):
1817         * ftl/FTLOperations.cpp:
1818         (JSC::FTL::operationPopulateObjectInOSR):
1819         * inspector/InjectedScriptManager.cpp:
1820         (Inspector::InjectedScriptManager::createInjectedScript):
1821         * inspector/JSJavaScriptCallFrame.cpp:
1822         (Inspector::JSJavaScriptCallFrame::caller const):
1823         (Inspector::JSJavaScriptCallFrame::scopeChain const):
1824         * interpreter/CallFrame.cpp:
1825         (JSC::CallFrame::wasmAwareLexicalGlobalObject):
1826         * interpreter/Interpreter.cpp:
1827         (JSC::Interpreter::executeProgram):
1828         (JSC::Interpreter::executeCall):
1829         (JSC::Interpreter::executeConstruct):
1830         (JSC::Interpreter::execute):
1831         (JSC::Interpreter::executeModuleProgram):
1832         * jit/JITOperations.cpp:
1833         (JSC::getByVal):
1834         * jit/Repatch.cpp:
1835         (JSC::tryCacheInByID):
1836         * jsc.cpp:
1837         (functionDollarAgentReceiveBroadcast):
1838         (functionHasCustomProperties):
1839         * llint/LLIntSlowPaths.cpp:
1840         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
1841         (JSC::LLInt::setupGetByIdPrototypeCache):
1842         (JSC::LLInt::getByVal):
1843         (JSC::LLInt::handleHostCall):
1844         (JSC::LLInt::llint_throw_stack_overflow_error):
1845         * runtime/AbstractModuleRecord.cpp:
1846         (JSC::AbstractModuleRecord::finishCreation):
1847         * runtime/ArrayConstructor.cpp:
1848         (JSC::constructArrayWithSizeQuirk):
1849         * runtime/ArrayPrototype.cpp:
1850         (JSC::speciesWatchpointIsValid):
1851         (JSC::arrayProtoFuncToString):
1852         (JSC::arrayProtoFuncToLocaleString):
1853         (JSC::ArrayPrototype::tryInitializeSpeciesWatchpoint):
1854         * runtime/AsyncFunctionConstructor.cpp:
1855         (JSC::callAsyncFunctionConstructor):
1856         (JSC::constructAsyncFunctionConstructor):
1857         * runtime/AsyncGeneratorFunctionConstructor.cpp:
1858         (JSC::callAsyncGeneratorFunctionConstructor):
1859         (JSC::constructAsyncGeneratorFunctionConstructor):
1860         * runtime/BooleanConstructor.cpp:
1861         (JSC::constructWithBooleanConstructor):
1862         * runtime/ClonedArguments.cpp:
1863         (JSC::ClonedArguments::createEmpty):
1864         (JSC::ClonedArguments::createWithInlineFrame):
1865         (JSC::ClonedArguments::createWithMachineFrame):
1866         (JSC::ClonedArguments::createByCopyingFrom):
1867         (JSC::ClonedArguments::getOwnPropertySlot):
1868         (JSC::ClonedArguments::materializeSpecials):
1869         * runtime/CommonSlowPaths.cpp:
1870         (JSC::SLOW_PATH_DECL):
1871         * runtime/CommonSlowPaths.h:
1872         (JSC::CommonSlowPaths::tryCachePutToScopeGlobal):
1873         (JSC::CommonSlowPaths::tryCacheGetFromScopeGlobal):
1874         (JSC::CommonSlowPaths::canAccessArgumentIndexQuickly):
1875         * runtime/ConstructData.cpp:
1876         (JSC::construct):
1877         * runtime/DateConstructor.cpp:
1878         (JSC::constructWithDateConstructor):
1879         * runtime/DatePrototype.cpp:
1880         (JSC::dateProtoFuncToJSON):
1881         * runtime/DirectArguments.cpp:
1882         (JSC::DirectArguments::overrideThings):
1883         * runtime/Error.cpp:
1884         (JSC::getStackTrace):
1885         * runtime/ErrorConstructor.cpp:
1886         (JSC::Interpreter::constructWithErrorConstructor):
1887         (JSC::Interpreter::callErrorConstructor):
1888         * runtime/FunctionConstructor.cpp:
1889         (JSC::constructWithFunctionConstructor):
1890         (JSC::callFunctionConstructor):
1891         * runtime/GeneratorFunctionConstructor.cpp:
1892         (JSC::callGeneratorFunctionConstructor):
1893         (JSC::constructGeneratorFunctionConstructor):
1894         * runtime/GenericArgumentsInlines.h:
1895         (JSC::GenericArguments<Type>::getOwnPropertySlot):
1896         * runtime/InferredStructureWatchpoint.cpp:
1897         (JSC::InferredStructureWatchpoint::fireInternal):
1898         * runtime/InferredType.cpp:
1899         (JSC::InferredType::removeStructure):
1900         * runtime/InferredType.h:
1901         * runtime/InferredTypeInlines.h:
1902         (JSC::InferredType::finalizeUnconditionally):
1903         * runtime/IntlCollator.cpp:
1904         (JSC::IntlCollator::initializeCollator):
1905         * runtime/IntlCollatorConstructor.cpp:
1906         (JSC::IntlCollatorConstructorFuncSupportedLocalesOf):
1907         * runtime/IntlCollatorPrototype.cpp:
1908         (JSC::IntlCollatorPrototypeGetterCompare):
1909         * runtime/IntlDateTimeFormat.cpp:
1910         (JSC::IntlDateTimeFormat::initializeDateTimeFormat):
1911         (JSC::IntlDateTimeFormat::formatToParts):
1912         * runtime/IntlDateTimeFormatConstructor.cpp:
1913         (JSC::IntlDateTimeFormatConstructorFuncSupportedLocalesOf):
1914         * runtime/IntlDateTimeFormatPrototype.cpp:
1915         (JSC::IntlDateTimeFormatPrototypeGetterFormat):
1916         * runtime/IntlNumberFormat.cpp:
1917         (JSC::IntlNumberFormat::initializeNumberFormat):
1918         (JSC::IntlNumberFormat::formatToParts):
1919         * runtime/IntlNumberFormatConstructor.cpp:
1920         (JSC::IntlNumberFormatConstructorFuncSupportedLocalesOf):
1921         * runtime/IntlNumberFormatPrototype.cpp:
1922         (JSC::IntlNumberFormatPrototypeGetterFormat):
1923         * runtime/IntlObject.cpp:
1924         (JSC::canonicalizeLocaleList):
1925         (JSC::defaultLocale):
1926         (JSC::lookupSupportedLocales):
1927         (JSC::intlObjectFuncGetCanonicalLocales):
1928         * runtime/IntlPluralRules.cpp:
1929         (JSC::IntlPluralRules::initializePluralRules):
1930         (JSC::IntlPluralRules::resolvedOptions):
1931         * runtime/IntlPluralRulesConstructor.cpp:
1932         (JSC::IntlPluralRulesConstructorFuncSupportedLocalesOf):
1933         * runtime/IteratorOperations.cpp:
1934         (JSC::iteratorNext):
1935         (JSC::iteratorClose):
1936         (JSC::iteratorForIterable):
1937         * runtime/JSArray.cpp:
1938         (JSC::JSArray::shiftCountWithArrayStorage):
1939         (JSC::JSArray::unshiftCountWithArrayStorage):
1940         (JSC::JSArray::isIteratorProtocolFastAndNonObservable):
1941         * runtime/JSArrayBufferConstructor.cpp:
1942         (JSC::JSArrayBufferConstructor::finishCreation):
1943         (JSC::constructArrayBuffer):
1944         * runtime/JSArrayBufferPrototype.cpp:
1945         (JSC::arrayBufferProtoFuncSlice):
1946         * runtime/JSArrayBufferView.cpp:
1947         (JSC::JSArrayBufferView::unsharedJSBuffer):
1948         (JSC::JSArrayBufferView::possiblySharedJSBuffer):
1949         * runtime/JSAsyncFunction.cpp:
1950         (JSC::JSAsyncFunction::createImpl):
1951         (JSC::JSAsyncFunction::create):
1952         (JSC::JSAsyncFunction::createWithInvalidatedReallocationWatchpoint):
1953         * runtime/JSAsyncGeneratorFunction.cpp:
1954         (JSC::JSAsyncGeneratorFunction::createImpl):
1955         (JSC::JSAsyncGeneratorFunction::create):
1956         (JSC::JSAsyncGeneratorFunction::createWithInvalidatedReallocationWatchpoint):
1957         * runtime/JSBoundFunction.cpp:
1958         (JSC::boundThisNoArgsFunctionCall):
1959         (JSC::boundFunctionCall):
1960         (JSC::boundThisNoArgsFunctionConstruct):
1961         (JSC::boundFunctionConstruct):
1962         (JSC::getBoundFunctionStructure):
1963         (JSC::JSBoundFunction::create):
1964         (JSC::JSBoundFunction::boundArgsCopy):
1965         * runtime/JSCJSValue.cpp:
1966         (JSC::JSValue::putToPrimitive):
1967         * runtime/JSCellInlines.h:
1968         (JSC::JSCell::setStructure):
1969         (JSC::JSCell::methodTable const):
1970         (JSC::JSCell::toBoolean const):
1971         * runtime/JSFunction.h:
1972         (JSC::JSFunction::createImpl):
1973         * runtime/JSGeneratorFunction.cpp:
1974         (JSC::JSGeneratorFunction::createImpl):
1975         (JSC::JSGeneratorFunction::create):
1976         (JSC::JSGeneratorFunction::createWithInvalidatedReallocationWatchpoint):
1977         * runtime/JSGenericTypedArrayViewConstructorInlines.h:
1978         (JSC::constructGenericTypedArrayViewWithArguments):
1979         (JSC::constructGenericTypedArrayView):
1980         * runtime/JSGenericTypedArrayViewInlines.h:
1981         (JSC::JSGenericTypedArrayView<Adaptor>::getOwnPropertySlotByIndex):
1982         (JSC::JSGenericTypedArrayView<Adaptor>::putByIndex):
1983         (JSC::JSGenericTypedArrayView<Adaptor>::deletePropertyByIndex):
1984         (JSC::JSGenericTypedArrayView<Adaptor>::slowDownAndWasteMemory):
1985         * runtime/JSGenericTypedArrayViewPrototypeFunctions.h:
1986         (JSC::genericTypedArrayViewProtoFuncSlice):
1987         (JSC::genericTypedArrayViewPrivateFuncSubarrayCreate):
1988         * runtime/JSGlobalObject.cpp:
1989         (JSC::JSGlobalObject::init):
1990         (JSC::JSGlobalObject::exposeDollarVM):
1991         (JSC::JSGlobalObject::finishCreation):
1992         * runtime/JSGlobalObject.h:
1993         * runtime/JSGlobalObjectFunctions.cpp:
1994         (JSC::globalFuncEval):
1995         * runtime/JSInternalPromise.cpp:
1996         (JSC::JSInternalPromise::then):
1997         * runtime/JSInternalPromiseConstructor.cpp:
1998         (JSC::constructPromise):
1999         * runtime/JSJob.cpp:
2000         (JSC::JSJobMicrotask::run):
2001         * runtime/JSLexicalEnvironment.cpp:
2002         (JSC::JSLexicalEnvironment::getOwnPropertySlot):
2003         (JSC::JSLexicalEnvironment::put):
2004         * runtime/JSMap.cpp:
2005         (JSC::JSMap::isIteratorProtocolFastAndNonObservable):
2006         * runtime/JSMapIterator.cpp:
2007         (JSC::JSMapIterator::createPair):
2008         * runtime/JSModuleLoader.cpp:
2009         (JSC::JSModuleLoader::provideFetch):
2010         (JSC::JSModuleLoader::loadAndEvaluateModule):
2011         (JSC::JSModuleLoader::loadModule):
2012         (JSC::JSModuleLoader::linkAndEvaluateModule):
2013         (JSC::JSModuleLoader::requestImportModule):
2014         * runtime/JSONObject.cpp:
2015         (JSC::JSONProtoFuncParse):
2016         * runtime/JSObject.cpp:
2017         (JSC::JSObject::putInlineSlow):
2018         (JSC::JSObject::putByIndex):
2019         (JSC::JSObject::notifyPresenceOfIndexedAccessors):
2020         (JSC::JSObject::createInitialIndexedStorage):
2021         (JSC::JSObject::createArrayStorage):
2022         (JSC::JSObject::convertUndecidedToArrayStorage):
2023         (JSC::JSObject::convertInt32ToArrayStorage):
2024         (JSC::JSObject::convertDoubleToArrayStorage):
2025         (JSC::JSObject::convertContiguousToArrayStorage):
2026         (JSC::JSObject::convertFromCopyOnWrite):
2027         (JSC::JSObject::ensureWritableInt32Slow):
2028         (JSC::JSObject::ensureWritableDoubleSlow):
2029         (JSC::JSObject::ensureWritableContiguousSlow):
2030         (JSC::JSObject::ensureArrayStorageSlow):
2031         (JSC::JSObject::setPrototypeDirect):
2032         (JSC::JSObject::deleteProperty):
2033         (JSC::callToPrimitiveFunction):
2034         (JSC::JSObject::hasInstance):
2035         (JSC::JSObject::getOwnNonIndexPropertyNames):
2036         (JSC::JSObject::preventExtensions):
2037         (JSC::JSObject::isExtensible):
2038         (JSC::JSObject::reifyAllStaticProperties):
2039         (JSC::JSObject::fillGetterPropertySlot):
2040         (JSC::JSObject::defineOwnIndexedProperty):
2041         (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes):
2042         (JSC::JSObject::putByIndexBeyondVectorLengthWithArrayStorage):
2043         (JSC::JSObject::putByIndexBeyondVectorLength):
2044         (JSC::JSObject::putDirectIndexBeyondVectorLengthWithArrayStorage):
2045         (JSC::JSObject::putDirectIndexSlowOrBeyondVectorLength):
2046         (JSC::JSObject::getNewVectorLength):
2047         (JSC::JSObject::increaseVectorLength):
2048         (JSC::JSObject::reallocateAndShrinkButterfly):
2049         (JSC::JSObject::shiftButterflyAfterFlattening):
2050         (JSC::JSObject::anyObjectInChainMayInterceptIndexedAccesses const):
2051         (JSC::JSObject::prototypeChainMayInterceptStoreTo):
2052         (JSC::JSObject::needsSlowPutIndexing const):
2053         (JSC::JSObject::suggestedArrayStorageTransition const):
2054         * runtime/JSObject.h:
2055         (JSC::JSObject::mayInterceptIndexedAccesses):
2056         (JSC::JSObject::hasIndexingHeader const):
2057         (JSC::JSObject::hasCustomProperties):
2058         (JSC::JSObject::hasGetterSetterProperties):
2059         (JSC::JSObject::hasCustomGetterSetterProperties):
2060         (JSC::JSObject::isExtensibleImpl):
2061         (JSC::JSObject::isStructureExtensible):
2062         (JSC::JSObject::indexingShouldBeSparse):
2063         (JSC::JSObject::staticPropertiesReified):
2064         (JSC::JSObject::globalObject const):
2065         (JSC::JSObject::finishCreation):
2066         (JSC::JSNonFinalObject::finishCreation):
2067         (JSC::getCallData):
2068         (JSC::getConstructData):
2069         (JSC::JSObject::getOwnNonIndexPropertySlot):
2070         (JSC::JSObject::putOwnDataProperty):
2071         (JSC::JSObject::putOwnDataPropertyMayBeIndex):
2072         (JSC::JSObject::butterflyPreCapacity):
2073         (JSC::JSObject::butterflyTotalSize):
2074         * runtime/JSObjectInlines.h:
2075         (JSC::JSObject::putDirectInternal):
2076         * runtime/JSPromise.cpp:
2077         (JSC::JSPromise::initialize):
2078         (JSC::JSPromise::resolve):
2079         * runtime/JSPromiseConstructor.cpp:
2080         (JSC::constructPromise):
2081         * runtime/JSPromiseDeferred.cpp:
2082         (JSC::newPromiseCapability):
2083         (JSC::callFunction):
2084         * runtime/JSScope.cpp:
2085         (JSC::abstractAccess):
2086         * runtime/JSScope.h:
2087         (JSC::JSScope::globalObject): Deleted.
2088         Remove this JSScope::globalObject function since it is completely the same to JSObject::globalObject().
2089
2090         * runtime/JSSet.cpp:
2091         (JSC::JSSet::isIteratorProtocolFastAndNonObservable):
2092         * runtime/JSSetIterator.cpp:
2093         (JSC::JSSetIterator::createPair):
2094         * runtime/JSStringIterator.cpp:
2095         (JSC::JSStringIterator::clone):
2096         * runtime/Lookup.cpp:
2097         (JSC::reifyStaticAccessor):
2098         (JSC::setUpStaticFunctionSlot):
2099         * runtime/Lookup.h:
2100         (JSC::getStaticPropertySlotFromTable):
2101         (JSC::replaceStaticPropertySlot):
2102         (JSC::reifyStaticProperty):
2103         * runtime/MapConstructor.cpp:
2104         (JSC::constructMap):
2105         * runtime/NumberConstructor.cpp:
2106         (JSC::NumberConstructor::finishCreation):
2107         * runtime/ObjectConstructor.cpp:
2108         (JSC::constructObject):
2109         (JSC::objectConstructorAssign):
2110         (JSC::toPropertyDescriptor):
2111         * runtime/ObjectPrototype.cpp:
2112         (JSC::objectProtoFuncDefineGetter):
2113         (JSC::objectProtoFuncDefineSetter):
2114         (JSC::objectProtoFuncToLocaleString):
2115         * runtime/Operations.cpp:
2116         (JSC::jsIsFunctionType): Deleted.
2117         Replace it with JSValue::isFunction(VM&).
2118
2119         * runtime/Operations.h:
2120         * runtime/ProgramExecutable.cpp:
2121         (JSC::ProgramExecutable::initializeGlobalProperties):
2122         * runtime/RegExpConstructor.cpp:
2123         (JSC::constructWithRegExpConstructor):
2124         (JSC::callRegExpConstructor):
2125         * runtime/SamplingProfiler.cpp:
2126         (JSC::SamplingProfiler::processUnverifiedStackTraces):
2127         (JSC::SamplingProfiler::StackFrame::nameFromCallee):
2128         * runtime/ScopedArguments.cpp:
2129         (JSC::ScopedArguments::overrideThings):
2130         * runtime/ScriptExecutable.cpp:
2131         (JSC::ScriptExecutable::newCodeBlockFor):
2132         (JSC::ScriptExecutable::prepareForExecutionImpl):
2133         * runtime/SetConstructor.cpp:
2134         (JSC::constructSet):
2135         * runtime/SparseArrayValueMap.cpp:
2136         (JSC::SparseArrayValueMap::putEntry):
2137         (JSC::SparseArrayValueMap::putDirect):
2138         * runtime/StringConstructor.cpp:
2139         (JSC::constructWithStringConstructor):
2140         * runtime/StringPrototype.cpp:
2141         (JSC::replaceUsingRegExpSearch):
2142         (JSC::replaceUsingStringSearch):
2143         (JSC::stringProtoFuncIterator):
2144         * runtime/Structure.cpp:
2145         (JSC::Structure::materializePropertyTable):
2146         (JSC::Structure::willStoreValueSlow):
2147         * runtime/StructureCache.cpp:
2148         (JSC::StructureCache::emptyStructureForPrototypeFromBaseStructure):
2149         * runtime/StructureInlines.h:
2150         (JSC::Structure::get):
2151         * runtime/WeakMapConstructor.cpp:
2152         (JSC::constructWeakMap):
2153         * runtime/WeakSetConstructor.cpp:
2154         (JSC::constructWeakSet):
2155         * tools/HeapVerifier.cpp:
2156         (JSC::HeapVerifier::reportCell):
2157         * tools/JSDollarVM.cpp:
2158         (JSC::functionGlobalObjectForObject):
2159         (JSC::JSDollarVM::finishCreation):
2160         * wasm/js/JSWebAssemblyInstance.cpp:
2161         (JSC::JSWebAssemblyInstance::finalizeCreation):
2162         * wasm/js/WasmToJS.cpp:
2163         (JSC::Wasm::handleBadI64Use):
2164         (JSC::Wasm::wasmToJSException):
2165         * wasm/js/WebAssemblyCompileErrorConstructor.cpp:
2166         (JSC::constructJSWebAssemblyCompileError):
2167         (JSC::callJSWebAssemblyCompileError):
2168         * wasm/js/WebAssemblyLinkErrorConstructor.cpp:
2169         (JSC::constructJSWebAssemblyLinkError):
2170         (JSC::callJSWebAssemblyLinkError):
2171         * wasm/js/WebAssemblyModuleRecord.cpp:
2172         (JSC::WebAssemblyModuleRecord::evaluate):
2173         * wasm/js/WebAssemblyPrototype.cpp:
2174         (JSC::instantiate):
2175         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
2176         (JSC::constructJSWebAssemblyRuntimeError):
2177         (JSC::callJSWebAssemblyRuntimeError):
2178         * wasm/js/WebAssemblyToJSCallee.cpp:
2179         (JSC::WebAssemblyToJSCallee::create):
2180
2181 2018-05-30  Saam Barati  <sbarati@apple.com>
2182
2183         DFG combined liveness needs to say that the machine CodeBlock's arguments are live
2184         https://bugs.webkit.org/show_bug.cgi?id=186121
2185         <rdar://problem/39377796>
2186
2187         Reviewed by Keith Miller.
2188
2189         DFG's combined liveness was reporting that the machine CodeBlock's |this|
2190         argument was dead at certain points in the program. However, a CodeBlock's
2191         arguments are considered live for the entire function. This fixes a bug
2192         where object allocation sinking phase skipped materializing an allocation
2193         because it thought that the argument it was associated with, |this|, was dead.
2194
2195         * dfg/DFGCombinedLiveness.cpp:
2196         (JSC::DFG::liveNodesAtHead):
2197
2198 2018-05-30  Daniel Bates  <dabates@apple.com>
2199
2200         Web Inspector: Annotate Same-Site cookies
2201         https://bugs.webkit.org/show_bug.cgi?id=184897
2202         <rdar://problem/35178209>
2203
2204         Reviewed by Brian Burg.
2205
2206         Update protocol to include cookie Same-Site policy.
2207
2208         * inspector/protocol/Page.json:
2209
2210 2018-05-29  Keith Miller  <keith_miller@apple.com>
2211
2212         Error instances should not strongly hold onto StackFrames
2213         https://bugs.webkit.org/show_bug.cgi?id=185996
2214
2215         Reviewed by Mark Lam.
2216
2217         Previously, we would hold onto all the StackFrames until the the user
2218         looked at one of the properties on the Error object. This patch makes us
2219         only weakly retain the StackFrames and collect all the information
2220         if we are about to collect any frame.
2221
2222         This patch also adds a method to $vm that returns the heaps count
2223         of live global objects.
2224
2225         * heap/Heap.cpp:
2226         (JSC::Heap::finalizeUnconditionalFinalizers):
2227         * interpreter/Interpreter.cpp:
2228         (JSC::Interpreter::stackTraceAsString):
2229         * interpreter/Interpreter.h:
2230         * runtime/Error.cpp:
2231         (JSC::addErrorInfo):
2232         * runtime/ErrorInstance.cpp:
2233         (JSC::ErrorInstance::finalizeUnconditionally):
2234         (JSC::ErrorInstance::computeErrorInfo):
2235         (JSC::ErrorInstance::materializeErrorInfoIfNeeded):
2236         (JSC::ErrorInstance::visitChildren): Deleted.
2237         * runtime/ErrorInstance.h:
2238         (JSC::ErrorInstance::subspaceFor):
2239         * runtime/JSFunction.cpp:
2240         (JSC::getCalculatedDisplayName):
2241         * runtime/StackFrame.h:
2242         (JSC::StackFrame::isMarked const):
2243         * runtime/VM.cpp:
2244         (JSC::VM::VM):
2245         * runtime/VM.h:
2246         * tools/JSDollarVM.cpp:
2247         (JSC::functionGlobalObjectCount):
2248         (JSC::JSDollarVM::finishCreation):
2249
2250 2018-05-30  Keith Miller  <keith_miller@apple.com>
2251
2252         LLInt get_by_id prototype caching doesn't properly handle changes
2253         https://bugs.webkit.org/show_bug.cgi?id=186112
2254
2255         Reviewed by Filip Pizlo.
2256
2257         The caching would sometimes fail to track that a prototype had changed
2258         and wouldn't update its set of watchpoints.
2259
2260         * bytecode/CodeBlock.cpp:
2261         (JSC::CodeBlock::finalizeLLIntInlineCaches):
2262         * bytecode/CodeBlock.h:
2263         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h:
2264         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::key const):
2265         * bytecode/ObjectPropertyConditionSet.h:
2266         (JSC::ObjectPropertyConditionSet::size const):
2267         * bytecode/Watchpoint.h:
2268         (JSC::Watchpoint::Watchpoint): Deleted.
2269         * llint/LLIntSlowPaths.cpp:
2270         (JSC::LLInt::setupGetByIdPrototypeCache):
2271
2272 2018-05-30  Caio Lima  <ticaiolima@gmail.com>
2273
2274         [ESNext][BigInt] Implement support for "%" operation
2275         https://bugs.webkit.org/show_bug.cgi?id=184327
2276
2277         Reviewed by Yusuke Suzuki.
2278
2279         We are introducing the support of BigInt into remainder (a.k.a mod)
2280         operation.
2281
2282         * runtime/CommonSlowPaths.cpp:
2283         (JSC::SLOW_PATH_DECL):
2284         * runtime/JSBigInt.cpp:
2285         (JSC::JSBigInt::remainder):
2286         (JSC::JSBigInt::rightTrim):
2287         * runtime/JSBigInt.h:
2288
2289 2018-05-30  Saam Barati  <sbarati@apple.com>
2290
2291         AI for Atomics.load() is too conservative in always clobbering world
2292         https://bugs.webkit.org/show_bug.cgi?id=185738
2293         <rdar://problem/40342214>
2294
2295         Reviewed by Yusuke Suzuki.
2296
2297         It fails the assertion that Fil added for catching disagreements between
2298         AI and clobberize. This patch fixes that. You'd run into this if you
2299         manually enabled SAB in a build and ran any SAB tests.
2300
2301         * dfg/DFGAbstractInterpreterInlines.h:
2302         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2303
2304 2018-05-30  Michael Saboff  <msaboff@apple.com>
2305
2306         REGRESSION(r232212): Broke Win32 Builds
2307         https://bugs.webkit.org/show_bug.cgi?id=186061
2308
2309         Reviewed by Yusuke Suzuki.
2310
2311         Changed Windows builds with the JIT disabled to generate and use LLIntAssembly.h
2312         instead of LowLevelInterpreterWin.asm.
2313
2314         * CMakeLists.txt:
2315
2316 2018-05-30  Dominik Infuehr  <dinfuehr@igalia.com>
2317
2318         [MIPS] Fix build on MIPS32r1
2319         https://bugs.webkit.org/show_bug.cgi?id=185944
2320
2321         Reviewed by Yusuke Suzuki.
2322
2323         Only use instructions on MIPS32r2 or later. mthc1 and mfhc1 are not supported
2324         on MIPS32r1.
2325
2326         * offlineasm/mips.rb:
2327
2328 2018-05-29  Saam Barati  <sbarati@apple.com>
2329
2330         Add a version of JSVirtualMachine shrinkFootprint that runs when the VM goes idle
2331         https://bugs.webkit.org/show_bug.cgi?id=186064
2332
2333         Reviewed by Mark Lam.
2334
2335         shrinkFootprint was implemented as:
2336         ```
2337         sanitizeStackForVM(this);
2338         deleteAllCode(DeleteAllCodeIfNotCollecting);
2339         heap.collectNow(Synchronousness::Sync);
2340         WTF::releaseFastMallocFreeMemory();
2341         ```
2342         
2343         However, for correctness reasons, deleteAllCode is implemented to do
2344         work when the VM is idle: no JS is running on the stack. This means
2345         that if shrinkFootprint is called when JS is running on the stack, it
2346         ends up freeing less memory than it could have if it waited to run until
2347         the VM goes idle.
2348         
2349         This patch makes it so we wait until idle before doing work. I'm seeing a
2350         10% footprint progression when testing this against a client of the JSC SPI.
2351         
2352         Because this is a semantic change in how the SPI works, this patch
2353         adds new SPI named shrinkFootprintWhenIdle. The plan is to move
2354         all clients of the shrinkFootprint SPI to shrinkFootprintWhenIdle.
2355         Once that happens, we will delete shrinkFootprint. Until then,
2356         we make shrinkFootprint do exactly what shrinkFootprintWhenIdle does.
2357
2358         * API/JSVirtualMachine.mm:
2359         (-[JSVirtualMachine shrinkFootprint]):
2360         (-[JSVirtualMachine shrinkFootprintWhenIdle]):
2361         * API/JSVirtualMachinePrivate.h:
2362         * runtime/VM.cpp:
2363         (JSC::VM::shrinkFootprintWhenIdle):
2364         (JSC::VM::shrinkFootprint): Deleted.
2365         * runtime/VM.h:
2366
2367 2018-05-29  Saam Barati  <sbarati@apple.com>
2368
2369         shrinkFootprint needs to request a full collection
2370         https://bugs.webkit.org/show_bug.cgi?id=186069
2371
2372         Reviewed by Mark Lam.
2373
2374         * runtime/VM.cpp:
2375         (JSC::VM::shrinkFootprint):
2376
2377 2018-05-29  Caio Lima  <ticaiolima@gmail.com>
2378
2379         [ESNext][BigInt] Implement support for "<" and ">" relational operation
2380         https://bugs.webkit.org/show_bug.cgi?id=185379
2381
2382         Reviewed by Yusuke Suzuki.
2383
2384         This patch is changing the ``jsLess``` operation to follow the
2385         semantics of Abstract Relational Comparison[1] that supports BigInt.
2386         For that, we create 2 new helper functions ```bigIntCompareLess``` and
2387         ```toPrimitiveNumeric``` that considers BigInt as a valid type to be
2388         compared.
2389
2390         [1] - https://tc39.github.io/proposal-bigint/#sec-abstract-relational-comparison
2391
2392         * runtime/JSBigInt.cpp:
2393         (JSC::JSBigInt::unequalSign):
2394         (JSC::JSBigInt::absoluteGreater):
2395         (JSC::JSBigInt::absoluteLess):
2396         (JSC::JSBigInt::compare):
2397         (JSC::JSBigInt::absoluteCompare):
2398         * runtime/JSBigInt.h:
2399         * runtime/JSCJSValueInlines.h:
2400         (JSC::JSValue::isPrimitive const):
2401         * runtime/Operations.h:
2402         (JSC::bigIntCompareLess):
2403         (JSC::toPrimitiveNumeric):
2404         (JSC::jsLess):
2405
2406 2018-05-29  Yusuke Suzuki  <utatane.tea@gmail.com>
2407
2408         [Baseline] Merge loading functionalities
2409         https://bugs.webkit.org/show_bug.cgi?id=185907
2410
2411         Reviewed by Saam Barati.
2412
2413         This patch unifies emitXXXLoad functions in 32bit and 64bit.
2414
2415         * jit/JITInlines.h:
2416         (JSC::JIT::emitDoubleGetByVal):
2417         * jit/JITPropertyAccess.cpp:
2418         (JSC::JIT::emitDoubleLoad):
2419         (JSC::JIT::emitContiguousLoad):
2420         (JSC::JIT::emitArrayStorageLoad):
2421         (JSC::JIT::emitIntTypedArrayGetByVal):
2422         (JSC::JIT::emitFloatTypedArrayGetByVal):
2423         Define register usage first, and share the same code in 32bit and 64bit.
2424
2425         * jit/JITPropertyAccess32_64.cpp:
2426         (JSC::JIT::emitSlow_op_put_by_val):
2427         Now C-stack is always enabled in JIT platform and temporary registers increases from 5 to 6 in x86.
2428         We can remove this special handling.
2429
2430         (JSC::JIT::emitContiguousLoad): Deleted.
2431         (JSC::JIT::emitDoubleLoad): Deleted.
2432         (JSC::JIT::emitArrayStorageLoad): Deleted.
2433
2434 2018-05-29  Saam Barati  <sbarati@apple.com>
2435
2436         JSC should put bmalloc's scavenger into mini mode
2437         https://bugs.webkit.org/show_bug.cgi?id=185988
2438
2439         Reviewed by Michael Saboff.
2440
2441         When we InitializeThreading, we'll now enable bmalloc's mini mode
2442         if the VM is in mini mode. This is an 8-10% progression on the footprint
2443         at end score in run-testmem, making it a 4-5% memory score progression.
2444         It's between a 0-1% regression in its time score.
2445
2446         * runtime/InitializeThreading.cpp:
2447         (JSC::initializeThreading):
2448
2449 2018-05-29  Caitlin Potter  <caitp@igalia.com>
2450
2451         [JSC] Fix Array.prototype.concat fast case when single argument is Proxy
2452         https://bugs.webkit.org/show_bug.cgi?id=184267
2453
2454         Reviewed by Saam Barati.
2455
2456         Before this patch, the fast case for Array.prototype.concat was taken if
2457         there was a single argument passed to the function, which is either a
2458         non-JSCell, or an ObjectType JSCell not marked as concat-spreadable.
2459         This incorrectly prevented Proxy objects from being spread when
2460         they were the only argument passed to A.prototype.concat(), violating ECMA-262.
2461
2462         * builtins/ArrayPrototype.js:
2463         (concat):
2464
2465 2018-05-27  Yusuke Suzuki  <utatane.tea@gmail.com>
2466
2467         [JSC] JSBigInt::digitDiv has undefined behavior which causes test failures
2468         https://bugs.webkit.org/show_bug.cgi?id=186022
2469
2470         Reviewed by Darin Adler.
2471
2472         digitDiv performs Value64Bit >> 64 / Value32Bit >> 32, which is undefined behavior. And zero mask
2473         creation has an issue (`s` should be casted to signed one before negating). They cause test failures
2474         in non x86 / x86_64 environments. x86 and x86_64 work well since they have a fast path written
2475         in asm.
2476
2477         This patch fixes digitDiv by carefully avoiding undefined behaviors. We mask the left value of the
2478         rshift with `digitBits - 1`, which makes `digitBits` 0 while it keeps 0 <= n < digitBits values.
2479         This makes the target rshift well-defined in C++. While produced value by the rshift covers 0 <= `s` < 64 (32
2480         in 32bit envirnoment) cases, this rshift does not shift if `s` is 0. sZeroMask clears the value
2481         if `s` is 0, so that `s == 0` case is also covered. Note that `s == 64` never happens since `divisor`
2482         is never 0 here. We add assertion for that. We also fixes `sZeroMask` calculation.
2483
2484         This patch also fixes naming convention for constant values.
2485
2486         * runtime/JSBigInt.cpp:
2487         (JSC::JSBigInt::digitMul):
2488         (JSC::JSBigInt::digitDiv):
2489         * runtime/JSBigInt.h:
2490
2491 2018-05-27  Yusuke Suzuki  <utatane.tea@gmail.com>
2492
2493         [WTF] Add clz32 / clz64 for MSVC
2494         https://bugs.webkit.org/show_bug.cgi?id=186023
2495
2496         Reviewed by Daniel Bates.
2497
2498         Move clz32 and clz64 to WTF.
2499
2500         * runtime/MathCommon.h:
2501         (JSC::clz32): Deleted.
2502         (JSC::clz64): Deleted.
2503
2504 2018-05-27  Caio Lima  <ticaiolima@gmail.com>
2505
2506         [ESNext][BigInt] Implement "+" and "-" unary operation
2507         https://bugs.webkit.org/show_bug.cgi?id=182214
2508
2509         Reviewed by Yusuke Suzuki.
2510
2511         This Patch is implementing support to "-" unary operation on BigInt.
2512         It is also changing the logic of ASTBuilder::makeNegateNode to
2513         calculate BigInt literals with properly sign, avoiding
2514         unecessary operation. It required a refactoring into
2515         JSBigInt::parseInt to consider the sign as parameter.
2516
2517         We are also introducing a new DFG Node called ValueNegate to handle BigInt negate
2518         operations. With the introduction of BigInt, it is not true
2519         that every negate operation returns a Number. As ArithNegate is a
2520         node that considers its result is always a Number, like all other
2521         Arith<Operation>, we decided to keep this consistency and use ValueNegate when
2522         speculation indicates that the operand is a BigInt.
2523         This design is following the same distinction between ArithAdd and
2524         ValueAdd. Also, this new node will make simpler the introduction of
2525         optimizations when we create speculation paths for BigInt in future
2526         patches.
2527
2528         In the case of "+" unary operation on BigInt, the current semantic we already have
2529         is correctly, since it needs to throw TypeError because of ToNumber call[1].
2530         In such case, we are adding tests to verify other edge cases.
2531
2532         [1] - https://tc39.github.io/proposal-bigint/#sec-unary-plus-operator
2533
2534         * bytecompiler/BytecodeGenerator.cpp:
2535         (JSC::BytecodeGenerator::addBigIntConstant):
2536         * bytecompiler/BytecodeGenerator.h:
2537         * bytecompiler/NodesCodegen.cpp:
2538         (JSC::BigIntNode::jsValue const):
2539         * dfg/DFGAbstractInterpreterInlines.h:
2540         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2541         * dfg/DFGByteCodeParser.cpp:
2542         (JSC::DFG::ByteCodeParser::makeSafe):
2543         (JSC::DFG::ByteCodeParser::parseBlock):
2544         * dfg/DFGClobberize.h:
2545         (JSC::DFG::clobberize):
2546         * dfg/DFGDoesGC.cpp:
2547         (JSC::DFG::doesGC):
2548         * dfg/DFGFixupPhase.cpp:
2549         (JSC::DFG::FixupPhase::fixupNode):
2550         * dfg/DFGNode.h:
2551         (JSC::DFG::Node::arithNodeFlags):
2552         * dfg/DFGNodeType.h:
2553         * dfg/DFGPredictionPropagationPhase.cpp:
2554         * dfg/DFGSafeToExecute.h:
2555         (JSC::DFG::safeToExecute):
2556         * dfg/DFGSpeculativeJIT.cpp:
2557         (JSC::DFG::SpeculativeJIT::compileValueNegate):
2558         (JSC::DFG::SpeculativeJIT::compileArithNegate):
2559         * dfg/DFGSpeculativeJIT.h:
2560         * dfg/DFGSpeculativeJIT32_64.cpp:
2561         (JSC::DFG::SpeculativeJIT::compile):
2562         * dfg/DFGSpeculativeJIT64.cpp:
2563         (JSC::DFG::SpeculativeJIT::compile):
2564         * ftl/FTLCapabilities.cpp:
2565         (JSC::FTL::canCompile):
2566         * ftl/FTLLowerDFGToB3.cpp:
2567         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
2568         (JSC::FTL::DFG::LowerDFGToB3::compileValueNegate):
2569         (JSC::FTL::DFG::LowerDFGToB3::compileArithNegate):
2570         * jit/JITOperations.cpp:
2571         * parser/ASTBuilder.h:
2572         (JSC::ASTBuilder::createBigIntWithSign):
2573         (JSC::ASTBuilder::createBigIntFromUnaryOperation):
2574         (JSC::ASTBuilder::makeNegateNode):
2575         * parser/NodeConstructors.h:
2576         (JSC::BigIntNode::BigIntNode):
2577         * parser/Nodes.h:
2578         * runtime/CommonSlowPaths.cpp:
2579         (JSC::updateArithProfileForUnaryArithOp):
2580         (JSC::SLOW_PATH_DECL):
2581         * runtime/JSBigInt.cpp:
2582         (JSC::JSBigInt::parseInt):
2583         * runtime/JSBigInt.h:
2584         * runtime/JSCJSValueInlines.h:
2585         (JSC::JSValue::strictEqualSlowCaseInline):
2586
2587 2018-05-27  Dan Bernstein  <mitz@apple.com>
2588
2589         Tried to fix the 32-bit !ASSERT_DISABLED build after r232211.
2590
2591         * jit/JITOperations.cpp:
2592
2593 2018-05-26  Yusuke Suzuki  <utatane.tea@gmail.com>
2594
2595         [JSC] Rename Array#flatten to flat
2596         https://bugs.webkit.org/show_bug.cgi?id=186012
2597
2598         Reviewed by Saam Barati.
2599
2600         Rename Array#flatten to Array#flat. This rename is done in TC39 since flatten
2601         conflicts with the mootools' function name.
2602
2603         * builtins/ArrayPrototype.js:
2604         (globalPrivate.flatIntoArray):
2605         (flat):
2606         (globalPrivate.flatIntoArrayWithCallback):
2607         (flatMap):
2608         (globalPrivate.flattenIntoArray): Deleted.
2609         (flatten): Deleted.
2610         (globalPrivate.flattenIntoArrayWithCallback): Deleted.
2611         * runtime/ArrayPrototype.cpp:
2612         (JSC::ArrayPrototype::finishCreation):
2613
2614 2018-05-25  Mark Lam  <mark.lam@apple.com>
2615
2616         for-in loops should preserve and restore the TDZ stack for each of its internal loops.
2617         https://bugs.webkit.org/show_bug.cgi?id=185995
2618         <rdar://problem/40173142>
2619
2620         Reviewed by Saam Barati.
2621
2622         This is because there's no guarantee that any of the loop bodies will be
2623         executed.  Hence, there's no guarantee that the TDZ variables will have been
2624         initialized after each loop body.
2625
2626         * bytecompiler/BytecodeGenerator.cpp:
2627         (JSC::BytecodeGenerator::preserveTDZStack):
2628         (JSC::BytecodeGenerator::restoreTDZStack):
2629         * bytecompiler/BytecodeGenerator.h:
2630         * bytecompiler/NodesCodegen.cpp:
2631         (JSC::ForInNode::emitBytecode):
2632
2633 2018-05-25  Mark Lam  <mark.lam@apple.com>
2634
2635         MachineContext's instructionPointer() should handle null PCs correctly.
2636         https://bugs.webkit.org/show_bug.cgi?id=186004
2637         <rdar://problem/40570067>
2638
2639         Reviewed by Saam Barati.
2640
2641         instructionPointer() returns a MacroAssemblerCodePtr<CFunctionPtrTag>.  However,
2642         MacroAssemblerCodePtr's constructor does not accept a null pointer value and will
2643         assert accordingly with a debug ASSERT.  This is inconsequential for release
2644         builds, but to avoid this assertion failure, we should check for a null PC and
2645         return MacroAssemblerCodePtr<CFunctionPtrTag>(nullptr) instead (which uses the
2646         MacroAssemblerCodePtr(std::nullptr_t) version of the constructor instead).
2647
2648         Alternatively, we can change all of MacroAssemblerCodePtr's constructors to check
2649         for null pointers, but I rather not do that yet.  In general,
2650         MacroAssemblerCodePtrs are constructed with non-null pointers, and I prefer to
2651         leave it that way for now.
2652
2653         Note: this assertion failure only manifests when we have signal traps enabled,
2654         and encounter a null pointer deref.
2655
2656         * runtime/MachineContext.h:
2657         (JSC::MachineContext::instructionPointer):
2658
2659 2018-05-25  Mark Lam  <mark.lam@apple.com>
2660
2661         Enforce invariant that GetterSetter objects are invariant.
2662         https://bugs.webkit.org/show_bug.cgi?id=185968
2663         <rdar://problem/40541416>
2664
2665         Reviewed by Saam Barati.
2666
2667         The code already assumes the invariant that GetterSetter objects are immutable.
2668         For example, the use of @tryGetById in builtins expect this invariant to be true.
2669         The existing code mostly enforces this except for one case: JSObject's
2670         validateAndApplyPropertyDescriptor, where it will re-use the same GetterSetter
2671         object.
2672
2673         This patch enforces this invariant by removing the setGetter and setSetter methods
2674         of GetterSetter, and requiring the getter/setter callback functions to be
2675         specified at construction time.
2676
2677         * jit/JITOperations.cpp:
2678         * llint/LLIntSlowPaths.cpp:
2679         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
2680         * runtime/GetterSetter.cpp:
2681         (JSC::GetterSetter::withGetter): Deleted.
2682         (JSC::GetterSetter::withSetter): Deleted.
2683         * runtime/GetterSetter.h:
2684         * runtime/JSGlobalObject.cpp:
2685         (JSC::JSGlobalObject::init):
2686         * runtime/JSObject.cpp:
2687         (JSC::JSObject::putIndexedDescriptor):
2688         (JSC::JSObject::putDirectNativeIntrinsicGetter):
2689         (JSC::putDescriptor):
2690         (JSC::validateAndApplyPropertyDescriptor):
2691         * runtime/JSTypedArrayViewPrototype.cpp:
2692         (JSC::JSTypedArrayViewPrototype::finishCreation):
2693         * runtime/Lookup.cpp:
2694         (JSC::reifyStaticAccessor):
2695         * runtime/PropertyDescriptor.cpp:
2696         (JSC::PropertyDescriptor::slowGetterSetter):
2697
2698 2018-05-25  Saam Barati  <sbarati@apple.com>
2699
2700         Make JSC have a mini mode that kicks in when the JIT is disabled
2701         https://bugs.webkit.org/show_bug.cgi?id=185931
2702
2703         Reviewed by Mark Lam.
2704
2705         This patch makes JSC have a mini VM mode. This currently only kicks in
2706         when the process can't JIT. Mini VM now means a few things:
2707         - We always use a 1.27x heap growth factor. This number was the best tradeoff
2708           between memory use progression and time regression in run-testmem. We may
2709           want to tune this more in the future as we make other mini VM changes.
2710         - We always sweep synchronously.
2711         - We disable generational GC.
2712         
2713         I'm going to continue to extend what mini VM mode means in future changes.
2714         
2715         This patch is a 50% memory progression and an ~8-9% time regression
2716         on run-testmem when running in mini VM mode with the JIT disabled.
2717
2718         * heap/Heap.cpp:
2719         (JSC::Heap::collectNow):
2720         (JSC::Heap::finalize):
2721         (JSC::Heap::useGenerationalGC):
2722         (JSC::Heap::shouldSweepSynchronously):
2723         (JSC::Heap::shouldDoFullCollection):
2724         * heap/Heap.h:
2725         * runtime/Options.h:
2726         * runtime/VM.cpp:
2727         (JSC::VM::isInMiniMode):
2728         * runtime/VM.h:
2729
2730 2018-05-25  Saam Barati  <sbarati@apple.com>
2731
2732         Have a memory test where we can validate JSCs mini memory mode
2733         https://bugs.webkit.org/show_bug.cgi?id=185932
2734
2735         Reviewed by Mark Lam.
2736
2737         This patch adds the testmem CLI. It takes as input a file to run
2738         and the number of iterations to run it (by default it runs it
2739         20 times). Each iteration runs in a new JSContext. Each JSContext
2740         belongs to a VM that is created once. When finished, the CLI dumps
2741         out the peak memory usage of the process, the memory usage at the end
2742         of running all the iterations of the process, and the total time it
2743         took to run all the iterations.
2744
2745         * JavaScriptCore.xcodeproj/project.pbxproj:
2746         * testmem: Added.
2747         * testmem/testmem.mm: Added.
2748         (description):
2749         (Footprint::now):
2750         (main):
2751
2752 2018-05-25  David Kilzer  <ddkilzer@apple.com>
2753
2754         Fix issues with -dealloc methods found by clang static analyzer
2755         <https://webkit.org/b/185887>
2756
2757         Reviewed by Joseph Pecoraro.
2758
2759         * API/JSValue.mm:
2760         (-[JSValue dealloc]):
2761         (-[JSValue description]):
2762         - Move method implementations from (Internal) category to the
2763           main category since these are public API.  This fixes the
2764           false positive warning about a missing -dealloc method.
2765
2766 2018-05-24  Yusuke Suzuki  <utatane.tea@gmail.com>
2767
2768         [Baseline] Remove a hack for DCE removal of NewFunction
2769         https://bugs.webkit.org/show_bug.cgi?id=185945
2770
2771         Reviewed by Saam Barati.
2772
2773         This `undefined` check in baseline is originally introduced in r177871. The problem was,
2774         when NewFunction is removed in DFG DCE, its referencing scope DFG node  is also removed.
2775         While op_new_func_xxx want to have scope for function creation, DFG OSR exit cannot
2776         retrieve this into the stack since the scope is not referenced from anywhere.
2777
2778         In r177871, we fixed this by accepting `undefined` scope in the baseline op_new_func_xxx
2779         implementation. But rather than that, just emitting `Phantom` for this scope is clean
2780         and consistent to the other DFG nodes like GetClosureVar.
2781
2782         This patch emits Phantom instead, and removes unnecessary `undefined` check in baseline.
2783         While we emit Phantom, it is not testable since NewFunction is guarded by MovHint which
2784         is not removed in DFG. And in FTL, NewFunction will be converted to PhantomNewFunction
2785         if it is not referenced. And scope node is kept by PutHint. But emitting Phantom is nice
2786         since it conservatively guards the scope, and it does not introduce any additional overhead
2787         compared to the current status.
2788
2789         * dfg/DFGByteCodeParser.cpp:
2790         (JSC::DFG::ByteCodeParser::parseBlock):
2791         * jit/JITOpcodes.cpp:
2792         (JSC::JIT::emitNewFuncExprCommon):
2793
2794 2018-05-23  Keith Miller  <keith_miller@apple.com>
2795
2796         Expose $vm if window.internals is exposed
2797         https://bugs.webkit.org/show_bug.cgi?id=185900
2798
2799         Reviewed by Mark Lam.
2800
2801         This is useful for testing vm internals when running LayoutTests.
2802
2803         * runtime/JSGlobalObject.cpp:
2804         (JSC::JSGlobalObject::init):
2805         (JSC::JSGlobalObject::visitChildren):
2806         (JSC::JSGlobalObject::exposeDollarVM):
2807         * runtime/JSGlobalObject.h:
2808
2809 2018-05-23  Keith Miller  <keith_miller@apple.com>
2810
2811         Define length on CoW array should properly convert to writable
2812         https://bugs.webkit.org/show_bug.cgi?id=185927
2813
2814         Reviewed by Yusuke Suzuki.
2815
2816         * runtime/JSArray.cpp:
2817         (JSC::JSArray::setLength):
2818
2819 2018-05-23  Keith Miller  <keith_miller@apple.com>
2820
2821         InPlaceAbstractState should filter variables at the tail from a GetLocal by their flush format
2822         https://bugs.webkit.org/show_bug.cgi?id=185923
2823
2824         Reviewed by Saam Barati.
2825
2826         Previously, we could confuse AI by overly broadening a type. This happens when a block in a
2827         loop has a local mutated following a GetLocal but never SetLocaled to the stack. For example,
2828
2829         Block 1:
2830         @1: GetLocal(loc42, FlushedInt32);
2831         @2: PutStructure(Check: Cell: @1);
2832         @3: Jump(Block 1);
2833
2834         Would cause us to claim that loc42 could be either an int32 or a some cell. However,
2835         the type of an local cannot change without writing to it.
2836
2837         This fixes a crash in destructuring-rest-element.js
2838
2839         * dfg/DFGInPlaceAbstractState.cpp:
2840         (JSC::DFG::InPlaceAbstractState::endBasicBlock):
2841
2842 2018-05-23  Filip Pizlo  <fpizlo@apple.com>
2843
2844         Speed up JetStream/base64
2845         https://bugs.webkit.org/show_bug.cgi?id=185914
2846
2847         Reviewed by Michael Saboff.
2848         
2849         Make allocation fast paths ALWAYS_INLINE.
2850         
2851         This is a 1% speed-up on SunSpider, mostly because of base64. It also speeds up pdfjs by
2852         ~6%.
2853
2854         * CMakeLists.txt:
2855         * JavaScriptCore.xcodeproj/project.pbxproj:
2856         * heap/AllocatorInlines.h:
2857         (JSC::Allocator::allocate const):
2858         * heap/CompleteSubspace.cpp:
2859         (JSC::CompleteSubspace::allocateNonVirtual): Deleted.
2860         * heap/CompleteSubspace.h:
2861         * heap/CompleteSubspaceInlines.h: Added.
2862         (JSC::CompleteSubspace::allocateNonVirtual):
2863         * heap/FreeListInlines.h:
2864         (JSC::FreeList::allocate):
2865         * heap/IsoSubspace.cpp:
2866         (JSC::IsoSubspace::allocateNonVirtual): Deleted.
2867         * heap/IsoSubspace.h:
2868         (JSC::IsoSubspace::allocatorForNonVirtual):
2869         * heap/IsoSubspaceInlines.h: Added.
2870         (JSC::IsoSubspace::allocateNonVirtual):
2871         * runtime/JSCellInlines.h:
2872         * runtime/VM.h:
2873
2874 2018-05-23  Rick Waldron  <waldron.rick@gmail.com>
2875
2876         Conversion misspelled "Convertion" in error message string
2877         https://bugs.webkit.org/show_bug.cgi?id=185436
2878
2879         Reviewed by Saam Barati, Michael Saboff
2880
2881         * runtime/JSBigInt.cpp:
2882         (JSC::JSBigInt::toNumber const):
2883
2884 2018-05-22  Yusuke Suzuki  <utatane.tea@gmail.com>
2885
2886         [JSC] Clean up stringGetByValStubGenerator
2887         https://bugs.webkit.org/show_bug.cgi?id=185864
2888
2889         Reviewed by Saam Barati.
2890
2891         We clean up stringGetByValStubGenerator.
2892
2893         1. Unify 32bit and 64bit implementations.
2894         2. Rename stringGetByValStubGenerator to stringGetByValGenerator, move it to ThunkGenerators.cpp.
2895         3. Remove string type check since this code is invoked only when we know regT0 is JSString*.
2896         4. Do not tag Cell in stringGetByValGenerator side. 32bit code stores Cell with tag in JITPropertyAccess32_64 side.
2897         5. Fix invalid use of loadPtr for StringImpl::flags. Should use load32.
2898
2899         * jit/JIT.h:
2900         * jit/JITPropertyAccess.cpp:
2901         (JSC::JIT::emitSlow_op_get_by_val):
2902         (JSC::JIT::stringGetByValStubGenerator): Deleted.
2903         * jit/JITPropertyAccess32_64.cpp:
2904         (JSC::JIT::emit_op_get_by_val):
2905         (JSC::JIT::emitSlow_op_get_by_val):
2906         (JSC::JIT::stringGetByValStubGenerator): Deleted.
2907         * jit/ThunkGenerators.cpp:
2908         (JSC::stringGetByValGenerator):
2909         * jit/ThunkGenerators.h:
2910
2911 2018-05-22  Yusuke Suzuki  <utatane.tea@gmail.com>
2912
2913         [JSC] Use branchIfString/branchIfNotString instead of structure checkings
2914         https://bugs.webkit.org/show_bug.cgi?id=185810
2915
2916         Reviewed by Saam Barati.
2917
2918         Let's use branchIfString/branchIfNotString helper functions instead of
2919         checking structure with jsString's structure. It's easy to read. And
2920         it emits less code since we do not need to embed string structure's
2921         raw pointer in 32bit environment.
2922
2923         * jit/JIT.h:
2924         * jit/JITInlines.h:
2925         (JSC::JIT::emitLoadCharacterString):
2926         (JSC::JIT::checkStructure): Deleted.
2927         * jit/JITOpcodes32_64.cpp:
2928         (JSC::JIT::emitSlow_op_eq):
2929         (JSC::JIT::compileOpEqJumpSlow):
2930         (JSC::JIT::emitSlow_op_neq):
2931         * jit/JITPropertyAccess.cpp:
2932         (JSC::JIT::stringGetByValStubGenerator):
2933         (JSC::JIT::emitSlow_op_get_by_val):
2934         (JSC::JIT::emitByValIdentifierCheck):
2935         * jit/JITPropertyAccess32_64.cpp:
2936         (JSC::JIT::stringGetByValStubGenerator):
2937         (JSC::JIT::emitSlow_op_get_by_val):
2938         * jit/JSInterfaceJIT.h:
2939         (JSC::ThunkHelpers::jsStringLengthOffset): Deleted.
2940         (JSC::ThunkHelpers::jsStringValueOffset): Deleted.
2941         * jit/SpecializedThunkJIT.h:
2942         (JSC::SpecializedThunkJIT::loadJSStringArgument):
2943         * jit/ThunkGenerators.cpp:
2944         (JSC::stringCharLoad):
2945         (JSC::charCodeAtThunkGenerator):
2946         (JSC::charAtThunkGenerator):
2947         * runtime/JSString.h:
2948
2949 2018-05-22  Mark Lam  <mark.lam@apple.com>
2950
2951         BytecodeGeneratorification shouldn't add a ValueProfile if the JIT is disabled.
2952         https://bugs.webkit.org/show_bug.cgi?id=185896
2953         <rdar://problem/40471403>
2954
2955         Reviewed by Saam Barati.
2956
2957         * bytecode/BytecodeGeneratorification.cpp:
2958         (JSC::BytecodeGeneratorification::run):
2959
2960 2018-05-22  Yusuke Suzuki  <utatane.tea@gmail.com>
2961
2962         [JSC] Fix CachedCall's argument count if RegExp has named captures
2963         https://bugs.webkit.org/show_bug.cgi?id=185587
2964
2965         Reviewed by Mark Lam.
2966
2967         If the given RegExp has named captures, the argument count of CachedCall in String#replace
2968         should be increased by one. This causes crash with assertion in test262. This patch corrects
2969         the argument count.
2970
2971         This patch also unifies source.is8Bit()/!source.is8Bit() code since they are now completely
2972         the same.
2973
2974         * runtime/StringPrototype.cpp:
2975         (JSC::replaceUsingRegExpSearch):
2976
2977 2018-05-22  Mark Lam  <mark.lam@apple.com>
2978
2979         StringImpl utf8 conversion should not fail silently.
2980         https://bugs.webkit.org/show_bug.cgi?id=185888
2981         <rdar://problem/40464506>
2982
2983         Reviewed by Filip Pizlo.
2984
2985         * dfg/DFGLazyJSValue.cpp:
2986         (JSC::DFG::LazyJSValue::dumpInContext const):
2987         * runtime/DateConstructor.cpp:
2988         (JSC::constructDate):
2989         (JSC::dateParse):
2990         * runtime/JSDateMath.cpp:
2991         (JSC::parseDate):
2992         * runtime/JSDateMath.h:
2993
2994 2018-05-22  Keith Miller  <keith_miller@apple.com>
2995
2996         Remove the UnconditionalFinalizer class
2997         https://bugs.webkit.org/show_bug.cgi?id=185881
2998
2999         Reviewed by Filip Pizlo.
3000
3001         The only remaining user of this API is
3002         JSWebAssemblyCodeBlock. This patch changes, JSWebAssemblyCodeBlock
3003         to use the newer template based API and removes the old class.
3004
3005         * JavaScriptCore.xcodeproj/project.pbxproj:
3006         * bytecode/CodeBlock.h:
3007         * heap/Heap.cpp:
3008         (JSC::Heap::finalizeUnconditionalFinalizers):
3009         * heap/Heap.h:
3010         * heap/SlotVisitor.cpp:
3011         (JSC::SlotVisitor::addUnconditionalFinalizer): Deleted.
3012         * heap/SlotVisitor.h:
3013         * heap/UnconditionalFinalizer.h: Removed.
3014         * wasm/js/JSWebAssemblyCodeBlock.cpp:
3015         (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock):
3016         (JSC::JSWebAssemblyCodeBlock::visitChildren):
3017         (JSC::JSWebAssemblyCodeBlock::finalizeUnconditionally):
3018         (JSC::JSWebAssemblyCodeBlock::UnconditionalFinalizer::finalizeUnconditionally): Deleted.
3019         * wasm/js/JSWebAssemblyCodeBlock.h:
3020         * wasm/js/JSWebAssemblyModule.h:
3021
3022         * CMakeLists.txt:
3023         * JavaScriptCore.xcodeproj/project.pbxproj:
3024         * bytecode/CodeBlock.h:
3025         * heap/Heap.cpp:
3026         (JSC::Heap::finalizeUnconditionalFinalizers):
3027         * heap/Heap.h:
3028         * heap/SlotVisitor.cpp:
3029         (JSC::SlotVisitor::addUnconditionalFinalizer): Deleted.
3030         * heap/SlotVisitor.h:
3031         * heap/UnconditionalFinalizer.h: Removed.
3032         * wasm/js/JSWebAssemblyCodeBlock.cpp:
3033         (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock):
3034         (JSC::JSWebAssemblyCodeBlock::visitChildren):
3035         (JSC::JSWebAssemblyCodeBlock::finalizeUnconditionally):
3036         (JSC::JSWebAssemblyCodeBlock::UnconditionalFinalizer::finalizeUnconditionally): Deleted.
3037         * wasm/js/JSWebAssemblyCodeBlock.h:
3038         * wasm/js/JSWebAssemblyModule.h:
3039
3040 2018-05-22  Keith Miller  <keith_miller@apple.com>
3041
3042         Unreviewed, fix internal build.
3043
3044         * runtime/JSImmutableButterfly.cpp:
3045
3046 2018-05-22  Saam Barati  <sbarati@apple.com>
3047
3048         DFG::LICMPhase should attempt to hoist edge type checks if hoisting the whole node fails
3049         https://bugs.webkit.org/show_bug.cgi?id=144525
3050
3051         Reviewed by Filip Pizlo.
3052
3053         This patch teaches LICM to fall back to hoisting a node's type checks when
3054         hoisting the entire node fails.
3055         
3056         This patch follow the same principles we use when deciding to hoist nodes in general:
3057         - If the pre header is control equivalent to where the current check is, we
3058         go ahead and hoist the check.
3059         - Otherwise, if hoisting hasn't failed before, we go ahead and gamble and
3060         hoist the check. If hoisting failed in the past, we will not hoist the check.
3061
3062         * dfg/DFGLICMPhase.cpp:
3063         (JSC::DFG::LICMPhase::attemptHoist):
3064         * dfg/DFGUseKind.h:
3065         (JSC::DFG::checkMayCrashIfInputIsEmpty):
3066
3067 2018-05-21  Filip Pizlo  <fpizlo@apple.com>
3068
3069         Get rid of TLCs
3070         https://bugs.webkit.org/show_bug.cgi?id=185846
3071
3072         Rubber stamped by Geoffrey Garen.
3073         
3074         This removes support for thread-local caches from the GC in order to speed up allocation a
3075         bit.
3076         
3077         We added TLCs as part of Spectre mitigations, which we have since removed.
3078         
3079         We will want some kind of TLCs eventually, since they allow us to:
3080         
3081         - have a global GC, which may be a perf optimization at some point.
3082         - allocate objects from JIT threads, which we've been wanting to do for a while.
3083         
3084         This change keeps the most interesting aspect of TLCs, which is the
3085         LocalAllocator/BlockDirectory separation. This means that it ought to be easy to implement
3086         TLCs again in the future if we wanted this feature.
3087         
3088         This change removes the part of TLCs that causes a perf regression, namely that Allocator is
3089         an offset that requires a bounds check and lookup that makes the rest of the allocation fast
3090         path dependent on the load of the TLC. Now, Allocator is really just a LocalAllocator*, so
3091         you can directly use it to allocate. This removes two loads and a check from the allocation
3092         fast path. In hindsight, I probably could have made that whole thing more efficient, had I
3093         allowed us to have a statically known set of LocalAllocators. This would have removed the
3094         bounds check (one load and one branch) and it would have made it possible to CSE the load of
3095         the TLC data structure, since that would no longer resize. But that's a harder change that
3096         this patch, and we don't need it right now.
3097         
3098         While reviewing the allocation hot paths, I found that CreateThis had an unnecessary branch
3099         to check if the allocator is null. I removed that check. AssemblyHelpers::emitAllocate() does
3100         that check already. Previously, the TLC bounds check doubled as this check.
3101         
3102         This is a 1% speed-up on Octane and a 2.3% speed-up on TailBench. However, the Octane
3103         speed-up on my machine includes an 8% regexp speed-up. I've found that sometimes regexp
3104         speeds up or slows down by 8% depending on which path I build JSC from. Without that 8%, this
3105         is still an Octane speed-up due to 2-4% speed-ups in earley, boyer, raytrace, and splay.
3106
3107         * JavaScriptCore.xcodeproj/project.pbxproj:
3108         * Sources.txt:
3109         * bytecode/ObjectAllocationProfileInlines.h:
3110         (JSC::ObjectAllocationProfile::initializeProfile):
3111         * dfg/DFGSpeculativeJIT.cpp:
3112         (JSC::DFG::SpeculativeJIT::compileCreateThis):
3113         * ftl/FTLLowerDFGToB3.cpp:
3114         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
3115         (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject):
3116         (JSC::FTL::DFG::LowerDFGToB3::allocatePropertyStorageWithSizeImpl):
3117         (JSC::FTL::DFG::LowerDFGToB3::allocateHeapCell):
3118         (JSC::FTL::DFG::LowerDFGToB3::allocateObject):
3119         (JSC::FTL::DFG::LowerDFGToB3::allocatorForSize):
3120         * heap/Allocator.cpp:
3121         (JSC::Allocator::cellSize const):
3122         * heap/Allocator.h:
3123         (JSC::Allocator::Allocator):
3124         (JSC::Allocator::localAllocator const):
3125         (JSC::Allocator::operator== const):
3126         (JSC::Allocator::offset const): Deleted.
3127         * heap/AllocatorInlines.h:
3128         (JSC::Allocator::allocate const):
3129         (JSC::Allocator::tryAllocate const): Deleted.
3130         * heap/BlockDirectory.cpp:
3131         (JSC::BlockDirectory::BlockDirectory):
3132         (JSC::BlockDirectory::~BlockDirectory):
3133         * heap/BlockDirectory.h:
3134         (JSC::BlockDirectory::allocator const): Deleted.
3135         * heap/CompleteSubspace.cpp:
3136         (JSC::CompleteSubspace::allocateNonVirtual):
3137         (JSC::CompleteSubspace::allocatorForSlow):
3138         (JSC::CompleteSubspace::tryAllocateSlow):
3139         * heap/CompleteSubspace.h:
3140         * heap/Heap.cpp:
3141         (JSC::Heap::Heap):
3142         * heap/Heap.h:
3143         (JSC::Heap::threadLocalCacheLayout): Deleted.
3144         * heap/IsoSubspace.cpp:
3145         (JSC::IsoSubspace::IsoSubspace):
3146         (JSC::IsoSubspace::allocateNonVirtual):
3147         * heap/IsoSubspace.h:
3148         (JSC::IsoSubspace::allocatorForNonVirtual):
3149         * heap/LocalAllocator.cpp:
3150         (JSC::LocalAllocator::LocalAllocator):
3151         (JSC::LocalAllocator::~LocalAllocator):
3152         * heap/LocalAllocator.h:
3153         (JSC::LocalAllocator::cellSize const):
3154         (JSC::LocalAllocator::tlc const): Deleted.
3155         * heap/ThreadLocalCache.cpp: Removed.
3156         * heap/ThreadLocalCache.h: Removed.
3157         * heap/ThreadLocalCacheInlines.h: Removed.
3158         * heap/ThreadLocalCacheLayout.cpp: Removed.
3159         * heap/ThreadLocalCacheLayout.h: Removed.
3160         * jit/AssemblyHelpers.cpp:
3161         (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):
3162         (JSC::AssemblyHelpers::emitAllocate):
3163         (JSC::AssemblyHelpers::emitAllocateVariableSized):
3164         * jit/JITOpcodes.cpp:
3165         (JSC::JIT::emit_op_create_this):
3166         * runtime/JSLock.cpp:
3167         (JSC::JSLock::didAcquireLock):
3168         * runtime/VM.cpp:
3169         (JSC::VM::VM):
3170         (JSC::VM::~VM):
3171         * runtime/VM.h:
3172         * runtime/VMEntryScope.cpp:
3173         (JSC::VMEntryScope::~VMEntryScope):
3174         * runtime/VMEntryScope.h:
3175
3176 2018-05-22  Keith Miller  <keith_miller@apple.com>
3177
3178         We should have a CoW storage for NewArrayBuffer arrays.
3179         https://bugs.webkit.org/show_bug.cgi?id=185003
3180
3181         Reviewed by Filip Pizlo.
3182
3183         This patch adds copy on write storage for new array buffers. In
3184         order to do this there needed to be significant changes to the
3185         layout of IndexingType. The new indexing type has the following
3186         shape:
3187
3188         struct IndexingTypeAndMisc {
3189             struct IndexingModeIncludingHistory {
3190                 struct IndexingMode {
3191                     struct IndexingType {
3192                         uint8_t isArray:1;          // bit 0
3193                         uint8_t shape:3;            // bit 1 - 3
3194                     };
3195                     uint8_t copyOnWrite:1;          // bit 4
3196                 };
3197                 uint8_t mayHaveIndexedAccessors:1;  // bit 5
3198             };
3199             uint8_t cellLockBits:2;                 // bit 6 - 7
3200         };
3201
3202         For simplicity ArrayStorage shapes cannot be CoW. So the only
3203         valid CoW indexing shapes are ArrayWithInt32, ArrayWithDouble, and
3204         ArrayWithContiguous.
3205
3206         The backing store for a CoW array is a new class
3207         JSImmutableButterfly, which looks exactly the same as a normal
3208         butterfly except that it has a JSCell header. Like other
3209         butterflies, JSImmutableButterfies are allocated out of the
3210         Auxiliary Gigacage and are pointed to by JSCells in the same
3211         way. However, when marking JSImmutableButterflies they are marked
3212         as if they were a property.
3213
3214         With CoW arrays, the new_array_buffer bytecode will reallocate the
3215         shared JSImmutableButterfly if it sees from the allocation profile
3216         that the last array it allocated has transitioned to a different
3217         indexing type. From then on, all arrays created by that
3218         new_array_buffer bytecode will have the promoted indexing
3219         type. This is more or less the same as what we used to do. The
3220         only difference is that we don't promote all the way to array
3221         storage even if we have seen it before.
3222
3223         Transitioning from a CoW indexing mode occurs whenever someone
3224         tries to store to an element, grow the array, or add properties.
3225         Storing or growing the array will call into code that does the
3226         stupid thing of copying the butterfly then continue into the old
3227         code. This doesn't end up costing us as future allocations will
3228         use any upgraded indexing shape.  We get adding properties for
3229         free by just changing the indexing mode on transition (our C++
3230         code always updates the indexing mode).
3231
3232         * JavaScriptCore.xcodeproj/project.pbxproj:
3233         * Sources.txt:
3234         * bytecode/ArrayAllocationProfile.cpp:
3235         (JSC::ArrayAllocationProfile::updateProfile):
3236         * bytecode/ArrayAllocationProfile.h:
3237         (JSC::ArrayAllocationProfile::initializeIndexingMode):
3238         * bytecode/ArrayProfile.cpp:
3239         (JSC::dumpArrayModes):
3240         (JSC::ArrayProfile::briefDescriptionWithoutUpdating):
3241         * bytecode/ArrayProfile.h:
3242         (JSC::asArrayModes):
3243         (JSC::arrayModeFromStructure):
3244         (JSC::arrayModesInclude):
3245         (JSC::hasSeenCopyOnWriteArray):
3246         * bytecode/BytecodeList.json:
3247         * bytecode/CodeBlock.cpp:
3248         (JSC::CodeBlock::finishCreation):
3249         * bytecode/InlineAccess.cpp:
3250         (JSC::InlineAccess::generateArrayLength):
3251         * bytecode/UnlinkedCodeBlock.h:
3252         (JSC::UnlinkedCodeBlock::addArrayAllocationProfile):
3253         (JSC::UnlinkedCodeBlock::decompressArrayAllocationProfile):
3254         * bytecompiler/BytecodeGenerator.cpp:
3255         (JSC::BytecodeGenerator::newArrayAllocationProfile):
3256         (JSC::BytecodeGenerator::emitNewArrayBuffer):
3257         (JSC::BytecodeGenerator::emitNewArray):
3258         (JSC::BytecodeGenerator::emitNewArrayWithSize):
3259         (JSC::BytecodeGenerator::emitExpectedFunctionSnippet):
3260         * bytecompiler/BytecodeGenerator.h:
3261         * bytecompiler/NodesCodegen.cpp:
3262         (JSC::ArrayNode::emitBytecode):
3263         (JSC::ArrayPatternNode::bindValue const):
3264         (JSC::ArrayPatternNode::emitDirectBinding):
3265         * dfg/DFGAbstractInterpreterInlines.h:
3266         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3267         * dfg/DFGArgumentsEliminationPhase.cpp:
3268         * dfg/DFGArgumentsUtilities.cpp:
3269         (JSC::DFG::emitCodeToGetArgumentsArrayLength):
3270         * dfg/DFGArrayMode.cpp:
3271         (JSC::DFG::ArrayMode::fromObserved):
3272         (JSC::DFG::ArrayMode::refine const):
3273         (JSC::DFG::ArrayMode::alreadyChecked const):
3274         * dfg/DFGArrayMode.h:
3275         (JSC::DFG::ArrayMode::ArrayMode):
3276         (JSC::DFG::ArrayMode::action const):
3277         (JSC::DFG::ArrayMode::withSpeculation const):
3278         (JSC::DFG::ArrayMode::withArrayClass const):
3279         (JSC::DFG::ArrayMode::withType const):
3280         (JSC::DFG::ArrayMode::withConversion const):
3281         (JSC::DFG::ArrayMode::withTypeAndConversion const):
3282         (JSC::DFG::ArrayMode::arrayModesThatPassFiltering const):
3283         (JSC::DFG::ArrayMode::arrayModesWithIndexingShape const):
3284         * dfg/DFGByteCodeParser.cpp:
3285         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
3286         (JSC::DFG::ByteCodeParser::handleIntrinsicGetter):
3287         (JSC::DFG::ByteCodeParser::parseBlock):
3288         * dfg/DFGClobberize.h:
3289         (JSC::DFG::clobberize):
3290         * dfg/DFGConstantFoldingPhase.cpp:
3291         (JSC::DFG::ConstantFoldingPhase::foldConstants):
3292         * dfg/DFGFixupPhase.cpp:
3293         (JSC::DFG::FixupPhase::fixupNode):
3294         (JSC::DFG::FixupPhase::attemptToForceStringArrayModeByToStringConversion):
3295         (JSC::DFG::FixupPhase::attemptToMakeGetArrayLength):
3296         * dfg/DFGGraph.cpp:
3297         (JSC::DFG::Graph::dump):
3298         * dfg/DFGNode.h:
3299         (JSC::DFG::Node::indexingType):
3300         (JSC::DFG::Node::indexingMode):
3301         * dfg/DFGOSRExit.cpp:
3302         (JSC::DFG::OSRExit::compileExit):
3303         * dfg/DFGOperations.cpp:
3304         * dfg/DFGOperations.h:
3305         * dfg/DFGSpeculativeJIT.cpp:
3306         (JSC::DFG::SpeculativeJIT::emitAllocateRawObject):
3307         (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode):
3308         (JSC::DFG::SpeculativeJIT::arrayify):
3309         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
3310         (JSC::DFG::SpeculativeJIT::compileGetByValOnDirectArguments):
3311         (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments):
3312         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
3313         (JSC::DFG::SpeculativeJIT::compileCreateRest):
3314         (JSC::DFG::SpeculativeJIT::compileArraySlice):
3315         (JSC::DFG::SpeculativeJIT::compileNewArrayBuffer):
3316         * dfg/DFGSpeculativeJIT32_64.cpp:
3317         (JSC::DFG::SpeculativeJIT::compile):
3318         * dfg/DFGSpeculativeJIT64.cpp:
3319         (JSC::DFG::SpeculativeJIT::compile):
3320         * dfg/DFGValidate.cpp:
3321         * ftl/FTLAbstractHeapRepository.h:
3322         * ftl/FTLLowerDFGToB3.cpp:
3323         (JSC::FTL::DFG::LowerDFGToB3::compilePutStructure):
3324         (JSC::FTL::DFG::LowerDFGToB3::compileArraySlice):
3325         (JSC::FTL::DFG::LowerDFGToB3::compileNewArrayWithSpread):
3326         (JSC::FTL::DFG::LowerDFGToB3::compileNewArrayBuffer):
3327         (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread):
3328         (JSC::FTL::DFG::LowerDFGToB3::compileForwardVarargsWithSpread):
3329         (JSC::FTL::DFG::LowerDFGToB3::storeStructure):
3330         (JSC::FTL::DFG::LowerDFGToB3::isArrayTypeForArrayify):
3331         * ftl/FTLOperations.cpp:
3332         (JSC::FTL::operationMaterializeObjectInOSR):
3333         * generate-bytecode-files:
3334         * interpreter/Interpreter.cpp:
3335         (JSC::sizeOfVarargs):
3336         (JSC::loadVarargs):
3337         * jit/AssemblyHelpers.cpp:
3338         (JSC::AssemblyHelpers::emitStoreStructureWithTypeInfo):
3339         * jit/AssemblyHelpers.h:
3340         (JSC::AssemblyHelpers::emitStoreStructureWithTypeInfo):
3341         * jit/JITOperations.cpp:
3342         * jit/JITPropertyAccess.cpp:
3343         (JSC::JIT::emit_op_put_by_val):
3344         (JSC::JIT::emitSlow_op_put_by_val):
3345         * jit/Repatch.cpp:
3346         (JSC::tryCachePutByID):
3347         * llint/LowLevelInterpreter.asm:
3348         * llint/LowLevelInterpreter32_64.asm:
3349         * llint/LowLevelInterpreter64.asm:
3350         * runtime/Butterfly.h:
3351         (JSC::ContiguousData::Data::Data):
3352         (JSC::ContiguousData::Data::operator bool const):
3353         (JSC::ContiguousData::Data::operator=):
3354         (JSC::ContiguousData::Data::operator const T& const):
3355         (JSC::ContiguousData::Data::set):
3356         (JSC::ContiguousData::Data::setWithoutWriteBarrier):
3357         (JSC::ContiguousData::Data::clear):
3358         (JSC::ContiguousData::Data::get const):
3359         (JSC::ContiguousData::atUnsafe):
3360         (JSC::ContiguousData::at const): Deleted.
3361         (JSC::ContiguousData::at): Deleted.
3362         * runtime/ButterflyInlines.h: