JSArrayBuffer should have its own JSType
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2018-08-01  Keith Miller  <keith_miller@apple.com>
2
3         JSArrayBuffer should have its own JSType
4         https://bugs.webkit.org/show_bug.cgi?id=188231
5
6         Reviewed by Saam Barati.
7
8         * runtime/JSArrayBuffer.cpp:
9         (JSC::JSArrayBuffer::createStructure):
10         * runtime/JSCast.h:
11         * runtime/JSType.h:
12
13 2018-07-31  Keith Miller  <keith_miller@apple.com>
14
15         Unreviewed 32-bit build fix...
16
17         * dfg/DFGSpeculativeJIT32_64.cpp:
18
19 2018-07-31  Keith Miller  <keith_miller@apple.com>
20
21         Long compiling JSC files should not be unified
22         https://bugs.webkit.org/show_bug.cgi?id=188205
23
24         Reviewed by Saam Barati.
25
26         The DFGSpeculativeJIT and FTLLowerDFGToB3 files take a long time
27         to compile. Unifying them means touching anything in the same
28         bundle as those files takes a long time to incrementally build.
29         This patch separates those files so they build standalone.
30
31         * JavaScriptCore.xcodeproj/project.pbxproj:
32         * Sources.txt:
33         * dfg/DFGSpeculativeJIT64.cpp:
34
35 2018-07-31  Yusuke Suzuki  <utatane.tea@gmail.com>
36
37         [JSC] Remove unnecessary cellLock() in JSObject's GC marking if IndexingType is contiguous
38         https://bugs.webkit.org/show_bug.cgi?id=188201
39
40         Reviewed by Keith Miller.
41
42         We do not reuse the existing butterfly with Contiguous shape for new ArrayStorage butterfly.
43         When converting the butterfly with Contiguous shape to ArrayStorage, we always allocate a
44         new one. So this cellLock() is unnecessary for contiguous shape since contigous shaped butterfly
45         never becomes broken state. This patch removes unnecessary locking.
46
47         * runtime/JSObject.cpp:
48         (JSC::JSObject::visitButterflyImpl):
49
50 2018-07-31  Guillaume Emont  <guijemont@igalia.com>
51
52         [JSC] Remove gcc warnings for 32-bit platforms
53         https://bugs.webkit.org/show_bug.cgi?id=187803
54
55         Reviewed by Yusuke Suzuki.
56
57         * assembler/MacroAssemblerPrinter.cpp:
58         (JSC::Printer::printPCRegister):
59         (JSC::Printer::printRegisterID):
60         (JSC::Printer::printAddress):
61         * dfg/DFGSpeculativeJIT.cpp:
62         (JSC::DFG::SpeculativeJIT::speculateNumber):
63         (JSC::DFG::SpeculativeJIT::speculateMisc):
64         * jit/CCallHelpers.h:
65         (JSC::CCallHelpers::calculatePokeOffset):
66         * runtime/Options.cpp:
67         (JSC::parse):
68
69 2018-07-30  Wenson Hsieh  <wenson_hsieh@apple.com>
70
71         watchOS engineering build is broken after r234227
72         https://bugs.webkit.org/show_bug.cgi?id=188180
73
74         Reviewed by Keith Miller.
75
76         In the case where we're building with a `PLATFORM_NAME` of neither "macosx" nor "iphone*",
77         postprocess-headers.sh attempts to delete any usage of the JSC availability macros. However,
78         `JSC_MAC_VERSION_TBA` and `JSC_IOS_VERSION_TBA` still remain, and JSValue.h's usage of
79         `JSC_IOS_VERSION_TBA` causes engineering watchOS builds to fail.
80
81         To fix this, simply allow the fallback path to remove these macros from JavaScriptCore headers
82         entirely, since there's no relevant version to replace them with.
83
84         * postprocess-headers.sh:
85
86 2018-07-30  Keith Miller  <keith_miller@apple.com>
87
88         Clarify conversion rules for JSValue property access API
89         https://bugs.webkit.org/show_bug.cgi?id=188179
90
91         Reviewed by Geoffrey Garen.
92
93         * API/JSValue.h:
94
95 2018-07-30  Keith Miller  <keith_miller@apple.com>
96
97         Rename some JSC API functions/types.
98         https://bugs.webkit.org/show_bug.cgi?id=188173
99
100         Reviewed by Saam Barati.
101
102         * API/JSObjectRef.cpp:
103         (JSObjectHasPropertyForKey):
104         (JSObjectGetPropertyForKey):
105         (JSObjectSetPropertyForKey):
106         (JSObjectDeletePropertyForKey):
107         (JSObjectHasPropertyKey): Deleted.
108         (JSObjectGetPropertyKey): Deleted.
109         (JSObjectSetPropertyKey): Deleted.
110         (JSObjectDeletePropertyKey): Deleted.
111         * API/JSObjectRef.h:
112         * API/JSValue.h:
113         * API/JSValue.mm:
114         (-[JSValue valueForProperty:]):
115         (-[JSValue setValue:forProperty:]):
116         (-[JSValue deleteProperty:]):
117         (-[JSValue hasProperty:]):
118         (-[JSValue defineProperty:descriptor:]):
119         * API/tests/testapi.cpp:
120         (TestAPI::run):
121
122 2018-07-30  Mark Lam  <mark.lam@apple.com>
123
124         Add a debugging utility to dump the memory layout of a JSCell.
125         https://bugs.webkit.org/show_bug.cgi?id=188157
126
127         Reviewed by Yusuke Suzuki.
128
129         This patch adds $vm.dumpCell() and VMInspector::dumpCellMemory() to allow us to
130         dump the memory contents of a cell and if present, its butterfly for debugging
131         purposes.
132
133         Example usage for JS code when JSC_useDollarVM=true:
134
135             $vm.dumpCell(obj);
136
137         Example usage from C++ code or from lldb: 
138
139             (lldb) p JSC::VMInspector::dumpCellMemory(obj)
140
141         Some examples of dumps:
142
143             <0x104bc8260, Object>
144               [0] 0x104bc8260 : 0x010016000000016c header
145                 structureID 364 0x16c structure 0x104b721b0
146                 indexingTypeAndMisc 0 0x0 NonArray
147                 type 22 0x16
148                 flags 0 0x0
149                 cellState 1
150               [1] 0x104bc8268 : 0x0000000000000000 butterfly
151               [2] 0x104bc8270 : 0xffff000000000007
152               [3] 0x104bc8278 : 0xffff000000000008
153
154             <0x104bb4360, Array>
155               [0] 0x104bb4360 : 0x0108210b00000171 header
156                 structureID 369 0x171 structure 0x104b723e0
157                 indexingTypeAndMisc 11 0xb ArrayWithArrayStorage
158                 type 33 0x21
159                 flags 8 0x8
160                 cellState 1
161               [1] 0x104bb4368 : 0x00000008000f4718 butterfly
162                 base 0x8000f46e0
163                 hasIndexingHeader YES hasAnyArrayStorage YES
164                 publicLength 4 vectorLength 7 indexBias 2
165                 preCapacity 2 propertyCapacity 4
166                   <--- preCapacity
167                   [0] 0x8000f46e0 : 0x0000000000000000
168                   [1] 0x8000f46e8 : 0x0000000000000000
169                   <--- propertyCapacity
170                   [2] 0x8000f46f0 : 0x0000000000000000
171                   [3] 0x8000f46f8 : 0x0000000000000000
172                   [4] 0x8000f4700 : 0xffff00000000000d
173                   [5] 0x8000f4708 : 0xffff00000000000c
174                   <--- indexingHeader
175                   [6] 0x8000f4710 : 0x0000000700000004
176                   <--- butterfly
177                   <--- arrayStorage
178                   [7] 0x8000f4718 : 0x0000000000000000
179                   [8] 0x8000f4720 : 0x0000000400000002
180                   <--- indexedProperties
181                   [9] 0x8000f4728 : 0xffff000000000008
182                   [10] 0x8000f4730 : 0xffff000000000009
183                   [11] 0x8000f4738 : 0xffff000000000005
184                   [12] 0x8000f4740 : 0xffff000000000006
185                   [13] 0x8000f4748 : 0x0000000000000000
186                   [14] 0x8000f4750 : 0x0000000000000000
187                   [15] 0x8000f4758 : 0x0000000000000000
188                   <--- unallocated capacity
189                   [16] 0x8000f4760 : 0x0000000000000000
190                   [17] 0x8000f4768 : 0x0000000000000000
191                   [18] 0x8000f4770 : 0x0000000000000000
192                   [19] 0x8000f4778 : 0x0000000000000000
193
194         * runtime/JSObject.h:
195         * tools/JSDollarVM.cpp:
196         (JSC::functionDumpCell):
197         (JSC::JSDollarVM::finishCreation):
198         * tools/VMInspector.cpp:
199         (JSC::VMInspector::dumpCellMemory):
200         (JSC::IndentationScope::IndentationScope):
201         (JSC::IndentationScope::~IndentationScope):
202         (JSC::VMInspector::dumpCellMemoryToStream):
203         * tools/VMInspector.h:
204
205 2018-07-27  Mark Lam  <mark.lam@apple.com>
206
207         Add some crash info to Heap::checkConn() RELEASE_ASSERTs.
208         https://bugs.webkit.org/show_bug.cgi?id=188123
209         <rdar://problem/42672268>
210
211         Reviewed by Keith Miller.
212
213         1. Add VM::m_id and Heap::m_lastPhase fields.  Both of these fit within existing
214            padding space in VM and Heap, and should not cost any measurable perf to
215            initialize and update.
216
217         2. Add some crash info to the RELEASE_ASSERTs in Heap::checkConn():
218
219            worldState tells us the value we failed the assertion on.
220
221            m_lastPhase, m_currentPhase, and m_nextPhase tells us the GC phase transition
222            that led us here.
223
224            VM::id(), and VM::numberOfIDs() tells us how many VMs may be in play.
225
226            VM::isEntered() tells us if the current VM is currently executing JS code.
227
228            Some of this data may be redundant, but the redundancy is intentional so that
229            we can double check what is really happening at the time of crash.
230
231         * heap/Heap.cpp:
232         (JSC::asInt):
233         (JSC::Heap::checkConn):
234         (JSC::Heap::changePhase):
235         * heap/Heap.h:
236         * runtime/VM.cpp:
237         (JSC::VM::nextID):
238         (JSC::VM::VM):
239         * runtime/VM.h:
240         (JSC::VM::numberOfIDs):
241         (JSC::VM::id const):
242         (JSC::VM::isEntered const):
243
244 2018-07-25  Yusuke Suzuki  <utatane.tea@gmail.com>
245
246         [JSC] Record CoW status in ArrayProfile correctly
247         https://bugs.webkit.org/show_bug.cgi?id=187949
248
249         Reviewed by Saam Barati.
250
251         In this patch, we simplify asArrayModes: just shifting the value with IndexingMode.
252         This is important since our OSR exit compiler records m_observedArrayModes by calculating
253         ArrayModes with shifting. Since ArrayModes for CoW arrays are incorrectly calculated,
254         our OSR exit compiler records incorrect results in ArrayProfile. And it leads to
255         Array::Generic DFG nodes.
256
257         * bytecode/ArrayProfile.h:
258         (JSC::asArrayModes):
259         (JSC::ArrayProfile::ArrayProfile):
260         * dfg/DFGOSRExit.cpp:
261         (JSC::DFG::OSRExit::compileExit):
262         * ftl/FTLOSRExitCompiler.cpp:
263         (JSC::FTL::compileStub):
264         * runtime/IndexingType.h:
265
266 2018-07-26  Andy VanWagoner  <andy@vanwagoner.family>
267
268         [INTL] Remove INTL sub-feature compile flags
269         https://bugs.webkit.org/show_bug.cgi?id=188081
270
271         Reviewed by Michael Catanzaro.
272
273         Removed ENABLE_INTL_NUMBER_FORMAT_TO_PARTS and ENABLE_INTL_PLURAL_RULES flags.
274         The runtime flags are still present, and should be relied on instead.
275         The defines for ICU features have also been updated to match HAVE() style.
276
277         * Configurations/FeatureDefines.xcconfig:
278         * runtime/IntlPluralRules.cpp:
279         (JSC::IntlPluralRules::resolvedOptions):
280         (JSC::IntlPluralRules::select):
281         * runtime/IntlPluralRules.h:
282         * runtime/Options.h:
283
284 2018-07-26  Yusuke Suzuki  <utatane.tea@gmail.com>
285
286         [JSC] Dump IndexingMode in Structure
287         https://bugs.webkit.org/show_bug.cgi?id=188085
288
289         Reviewed by Keith Miller.
290
291         Dump IndexingMode instead of IndexingType.
292
293         * runtime/Structure.cpp:
294         (JSC::Structure::dump const):
295
296 2018-07-26  Ross Kirsling  <ross.kirsling@sony.com>
297
298         String(View) should have a splitAllowingEmptyEntries function instead of a flag parameter
299         https://bugs.webkit.org/show_bug.cgi?id=187963
300
301         Reviewed by Alex Christensen.
302
303         * inspector/InspectorBackendDispatcher.cpp:
304         (Inspector::BackendDispatcher::dispatch):
305         * jsc.cpp:
306         (ModuleName::ModuleName):
307         (resolvePath):
308         * runtime/IntlObject.cpp:
309         (JSC::canonicalizeLanguageTag):
310         (JSC::removeUnicodeLocaleExtension):
311         Update split/splitAllowingEmptyEntries usage.
312
313 2018-07-26  Commit Queue  <commit-queue@webkit.org>
314
315         Unreviewed, rolling out r234181 and r234189.
316         https://bugs.webkit.org/show_bug.cgi?id=188075
317
318         These are not needed right now (Requested by thorton on
319         #webkit).
320
321         Reverted changesets:
322
323         "Enable Web Content Filtering on watchOS"
324         https://bugs.webkit.org/show_bug.cgi?id=187979
325         https://trac.webkit.org/changeset/234181
326
327         "HAVE(PARENTAL_CONTROLS) should be true on watchOS"
328         https://bugs.webkit.org/show_bug.cgi?id=187985
329         https://trac.webkit.org/changeset/234189
330
331 2018-07-26  Mark Lam  <mark.lam@apple.com>
332
333         arrayProtoPrivateFuncConcatMemcpy() should handle copying from an Undecided type array.
334         https://bugs.webkit.org/show_bug.cgi?id=188065
335         <rdar://problem/42515726>
336
337         Reviewed by Saam Barati.
338
339         * runtime/ArrayPrototype.cpp:
340         (JSC::clearElement):
341         (JSC::copyElements):
342         (JSC::arrayProtoPrivateFuncConcatMemcpy):
343
344 2018-07-26  Andy VanWagoner  <andy@vanwagoner.family>
345
346         JSC: Intl API should ignore encoding when parsing BCP 47 language tag from ISO 15897 locale string (passed via LANG)
347         https://bugs.webkit.org/show_bug.cgi?id=167991
348
349         Reviewed by Michael Catanzaro.
350
351         Improved the conversion of ICU locales to BCP47 tags, using their preferred method.
352         Checked locale.isEmpty() before returning it from defaultLocale, so there should be
353         no more cases where you might have an invalid locale come back from resolveLocale.
354
355         * runtime/IntlObject.cpp:
356         (JSC::convertICULocaleToBCP47LanguageTag):
357         (JSC::defaultLocale):
358         (JSC::lookupMatcher):
359         * runtime/IntlObject.h:
360         * runtime/JSGlobalObject.cpp:
361         (JSC::JSGlobalObject::intlCollatorAvailableLocales):
362         (JSC::JSGlobalObject::intlDateTimeFormatAvailableLocales):
363         (JSC::JSGlobalObject::intlNumberFormatAvailableLocales):
364         (JSC::JSGlobalObject::intlPluralRulesAvailableLocales):
365
366 2018-07-26  Fujii Hironori  <Hironori.Fujii@sony.com>
367
368         REGRESSION(r234248) [Win] testapi.c: nonstandard extension used: non-constant aggregate initializer
369         https://bugs.webkit.org/show_bug.cgi?id=188040
370
371         Unreviewed build fix for AppleWin port.
372
373         * API/tests/testapi.c: Disabled warning C4204.
374         (testMarkingConstraintsAndHeapFinalizers): Added an explicit void* cast for weakRefs.
375
376 2018-07-26  Fujii Hironori  <Hironori.Fujii@sony.com>
377
378         [JSC API] We should support the symbol type in our C/Obj-C API
379         https://bugs.webkit.org/show_bug.cgi?id=175836
380
381         Unreviewed build fix for Windows port.
382
383         r234227 introduced a compilation error unresolved external symbol
384         "int __cdecl testCAPIViaCpp(void)" in testapi for Windows ports.
385
386         Windows ports are compiling testapi.c as C++ by using /TP switch.
387
388         * API/tests/testapi.c:
389         (main): Removed `::` prefix of ::SetErrorMode Windows API.
390         (dllLauncherEntryPoint): Converted into C style.
391         * shell/PlatformWin.cmake: Do not use /TP switch for testapi.c
392
393 2018-07-25  Keith Miller  <keith_miller@apple.com>
394
395         [JSC API] We should support the symbol type in our C/Obj-C API
396         https://bugs.webkit.org/show_bug.cgi?id=175836
397
398         Reviewed by Filip Pizlo.
399
400         This patch makes the following API additions:
401         1) Test if a JSValue/JSValueRef is a symbol via any of the methods API are able to test for the types of other JSValues.
402         2) Create a symbol on both APIs.
403         3) Get/Set/Delete/Define property now take ids in the Obj-C API.
404         4) Add Get/Set/Delete in the C API.
405
406         We can do 3 because it is both binary and source compatable with
407         the existing API. I added (4) because the current property access
408         APIs only have the ability to get Strings. It was possible to
409         merge symbols into JSStringRef but that felt confusing and exposes
410         implementation details of our engine. The new functions match the
411         same meaning that they have in JS, thus should be forward
412         compatible with any future language extensions.
413
414         Lastly, this patch adds the same availability preproccessing phase
415         in WebCore to JavaScriptCore, which enables TBA features for
416         testing on previous releases.
417
418         * API/APICast.h:
419         * API/JSBasePrivate.h:
420         * API/JSContext.h:
421         * API/JSContextPrivate.h:
422         * API/JSContextRef.h:
423         * API/JSContextRefInternal.h:
424         * API/JSContextRefPrivate.h:
425         * API/JSManagedValue.h:
426         * API/JSObjectRef.cpp:
427         (JSObjectHasPropertyKey):
428         (JSObjectGetPropertyKey):
429         (JSObjectSetPropertyKey):
430         (JSObjectDeletePropertyKey):
431         * API/JSObjectRef.h:
432         * API/JSRemoteInspector.h:
433         * API/JSTypedArray.h:
434         * API/JSValue.h:
435         * API/JSValue.mm:
436         (+[JSValue valueWithNewSymbolFromDescription:inContext:]):
437         (performPropertyOperation):
438         (-[JSValue valueForProperty:valueForProperty:]):
439         (-[JSValue setValue:forProperty:setValue:forProperty:]):
440         (-[JSValue deleteProperty:deleteProperty:]):
441         (-[JSValue hasProperty:hasProperty:]):
442         (-[JSValue defineProperty:descriptor:defineProperty:descriptor:]):
443         (-[JSValue isSymbol]):
444         (-[JSValue objectForKeyedSubscript:]):
445         (-[JSValue setObject:forKeyedSubscript:]):
446         (-[JSValue valueForProperty:]): Deleted.
447         (-[JSValue setValue:forProperty:]): Deleted.
448         (-[JSValue deleteProperty:]): Deleted.
449         (-[JSValue hasProperty:]): Deleted.
450         (-[JSValue defineProperty:descriptor:]): Deleted.
451         * API/JSValueRef.cpp:
452         (JSValueGetType):
453         (JSValueIsSymbol):
454         (JSValueMakeSymbol):
455         * API/JSValueRef.h:
456         * API/WebKitAvailability.h:
457         * API/tests/CurrentThisInsideBlockGetterTest.mm:
458         * API/tests/CustomGlobalObjectClassTest.c:
459         * API/tests/DateTests.mm:
460         * API/tests/JSExportTests.mm:
461         * API/tests/JSNode.c:
462         * API/tests/JSNodeList.c:
463         * API/tests/Node.c:
464         * API/tests/NodeList.c:
465         * API/tests/minidom.c:
466         * API/tests/testapi.c:
467         (main):
468         * API/tests/testapi.cpp: Added.
469         (APIString::APIString):
470         (APIString::~APIString):
471         (APIString::operator JSStringRef):
472         (APIContext::APIContext):
473         (APIContext::~APIContext):
474         (APIContext::operator JSGlobalContextRef):
475         (APIVector::APIVector):
476         (APIVector::~APIVector):
477         (APIVector::append):
478         (testCAPIViaCpp):
479         (TestAPI::evaluateScript):
480         (TestAPI::callFunction):
481         (TestAPI::functionReturnsTrue):
482         (TestAPI::check):
483         (TestAPI::checkJSAndAPIMatch):
484         (TestAPI::interestingObjects):
485         (TestAPI::interestingKeys):
486         (TestAPI::run):
487         * API/tests/testapi.mm:
488         (testObjectiveCAPIMain):
489         * JavaScriptCore.xcodeproj/project.pbxproj:
490         * config.h:
491         * postprocess-headers.sh:
492         * shell/CMakeLists.txt:
493         * testmem/testmem.mm:
494
495 2018-07-25  Andy VanWagoner  <andy@vanwagoner.family>
496
497         [INTL] Call Typed Array elements toLocaleString with locale and options
498         https://bugs.webkit.org/show_bug.cgi?id=185796
499
500         Reviewed by Keith Miller.
501
502         Improve ECMA 402 compliance of typed array toLocaleString, passing along
503         the locale and options to element toLocaleString calls.
504
505         * builtins/TypedArrayPrototype.js:
506         (toLocaleString):
507
508 2018-07-25  Andy VanWagoner  <andy@vanwagoner.family>
509
510         [INTL] Intl constructor lengths should be configurable
511         https://bugs.webkit.org/show_bug.cgi?id=187960
512
513         Reviewed by Saam Barati.
514
515         Removed DontDelete from Intl constructor lengths.
516         Fixed DateTimeFormat formatToParts length.
517
518         * runtime/IntlCollatorConstructor.cpp:
519         (JSC::IntlCollatorConstructor::finishCreation):
520         * runtime/IntlDateTimeFormatConstructor.cpp:
521         (JSC::IntlDateTimeFormatConstructor::finishCreation):
522         * runtime/IntlDateTimeFormatPrototype.cpp:
523         (JSC::IntlDateTimeFormatPrototype::finishCreation):
524         * runtime/IntlNumberFormatConstructor.cpp:
525         (JSC::IntlNumberFormatConstructor::finishCreation):
526         * runtime/IntlPluralRulesConstructor.cpp:
527         (JSC::IntlPluralRulesConstructor::finishCreation):
528
529 2018-07-24  Fujii Hironori  <Hironori.Fujii@sony.com>
530
531         runJITThreadLimitTests is failing
532         https://bugs.webkit.org/show_bug.cgi?id=187886
533         <rdar://problem/42561966>
534
535         Unreviewed build fix for MSVC.
536
537         MSVC doen't support ternary operator without second operand.
538
539         * dfg/DFGWorklist.cpp:
540         (JSC::DFG::getNumberOfDFGCompilerThreads):
541         (JSC::DFG::getNumberOfFTLCompilerThreads):
542
543 2018-07-24  Commit Queue  <commit-queue@webkit.org>
544
545         Unreviewed, rolling out r234183.
546         https://bugs.webkit.org/show_bug.cgi?id=187983
547
548         cause regression in Kraken gaussian blur and desaturate
549         (Requested by yusukesuzuki on #webkit).
550
551         Reverted changeset:
552
553         "[JSC] Record CoW status in ArrayProfile"
554         https://bugs.webkit.org/show_bug.cgi?id=187949
555         https://trac.webkit.org/changeset/234183
556
557 2018-07-24  Yusuke Suzuki  <utatane.tea@gmail.com>
558
559         [JSC] Record CoW status in ArrayProfile
560         https://bugs.webkit.org/show_bug.cgi?id=187949
561
562         Reviewed by Saam Barati.
563
564         Once CoW array is converted to non-CoW array, subsequent operations are done for this non-CoW array.
565         Even though these operations are performed onto both CoW and non-CoW arrays in the code, array profiles
566         in these code typically record only non-CoW arrays since array profiles hold only one StructureID recently
567         seen. This results emitting CheckStructure for non-CoW arrays in DFG, and it soon causes OSR exits due to
568         CoW arrays.
569
570         In this patch, we record CoW status in ArrayProfile separately to construct more appropriate DFG::ArrayMode
571         speculation. To do so efficiently, we store union of seen IndexingMode in ArrayProfile.
572
573         This patch removes one of Kraken/stanford-crypto-aes's OSR exit reason, and improves the performance by 6-7%.
574
575                                       baseline                  patched
576
577         stanford-crypto-aes        60.893+-1.346      ^      57.412+-1.298         ^ definitely 1.0606x faster
578         stanford-crypto-ccm        62.124+-1.992             58.921+-1.844           might be 1.0544x faster
579
580         * bytecode/ArrayProfile.cpp:
581         (JSC::ArrayProfile::briefDescriptionWithoutUpdating):
582         * bytecode/ArrayProfile.h:
583         (JSC::asArrayModes):
584         We simplify asArrayModes instead of giving up Int8ArrayMode - Float64ArrayMode contiguous sequence.
585
586         (JSC::ArrayProfile::ArrayProfile):
587         (JSC::ArrayProfile::addressOfObservedIndexingModes):
588         (JSC::ArrayProfile::observedIndexingModes const):
589         Currently, our macro assembler and offlineasm only support `or32` / `ori` operation onto addresses.
590         So storing the union of seen IndexingMode in `unsigned` instead.
591
592         * dfg/DFGArrayMode.cpp:
593         (JSC::DFG::ArrayMode::fromObserved):
594         * dfg/DFGArrayMode.h:
595         (JSC::DFG::ArrayMode::withProfile const):
596         * jit/JITCall.cpp:
597         (JSC::JIT::compileOpCall):
598         * jit/JITCall32_64.cpp:
599         (JSC::JIT::compileOpCall):
600         * jit/JITInlines.h:
601         (JSC::JIT::emitArrayProfilingSiteWithCell):
602         * llint/LowLevelInterpreter.asm:
603         * llint/LowLevelInterpreter32_64.asm:
604         * llint/LowLevelInterpreter64.asm:
605
606 2018-07-24  Tim Horton  <timothy_horton@apple.com>
607
608         Enable Web Content Filtering on watchOS
609         https://bugs.webkit.org/show_bug.cgi?id=187979
610         <rdar://problem/42559346>
611
612         Reviewed by Wenson Hsieh.
613
614         * Configurations/FeatureDefines.xcconfig:
615
616 2018-07-24  Tadeu Zagallo  <tzagallo@apple.com>
617
618         Don't modify Options when setting JIT thread limits
619         https://bugs.webkit.org/show_bug.cgi?id=187886
620
621         Reviewed by Filip Pizlo.
622
623         Previously, when setting the JIT thread limit prior to the worklist
624         initialization, it'd be set via Options, which didn't work if Options
625         hadn't been initialized yet. Change it to use a static variable in the
626         Worklist instead.
627
628         * API/JSVirtualMachine.mm:
629         (+[JSVirtualMachine setNumberOfDFGCompilerThreads:]):
630         (+[JSVirtualMachine setNumberOfFTLCompilerThreads:]):
631         * API/tests/testapi.mm:
632         (testObjectiveCAPIMain):
633         * dfg/DFGWorklist.cpp:
634         (JSC::DFG::getNumberOfDFGCompilerThreads):
635         (JSC::DFG::getNumberOfFTLCompilerThreads):
636         (JSC::DFG::setNumberOfDFGCompilerThreads):
637         (JSC::DFG::setNumberOfFTLCompilerThreads):
638         (JSC::DFG::ensureGlobalDFGWorklist):
639         (JSC::DFG::ensureGlobalFTLWorklist):
640         * dfg/DFGWorklist.h:
641
642 2018-07-24  Mark Lam  <mark.lam@apple.com>
643
644         Refactoring: make DFG::Plan a class.
645         https://bugs.webkit.org/show_bug.cgi?id=187968
646
647         Reviewed by Saam Barati.
648
649         This patch makes all the DFG::Plan fields private, and provide accessor methods
650         for them.  This makes it easier to reason about how these fields are used and
651         modified.
652
653         * dfg/DFGAbstractInterpreterInlines.h:
654         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
655         * dfg/DFGByteCodeParser.cpp:
656         (JSC::DFG::ByteCodeParser::handleCall):
657         (JSC::DFG::ByteCodeParser::handleVarargsCall):
658         (JSC::DFG::ByteCodeParser::handleInlining):
659         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
660         (JSC::DFG::ByteCodeParser::handleDOMJITGetter):
661         (JSC::DFG::ByteCodeParser::handleModuleNamespaceLoad):
662         (JSC::DFG::ByteCodeParser::handleGetById):
663         (JSC::DFG::ByteCodeParser::handlePutById):
664         (JSC::DFG::ByteCodeParser::parseBlock):
665         (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry):
666         (JSC::DFG::ByteCodeParser::parseCodeBlock):
667         (JSC::DFG::ByteCodeParser::parse):
668         * dfg/DFGCFAPhase.cpp:
669         (JSC::DFG::CFAPhase::run):
670         (JSC::DFG::CFAPhase::injectOSR):
671         * dfg/DFGClobberize.h:
672         (JSC::DFG::clobberize):
673         * dfg/DFGCommonData.cpp:
674         (JSC::DFG::CommonData::notifyCompilingStructureTransition):
675         * dfg/DFGCommonData.h:
676         * dfg/DFGConstantFoldingPhase.cpp:
677         (JSC::DFG::ConstantFoldingPhase::foldConstants):
678         * dfg/DFGDriver.cpp:
679         (JSC::DFG::compileImpl):
680         * dfg/DFGFinalizer.h:
681         * dfg/DFGFixupPhase.cpp:
682         (JSC::DFG::FixupPhase::fixupNode):
683         (JSC::DFG::FixupPhase::fixupCompareStrictEqAndSameValue):
684         * dfg/DFGGraph.cpp:
685         (JSC::DFG::Graph::Graph):
686         (JSC::DFG::Graph::watchCondition):
687         (JSC::DFG::Graph::inferredTypeFor):
688         (JSC::DFG::Graph::requiredRegisterCountForExit):
689         (JSC::DFG::Graph::registerFrozenValues):
690         (JSC::DFG::Graph::registerStructure):
691         (JSC::DFG::Graph::registerAndWatchStructureTransition):
692         (JSC::DFG::Graph::assertIsRegistered):
693         * dfg/DFGGraph.h:
694         (JSC::DFG::Graph::compilation):
695         (JSC::DFG::Graph::identifiers):
696         (JSC::DFG::Graph::watchpoints):
697         * dfg/DFGJITCompiler.cpp:
698         (JSC::DFG::JITCompiler::JITCompiler):
699         (JSC::DFG::JITCompiler::link):
700         (JSC::DFG::JITCompiler::compile):
701         (JSC::DFG::JITCompiler::compileFunction):
702         (JSC::DFG::JITCompiler::disassemble):
703         * dfg/DFGJITCompiler.h:
704         (JSC::DFG::JITCompiler::addWeakReference):
705         * dfg/DFGJITFinalizer.cpp:
706         (JSC::DFG::JITFinalizer::finalize):
707         (JSC::DFG::JITFinalizer::finalizeFunction):
708         (JSC::DFG::JITFinalizer::finalizeCommon):
709         * dfg/DFGOSREntrypointCreationPhase.cpp:
710         (JSC::DFG::OSREntrypointCreationPhase::run):
711         * dfg/DFGPhase.cpp:
712         (JSC::DFG::Phase::beginPhase):
713         * dfg/DFGPhase.h:
714         (JSC::DFG::runAndLog):
715         * dfg/DFGPlan.cpp:
716         (JSC::DFG::Plan::Plan):
717         (JSC::DFG::Plan::computeCompileTimes const):
718         (JSC::DFG::Plan::reportCompileTimes const):
719         (JSC::DFG::Plan::compileInThread):
720         (JSC::DFG::Plan::compileInThreadImpl):
721         (JSC::DFG::Plan::isStillValid):
722         (JSC::DFG::Plan::reallyAdd):
723         (JSC::DFG::Plan::notifyCompiling):
724         (JSC::DFG::Plan::notifyReady):
725         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
726         (JSC::DFG::Plan::finalizeAndNotifyCallback):
727         (JSC::DFG::Plan::key):
728         (JSC::DFG::Plan::checkLivenessAndVisitChildren):
729         (JSC::DFG::Plan::finalizeInGC):
730         (JSC::DFG::Plan::isKnownToBeLiveDuringGC):
731         (JSC::DFG::Plan::cancel):
732         (JSC::DFG::Plan::cleanMustHandleValuesIfNecessary):
733         * dfg/DFGPlan.h:
734         (JSC::DFG::Plan::canTierUpAndOSREnter const):
735         (JSC::DFG::Plan::vm const):
736         (JSC::DFG::Plan::codeBlock):
737         (JSC::DFG::Plan::mode const):
738         (JSC::DFG::Plan::osrEntryBytecodeIndex const):
739         (JSC::DFG::Plan::mustHandleValues const):
740         (JSC::DFG::Plan::threadData const):
741         (JSC::DFG::Plan::compilation const):
742         (JSC::DFG::Plan::finalizer const):
743         (JSC::DFG::Plan::setFinalizer):
744         (JSC::DFG::Plan::inlineCallFrames const):
745         (JSC::DFG::Plan::watchpoints):
746         (JSC::DFG::Plan::identifiers):
747         (JSC::DFG::Plan::weakReferences):
748         (JSC::DFG::Plan::transitions):
749         (JSC::DFG::Plan::recordedStatuses):
750         (JSC::DFG::Plan::willTryToTierUp const):
751         (JSC::DFG::Plan::setWillTryToTierUp):
752         (JSC::DFG::Plan::tierUpInLoopHierarchy):
753         (JSC::DFG::Plan::tierUpAndOSREnterBytecodes):
754         (JSC::DFG::Plan::stage const):
755         (JSC::DFG::Plan::callback const):
756         (JSC::DFG::Plan::setCallback):
757         * dfg/DFGPlanInlines.h:
758         (JSC::DFG::Plan::iterateCodeBlocksForGC):
759         * dfg/DFGPreciseLocalClobberize.h:
760         (JSC::DFG::PreciseLocalClobberizeAdaptor::readTop):
761         * dfg/DFGPredictionInjectionPhase.cpp:
762         (JSC::DFG::PredictionInjectionPhase::run):
763         * dfg/DFGSafepoint.cpp:
764         (JSC::DFG::Safepoint::Safepoint):
765         (JSC::DFG::Safepoint::~Safepoint):
766         (JSC::DFG::Safepoint::begin):
767         * dfg/DFGSafepoint.h:
768         * dfg/DFGSpeculativeJIT.h:
769         (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPointer):
770         (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPoisonedPointer):
771         * dfg/DFGStackLayoutPhase.cpp:
772         (JSC::DFG::StackLayoutPhase::run):
773         * dfg/DFGStrengthReductionPhase.cpp:
774         (JSC::DFG::StrengthReductionPhase::handleNode):
775         * dfg/DFGTierUpCheckInjectionPhase.cpp:
776         (JSC::DFG::TierUpCheckInjectionPhase::run):
777         * dfg/DFGTypeCheckHoistingPhase.cpp:
778         (JSC::DFG::TypeCheckHoistingPhase::disableHoistingAcrossOSREntries):
779         * dfg/DFGWorklist.cpp:
780         (JSC::DFG::Worklist::isActiveForVM const):
781         (JSC::DFG::Worklist::compilationState):
782         (JSC::DFG::Worklist::waitUntilAllPlansForVMAreReady):
783         (JSC::DFG::Worklist::removeAllReadyPlansForVM):
784         (JSC::DFG::Worklist::completeAllReadyPlansForVM):
785         (JSC::DFG::Worklist::visitWeakReferences):
786         (JSC::DFG::Worklist::removeDeadPlans):
787         (JSC::DFG::Worklist::removeNonCompilingPlansForVM):
788         * dfg/DFGWorklistInlines.h:
789         (JSC::DFG::Worklist::iterateCodeBlocksForGC):
790         * ftl/FTLCompile.cpp:
791         (JSC::FTL::compile):
792         * ftl/FTLFail.cpp:
793         (JSC::FTL::fail):
794         * ftl/FTLJITFinalizer.cpp:
795         (JSC::FTL::JITFinalizer::finalizeCommon):
796         * ftl/FTLLink.cpp:
797         (JSC::FTL::link):
798         * ftl/FTLLowerDFGToB3.cpp:
799         (JSC::FTL::DFG::LowerDFGToB3::compileMultiPutByOffset):
800         (JSC::FTL::DFG::LowerDFGToB3::buildExitArguments):
801         (JSC::FTL::DFG::LowerDFGToB3::addWeakReference):
802         * ftl/FTLState.cpp:
803         (JSC::FTL::State::State):
804
805 2018-07-24  Saam Barati  <sbarati@apple.com>
806
807         Make VM::canUseJIT an inlined function
808         https://bugs.webkit.org/show_bug.cgi?id=187583
809
810         Reviewed by Mark Lam.
811
812         We know the answer to this query in initializeThreading after initializing
813         the executable allocator. This patch makes it so that we just hold this value
814         in a static variable and have an inlined function that just returns the value
815         of that static variable.
816
817         * runtime/InitializeThreading.cpp:
818         (JSC::initializeThreading):
819         * runtime/VM.cpp:
820         (JSC::VM::computeCanUseJIT):
821         (JSC::VM::canUseJIT): Deleted.
822         * runtime/VM.h:
823         (JSC::VM::canUseJIT):
824
825 2018-07-24  Mark Lam  <mark.lam@apple.com>
826
827         Placate exception check verification after recent changes.
828         https://bugs.webkit.org/show_bug.cgi?id=187961
829         <rdar://problem/42545394>
830
831         Reviewed by Saam Barati.
832
833         * runtime/IntlObject.cpp:
834         (JSC::intlNumberOption):
835
836 2018-07-23  Saam Barati  <sbarati@apple.com>
837
838         need to didFoldClobberWorld when we constant fold GetByVal
839         https://bugs.webkit.org/show_bug.cgi?id=187917
840         <rdar://problem/42505095>
841
842         Reviewed by Yusuke Suzuki.
843
844         * dfg/DFGAbstractInterpreterInlines.h:
845         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
846
847 2018-07-23  Andy VanWagoner  <andy@vanwagoner.family>
848
849         [INTL] Language tags are not canonicalized
850         https://bugs.webkit.org/show_bug.cgi?id=185836
851
852         Reviewed by Keith Miller.
853
854         Canonicalize language tags, replacing deprecated tag parts with the
855         preferred values. Remove broken support for algorithmic numbering systems,
856         that can cause an error in icu, and are not supported in other engines.
857
858         Generate the lookup functions from the language-subtag-registry.
859
860         Also initialize the UNumberFormat in initializeNumberFormat so any
861         failures are thrown immediately instead of failing to format later.
862
863         * CMakeLists.txt:
864         * DerivedSources.make:
865         * JavaScriptCore.xcodeproj/project.pbxproj:
866         * Scripts/generateIntlCanonicalizeLanguage.py: Added.
867         * runtime/IntlDateTimeFormat.cpp:
868         (JSC::IntlDateTimeFormat::initializeDateTimeFormat):
869         * runtime/IntlNumberFormat.cpp:
870         (JSC::IntlNumberFormat::initializeNumberFormat):
871         (JSC::IntlNumberFormat::formatNumber):
872         (JSC::IntlNumberFormat::formatToParts):
873         (JSC::IntlNumberFormat::createNumberFormat): Deleted.
874         * runtime/IntlNumberFormat.h:
875         * runtime/IntlObject.cpp:
876         (JSC::intlNumberOption):
877         (JSC::intlDefaultNumberOption):
878         (JSC::preferredLanguage):
879         (JSC::preferredRegion):
880         (JSC::canonicalLangTag):
881         (JSC::canonicalizeLanguageTag):
882         (JSC::defaultLocale):
883         (JSC::removeUnicodeLocaleExtension):
884         (JSC::numberingSystemsForLocale):
885         (JSC::grandfatheredLangTag): Deleted.
886         * runtime/IntlObject.h:
887         * runtime/IntlPluralRules.cpp:
888         (JSC::IntlPluralRules::initializePluralRules):
889         * runtime/JSGlobalObject.cpp:
890         (JSC::addMissingScriptLocales):
891         (JSC::JSGlobalObject::intlCollatorAvailableLocales):
892         (JSC::JSGlobalObject::intlDateTimeFormatAvailableLocales):
893         (JSC::JSGlobalObject::intlNumberFormatAvailableLocales):
894         (JSC::JSGlobalObject::intlPluralRulesAvailableLocales):
895         * ucd/language-subtag-registry.txt: Added.
896
897 2018-07-23  Mark Lam  <mark.lam@apple.com>
898
899         Add some asserts to help diagnose a crash.
900         https://bugs.webkit.org/show_bug.cgi?id=187915
901         <rdar://problem/42508166>
902
903         Reviewed by Michael Saboff.
904
905         Add some asserts to verify that an CodeBlock alternative should always have a
906         non-null jitCode.  Also change a RELEASE_ASSERT_NOT_REACHED() in
907         CodeBlock::setOptimizationThresholdBasedOnCompilationResult() to a RELEASE_ASSERT()
908         so that we'll retain the state of the variables that failed the assertion (again
909         to help with diagnosis).
910
911         * bytecode/CodeBlock.cpp:
912         (JSC::CodeBlock::setAlternative):
913         (JSC::CodeBlock::setOptimizationThresholdBasedOnCompilationResult):
914         * dfg/DFGPlan.cpp:
915         (JSC::DFG::Plan::Plan):
916
917 2018-07-23  Filip Pizlo  <fpizlo@apple.com>
918
919         Unreviewed, fix no-JIT build.
920
921         * bytecode/CallLinkStatus.cpp:
922         (JSC::CallLinkStatus::computeFor):
923         * bytecode/CodeBlock.cpp:
924         (JSC::CodeBlock::finalizeUnconditionally):
925         * bytecode/GetByIdStatus.cpp:
926         (JSC::GetByIdStatus::computeFor):
927         (JSC::GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback):
928         * bytecode/InByIdStatus.cpp:
929         * bytecode/PutByIdStatus.cpp:
930         (JSC::PutByIdStatus::computeForStubInfo):
931
932 2018-07-22  Yusuke Suzuki  <utatane.tea@gmail.com>
933
934         [JSC] GetByIdVariant and InByIdVariant do not need slot base if they are not "hit" variants
935         https://bugs.webkit.org/show_bug.cgi?id=187891
936
937         Reviewed by Saam Barati.
938
939         When merging GetByIdVariant and InByIdVariant, we accidentally make merging failed if
940         two variants are mergeable but they have "Miss" status. We make merging failed if
941         the merged OPCSet says hasOneSlotBaseCondition() is false. But it is only reasonable
942         if the variant has "Hit" status. This bug is revealed when we introduce CreateThis in FTL,
943         which patch have more chances to merge variants.
944
945         This patch fixes this issue by checking `!isPropertyUnset()` / `isHit()`. PutByIdVariant
946         is not related since it does not use this check in Transition case.
947
948         * bytecode/GetByIdVariant.cpp:
949         (JSC::GetByIdVariant::attemptToMerge):
950         * bytecode/InByIdVariant.cpp:
951         (JSC::InByIdVariant::attemptToMerge):
952
953 2018-07-22  Yusuke Suzuki  <utatane.tea@gmail.com>
954
955         [DFG] Fold GetByVal if the indexed value is non configurable and non writable
956         https://bugs.webkit.org/show_bug.cgi?id=186462
957
958         Reviewed by Saam Barati.
959
960         Non-special DontDelete | ReadOnly properties mean that it won't be changed. If DFG AI can retrieve this
961         property, AI can fold it into a constant. This type of property can be seen when we use ES6 tagged templates.
962         Tagged templates' callsite includes indexed properties whose attributes are DontDelete | ReadOnly.
963
964         This patch attempts to fold such properties into constant in DFG AI. The challenge is that DFG AI runs
965         concurrently with the mutator thread. In this patch, we insert WTF::storeStoreFence between value setting
966         and attributes setting. The attributes must be set after the corresponding value is set. If the loaded
967         attributes (with WTF::loadLoadFence) include DontDelete | ReadOnly, it means the given value won't be
968         changed and we can safely use it. We arrange our existing code to use this protocol.
969
970         Since GetByVal folding requires the correct Structure & Butterfly pairs, it is only enabled in x86 architecture
971         since it is TSO. So, our WTF::storeStoreFence in SparseArrayValueMap is also emitted only in x86.
972
973         This patch improves SixSpeed/template_string_tag.es6.
974
975                                           baseline                  patched
976
977         template_string_tag.es6      237.0301+-4.8374     ^      9.8779+-0.3628        ^ definitely 23.9960x faster
978
979         * dfg/DFGAbstractInterpreterInlines.h:
980         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
981         * runtime/JSArray.cpp:
982         (JSC::JSArray::setLengthWithArrayStorage):
983         * runtime/JSObject.cpp:
984         (JSC::JSObject::enterDictionaryIndexingModeWhenArrayStorageAlreadyExists):
985         (JSC::JSObject::deletePropertyByIndex):
986         (JSC::JSObject::getOwnPropertyNames):
987         (JSC::putIndexedDescriptor):
988         (JSC::JSObject::defineOwnIndexedProperty):
989         (JSC::JSObject::attemptToInterceptPutByIndexOnHoleForPrototype):
990         (JSC::JSObject::putIndexedDescriptor): Deleted.
991         * runtime/JSObject.h:
992         * runtime/SparseArrayValueMap.cpp:
993         (JSC::SparseArrayValueMap::SparseArrayValueMap):
994         (JSC::SparseArrayValueMap::add):
995         (JSC::SparseArrayValueMap::putDirect):
996         (JSC::SparseArrayValueMap::getConcurrently):
997         (JSC::SparseArrayEntry::get const):
998         (JSC::SparseArrayEntry::getConcurrently const):
999         (JSC::SparseArrayEntry::put):
1000         (JSC::SparseArrayEntry::getNonSparseMode const):
1001         (JSC::SparseArrayValueMap::visitChildren):
1002         (JSC::SparseArrayValueMap::~SparseArrayValueMap): Deleted.
1003         * runtime/SparseArrayValueMap.h:
1004         (JSC::SparseArrayEntry::SparseArrayEntry):
1005         (JSC::SparseArrayEntry::attributes const):
1006         (JSC::SparseArrayEntry::forceSet):
1007         (JSC::SparseArrayEntry::asValue):
1008
1009 2018-06-02  Filip Pizlo  <fpizlo@apple.com>
1010
1011         We should support CreateThis in the FTL
1012         https://bugs.webkit.org/show_bug.cgi?id=164904
1013
1014         Reviewed by Yusuke Suzuki.
1015         
1016         This started with Saam's patch to implement CreateThis in the FTL, but turned into a type
1017         inference adventure.
1018         
1019         CreateThis in the FTL was a massive regression in raytrace because it disturbed that
1020         benchmark's extremely perverse way of winning at type inference:
1021         
1022         - The benchmark wanted polyvariant devirtualization of an object construction helper. But,
1023           the polyvariant profiler wasn't powerful enough to reliably devirtualize that code. So, the
1024           benchmark was falling back to other mechanisms...
1025         
1026         - The construction helper could not tier up into the FTL. When the DFG compiled it, it would
1027           see that the IC had 4 cases. That's too polymorphic for the DFG. So, the DFG would emit a
1028           GetById. Shortly after the DFG compile, that get_by_id would see many more cases, but now
1029           that the helper was compiled by the DFG, the baseline get_by_id would not see those cases.
1030           The DFG's GetById would "hide" those cases. The number of cases the DFG's GetById would see
1031           is larger than our polymorphic list limit (limit = 8, case count = 13, I think).
1032           
1033           Note that if the FTL compiles that construction helper, it sees the 4 cases, turns them
1034           into a MultiGetByOffset, then suffers from exits when the new cases hit, and then exits to
1035           baseline, which then sees those cases. Luckily, the FTL was not compiling the construction
1036           helper because it had a CreateThis.
1037         
1038         - Compilations that inlined the construction helper would have gotten super lucky with
1039           parse-time constant folding, so they knew what structure the input to the get_by_id would
1040           have at parse time. This is only profitable if the get_by_id parsing computed a
1041           GetByIdStatus that had a finite number of cases. Because the 13 cases were being hidden by
1042           the DFG GetById and GetByIdStatus would only look at the baseline get_by_id, which had 4
1043           cases, we would indeed get a finite number of cases. The parser would then prune those
1044           cases to just one - based on its knowledge of the structure - and that would result in that
1045           get_by_id being folded at parse time to a constant.
1046         
1047         - The subsequent op_call would inline based on parse-time knowledge of that constant.
1048         
1049         This patch comprehensively fixes these issues, as well as other issues that come up along the
1050         way. The short version is that raytrace was revealing sloppiness in our use of profiling for
1051         type inference. This patch fixes the sloppiness by vastly expanding *polyvariant* profiling,
1052         i.e. the profiling that considers call context. I was encouraged to do this by the fact that
1053         even the old version of polyvariant profiling was a speed-up on JetStream, ARES-6, and
1054         Speedometer 2 (it's easy to measure since it's a runtime flag). So, it seemed worthwhile to
1055         attack raytrace's problem as a shortcoming of polyvariant profiling.
1056         
1057         - Polyvariant profiling now consults every DFG or FTL code block that participated in any
1058           subset of the inline stack that includes the IC we're profiling. For example, if we have
1059           an inline stack like foo->bar->baz, with baz on top, then we will consult DFG or FTL
1060           compilations for foo, bar, and baz. In foo, we'll look up foo->bar->baz; in bar we'll look
1061           up bar->baz; etc. This fixes two problems encountered in raytrace. First, it ensures that
1062           a DFG GetById cannot hide anything from the profiling of that get_by_id, since the
1063           polyvariant profiling code will always consult it. Second, it enables raytrace to benefit
1064           from polyvariant profling. Previously, the polyvariant profiler would only look at the
1065           previous DFG compilation of foo and look up foo->bar->baz. But that only works if DFG-foo
1066           had inlined bar and then baz. It may not have done that, because those calls could have
1067           required polyvariant profiling that was only available in the FTL.
1068           
1069         - A particularly interesting case is when some IC in foo-baseline is also available in
1070           foo-DFG. This case is encountered by the polyvariant profiler as it walks the inline stack.
1071           In the case of gathering profiling for foo-FTL, the polyvariant profiler finds foo-DFG via
1072           the trivial case of no inline stack. This also means that if foo ever gets inlined, we will
1073           find foo-DFG or foo-FTL in the final case of polyvariant profiling. In those cases, we now
1074           merge the IC of foo-baseline and foo-DFG. This avoids lots of unnecessary recompilations,
1075           because it warns us of historical polymorphism. Historical polymorphism usually means
1076           future polymorphism. IC status code already had some merging functionality, but I needed to
1077           beef it up a lot to make this work right.
1078         
1079         - Inlining an inline cache now preserves as much information as profiling. One challenge of
1080           polyvariant profiling is that the FTL compile for bar (that includes bar->baz) could have
1081           inlined an inline cache based on polyvariant profiling. So, when the FTL compile for foo
1082           (that includes foo->bar->baz) asks bar what it knows about that IC inside bar->baz, it will
1083           say "I don't have such an IC". At this point the DFG compilation that included that IC that
1084           gave us the information that we used to inline the IC is no longer alive. To keep us from
1085           losing the information we learned about the IC, there is now a RecordedStatuses data
1086           structure that preserves the statuses we use for inlining ICs. We also filter those
1087           statuses according to things we learn from AI. This further reduces the risk of information
1088           about an IC being forgotten.
1089         
1090         - Exit profiling now considers whether or not an exit happened from inline code. This
1091           protects us in the case where the not-inlined version of an IC exited a lot because of
1092           polymorphism that doesn't exist in the inlined version. So, when using polyvariant
1093           profiling data, we consider only inlined exits.
1094         
1095         - CallLinkInfo now records when it's repatched to the virtual call thunk. Previously, this
1096           would clear the CallLinkInfo, so CallLinkStatus would fall back to the lastSeenCallee. It's
1097           surprising that we've had this bug.
1098         
1099         Altogether this patch is performance-neutral in run-jsc-benchmarks, except for speed-ups in
1100         microbenchmarks and a compile time regression. Octane/deltablue speeds up by ~5%.
1101         Octane/raytrace is regressed by a minuscule amount, which we could make up by implementing
1102         prototype access folding in the bytecode parser and constant folder. That would require some
1103         significant new logic in GetByIdStatus. That would also require a new benchmark - we want to
1104         have a test that captures raytrace's behavior in the case that the parser cannot fold the
1105         get_by_id.
1106         
1107         This change is a 1.2% regression on V8Spider-CompileTime. That's a smaller regression than
1108         recent compile time progressions, so I think that's an OK trade-off. Also, I would expect a
1109         compile time regression anytime we fill in FTL coverage.
1110         
1111         This is neutral on JetStream, ARES-6, and Speedometer2. JetStream agrees that deltablue
1112         speeds up and that raytrace slows down, but these changes balance out and don't affect the
1113         overall score. In ARES-6, it looks like individual tests have some significant 1-2% speed-ups
1114         or slow-downs. Air-steady is definitely ~1.5% faster. Basic-worst is probably 2% slower (p ~
1115         0.1, so it's not very certain). The JetStream, ARES-6, and Speedometer2 overall scores don't
1116         see a significant difference. In all three cases the difference is <0.5% with a high p value,
1117         with JetStream and Speedometer2 being insignificant infinitesimal speed-ups and ARES-6 being
1118         an insignificant infinitesimal slow-down.
1119         
1120         Oh, and this change means that the FTL now has 100% coverage of JavaScript. You could do an
1121         eval in a for-in loop in a for-of loop inside a with block that uses try/catch for control
1122         flow in a polymorphic constructor while having a bad time, and we'll still compile it.
1123
1124         * CMakeLists.txt:
1125         * JavaScriptCore.xcodeproj/project.pbxproj:
1126         * Sources.txt:
1127         * bytecode/ByValInfo.h:
1128         * bytecode/BytecodeDumper.cpp:
1129         (JSC::BytecodeDumper<Block>::printGetByIdCacheStatus):
1130         (JSC::BytecodeDumper<Block>::printPutByIdCacheStatus):
1131         (JSC::BytecodeDumper<Block>::printInByIdCacheStatus):
1132         (JSC::BytecodeDumper<Block>::dumpCallLinkStatus):
1133         (JSC::BytecodeDumper<CodeBlock>::dumpCallLinkStatus):
1134         (JSC::BytecodeDumper<Block>::printCallOp):
1135         (JSC::BytecodeDumper<Block>::dumpBytecode):
1136         (JSC::BytecodeDumper<Block>::dumpBlock):
1137         * bytecode/BytecodeDumper.h:
1138         * bytecode/CallLinkInfo.h:
1139         * bytecode/CallLinkStatus.cpp:
1140         (JSC::CallLinkStatus::computeFor):
1141         (JSC::CallLinkStatus::computeExitSiteData):
1142         (JSC::CallLinkStatus::computeFromCallLinkInfo):
1143         (JSC::CallLinkStatus::accountForExits):
1144         (JSC::CallLinkStatus::finalize):
1145         (JSC::CallLinkStatus::filter):
1146         (JSC::CallLinkStatus::computeDFGStatuses): Deleted.
1147         * bytecode/CallLinkStatus.h:
1148         (JSC::CallLinkStatus::operator bool const):
1149         (JSC::CallLinkStatus::operator! const): Deleted.
1150         * bytecode/CallVariant.cpp:
1151         (JSC::CallVariant::finalize):
1152         (JSC::CallVariant::filter):
1153         * bytecode/CallVariant.h:
1154         (JSC::CallVariant::operator bool const):
1155         (JSC::CallVariant::operator! const): Deleted.
1156         * bytecode/CodeBlock.cpp:
1157         (JSC::CodeBlock::dumpBytecode):
1158         (JSC::CodeBlock::propagateTransitions):
1159         (JSC::CodeBlock::finalizeUnconditionally):
1160         (JSC::CodeBlock::getICStatusMap):
1161         (JSC::CodeBlock::resetJITData):
1162         (JSC::CodeBlock::getStubInfoMap): Deleted.
1163         (JSC::CodeBlock::getCallLinkInfoMap): Deleted.
1164         (JSC::CodeBlock::getByValInfoMap): Deleted.
1165         * bytecode/CodeBlock.h:
1166         * bytecode/CodeOrigin.cpp:
1167         (JSC::CodeOrigin::isApproximatelyEqualTo const):
1168         (JSC::CodeOrigin::approximateHash const):
1169         * bytecode/CodeOrigin.h:
1170         (JSC::CodeOrigin::exitingInlineKind const):
1171         * bytecode/DFGExitProfile.cpp:
1172         (JSC::DFG::FrequentExitSite::dump const):
1173         (JSC::DFG::ExitProfile::add):
1174         * bytecode/DFGExitProfile.h:
1175         (JSC::DFG::FrequentExitSite::FrequentExitSite):
1176         (JSC::DFG::FrequentExitSite::operator== const):
1177         (JSC::DFG::FrequentExitSite::subsumes const):
1178         (JSC::DFG::FrequentExitSite::hash const):
1179         (JSC::DFG::FrequentExitSite::inlineKind const):
1180         (JSC::DFG::FrequentExitSite::withInlineKind const):
1181         (JSC::DFG::QueryableExitProfile::hasExitSite const):
1182         (JSC::DFG::QueryableExitProfile::hasExitSiteWithSpecificJITType const):
1183         (JSC::DFG::QueryableExitProfile::hasExitSiteWithSpecificInlineKind const):
1184         * bytecode/ExitFlag.cpp: Added.
1185         (JSC::ExitFlag::dump const):
1186         * bytecode/ExitFlag.h: Added.
1187         (JSC::ExitFlag::ExitFlag):
1188         (JSC::ExitFlag::operator| const):
1189         (JSC::ExitFlag::operator|=):
1190         (JSC::ExitFlag::operator& const):
1191         (JSC::ExitFlag::operator&=):
1192         (JSC::ExitFlag::operator bool const):
1193         (JSC::ExitFlag::isSet const):
1194         * bytecode/ExitingInlineKind.cpp: Added.
1195         (WTF::printInternal):
1196         * bytecode/ExitingInlineKind.h: Added.
1197         * bytecode/GetByIdStatus.cpp:
1198         (JSC::GetByIdStatus::computeFor):
1199         (JSC::GetByIdStatus::computeForStubInfo):
1200         (JSC::GetByIdStatus::slowVersion const):
1201         (JSC::GetByIdStatus::markIfCheap):
1202         (JSC::GetByIdStatus::finalize):
1203         (JSC::GetByIdStatus::hasExitSite): Deleted.
1204         * bytecode/GetByIdStatus.h:
1205         * bytecode/GetByIdVariant.cpp:
1206         (JSC::GetByIdVariant::markIfCheap):
1207         (JSC::GetByIdVariant::finalize):
1208         * bytecode/GetByIdVariant.h:
1209         * bytecode/ICStatusMap.cpp: Added.
1210         (JSC::ICStatusContext::get const):
1211         (JSC::ICStatusContext::isInlined const):
1212         (JSC::ICStatusContext::inlineKind const):
1213         * bytecode/ICStatusMap.h: Added.
1214         * bytecode/ICStatusUtils.cpp: Added.
1215         (JSC::hasBadCacheExitSite):
1216         * bytecode/ICStatusUtils.h:
1217         * bytecode/InstanceOfStatus.cpp:
1218         (JSC::InstanceOfStatus::computeFor):
1219         * bytecode/InstanceOfStatus.h:
1220         * bytecode/PolyProtoAccessChain.h:
1221         * bytecode/PutByIdStatus.cpp:
1222         (JSC::PutByIdStatus::hasExitSite):
1223         (JSC::PutByIdStatus::computeFor):
1224         (JSC::PutByIdStatus::slowVersion const):
1225         (JSC::PutByIdStatus::markIfCheap):
1226         (JSC::PutByIdStatus::finalize):
1227         (JSC::PutByIdStatus::filter):
1228         * bytecode/PutByIdStatus.h:
1229         * bytecode/PutByIdVariant.cpp:
1230         (JSC::PutByIdVariant::markIfCheap):
1231         (JSC::PutByIdVariant::finalize):
1232         * bytecode/PutByIdVariant.h:
1233         (JSC::PutByIdVariant::structureSet const):
1234         * bytecode/RecordedStatuses.cpp: Added.
1235         (JSC::RecordedStatuses::operator=):
1236         (JSC::RecordedStatuses::RecordedStatuses):
1237         (JSC::RecordedStatuses::addCallLinkStatus):
1238         (JSC::RecordedStatuses::addGetByIdStatus):
1239         (JSC::RecordedStatuses::addPutByIdStatus):
1240         (JSC::RecordedStatuses::markIfCheap):
1241         (JSC::RecordedStatuses::finalizeWithoutDeleting):
1242         (JSC::RecordedStatuses::finalize):
1243         (JSC::RecordedStatuses::shrinkToFit):
1244         * bytecode/RecordedStatuses.h: Added.
1245         (JSC::RecordedStatuses::RecordedStatuses):
1246         (JSC::RecordedStatuses::forEachVector):
1247         * bytecode/StructureSet.cpp:
1248         (JSC::StructureSet::markIfCheap const):
1249         (JSC::StructureSet::isStillAlive const):
1250         * bytecode/StructureSet.h:
1251         * bytecode/TerminatedCodeOrigin.h: Added.
1252         (JSC::TerminatedCodeOrigin::TerminatedCodeOrigin):
1253         (JSC::TerminatedCodeOriginHashTranslator::hash):
1254         (JSC::TerminatedCodeOriginHashTranslator::equal):
1255         * bytecode/Watchpoint.cpp:
1256         (WTF::printInternal):
1257         * bytecode/Watchpoint.h:
1258         * dfg/DFGAbstractInterpreter.h:
1259         * dfg/DFGAbstractInterpreterInlines.h:
1260         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1261         (JSC::DFG::AbstractInterpreter<AbstractStateType>::filterICStatus):
1262         * dfg/DFGByteCodeParser.cpp:
1263         (JSC::DFG::ByteCodeParser::handleCall):
1264         (JSC::DFG::ByteCodeParser::handleVarargsCall):
1265         (JSC::DFG::ByteCodeParser::handleDOMJITGetter):
1266         (JSC::DFG::ByteCodeParser::handleModuleNamespaceLoad):
1267         (JSC::DFG::ByteCodeParser::handleGetById):
1268         (JSC::DFG::ByteCodeParser::handlePutById):
1269         (JSC::DFG::ByteCodeParser::parseBlock):
1270         (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry):
1271         (JSC::DFG::ByteCodeParser::InlineStackEntry::~InlineStackEntry):
1272         (JSC::DFG::ByteCodeParser::parse):
1273         * dfg/DFGClobberize.h:
1274         (JSC::DFG::clobberize):
1275         * dfg/DFGClobbersExitState.cpp:
1276         (JSC::DFG::clobbersExitState):
1277         * dfg/DFGCommonData.h:
1278         * dfg/DFGConstantFoldingPhase.cpp:
1279         (JSC::DFG::ConstantFoldingPhase::foldConstants):
1280         * dfg/DFGDesiredWatchpoints.h:
1281         (JSC::DFG::SetPointerAdaptor::hasBeenInvalidated):
1282         * dfg/DFGDoesGC.cpp:
1283         (JSC::DFG::doesGC):
1284         * dfg/DFGFixupPhase.cpp:
1285         (JSC::DFG::FixupPhase::fixupNode):
1286         * dfg/DFGGraph.cpp:
1287         (JSC::DFG::Graph::dump):
1288         * dfg/DFGMayExit.cpp:
1289         * dfg/DFGNode.h:
1290         (JSC::DFG::Node::hasCallLinkStatus):
1291         (JSC::DFG::Node::callLinkStatus):
1292         (JSC::DFG::Node::hasGetByIdStatus):
1293         (JSC::DFG::Node::getByIdStatus):
1294         (JSC::DFG::Node::hasPutByIdStatus):
1295         (JSC::DFG::Node::putByIdStatus):
1296         * dfg/DFGNodeType.h:
1297         * dfg/DFGOSRExitBase.cpp:
1298         (JSC::DFG::OSRExitBase::considerAddingAsFrequentExitSiteSlow):
1299         * dfg/DFGObjectAllocationSinkingPhase.cpp:
1300         * dfg/DFGPlan.cpp:
1301         (JSC::DFG::Plan::reallyAdd):
1302         (JSC::DFG::Plan::checkLivenessAndVisitChildren):
1303         (JSC::DFG::Plan::finalizeInGC):
1304         * dfg/DFGPlan.h:
1305         * dfg/DFGPredictionPropagationPhase.cpp:
1306         * dfg/DFGSafeToExecute.h:
1307         (JSC::DFG::safeToExecute):
1308         * dfg/DFGSpeculativeJIT32_64.cpp:
1309         (JSC::DFG::SpeculativeJIT::compile):
1310         * dfg/DFGSpeculativeJIT64.cpp:
1311         (JSC::DFG::SpeculativeJIT::compile):
1312         * dfg/DFGStrengthReductionPhase.cpp:
1313         (JSC::DFG::StrengthReductionPhase::handleNode):
1314         * dfg/DFGWorklist.cpp:
1315         (JSC::DFG::Worklist::removeDeadPlans):
1316         * ftl/FTLAbstractHeapRepository.h:
1317         * ftl/FTLCapabilities.cpp:
1318         (JSC::FTL::canCompile):
1319         * ftl/FTLLowerDFGToB3.cpp:
1320         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
1321         (JSC::FTL::DFG::LowerDFGToB3::compileCreateThis):
1322         (JSC::FTL::DFG::LowerDFGToB3::compileFilterICStatus):
1323         * jit/PolymorphicCallStubRoutine.cpp:
1324         (JSC::PolymorphicCallStubRoutine::hasEdges const):
1325         (JSC::PolymorphicCallStubRoutine::edges const):
1326         * jit/PolymorphicCallStubRoutine.h:
1327         * profiler/ProfilerBytecodeSequence.cpp:
1328         (JSC::Profiler::BytecodeSequence::BytecodeSequence):
1329         * runtime/FunctionRareData.cpp:
1330         (JSC::FunctionRareData::initializeObjectAllocationProfile):
1331         * runtime/Options.h:
1332
1333 2018-07-21  Yusuke Suzuki  <utatane.tea@gmail.com>
1334
1335         [JSC] Use Function / ScopedLambda / RecursableLambda instead of std::function
1336         https://bugs.webkit.org/show_bug.cgi?id=187472
1337
1338         Reviewed by Mark Lam.
1339
1340         std::function allocates memory from standard malloc instead of bmalloc. Instead of
1341         using that, we should use WTF::{Function,ScopedLambda,RecursableLambda}.
1342
1343         This patch attempts to replace std::function with the above WTF function types.
1344         If the function's lifetime can be the same to the stack, we can use ScopedLambda, which
1345         is really efficient. Otherwise, we should use WTF::Function.
1346         For recurring use cases, we can use RecursableLambda.
1347
1348         * assembler/MacroAssembler.cpp:
1349         (JSC::stdFunctionCallback):
1350         (JSC::MacroAssembler::probe):
1351         * assembler/MacroAssembler.h:
1352         * b3/air/AirDisassembler.cpp:
1353         (JSC::B3::Air::Disassembler::dump):
1354         * b3/air/AirDisassembler.h:
1355         * bytecompiler/BytecodeGenerator.cpp:
1356         (JSC::BytecodeGenerator::BytecodeGenerator):
1357         (JSC::BytecodeGenerator::initializeDefaultParameterValuesAndSetupFunctionScopeStack):
1358         (JSC::BytecodeGenerator::emitEnumeration):
1359         * bytecompiler/BytecodeGenerator.h:
1360         * bytecompiler/NodesCodegen.cpp:
1361         (JSC::ArrayNode::emitBytecode):
1362         (JSC::ApplyFunctionCallDotNode::emitBytecode):
1363         (JSC::ForOfNode::emitBytecode):
1364         * dfg/DFGSpeculativeJIT.cpp:
1365         (JSC::DFG::SpeculativeJIT::addSlowPathGeneratorLambda):
1366         (JSC::DFG::SpeculativeJIT::compileMathIC):
1367         * dfg/DFGSpeculativeJIT.h:
1368         * dfg/DFGSpeculativeJIT64.cpp:
1369         (JSC::DFG::SpeculativeJIT::compile):
1370         * dfg/DFGValidate.cpp:
1371         * ftl/FTLCompile.cpp:
1372         (JSC::FTL::compile):
1373         * heap/HeapSnapshotBuilder.cpp:
1374         (JSC::HeapSnapshotBuilder::json):
1375         * heap/HeapSnapshotBuilder.h:
1376         * interpreter/StackVisitor.cpp:
1377         (JSC::StackVisitor::Frame::dump const):
1378         * interpreter/StackVisitor.h:
1379         * runtime/PromiseDeferredTimer.h:
1380         * runtime/VM.cpp:
1381         (JSC::VM::whenIdle):
1382         (JSC::enableProfilerWithRespectToCount):
1383         (JSC::disableProfilerWithRespectToCount):
1384         * runtime/VM.h:
1385         * runtime/VMEntryScope.cpp:
1386         (JSC::VMEntryScope::addDidPopListener):
1387         * runtime/VMEntryScope.h:
1388         * tools/HeapVerifier.cpp:
1389         (JSC::HeapVerifier::verifyCellList):
1390         (JSC::HeapVerifier::validateCell):
1391         (JSC::HeapVerifier::validateJSCell):
1392         * tools/HeapVerifier.h:
1393
1394 2018-07-20  Michael Saboff  <msaboff@apple.com>
1395
1396         DFG AbstractInterpreter: CheckArray filters array modes for DirectArguments/ScopedArguments using only NonArray
1397         https://bugs.webkit.org/show_bug.cgi?id=187827
1398         rdar://problem/42146858
1399
1400         Reviewed by Saam Barati.
1401
1402         When filtering array modes for DirectArguments or ScopedArguments, we need to allow for the possibility
1403         that they can either be NonArray or NonArrayWithArrayStorage (aka ArrayStorageShape).
1404         We can't end up with other shapes, Int32, Double, etc because GenericArguments sets 
1405         InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero which will cause us to go down a
1406         putByIndex() path that doesn't change the shape.
1407
1408         * dfg/DFGArrayMode.h:
1409         (JSC::DFG::ArrayMode::arrayModesThatPassFiltering const):
1410
1411 2018-07-20  Yusuke Suzuki  <utatane.tea@gmail.com>
1412
1413         [DFG] Fold GetByVal if Array is CoW
1414         https://bugs.webkit.org/show_bug.cgi?id=186459
1415
1416         Reviewed by Saam Barati.
1417
1418         CoW indexing type means that we now tracks the changes in CoW Array by structure. So DFG has a chance to
1419         fold GetByVal if the given array is CoW. This patch folds GetByVal onto the CoW Array. If the structure
1420         is watched and the butterfly is JSImmutableButterfly, we can load the value from this butterfly.
1421
1422         This can be useful since these CoW arrays are used for a storage for constants. Constant-indexed access
1423         to these constant arrays can be folded into an actual constant by this patch.
1424
1425                                            baseline                  patched
1426
1427         template_string.es6          4993.9853+-147.5308   ^    824.1685+-44.1839       ^ definitely 6.0594x faster
1428         template_string_tag.es5        67.0822+-2.0100     ^      9.3540+-0.5376        ^ definitely 7.1715x faster
1429
1430         * dfg/DFGAbstractInterpreterInlines.h:
1431         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1432
1433 2018-07-20  Yusuke Suzuki  <utatane.tea@gmail.com>
1434
1435         [JSC] Remove cellLock in JSObject::convertContiguousToArrayStorage
1436         https://bugs.webkit.org/show_bug.cgi?id=186602
1437
1438         Reviewed by Saam Barati.
1439
1440         JSObject::convertContiguousToArrayStorage's cellLock() is not necessary since we do not
1441         change the part of the butterfly, length etc. We prove that our procedure is safe, and
1442         drop the cellLock() here.
1443
1444         * runtime/JSObject.cpp:
1445         (JSC::JSObject::convertContiguousToArrayStorage):
1446
1447 2018-07-20  Saam Barati  <sbarati@apple.com>
1448
1449         CompareEq should be using KnownOtherUse instead of OtherUse
1450         https://bugs.webkit.org/show_bug.cgi?id=186814
1451         <rdar://problem/39720030>
1452
1453         Reviewed by Filip Pizlo.
1454
1455         CompareEq in fixup phase was doing this:
1456         insertCheck(child, OtherUse)
1457         setUseKind(child, OtherUse)
1458         And in the DFG/FTL backend, it would not emit a check for OtherUse. This could
1459         lead to edge verification crashing because a phase may optimize the check out
1460         by removing the node. However, AI may not be privy to that optimization, and
1461         AI may think the incoming value may not be Other. AI is expecting the DFG/FTL
1462         backend to actually emit a check here, but it does not.
1463         
1464         This exact pattern is why we have KnownXYZ use kinds. This patch introduces
1465         KnownOtherUse and changes the above pattern to be:
1466         insertCheck(child, OtherUse)
1467         setUseKind(child, KnownOtherUse)
1468
1469         * dfg/DFGFixupPhase.cpp:
1470         (JSC::DFG::FixupPhase::fixupNode):
1471         * dfg/DFGSafeToExecute.h:
1472         (JSC::DFG::SafeToExecuteEdge::operator()):
1473         * dfg/DFGSpeculativeJIT.cpp:
1474         (JSC::DFG::SpeculativeJIT::speculate):
1475         * dfg/DFGUseKind.cpp:
1476         (WTF::printInternal):
1477         * dfg/DFGUseKind.h:
1478         (JSC::DFG::typeFilterFor):
1479         (JSC::DFG::shouldNotHaveTypeCheck):
1480         (JSC::DFG::checkMayCrashIfInputIsEmpty):
1481         * dfg/DFGWatchpointCollectionPhase.cpp:
1482         (JSC::DFG::WatchpointCollectionPhase::handle):
1483         * ftl/FTLCapabilities.cpp:
1484         (JSC::FTL::canCompile):
1485         * ftl/FTLLowerDFGToB3.cpp:
1486         (JSC::FTL::DFG::LowerDFGToB3::compileCompareEq):
1487         (JSC::FTL::DFG::LowerDFGToB3::speculate):
1488
1489 2018-07-20  Yusuke Suzuki  <utatane.tea@gmail.com>
1490
1491         [JSC] A bit performance improvement for Object.assign by cleaning up code
1492         https://bugs.webkit.org/show_bug.cgi?id=187852
1493
1494         Reviewed by Saam Barati.
1495
1496         We clean up Object.assign code a bit.
1497
1498         1. Vector and MarkedArgumentBuffer are extracted out from the loop since repeatedly creating MarkedArgumentBuffer is costly.
1499         2. canDoFastPath is not necessary. Restructuring the code to clean up things.
1500
1501         It improves the performance a bit.
1502
1503                                     baseline                  patched
1504
1505         object-assign.es6      237.7719+-5.5175          231.2856+-4.6907          might be 1.0280x faster
1506
1507         * runtime/ObjectConstructor.cpp:
1508         (JSC::objectConstructorAssign):
1509
1510 2018-07-19  Carlos Garcia Campos  <cgarcia@igalia.com>
1511
1512         [GLIB] jsc_context_evaluate_in_object() should receive an instance when a JSCClass is given
1513         https://bugs.webkit.org/show_bug.cgi?id=187798
1514
1515         Reviewed by Michael Catanzaro.
1516
1517         Because a JSCClass is pretty much useless without an instance in this case. It should be similar to
1518         jsc_value_new_object() because indeed we are creating a new object. This makes destroy function and vtable
1519         functions to work. We can't use JSAPIWrapperObject to wrap this object, because it's a global object, so this
1520         patch adds JSAPIWrapperGlobalObject or that.
1521
1522         * API/glib/JSAPIWrapperGlobalObject.cpp: Added.
1523         (jsAPIWrapperGlobalObjectHandleOwner):
1524         (JSAPIWrapperGlobalObjectHandleOwner::finalize):
1525         (JSC::JSCallbackObject<JSAPIWrapperGlobalObject>::createStructure):
1526         (JSC::JSCallbackObject<JSAPIWrapperGlobalObject>::create):
1527         (JSC::JSAPIWrapperGlobalObject::JSAPIWrapperGlobalObject):
1528         (JSC::JSAPIWrapperGlobalObject::finishCreation):
1529         (JSC::JSAPIWrapperGlobalObject::visitChildren):
1530         * API/glib/JSAPIWrapperGlobalObject.h: Added.
1531         (JSC::JSAPIWrapperGlobalObject::wrappedObject const):
1532         (JSC::JSAPIWrapperGlobalObject::setWrappedObject):
1533         * API/glib/JSCClass.cpp:
1534         (isWrappedObject): Helper to check if the given object is a JSAPIWrapperObject or JSAPIWrapperGlobalObject.
1535         (wrappedObjectClass): Return the class of a wrapped object.
1536         (jscContextForObject): Get the execution context of an object. If the object is a JSAPIWrapperGlobalObject, the
1537         scope extension global object is used instead.
1538         (getProperty): Use isWrappedObject, wrappedObjectClass and jscContextForObject.
1539         (setProperty): Ditto.
1540         (hasProperty): Ditto.
1541         (deleteProperty): Ditto.
1542         (getPropertyNames): Ditto.
1543         (jscClassCreateContextWithJSWrapper): Call jscContextCreateContextWithJSWrapper().
1544         * API/glib/JSCClassPrivate.h:
1545         * API/glib/JSCContext.cpp:
1546         (jscContextCreateContextWithJSWrapper): Call WrapperMap::createContextWithJSWrappper().
1547         (jsc_context_evaluate_in_object): Use jscClassCreateContextWithJSWrapper() when a JSCClass is given.
1548         * API/glib/JSCContext.h:
1549         * API/glib/JSCContextPrivate.h:
1550         * API/glib/JSCWrapperMap.cpp:
1551         (JSC::WrapperMap::createContextWithJSWrappper): Create the new context for jsc_context_evaluate_in_object() here
1552         when a JSCClass is used to create the JSAPIWrapperGlobalObject.
1553         (JSC::WrapperMap::wrappedObject const): Return the wrapped object also in case of JSAPIWrapperGlobalObject.
1554         * API/glib/JSCWrapperMap.h:
1555         * GLib.cmake:
1556
1557 2018-07-19  Saam Barati  <sbarati@apple.com>
1558
1559         Conservatively make Object.assign's fast path do a two phase protocol of loading everything then storing everything to try to prevent a crash
1560         https://bugs.webkit.org/show_bug.cgi?id=187836
1561         <rdar://problem/42409527>
1562
1563         Reviewed by Mark Lam.
1564
1565         We have crash reports that we're crashing on source->getDirect in Object.assign's
1566         fast path. Mark investigated this and determined we end up with a nullptr for
1567         butterfly. This is curious, because source's Structure indicated that it has
1568         out of line properties. My leading hypothesis for this at the moment is a bit
1569         handwavy, but it's essentially:
1570         - We end up firing a watchpoint when assigning to the target (this can happen
1571         if a watchpoint was set up for storing to that particular field)
1572         - When we fire that watchpoint, we end up doing some kind work on the source,
1573         perhaps causing it to flattenDictionaryStructure. Therefore, we end up
1574         mutating source.
1575         
1576         I'm not super convinced this is what we're running into, but just by reading
1577         the code, I think it needs to be something similar to this. Seeing if this change
1578         fixes the crasher will give us good data to determine if something like this is
1579         happening or if the bug is something else entirely.
1580
1581         * runtime/ObjectConstructor.cpp:
1582         (JSC::objectConstructorAssign):
1583
1584 2018-07-19  Commit Queue  <commit-queue@webkit.org>
1585
1586         Unreviewed, rolling out r233998.
1587         https://bugs.webkit.org/show_bug.cgi?id=187815
1588
1589         Not needed. (Requested by mlam|a on #webkit).
1590
1591         Reverted changeset:
1592
1593         "Temporarily mitigate a bug where a source provider is null
1594         when it shouldn't be."
1595         https://bugs.webkit.org/show_bug.cgi?id=187812
1596         https://trac.webkit.org/changeset/233998
1597
1598 2018-07-19  Mark Lam  <mark.lam@apple.com>
1599
1600         Temporarily mitigate a bug where a source provider is null when it shouldn't be.
1601         https://bugs.webkit.org/show_bug.cgi?id=187812
1602         <rdar://problem/41192691>
1603
1604         Reviewed by Michael Saboff.
1605
1606         Adding a null check to temporarily mitigate https://bugs.webkit.org/show_bug.cgi?id=187811.
1607
1608         * runtime/Error.cpp:
1609         (JSC::addErrorInfo):
1610
1611 2018-07-19  Keith Rollin  <krollin@apple.com>
1612
1613         Adjust WEBCORE_EXPORT annotations for LTO
1614         https://bugs.webkit.org/show_bug.cgi?id=187781
1615         <rdar://problem/42351124>
1616
1617         Reviewed by Alex Christensen.
1618
1619         Continuation of Bug 186944. This bug addresses issues not caught
1620         during the first pass of adjustments. The initial work focussed on
1621         macOS; this one addresses issues found when building for iOS. From
1622         186944:
1623
1624         Adjust a number of places that result in WebKit's
1625         'check-for-weak-vtables-and-externals' script reporting weak external
1626         symbols:
1627
1628             ERROR: WebCore has a weak external symbol in it (/Volumes/Data/dev/webkit/OpenSource/WebKitBuild/Release/WebCore.framework/Versions/A/WebCore)
1629             ERROR: A weak external symbol is generated when a symbol is defined in multiple compilation units and is also marked as being exported from the library.
1630             ERROR: A common cause of weak external symbols is when an inline function is listed in the linker export file.
1631             ...
1632
1633         These cases are caused by inline methods being marked with WTF_EXPORT
1634         (or related macro) or with an inline function being in a class marked
1635         as such, and when enabling LTO builds.
1636
1637         For the most part, address these by removing the WEBCORE_EXPORT
1638         annotation from inline methods. In some cases, move the implementation
1639         out-of-line because it's the class that has the WEBCORE_EXPORT on it
1640         and removing the annotation from the class would be too disruptive.
1641         Finally, in other cases, move the implementation out-of-line because
1642         check-for-weak-vtables-and-externals still complains when keeping the
1643         implementation inline and removing the annotation; this seems to
1644         typically (but not always) happen with destructors.
1645
1646         * inspector/remote/RemoteAutomationTarget.cpp:
1647         (Inspector::RemoteAutomationTarget::~RemoteAutomationTarget):
1648         * inspector/remote/RemoteAutomationTarget.h:
1649         * inspector/remote/RemoteInspector.cpp:
1650         (Inspector::RemoteInspector::Client::~Client):
1651         * inspector/remote/RemoteInspector.h:
1652
1653 2018-07-19  Yusuke Suzuki  <utatane.tea@gmail.com>
1654
1655         Unreviewed, check scope after performing getPropertySlot in JSON.stringify
1656         https://bugs.webkit.org/show_bug.cgi?id=187807
1657
1658         Properly putting EXCEPTION_ASSERT to tell our exception checker mechanism
1659         that we know that exception occurrence and handle it well.
1660
1661         * runtime/JSONObject.cpp:
1662         (JSC::Stringifier::Holder::appendNextProperty):
1663
1664 2018-07-18  Yusuke Suzuki  <utatane.tea@gmail.com>
1665
1666         [JSC] Reduce size of AST nodes
1667         https://bugs.webkit.org/show_bug.cgi?id=187689
1668
1669         Reviewed by Mark Lam.
1670
1671         We clean up AST nodes to reduce size. By doing so, we can reduce the memory consumption
1672         of ParserArena at peak state.
1673
1674         1. Annotate `final` to AST nodes to make them solid. And it allows the compiler to
1675         devirtualize a call to the function which are implemented in a final class.
1676
1677         2. Use default member initializers more.
1678
1679         3. And use `nullptr` instead of `0`.
1680
1681         4. Arrange the layout of AST nodes to reduce the size. It includes changing the order
1682         of classes in multiple inheritance. In particular, StatementNode is decreased from 48
1683         to 40. This decreases the sizes of all the derived Statement nodes.
1684
1685         * parser/NodeConstructors.h:
1686         (JSC::Node::Node):
1687         (JSC::StatementNode::StatementNode):
1688         (JSC::ElementNode::ElementNode):
1689         (JSC::ArrayNode::ArrayNode):
1690         (JSC::PropertyListNode::PropertyListNode):
1691         (JSC::ObjectLiteralNode::ObjectLiteralNode):
1692         (JSC::ArgumentListNode::ArgumentListNode):
1693         (JSC::ArgumentsNode::ArgumentsNode):
1694         (JSC::NewExprNode::NewExprNode):
1695         (JSC::BytecodeIntrinsicNode::BytecodeIntrinsicNode):
1696         (JSC::BinaryOpNode::BinaryOpNode):
1697         (JSC::LogicalOpNode::LogicalOpNode):
1698         (JSC::CommaNode::CommaNode):
1699         (JSC::SourceElements::SourceElements):
1700         (JSC::ClauseListNode::ClauseListNode):
1701         * parser/Nodes.cpp:
1702         (JSC::FunctionMetadataNode::FunctionMetadataNode):
1703         (JSC::FunctionMetadataNode::operator== const):
1704         (JSC::FunctionMetadataNode::dump const):
1705         * parser/Nodes.h:
1706         (JSC::BooleanNode::value): Deleted.
1707         (JSC::StringNode::value): Deleted.
1708         (JSC::TemplateExpressionListNode::value): Deleted.
1709         (JSC::TemplateExpressionListNode::next): Deleted.
1710         (JSC::TemplateStringNode::cooked): Deleted.
1711         (JSC::TemplateStringNode::raw): Deleted.
1712         (JSC::TemplateStringListNode::value): Deleted.
1713         (JSC::TemplateStringListNode::next): Deleted.
1714         (JSC::TemplateLiteralNode::templateStrings const): Deleted.
1715         (JSC::TemplateLiteralNode::templateExpressions const): Deleted.
1716         (JSC::TaggedTemplateNode::templateLiteral const): Deleted.
1717         (JSC::ResolveNode::identifier const): Deleted.
1718         (JSC::ElementNode::elision const): Deleted.
1719         (JSC::ElementNode::value): Deleted.
1720         (JSC::ElementNode::next): Deleted.
1721         (JSC::ArrayNode::elements const): Deleted.
1722         (JSC::PropertyNode::expressionName const): Deleted.
1723         (JSC::PropertyNode::name const): Deleted.
1724         (JSC::PropertyNode::type const): Deleted.
1725         (JSC::PropertyNode::needsSuperBinding const): Deleted.
1726         (JSC::PropertyNode::isClassProperty const): Deleted.
1727         (JSC::PropertyNode::isStaticClassProperty const): Deleted.
1728         (JSC::PropertyNode::isInstanceClassProperty const): Deleted.
1729         (JSC::PropertyNode::isOverriddenByDuplicate const): Deleted.
1730         (JSC::PropertyNode::setIsOverriddenByDuplicate): Deleted.
1731         (JSC::PropertyNode::putType const): Deleted.
1732         (JSC::BracketAccessorNode::base const): Deleted.
1733         (JSC::BracketAccessorNode::subscript const): Deleted.
1734         (JSC::BracketAccessorNode::subscriptHasAssignments const): Deleted.
1735         (JSC::DotAccessorNode::base const): Deleted.
1736         (JSC::DotAccessorNode::identifier const): Deleted.
1737         (JSC::SpreadExpressionNode::expression const): Deleted.
1738         (JSC::ObjectSpreadExpressionNode::expression const): Deleted.
1739         (JSC::BytecodeIntrinsicNode::type const): Deleted.
1740         (JSC::BytecodeIntrinsicNode::emitter const): Deleted.
1741         (JSC::BytecodeIntrinsicNode::identifier const): Deleted.
1742         (JSC::TypeOfResolveNode::identifier const): Deleted.
1743         (JSC::BitwiseNotNode::expr): Deleted.
1744         (JSC::BitwiseNotNode::expr const): Deleted.
1745         (JSC::AssignResolveNode::identifier const): Deleted.
1746         (JSC::ExprStatementNode::expr const): Deleted.
1747         (JSC::ForOfNode::isForAwait const): Deleted.
1748         (JSC::ReturnNode::value): Deleted.
1749         (JSC::ProgramNode::startColumn const): Deleted.
1750         (JSC::ProgramNode::endColumn const): Deleted.
1751         (JSC::EvalNode::startColumn const): Deleted.
1752         (JSC::EvalNode::endColumn const): Deleted.
1753         (JSC::ModuleProgramNode::startColumn const): Deleted.
1754         (JSC::ModuleProgramNode::endColumn const): Deleted.
1755         (JSC::ModuleProgramNode::moduleScopeData): Deleted.
1756         (JSC::ModuleNameNode::moduleName): Deleted.
1757         (JSC::ImportSpecifierNode::importedName): Deleted.
1758         (JSC::ImportSpecifierNode::localName): Deleted.
1759         (JSC::ImportSpecifierListNode::specifiers const): Deleted.
1760         (JSC::ImportSpecifierListNode::append): Deleted.
1761         (JSC::ImportDeclarationNode::specifierList const): Deleted.
1762         (JSC::ImportDeclarationNode::moduleName const): Deleted.
1763         (JSC::ExportAllDeclarationNode::moduleName const): Deleted.
1764         (JSC::ExportDefaultDeclarationNode::declaration const): Deleted.
1765         (JSC::ExportDefaultDeclarationNode::localName const): Deleted.
1766         (JSC::ExportLocalDeclarationNode::declaration const): Deleted.
1767         (JSC::ExportSpecifierNode::exportedName): Deleted.
1768         (JSC::ExportSpecifierNode::localName): Deleted.
1769         (JSC::ExportSpecifierListNode::specifiers const): Deleted.
1770         (JSC::ExportSpecifierListNode::append): Deleted.
1771         (JSC::ExportNamedDeclarationNode::specifierList const): Deleted.
1772         (JSC::ExportNamedDeclarationNode::moduleName const): Deleted.
1773         (JSC::ArrayPatternNode::appendIndex): Deleted.
1774         (JSC::ObjectPatternNode::appendEntry): Deleted.
1775         (JSC::ObjectPatternNode::setContainsRestElement): Deleted.
1776         (JSC::ObjectPatternNode::setContainsComputedProperty): Deleted.
1777         (JSC::DestructuringAssignmentNode::bindings): Deleted.
1778         (JSC::FunctionParameters::size const): Deleted.
1779         (JSC::FunctionParameters::append): Deleted.
1780         (JSC::FunctionParameters::isSimpleParameterList const): Deleted.
1781         (JSC::FuncDeclNode::metadata): Deleted.
1782         (JSC::CaseClauseNode::expr const): Deleted.
1783         (JSC::CaseClauseNode::setStartOffset): Deleted.
1784         (JSC::ClauseListNode::getClause const): Deleted.
1785         (JSC::ClauseListNode::getNext const): Deleted.
1786         * runtime/ExceptionHelpers.cpp:
1787         * runtime/JSObject.cpp:
1788
1789 2018-07-18  Yusuke Suzuki  <utatane.tea@gmail.com>
1790
1791         JSON.stringify should emit non own properties if second array argument includes
1792         https://bugs.webkit.org/show_bug.cgi?id=187724
1793
1794         Reviewed by Mark Lam.
1795
1796         According to the spec[1], JSON.stringify needs to retrieve properties by using [[Get]],
1797         instead of [[GetOwnProperty]]. It means that we would look up a properties defined
1798         in [[Prototype]] or upper objects in the prototype chain. While enumeration is done
1799         by using EnumerableOwnPropertyNames typically, we can pass replacer array including
1800         property names which does not reside in the own properties. Or we can modify the
1801         own properties by deleting properties while JSON.stringify is calling a getter. So,
1802         using [[Get]] instead of [[GetOwnProperty]] is user-visible.
1803
1804         This patch changes getOwnPropertySlot to getPropertySlot to align the behavior to the spec.
1805         The performance of Kraken/json-stringify-tinderbox is neutral.
1806
1807         [1]: https://tc39.github.io/ecma262/#sec-serializejsonproperty
1808
1809         * runtime/JSONObject.cpp:
1810         (JSC::Stringifier::toJSON):
1811         (JSC::Stringifier::toJSONImpl):
1812         (JSC::Stringifier::appendStringifiedValue):
1813         (JSC::Stringifier::Holder::Holder):
1814         (JSC::Stringifier::Holder::appendNextProperty):
1815
1816 2018-07-18  Yusuke Suzuki  <utatane.tea@gmail.com>
1817
1818         [JSC] JSON.stringify's replacer should use `isArray` instead of JSArray checks
1819         https://bugs.webkit.org/show_bug.cgi?id=187755
1820
1821         Reviewed by Mark Lam.
1822
1823         JSON.stringify used `inherits<JSArray>(vm)` to determine whether the given replacer is an array replacer.
1824         But this is wrong. According to the spec, we should use `isArray`[1], which accepts Proxies. This difference
1825         makes one test262 test failed.
1826
1827         This patch changes the code to using `isArray()`. And we reorder the evaluations of replacer check and ident space check
1828         to align these checks to the spec's order.
1829
1830         [1]: https://tc39.github.io/ecma262/#sec-json.stringify
1831
1832         * runtime/JSONObject.cpp:
1833         (JSC::Stringifier::Stringifier):
1834
1835 2018-07-18  Yusuke Suzuki  <utatane.tea@gmail.com>
1836
1837         [JSC] Root wrapper object in JSON.stringify is not necessary if replacer is not callable
1838         https://bugs.webkit.org/show_bug.cgi?id=187752
1839
1840         Reviewed by Mark Lam.
1841
1842         JSON.stringify has an implicit root wrapper object since we would like to call replacer
1843         with a wrapper object and a property name. While we always create this wrapper object,
1844         it is unnecessary if the given replacer is not callable.
1845
1846         This patch removes wrapper object creation when a replacer is not callable to avoid unnecessary
1847         allocations. This change slightly improves the performance of Kraken/json-stringify-tinderbox.
1848
1849                                            baseline                  patched
1850
1851         json-stringify-tinderbox        39.730+-0.590      ^      38.853+-0.266         ^ definitely 1.0226x faster
1852
1853         * runtime/JSONObject.cpp:
1854         (JSC::Stringifier::isCallableReplacer const):
1855         (JSC::Stringifier::Stringifier):
1856         (JSC::Stringifier::stringify):
1857         (JSC::Stringifier::appendStringifiedValue):
1858
1859 2018-07-18  Carlos Garcia Campos  <cgarcia@igalia.com>
1860
1861         [GLIB] Add jsc_context_check_syntax() to GLib API
1862         https://bugs.webkit.org/show_bug.cgi?id=187694
1863
1864         Reviewed by Yusuke Suzuki.
1865
1866         A new function to be able to check for syntax errors without actually evaluating the code.
1867
1868         * API/glib/JSCContext.cpp:
1869         (jsc_context_check_syntax):
1870         * API/glib/JSCContext.h:
1871         * API/glib/docs/jsc-glib-4.0-sections.txt:
1872
1873 2018-07-17  Keith Miller  <keith_miller@apple.com>
1874
1875         Revert r233630 since it broke internal wasm benchmarks
1876         https://bugs.webkit.org/show_bug.cgi?id=187746
1877
1878         Unreviewed revert.
1879
1880         This patch seems to have broken internal Wasm benchmarks. This
1881         issue is likely due to an underlying bug but let's rollout while
1882         we investigate.
1883
1884         * bytecode/CodeType.h:
1885         * bytecode/UnlinkedCodeBlock.cpp:
1886         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
1887         * bytecode/UnlinkedCodeBlock.h:
1888         (JSC::UnlinkedCodeBlock::codeType const):
1889         (JSC::UnlinkedCodeBlock::didOptimize const):
1890         (JSC::UnlinkedCodeBlock::setDidOptimize):
1891         * bytecode/VirtualRegister.h:
1892         (JSC::VirtualRegister::VirtualRegister):
1893         (): Deleted.
1894
1895 2018-07-17  Mark Lam  <mark.lam@apple.com>
1896
1897         CodeBlock::baselineVersion() should account for executables with purged codeBlocks.
1898         https://bugs.webkit.org/show_bug.cgi?id=187736
1899         <rdar://problem/42114371>
1900
1901         Reviewed by Michael Saboff.
1902
1903         CodeBlock::baselineVersion() currently checks for a null replacement but does not
1904         account for the fact that that the replacement can also be null due to the
1905         executable having being purged of its codeBlocks due to a memory event (see
1906         ExecutableBase::clearCode()).  This patch adds code to account for this.
1907
1908         * bytecode/CodeBlock.cpp:
1909         (JSC::CodeBlock::baselineVersion):
1910
1911 2018-07-16  Yusuke Suzuki  <utatane.tea@gmail.com>
1912
1913         [JSC] UnlinkedCodeBlock::shrinkToFit miss m_constantIdentifierSets
1914         https://bugs.webkit.org/show_bug.cgi?id=187709
1915
1916         Reviewed by Mark Lam.
1917
1918         UnlinkedCodeBlock::shrinkToFit accidentally misses m_constantIdentifierSets shrinking.
1919
1920         * bytecode/UnlinkedCodeBlock.cpp:
1921         (JSC::UnlinkedCodeBlock::shrinkToFit):
1922
1923 2018-07-16  Yusuke Suzuki  <utatane.tea@gmail.com>
1924
1925         [JSC] Make SourceParseMode small
1926         https://bugs.webkit.org/show_bug.cgi?id=187705
1927
1928         Reviewed by Mark Lam.
1929
1930         Each SourceParseMode is distinct. So we do not need to make it a set-style (power of 2 style).
1931         Originally, this is done to make SourceParseModeSet faster because it is critical in our parser.
1932         But we can keep SourceParseModeSet fast by `1U << mode | set`. And we can make SourceParseMode
1933         within 5 bits. This reduces the size of UnlinkedCodeBlock from 288 to 280.
1934
1935         * parser/ParserModes.h:
1936         (JSC::SourceParseModeSet::SourceParseModeSet):
1937         (JSC::SourceParseModeSet::contains):
1938         (JSC::SourceParseModeSet::mergeSourceParseModes):
1939
1940 2018-07-12  Yusuke Suzuki  <utatane.tea@gmail.com>
1941
1942         [JSC] Generator and AsyncGeneratorMethod's prototype is incorrect
1943         https://bugs.webkit.org/show_bug.cgi?id=187585
1944
1945         Reviewed by Darin Adler.
1946
1947         This patch fixes Generator and AsyncGenerator's prototype issues.
1948
1949         1. Generator's default prototype is incorrect when `generator.prototype = null` is performed.
1950         We fix this by changing JSFunction::prototypeForConstruction.
1951
1952         2. AsyncGeneratorMethod is not handled. We change the name isAsyncGeneratorFunctionParseMode
1953         to isAsyncGeneratorWrapperParseMode since it is aligned to Generator's code. And use it well
1954         to fix `prototype` issues for AsyncGeneratorMethod.
1955
1956         * bytecompiler/BytecodeGenerator.cpp:
1957         (JSC::BytecodeGenerator::emitPutAsyncGeneratorFields):
1958         (JSC::BytecodeGenerator::emitNewFunction):
1959         * bytecompiler/NodesCodegen.cpp:
1960         (JSC::FunctionNode::emitBytecode):
1961         * parser/ASTBuilder.h:
1962         (JSC::ASTBuilder::createFunctionMetadata):
1963         * parser/Parser.cpp:
1964         (JSC::getAsynFunctionBodyParseMode):
1965         (JSC::Parser<LexerType>::parseInner):
1966         (JSC::Parser<LexerType>::parseAsyncGeneratorFunctionSourceElements):
1967         * parser/ParserModes.h:
1968         (JSC::isAsyncGeneratorParseMode):
1969         (JSC::isAsyncGeneratorWrapperParseMode):
1970         (JSC::isAsyncGeneratorFunctionParseMode): Deleted.
1971         * runtime/FunctionExecutable.h:
1972         * runtime/JSFunction.cpp:
1973         (JSC::JSFunction::prototypeForConstruction):
1974         (JSC::JSFunction::getOwnPropertySlot):
1975
1976 2018-07-16  Mark Lam  <mark.lam@apple.com>
1977
1978         jsc shell's noFTL utility test function should be more robust.
1979         https://bugs.webkit.org/show_bug.cgi?id=187704
1980         <rdar://problem/42231988>
1981
1982         Reviewed by Michael Saboff and Keith Miller.
1983
1984         * jsc.cpp:
1985         (functionNoFTL):
1986         - only setNeverFTLOptimize() if the function is actually a JS function.
1987
1988 2018-07-15  Carlos Garcia Campos  <cgarcia@igalia.com>
1989
1990         [GLIB] Add API to evaluate code using a given object to store global symbols
1991         https://bugs.webkit.org/show_bug.cgi?id=187639
1992
1993         Reviewed by Michael Catanzaro.
1994
1995         Add jsc_context_evaluate_in_object(). It returns a new object as an out parameter. Global symbols in the
1996         evaluated script are added as properties to the new object instead of to the context global object. This is
1997         similar to JS::Evaluate in spider monkey when a scopeChain parameter is passed, but JSC doesn't support using a
1998         scope for assignments, so we have to create a new context and get its global object. This patch also updates
1999         jsc_context_evaluate_with_source_uri() to receive the starting line number for consistency with the new
2000         jsc_context_evaluate_in_object().
2001
2002         * API/glib/JSCContext.cpp:
2003         (jsc_context_evaluate): Pass 0 as line number to jsc_context_evaluate_with_source_uri().
2004         (evaluateScriptInContext): Helper function to evaluate a script in a JSGlobalContextRef.
2005         (jsc_context_evaluate_with_source_uri): Use evaluateScriptInContext().
2006         (jsc_context_evaluate_in_object): Create a new context and set the main context global object as extension
2007         scope of it. Evaluate the script in the new context and get its global object to be returned as parameter.
2008         * API/glib/JSCContext.h:
2009         * API/glib/docs/jsc-glib-4.0-sections.txt:
2010
2011 2018-07-13  Yusuke Suzuki  <utatane.tea@gmail.com>
2012
2013         [32bit JSC tests]  stress/cow-convert-double-to-contiguous.js and stress/cow-convert-int32-to-contiguous.js are failing
2014         https://bugs.webkit.org/show_bug.cgi?id=187561
2015
2016         Reviewed by Darin Adler.
2017
2018         This patch fixes the issue that CoW array handling is not introduced in 32bit put_by_val code.
2019         We clean up 32bit put_by_val code.
2020
2021         1. We remove inline out-of-bounds recording code since it is done in C operation code. This change
2022         aligns 32bit implementation to 64bit implementation.
2023
2024         2. We add CoW array checking, which is done in 64bit implementation.
2025
2026         * jit/JITPropertyAccess.cpp:
2027         (JSC::JIT::emit_op_put_by_val):
2028         * jit/JITPropertyAccess32_64.cpp:
2029         (JSC::JIT::emit_op_put_by_val):
2030         (JSC::JIT::emitSlow_op_put_by_val):
2031
2032 2018-07-12  Mark Lam  <mark.lam@apple.com>
2033
2034         Need to handle CodeBlock::replacement() being null.
2035         https://bugs.webkit.org/show_bug.cgi?id=187569
2036         <rdar://problem/41468692>
2037
2038         Reviewed by Saam Barati.
2039
2040         CodeBlock::replacement() may return a nullptr.  Some of our code already checks
2041         for this while others do not.  We should add null checks in all the places that
2042         need it.
2043
2044         * bytecode/CodeBlock.cpp:
2045         (JSC::CodeBlock::hasOptimizedReplacement):
2046         (JSC::CodeBlock::jettison):
2047         (JSC::CodeBlock::numberOfDFGCompiles):
2048         (JSC::CodeBlock::setOptimizationThresholdBasedOnCompilationResult):
2049         * dfg/DFGOperations.cpp:
2050         * dfg/DFGToFTLDeferredCompilationCallback.cpp:
2051         (JSC::DFG::ToFTLDeferredCompilationCallback::compilationDidBecomeReadyAsynchronously):
2052         (JSC::DFG::ToFTLDeferredCompilationCallback::compilationDidComplete):
2053         * jit/JITOperations.cpp:
2054
2055 2018-07-12  Yusuke Suzuki  <utatane.tea@gmail.com>
2056
2057         [JSC] Thread VM& to JSCell::methodTable(VM&)
2058         https://bugs.webkit.org/show_bug.cgi?id=187548
2059
2060         Reviewed by Saam Barati.
2061
2062         This patch threads VM& to methodTable(VM&) and remove methodTable().
2063         We add VM& parameter to estimatedSize() to thread VM& in estimatedSize implementations.
2064
2065         * API/APICast.h:
2066         (toJS):
2067         * API/JSCallbackObject.h:
2068         * API/JSCallbackObjectFunctions.h:
2069         (JSC::JSCallbackObject<Parent>::className):
2070         * bytecode/CodeBlock.cpp:
2071         (JSC::CodeBlock::estimatedSize):
2072         * bytecode/CodeBlock.h:
2073         * bytecode/UnlinkedCodeBlock.cpp:
2074         (JSC::UnlinkedCodeBlock::estimatedSize):
2075         * bytecode/UnlinkedCodeBlock.h:
2076         * debugger/DebuggerScope.cpp:
2077         (JSC::DebuggerScope::className):
2078         * debugger/DebuggerScope.h:
2079         * heap/Heap.cpp:
2080         (JSC::GatherHeapSnapshotData::GatherHeapSnapshotData):
2081         (JSC::GatherHeapSnapshotData::operator() const):
2082         (JSC::Heap::gatherExtraHeapSnapshotData):
2083         * heap/HeapSnapshotBuilder.cpp:
2084         (JSC::HeapSnapshotBuilder::json):
2085         * runtime/ArrayPrototype.cpp:
2086         (JSC::arrayProtoFuncToString):
2087         * runtime/ClassInfo.h:
2088         * runtime/DirectArguments.cpp:
2089         (JSC::DirectArguments::estimatedSize):
2090         * runtime/DirectArguments.h:
2091         * runtime/HashMapImpl.cpp:
2092         (JSC::HashMapImpl<HashMapBucket>::estimatedSize):
2093         * runtime/HashMapImpl.h:
2094         * runtime/JSArrayBuffer.cpp:
2095         (JSC::JSArrayBuffer::estimatedSize):
2096         * runtime/JSArrayBuffer.h:
2097         * runtime/JSBigInt.cpp:
2098         (JSC::JSBigInt::estimatedSize):
2099         * runtime/JSBigInt.h:
2100         * runtime/JSCell.cpp:
2101         (JSC::JSCell::dump const):
2102         (JSC::JSCell::estimatedSizeInBytes const):
2103         (JSC::JSCell::estimatedSize):
2104         (JSC::JSCell::className):
2105         * runtime/JSCell.h:
2106         * runtime/JSCellInlines.h:
2107         * runtime/JSGenericTypedArrayView.h:
2108         * runtime/JSGenericTypedArrayViewInlines.h:
2109         (JSC::JSGenericTypedArrayView<Adaptor>::estimatedSize):
2110         * runtime/JSObject.cpp:
2111         (JSC::JSObject::estimatedSize):
2112         (JSC::JSObject::className):
2113         (JSC::JSObject::toStringName):
2114         (JSC::JSObject::calculatedClassName):
2115         * runtime/JSObject.h:
2116         * runtime/JSProxy.cpp:
2117         (JSC::JSProxy::className):
2118         * runtime/JSProxy.h:
2119         * runtime/JSString.cpp:
2120         (JSC::JSString::estimatedSize):
2121         * runtime/JSString.h:
2122         * runtime/RegExp.cpp:
2123         (JSC::RegExp::estimatedSize):
2124         * runtime/RegExp.h:
2125         * runtime/WeakMapImpl.cpp:
2126         (JSC::WeakMapImpl<WeakMapBucket>::estimatedSize):
2127         * runtime/WeakMapImpl.h:
2128
2129 2018-07-11  Commit Queue  <commit-queue@webkit.org>
2130
2131         Unreviewed, rolling out r233714.
2132         https://bugs.webkit.org/show_bug.cgi?id=187579
2133
2134         it made tests time out (Requested by pizlo on #webkit).
2135
2136         Reverted changeset:
2137
2138         "Change the reoptimization backoff base to 1.3 from 2"
2139         https://bugs.webkit.org/show_bug.cgi?id=187540
2140         https://trac.webkit.org/changeset/233714
2141
2142 2018-07-11  Carlos Garcia Campos  <cgarcia@igalia.com>
2143
2144         [GLIB] Add API to allow creating variadic functions
2145         https://bugs.webkit.org/show_bug.cgi?id=187517
2146
2147         Reviewed by Michael Catanzaro.
2148
2149         Add a _variadic alternate method for jsc_class_add_constructor, jsc_class_add_method and
2150         jsc_value_new_function. In that case the callback always receives a GPtrArray of JSCValue.
2151
2152         * API/glib/JSCCallbackFunction.cpp:
2153         (JSC::JSCCallbackFunction::create): Make the parameters optional.
2154         (JSC::JSCCallbackFunction::JSCCallbackFunction): Ditto.
2155         (JSC::JSCCallbackFunction::call): Handle the case of parameters being nullopt by creating a GPtrArray of
2156         JSCValue for the arguments.
2157         (JSC::JSCCallbackFunction::construct): Ditto.
2158         * API/glib/JSCCallbackFunction.h:
2159         * API/glib/JSCClass.cpp:
2160         (jscClassCreateConstructor): Make the parameters optional.
2161         (jsc_class_add_constructor_variadic): Pass nullopt as parameters to jscClassCreateConstructor.
2162         (jscClassAddMethod): Make the parameters optional.
2163         (jsc_class_add_method_variadic): Pass nullopt as parameters to jscClassAddMethod.
2164         * API/glib/JSCClass.h:
2165         * API/glib/JSCValue.cpp:
2166         (jsc_value_object_define_property_accessor): Update now that parameters are optional.
2167         (jscValueFunctionCreate): Make the parameters optional.
2168         (jsc_value_new_function_variadic): Pass nullopt as parameters to jscValueFunctionCreate.
2169         * API/glib/JSCValue.h:
2170         * API/glib/docs/jsc-glib-4.0-sections.txt:
2171
2172 2018-07-11  Carlos Garcia Campos  <cgarcia@igalia.com>
2173
2174         [GLIB] Add jsc_context_get_global_object() to GLib API
2175         https://bugs.webkit.org/show_bug.cgi?id=187515
2176
2177         Reviewed by Michael Catanzaro.
2178
2179         This wasn't exposed because we have convenient methods in JSCContext to get and set properties on the global
2180         object. However, getting the global object could be useful in some cases, for example to give it a well known
2181         name like 'window' in browsers and GJS.
2182
2183         * API/glib/JSCContext.cpp:
2184         (jsc_context_get_global_object):
2185         * API/glib/JSCContext.h:
2186         * API/glib/docs/jsc-glib-4.0-sections.txt:
2187
2188 2018-07-11  Carlos Garcia Campos  <cgarcia@igalia.com>
2189
2190         [GLIB] Handle G_TYPE_STRV in glib API
2191         https://bugs.webkit.org/show_bug.cgi?id=187512
2192
2193         Reviewed by Michael Catanzaro.
2194
2195         Add jsc_value_new_array_from_strv() and handle G_TYPE_STRV types in function parameters.
2196
2197         * API/glib/JSCContext.cpp:
2198         (jscContextGValueToJSValue):
2199         (jscContextJSValueToGValue):
2200         * API/glib/JSCValue.cpp:
2201         (jsc_value_new_array_from_strv):
2202         * API/glib/JSCValue.h:
2203         * API/glib/docs/jsc-glib-4.0-sections.txt:
2204
2205 2018-07-11  Yusuke Suzuki  <utatane.tea@gmail.com>
2206
2207         Iterator of Array.keys() returns object in wrong order
2208         https://bugs.webkit.org/show_bug.cgi?id=185197
2209
2210         Reviewed by Keith Miller.
2211
2212         * builtins/ArrayIteratorPrototype.js:
2213         (globalPrivate.arrayIteratorValueNext):
2214         (globalPrivate.arrayIteratorKeyNext):
2215         (globalPrivate.arrayIteratorKeyValueNext):
2216         * builtins/AsyncFromSyncIteratorPrototype.js:
2217         * builtins/AsyncGeneratorPrototype.js:
2218         (globalPrivate.asyncGeneratorResolve):
2219         * builtins/GeneratorPrototype.js:
2220         (globalPrivate.generatorResume):
2221         * builtins/MapIteratorPrototype.js:
2222         (globalPrivate.mapIteratorNext):
2223         * builtins/SetIteratorPrototype.js:
2224         (globalPrivate.setIteratorNext):
2225         * builtins/StringIteratorPrototype.js:
2226         (next):
2227         * runtime/IteratorOperations.cpp:
2228         (JSC::createIteratorResultObjectStructure):
2229         (JSC::createIteratorResultObject):
2230
2231 2018-07-10  Mark Lam  <mark.lam@apple.com>
2232
2233         constructArray() should always allocate the requested length.
2234         https://bugs.webkit.org/show_bug.cgi?id=187543
2235         <rdar://problem/41947884>
2236
2237         Reviewed by Saam Barati.
2238
2239         Currently, it does not when we're having a bad time.  We fix this by switching
2240         back to using tryCreateUninitializedRestricted() exclusively in constructArray().
2241         If we detect that a structure transition is possible before we can initialize
2242         the butterfly, we'll go ahead and eagerly initialize the rest of the butterfly.
2243         We will introduce JSArray::eagerlyInitializeButterfly() to handle this.
2244
2245         Also enhanced the DisallowScope and ObjectInitializationScope to support this
2246         eager initialization when needed.
2247
2248         * dfg/DFGOperations.cpp:
2249         - the client of operationNewArrayWithSizeAndHint() (in FTL generated code) expects
2250           the array allocation to always succeed.  Adding this RELEASE_ASSERT here makes
2251           it clearer that we encountered an OutOfMemory condition instead of failing in FTL
2252           generated code, which will appear as a generic null pointer dereference.
2253
2254         * runtime/ArrayPrototype.cpp:
2255         (JSC::concatAppendOne):
2256         - the code here clearly wants to check for an allocation failure.  Switched to
2257           using JSArray::tryCreate() instead of JSArray::create().
2258
2259         * runtime/DisallowScope.h:
2260         (JSC::DisallowScope::disable):
2261         * runtime/JSArray.cpp:
2262         (JSC::JSArray::tryCreateUninitializedRestricted):
2263         (JSC::JSArray::eagerlyInitializeButterfly):
2264         (JSC::constructArray):
2265         * runtime/JSArray.h:
2266         * runtime/ObjectInitializationScope.cpp:
2267         (JSC::ObjectInitializationScope::notifyInitialized):
2268         * runtime/ObjectInitializationScope.h:
2269         (JSC::ObjectInitializationScope::notifyInitialized):
2270
2271 2018-07-05  Yusuke Suzuki  <utatane.tea@gmail.com>
2272
2273         [JSC] Remove getTypedArrayImpl
2274         https://bugs.webkit.org/show_bug.cgi?id=187338
2275
2276         Reviewed by Mark Lam.
2277
2278         getTypedArrayImpl is overridden only by typed arrays and DataView. Since the number of these classes
2279         are limited, we do not need to add this function to MethodTable: dispatching it in JSArrayBufferView is fine.
2280         This patch removes getTypedArrayImpl from MethodTable, and moves it to JSArrayBufferView.
2281
2282         * runtime/ClassInfo.h:
2283         * runtime/GenericTypedArrayView.h:
2284         (JSC::GenericTypedArrayView::data const): Deleted.
2285         (JSC::GenericTypedArrayView::set): Deleted.
2286         (JSC::GenericTypedArrayView::setRange): Deleted.
2287         (JSC::GenericTypedArrayView::zeroRange): Deleted.
2288         (JSC::GenericTypedArrayView::zeroFill): Deleted.
2289         (JSC::GenericTypedArrayView::length const): Deleted.
2290         (JSC::GenericTypedArrayView::item const): Deleted.
2291         (JSC::GenericTypedArrayView::set const): Deleted.
2292         (JSC::GenericTypedArrayView::setNative const): Deleted.
2293         (JSC::GenericTypedArrayView::getRange): Deleted.
2294         (JSC::GenericTypedArrayView::checkInboundData const): Deleted.
2295         (JSC::GenericTypedArrayView::internalByteLength const): Deleted.
2296         * runtime/JSArrayBufferView.cpp:
2297         (JSC::JSArrayBufferView::possiblySharedImpl):
2298         * runtime/JSArrayBufferView.h:
2299         * runtime/JSArrayBufferViewInlines.h:
2300         (JSC::JSArrayBufferView::possiblySharedImpl): Deleted.
2301         * runtime/JSCell.cpp:
2302         (JSC::JSCell::getTypedArrayImpl): Deleted.
2303         * runtime/JSCell.h:
2304         * runtime/JSDataView.cpp:
2305         (JSC::JSDataView::getTypedArrayImpl): Deleted.
2306         * runtime/JSDataView.h:
2307         * runtime/JSGenericTypedArrayView.h:
2308         * runtime/JSGenericTypedArrayViewInlines.h:
2309         (JSC::JSGenericTypedArrayView<Adaptor>::getTypedArrayImpl): Deleted.
2310
2311 2018-07-10  Keith Miller  <keith_miller@apple.com>
2312
2313         hasOwnProperty returns true for out of bounds property index on TypedArray
2314         https://bugs.webkit.org/show_bug.cgi?id=187520
2315
2316         Reviewed by Saam Barati.
2317
2318         * runtime/JSGenericTypedArrayViewInlines.h:
2319         (JSC::JSGenericTypedArrayView<Adaptor>::getOwnPropertySlot):
2320
2321 2018-07-10  Michael Saboff  <msaboff@apple.com>
2322
2323         DFG JIT: compileMathIC produces incorrect machine code
2324         https://bugs.webkit.org/show_bug.cgi?id=187537
2325
2326         Reviewed by Saam Barati.
2327
2328         Added checks for constant multipliers in JITMulGenerator::generateInline().  If we have a constant multiplier,
2329         fall back to the fast path generator which handles such cases.
2330
2331         * jit/JITMulGenerator.cpp:
2332         (JSC::JITMulGenerator::generateInline):
2333
2334 2018-07-10  Filip Pizlo  <fpizlo@apple.com>
2335
2336         Change the reoptimization backoff base to 1.3 from 2
2337         https://bugs.webkit.org/show_bug.cgi?id=187540
2338
2339         Reviewed by Saam Barati.
2340         
2341         I have data that hints at this being a speed-up on JetStream, ARES-6, and Speedometer2.
2342         
2343         I also have data that hints that a backoff base of 1 might be even better, but I think that
2344         we want to keep *some* backoff in case we find ourselves in an unmitigated recomp loop.
2345
2346         * bytecode/CodeBlock.cpp:
2347         (JSC::CodeBlock::reoptimizationRetryCounter const):
2348         (JSC::CodeBlock::countReoptimization):
2349         (JSC::CodeBlock::adjustedCounterValue):
2350         * runtime/Options.cpp:
2351         (JSC::recomputeDependentOptions):
2352         * runtime/Options.h:
2353
2354 2018-07-10  Mark Lam  <mark.lam@apple.com>
2355
2356         [32-bit JSC tests] ASSERTION FAILED: !butterfly->propertyStorage()[-I - 1].get() under JSC::ObjectInitializationScope::verifyPropertiesAreInitialized.
2357         https://bugs.webkit.org/show_bug.cgi?id=187362
2358         <rdar://problem/42027210>
2359
2360         Reviewed by Saam Barati.
2361
2362         On 32-bit targets, a 0 valued JSValue is not the empty JSValue, but it is a valid
2363         value to use for initializing unused properties.  Updated an assertion to account
2364         for this.
2365
2366         * runtime/ObjectInitializationScope.cpp:
2367         (JSC::ObjectInitializationScope::verifyPropertiesAreInitialized):
2368
2369 2018-07-10  Michael Saboff  <msaboff@apple.com>
2370
2371         YARR: . doesn't match non-BMP Unicode characters in some cases
2372         https://bugs.webkit.org/show_bug.cgi?id=187248
2373
2374         Reviewed by Geoffrey Garen.
2375
2376         The safety check in optimizeAlternative() for moving character classes that only consist of BMP
2377         characters did not take into account that the character class is inverted.  In this case, we
2378         represent '.' as "not a newline" using the newline character class with an inverted check.
2379         Clearly that includes non-BMP characters.
2380
2381         The fix is to check that the character class doesn't have non-BMP characters AND it isn't an
2382         inverted use of that character class.
2383
2384         * yarr/YarrJIT.cpp:
2385         (JSC::Yarr::YarrGenerator::optimizeAlternative):
2386
2387 2018-07-09  Mark Lam  <mark.lam@apple.com>
2388
2389         Add --traceLLIntExecution and --traceLLIntSlowPath options.
2390         https://bugs.webkit.org/show_bug.cgi?id=187479
2391
2392         Reviewed by Yusuke Suzuki and Saam Barati.
2393
2394         These options are only available if LLINT_TRACING is enabled in LLIntCommon.h.
2395
2396         The details:
2397         1. LLINT_TRACING consolidates and replaces LLINT_EXECUTION_TRACING and LLINT_SLOW_PATH_TRACING.
2398         2. Tracing is now guarded behind runtime options --traceLLIntExecution and --traceLLIntSlowPath.
2399            This makes it such that enabling LLINT_TRACING doesn't means that we'll
2400            continually spammed with logging until we rebuild.
2401         3. Fixed slow path LLINT tracing to work with exception check validation.
2402
2403         * llint/LLIntCommon.h:
2404         * llint/LLIntExceptions.cpp:
2405         (JSC::LLInt::returnToThrow):
2406         (JSC::LLInt::callToThrow):
2407         * llint/LLIntOfflineAsmConfig.h:
2408         * llint/LLIntSlowPaths.cpp:
2409         (JSC::LLInt::slowPathLog):
2410         (JSC::LLInt::slowPathLn):
2411         (JSC::LLInt::slowPathLogF):
2412         (JSC::LLInt::slowPathLogLn):
2413         (JSC::LLInt::llint_trace_operand):
2414         (JSC::LLInt::llint_trace_value):
2415         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
2416         (JSC::LLInt::traceFunctionPrologue):
2417         (JSC::LLInt::handleHostCall):
2418         (JSC::LLInt::setUpCall):
2419         * llint/LLIntSlowPaths.h:
2420         * llint/LowLevelInterpreter.asm:
2421         * runtime/CommonSlowPathsExceptions.cpp:
2422         (JSC::CommonSlowPaths::interpreterThrowInCaller):
2423         * runtime/Options.cpp:
2424         (JSC::Options::isAvailable):
2425         * runtime/Options.h:
2426
2427 2018-07-09  Yusuke Suzuki  <utatane.tea@gmail.com>
2428
2429         [JSC] Embed RegExp into constant buffer in UnlinkedCodeBlock and CodeBlock
2430         https://bugs.webkit.org/show_bug.cgi?id=187477
2431
2432         Reviewed by Mark Lam.
2433
2434         Before this patch, RegExp* is specially held in m_regexp buffer which resides in CodeBlock's RareData.
2435         However, it is not necessary since JSCells can be reside in a constant buffer.
2436         This patch embeds RegExp* to a constant buffer in UnlinkedCodeBlock and CodeBlock. And remove RegExp
2437         vector from RareData.
2438
2439         We also move the code of dumping RegExp from BytecodeDumper to RegExp::dumpToStream.
2440
2441         * bytecode/BytecodeDumper.cpp:
2442         (JSC::BytecodeDumper<Block>::dumpBytecode):
2443         (JSC::BytecodeDumper<Block>::dumpBlock):
2444         (JSC::regexpToSourceString): Deleted.
2445         (JSC::regexpName): Deleted.
2446         (JSC::BytecodeDumper<Block>::dumpRegExps): Deleted.
2447         * bytecode/BytecodeDumper.h:
2448         * bytecode/CodeBlock.h:
2449         (JSC::CodeBlock::regexp const): Deleted.
2450         (JSC::CodeBlock::numberOfRegExps const): Deleted.
2451         * bytecode/UnlinkedCodeBlock.cpp:
2452         (JSC::UnlinkedCodeBlock::visitChildren):
2453         (JSC::UnlinkedCodeBlock::shrinkToFit):
2454         * bytecode/UnlinkedCodeBlock.h:
2455         (JSC::UnlinkedCodeBlock::addRegExp): Deleted.
2456         (JSC::UnlinkedCodeBlock::numberOfRegExps const): Deleted.
2457         (JSC::UnlinkedCodeBlock::regexp const): Deleted.
2458         * bytecompiler/BytecodeGenerator.cpp:
2459         (JSC::BytecodeGenerator::emitNewRegExp):
2460         (JSC::BytecodeGenerator::addRegExp): Deleted.
2461         * bytecompiler/BytecodeGenerator.h:
2462         * dfg/DFGByteCodeParser.cpp:
2463         (JSC::DFG::ByteCodeParser::parseBlock):
2464         * jit/JITOpcodes.cpp:
2465         (JSC::JIT::emit_op_new_regexp):
2466         * llint/LLIntSlowPaths.cpp:
2467         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
2468         * runtime/JSCJSValue.cpp:
2469         (JSC::JSValue::dumpInContextAssumingStructure const):
2470         * runtime/RegExp.cpp:
2471         (JSC::regexpToSourceString):
2472         (JSC::RegExp::dumpToStream):
2473         * runtime/RegExp.h:
2474
2475 2018-07-09  Brian Burg  <bburg@apple.com>
2476
2477         REGRESSION: Web Inspector no longer pauses in internal injected scripts like WDFindNodes.js
2478         https://bugs.webkit.org/show_bug.cgi?id=187350
2479         <rdar://problem/41728249>
2480
2481         Reviewed by Matt Baker.
2482
2483         Add a new command that toggles whether or not to blackbox internal scripts.
2484         If blackboxed, the scripts will not be shown to the frontend and the debugger will
2485         not pause in source frames from blackboxed scripts. Sometimes we want to break into
2486         those scripts when debugging Web Inspector, WebDriver, or other WebKit-internal code
2487         that injects scripts.
2488
2489         * inspector/agents/InspectorDebuggerAgent.cpp:
2490         (Inspector::InspectorDebuggerAgent::setPauseForInternalScripts):
2491         (Inspector::InspectorDebuggerAgent::didParseSource):
2492         * inspector/agents/InspectorDebuggerAgent.h:
2493         * inspector/protocol/Debugger.json:
2494
2495 2018-07-09  Yusuke Suzuki  <utatane.tea@gmail.com>
2496
2497         [JSC] Make some data members of UnlinkedCodeBlock private
2498         https://bugs.webkit.org/show_bug.cgi?id=187467
2499
2500         Reviewed by Mark Lam.
2501
2502         This patch makes m_numVars, m_numCalleeLocals, and m_numParameters of UnlinkedCodeBlock private.
2503         We also remove m_numCapturedVars since it is no longer used.
2504
2505         * bytecode/CodeBlock.cpp:
2506         (JSC::CodeBlock::CodeBlock):
2507         * bytecode/CodeBlock.h:
2508         * bytecode/UnlinkedCodeBlock.cpp:
2509         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
2510         * bytecode/UnlinkedCodeBlock.h:
2511
2512 2018-07-09  Yusuke Suzuki  <utatane.tea@gmail.com>
2513
2514         [JSC] Optimize layout of AccessCase / ProxyableAccessCase to reduce size of ProxyableAccessCase
2515         https://bugs.webkit.org/show_bug.cgi?id=187465
2516
2517         Reviewed by Keith Miller.
2518
2519         ProxyableAccessCase is allocated so frequently and it is persisted so long. Reducing the size
2520         of ProxyableAccessCase can reduce the footprint of many web sites including nytimes.com.
2521
2522         This patch uses a bit complicated layout to reduce ProxyableAccessCase. We add unused bool member
2523         in AccessCase's padding, and use it in ProxyableAccessCase. By doing so, we can reduce the size
2524         of ProxyableAccessCase from 56 to 48. And it also reduces the size of GetterSetterAccessCase
2525         from 104 to 96 since it inherits ProxyableAccessCase.
2526
2527         * bytecode/AccessCase.h:
2528         (JSC::AccessCase::viaProxy const):
2529         (JSC::AccessCase::AccessCase):
2530         * bytecode/ProxyableAccessCase.cpp:
2531         (JSC::ProxyableAccessCase::ProxyableAccessCase):
2532         * bytecode/ProxyableAccessCase.h:
2533
2534 2018-07-08  Yusuke Suzuki  <utatane.tea@gmail.com>
2535
2536         Unreviewed, build fix for debug builds after r233630
2537         https://bugs.webkit.org/show_bug.cgi?id=187441
2538
2539         * jit/JIT.cpp:
2540         (JSC::JIT::frameRegisterCountFor):
2541         * llint/LLIntEntrypoint.cpp:
2542         (JSC::LLInt::frameRegisterCountFor):
2543
2544 2018-07-08  Yusuke Suzuki  <utatane.tea@gmail.com>
2545
2546         [JSC] Optimize layout of CodeBlock to reduce padding
2547         https://bugs.webkit.org/show_bug.cgi?id=187441
2548
2549         Reviewed by Mark Lam.
2550
2551         Arrange the order of members to reduce the size of CodeBlock from 552 to 544.
2552         We also make SourceCodeRepresentation 1 byte since CodeBlock has a vector of this,
2553         Vector<SourceCodeRepresentation> m_constantsSourceCodeRepresentation.
2554
2555         We also move m_numCalleeLocals and m_numVars from `public` to `private` in CodeBlock.
2556
2557         * bytecode/BytecodeDumper.cpp:
2558         (JSC::BytecodeDumper<Block>::dumpBlock):
2559         * bytecode/BytecodeUseDef.h:
2560         (JSC::computeDefsForBytecodeOffset):
2561         * bytecode/CodeBlock.cpp:
2562         (JSC::CodeBlock::CodeBlock):
2563         * bytecode/CodeBlock.h:
2564         (JSC::CodeBlock::numVars const):
2565         * bytecode/UnlinkedCodeBlock.h:
2566         (JSC::UnlinkedCodeBlock::numVars const):
2567         * dfg/DFGByteCodeParser.cpp:
2568         (JSC::DFG::ByteCodeParser::ByteCodeParser):
2569         (JSC::DFG::ByteCodeParser::flushForTerminalImpl):
2570         (JSC::DFG::ByteCodeParser::handleRecursiveTailCall):
2571         (JSC::DFG::ByteCodeParser::inlineCall):
2572         (JSC::DFG::ByteCodeParser::handleGetById):
2573         (JSC::DFG::ByteCodeParser::handlePutById):
2574         (JSC::DFG::ByteCodeParser::parseBlock):
2575         * dfg/DFGGraph.h:
2576         (JSC::DFG::Graph::forAllLocalsLiveInBytecode):
2577         * dfg/DFGOSREntrypointCreationPhase.cpp:
2578         (JSC::DFG::OSREntrypointCreationPhase::run):
2579         * dfg/DFGVariableEventStream.cpp:
2580         (JSC::DFG::VariableEventStream::reconstruct const):
2581         * ftl/FTLOSREntry.cpp:
2582         (JSC::FTL::prepareOSREntry):
2583         * ftl/FTLState.cpp:
2584         (JSC::FTL::State::State):
2585         * interpreter/Interpreter.cpp:
2586         (JSC::Interpreter::dumpRegisters):
2587         * jit/JIT.cpp:
2588         (JSC::JIT::frameRegisterCountFor):
2589         * jit/JITOpcodes.cpp:
2590         (JSC::JIT::emit_op_enter):
2591         * jit/JITOpcodes32_64.cpp:
2592         (JSC::JIT::emit_op_enter):
2593         * jit/JITOperations.cpp:
2594         * llint/LLIntEntrypoint.cpp:
2595         (JSC::LLInt::frameRegisterCountFor):
2596         * llint/LLIntSlowPaths.cpp:
2597         (JSC::LLInt::traceFunctionPrologue):
2598         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
2599         * runtime/JSCJSValue.h:
2600
2601 2018-07-08  Yusuke Suzuki  <utatane.tea@gmail.com>
2602
2603         [JSC] Optimize padding of UnlinkedCodeBlock to shrink
2604         https://bugs.webkit.org/show_bug.cgi?id=187448
2605
2606         Reviewed by Saam Barati.
2607
2608         We optimize the size of CodeType and TriState. And we arrange the layout of UnlinkedCodeBlock.
2609         These optimizations reduce the size of UnlinkedCodeBlock from 304 to 288.
2610
2611         * bytecode/CodeType.h:
2612         * bytecode/UnlinkedCodeBlock.cpp:
2613         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
2614         * bytecode/UnlinkedCodeBlock.h:
2615         (JSC::UnlinkedCodeBlock::codeType const):
2616         (JSC::UnlinkedCodeBlock::didOptimize const):
2617         (JSC::UnlinkedCodeBlock::setDidOptimize):
2618         * bytecode/VirtualRegister.h:
2619
2620 2018-07-08  Yusuke Suzuki  <utatane.tea@gmail.com>
2621
2622         [JSC] Optimize padding of InferredTypeTable by using cellLock
2623         https://bugs.webkit.org/show_bug.cgi?id=187447
2624
2625         Reviewed by Mark Lam.
2626
2627         Use cellLock() in InferredTypeTable to guard changes of internal structures.
2628         This is the same usage to SparseArrayValueMap. By using cellLock(), we can
2629         reduce the size of InferredTypeTable from 40 to 32.
2630
2631         * runtime/InferredTypeTable.cpp:
2632         (JSC::InferredTypeTable::visitChildren):
2633         (JSC::InferredTypeTable::get):
2634         (JSC::InferredTypeTable::willStoreValue):
2635         (JSC::InferredTypeTable::makeTop):
2636         * runtime/InferredTypeTable.h:
2637         Using enum class and using. And remove `isEmpty()` since it is not used.
2638
2639         * runtime/Structure.h:
2640
2641 2018-07-07  Yusuke Suzuki  <utatane.tea@gmail.com>
2642
2643         [JSC] Optimize layout of SourceProvider to reduce padding
2644         https://bugs.webkit.org/show_bug.cgi?id=187440
2645
2646         Reviewed by Mark Lam.
2647
2648         Arrange members of SourceProvider to reduce the size from 80 to 72.
2649
2650         * parser/SourceProvider.cpp:
2651         (JSC::SourceProvider::SourceProvider):
2652         * parser/SourceProvider.h:
2653
2654 2018-07-08  Mark Lam  <mark.lam@apple.com>
2655
2656         PropertyTable::skipDeletedEntries() should guard against iterating past the table end.
2657         https://bugs.webkit.org/show_bug.cgi?id=187444
2658         <rdar://problem/41282849>
2659
2660         Reviewed by Saam Barati.
2661
2662         PropertyTable supports C++ iteration by offering begin() and end() methods, and
2663         an iterator class.  The begin() methods and the iterator operator++() method uses
2664         PropertyTable::skipDeletedEntries() to skip over deleted entries in the table.
2665         However, PropertyTable::skipDeletedEntries() does not prevent the iteration
2666         pointer from being incremented past the end of the table.  As a result, we can
2667         iterate past the end of the table.  Note that the C++ iteration protocol tests
2668         for the iterator not being equal to the end() value.  It does not do a <= test.
2669         If the iterator ever shoots past end, the loop will effectively not terminate.
2670
2671         This issue can manifest if and only if the last entry in the table is a deleted
2672         one, and the key field of the PropertyMapEntry shaped space at the end of the
2673         table (the one beyond the last) contains a 1 (i.e. PROPERTY_MAP_DELETED_ENTRY_KEY)
2674         value.
2675
2676         No test because manifesting this issue requires uncontrollable happenstance where
2677         memory just beyond the end of the table looks like a deleted entry.
2678
2679         * runtime/PropertyMapHashTable.h:
2680         (JSC::PropertyTable::begin):
2681         (JSC::PropertyTable::end):
2682         (JSC::PropertyTable::begin const):
2683         (JSC::PropertyTable::end const):
2684         (JSC::PropertyTable::skipDeletedEntries):
2685
2686 2018-07-07  Yusuke Suzuki  <utatane.tea@gmail.com>
2687
2688         [JSC] Optimize layout of SymbolTable to reduce padding
2689         https://bugs.webkit.org/show_bug.cgi?id=187437
2690
2691         Reviewed by Mark Lam.
2692
2693         Arrange the layout of SymbolTable to reduce the size from 88 to 72.
2694
2695         * runtime/SymbolTable.h:
2696
2697 2018-07-07  Yusuke Suzuki  <utatane.tea@gmail.com>
2698
2699         [JSC] Optimize layout of RegExp to reduce padding
2700         https://bugs.webkit.org/show_bug.cgi?id=187438
2701
2702         Reviewed by Mark Lam.
2703
2704         Reduce the size of RegExp from 168 to 144.
2705
2706         * runtime/RegExp.cpp:
2707         (JSC::RegExp::RegExp):
2708         * runtime/RegExp.h:
2709         * runtime/RegExpKey.h:
2710         * yarr/YarrErrorCode.h:
2711
2712 2018-07-07  Yusuke Suzuki  <utatane.tea@gmail.com>
2713
2714         [JSC] Optimize layout of ValueProfile to reduce padding
2715         https://bugs.webkit.org/show_bug.cgi?id=187439
2716
2717         Reviewed by Mark Lam.
2718
2719         Reduce the size of ValueProfile from 40 to 32 by reordering members.
2720
2721         * bytecode/ValueProfile.h:
2722         (JSC::ValueProfileBase::ValueProfileBase):
2723
2724 2018-07-05  Saam Barati  <sbarati@apple.com>
2725
2726         ProgramExecutable may be collected as we checkSyntax on it
2727         https://bugs.webkit.org/show_bug.cgi?id=187359
2728         <rdar://problem/41832135>
2729
2730         Reviewed by Mark Lam.
2731
2732         The bug was we were passing in a reference to the SourceCode field on ProgramExecutable as
2733         the ProgramExecutable itself may be collected. The fix here is to make a copy
2734         of the field instead of passing in a reference inside of ParserError::toErrorObject.
2735         
2736         No new tests here as this was already caught by our iOS JSC testers.
2737
2738         * parser/ParserError.h:
2739         (JSC::ParserError::toErrorObject):
2740
2741 2018-07-04  Tim Horton  <timothy_horton@apple.com>
2742
2743         Introduce PLATFORM(IOSMAC)
2744         https://bugs.webkit.org/show_bug.cgi?id=187315
2745
2746         Reviewed by Dan Bernstein.
2747
2748         * Configurations/Base.xcconfig:
2749         * Configurations/FeatureDefines.xcconfig:
2750
2751 2018-07-03  Mark Lam  <mark.lam@apple.com>
2752
2753         [32-bit JSC tests] ASSERTION FAILED: !getDirect(offset) || !JSValue::encode(getDirect(offset)).
2754         https://bugs.webkit.org/show_bug.cgi?id=187255
2755         <rdar://problem/41785257>
2756
2757         Reviewed by Saam Barati.
2758
2759         The 32-bit JIT::emit_op_create_this() needs to initialize uninitialized properties
2760         too: basically, do what the 64-bit code is doing.  At present, this change only
2761         serves to pacify an assertion.  It is not needed for correctness because the
2762         concurrent GC is not used on 32-bit builds.
2763
2764         This issue is already covered by the slowMicrobenchmarks/rest-parameter-allocation-elimination.js
2765         test.
2766
2767         * jit/JITOpcodes32_64.cpp:
2768         (JSC::JIT::emit_op_create_this):
2769
2770 2018-07-03  Yusuke Suzuki  <utatane.tea@gmail.com>
2771
2772         [JSC] Move slowDownAndWasteMemory function to JSArrayBufferView
2773         https://bugs.webkit.org/show_bug.cgi?id=187290
2774
2775         Reviewed by Saam Barati.
2776
2777         slowDownAndWasteMemory is just overridden by typed arrays. Since they are limited,
2778         we do not need to add this function to MethodTable: just dispatching it in JSArrayBufferView
2779         is fine. And slowDownAndWasteMemory only requires the sizeof(element), which can be
2780         easily calculated from JSType.
2781         This patch removes slowDownAndWasteMemory from MethodTable, and moves it to JSArrayBufferView.
2782
2783         * runtime/ClassInfo.h:
2784         * runtime/JSArrayBufferView.cpp:
2785         (JSC::elementSize):
2786         (JSC::JSArrayBufferView::slowDownAndWasteMemory):
2787         * runtime/JSArrayBufferView.h:
2788         * runtime/JSArrayBufferViewInlines.h:
2789         (JSC::JSArrayBufferView::possiblySharedBuffer):
2790         * runtime/JSCell.cpp:
2791         (JSC::JSCell::slowDownAndWasteMemory): Deleted.
2792         * runtime/JSCell.h:
2793         * runtime/JSDataView.cpp:
2794         (JSC::JSDataView::slowDownAndWasteMemory): Deleted.
2795         * runtime/JSDataView.h:
2796         * runtime/JSGenericTypedArrayView.h:
2797         * runtime/JSGenericTypedArrayViewInlines.h:
2798         (JSC::JSGenericTypedArrayView<Adaptor>::slowDownAndWasteMemory): Deleted.
2799
2800 2018-07-02  Sukolsak Sakshuwong  <sukolsak@gmail.com>
2801
2802         Regular expressions with ".?" expressions at the start and the end match the entire string
2803         https://bugs.webkit.org/show_bug.cgi?id=119191
2804
2805         Reviewed by Michael Saboff.
2806
2807         r90962 optimized regular expressions in the form of /.*abc.*/ by looking
2808         for "abc" first and then processing the leading and trailing dot stars
2809         to find the beginning and the end of the match. However, it erroneously
2810         enabled this optimization for regular expressions whose leading or
2811         trailing dots had quantifiers that were not of arbitrary length, e.g.,
2812         /.?abc.*/, /.*abc.?/, /.{0,4}abc.*/, etc. This caused the expression to
2813         match the entire string when it shouldn't. This patch disables the
2814         optimization for those cases.
2815
2816         * yarr/YarrPattern.cpp:
2817         (JSC::Yarr::YarrPatternConstructor::optimizeDotStarWrappedExpressions):
2818
2819 2018-07-02  Sukolsak Sakshuwong  <sukolsak@gmail.com>
2820
2821         RegExp.exec returns wrong value with a long integer quantifier
2822         https://bugs.webkit.org/show_bug.cgi?id=187042
2823
2824         Reviewed by Saam Barati.
2825
2826         Prior to this patch, the Yarr parser checked for integer overflow when
2827         parsing quantifiers in regular expressions by adding one digit at a time
2828         to a number and checking if the result got larger. This is wrong;
2829         The parser would fail to detect overflow when parsing, for example,
2830         10,000,000,003 because (1000000000*10 + 3) % (2^32) = 1410065411 > 1000000000.
2831
2832         Another issue was that once it detected overflow, it stopped consuming
2833         the remaining digits. Since it didn't find the closing bracket, it
2834         parsed the quantifier as a normal string instead.
2835
2836         This patch fixes these issues by reading all the digits and checking for
2837         overflow with Checked<unsigned, RecordOverflow>. If it overflows, it
2838         returns the largest possible value (quantifyInfinite in this case). This
2839         matches Chrome [1], Firefox [2], and Edge [3].
2840
2841         [1] https://chromium.googlesource.com/v8/v8.git/+/23222f0a88599dcf302ccf395883944620b70fd5/src/regexp/regexp-parser.cc#1042
2842         [2] https://dxr.mozilla.org/mozilla-central/rev/aea3f3457f1531706923b8d4c595a1f271de83da/js/src/irregexp/RegExpParser.cpp#1310
2843         [3] https://github.com/Microsoft/ChakraCore/blob/fc08987381da141bb686b5d0c71d75da96f9eb8a/lib/Parser/RegexParser.cpp#L1149
2844
2845         * yarr/YarrParser.h:
2846         (JSC::Yarr::Parser::consumeNumber):
2847
2848 2018-07-02  Keith Miller  <keith_miller@apple.com>
2849
2850         InstanceOf IC should do generic if the prototype is not an object.
2851         https://bugs.webkit.org/show_bug.cgi?id=187250
2852
2853         Reviewed by Mark Lam.
2854
2855         The old code was wrong for two reasons. First, the AccessCase expected that
2856         the prototype value would be non-null. Second, we would end up returning
2857         false instead of throwing an exception.
2858
2859         * jit/Repatch.cpp:
2860         (JSC::tryCacheInstanceOf):
2861
2862 2018-07-01  Mark Lam  <mark.lam@apple.com>
2863
2864         Builtins and host functions should get their own structures.
2865         https://bugs.webkit.org/show_bug.cgi?id=187211
2866         <rdar://problem/41646336>
2867
2868         Reviewed by Saam Barati.
2869
2870         JSFunctions do lazy reification of properties, but ordinary functions applies
2871         different rules of property reification than builtin and host functions.  Hence,
2872         we should give builtins and host functions their own structures.
2873
2874         * runtime/JSFunction.cpp:
2875         (JSC::JSFunction::selectStructureForNewFuncExp):
2876         (JSC::JSFunction::create):
2877         (JSC::JSFunction::getOwnPropertySlot):
2878         * runtime/JSGlobalObject.cpp:
2879         (JSC::JSGlobalObject::init):
2880         (JSC::JSGlobalObject::visitChildren):
2881         * runtime/JSGlobalObject.h:
2882         (JSC::JSGlobalObject::hostFunctionStructure const):
2883         (JSC::JSGlobalObject::arrowFunctionStructure const):
2884         (JSC::JSGlobalObject::sloppyFunctionStructure const):
2885         (JSC::JSGlobalObject::strictFunctionStructure const):
2886
2887 2018-07-01  David Kilzer  <ddkilzer@apple.com>
2888
2889         JavaScriptCore: Fix clang static analyzer warnings: Assigned value is garbage or undefined
2890         <https://webkit.org/b/187233>
2891
2892         Reviewed by Mark Lam.
2893
2894         * b3/air/AirEliminateDeadCode.cpp:
2895         (JSC::B3::Air::eliminateDeadCode): Initialize `changed`.
2896         * parser/ParserTokens.h:
2897         (JSC::JSTextPosition::JSTextPosition): Add struct member
2898         initialization. Simplify default constructor.
2899         (JSC::JSTokenLocation::JSTokenData): Move largest struct in the
2900         union to the beginning to make it easy to zero out all fields.
2901         (JSC::JSTokenLocation::JSTokenLocation): Add struct member
2902         initialization.  Simplify default constructor.  Note that
2903         `endOffset` was not being initialized previously.
2904         (JSC::JSTextPosition::JSToken): Add struct member initialization
2905         where necessary.
2906         * runtime/IntlObject.cpp:
2907         (JSC::MatcherResult): Add struct member initialization.
2908
2909 2018-06-23  Darin Adler  <darin@apple.com>
2910
2911         [Cocoa] Improve ARC compatibility of more code in JavaScriptCore
2912         https://bugs.webkit.org/show_bug.cgi?id=186973
2913
2914         Reviewed by Dan Bernstein.
2915
2916         * API/JSContext.mm:
2917         (WeakContextRef::WeakContextRef): Deleted.
2918         (WeakContextRef::~WeakContextRef): Deleted.
2919         (WeakContextRef::get): Deleted.
2920         (WeakContextRef::set): Deleted.
2921
2922         * API/JSContextInternal.h: Removed unneeded header guards since this is
2923         an Objective-C++ header. Removed unused WeakContextRef class. Removed declaration
2924         of method -[JSContext initWithGlobalContextRef:] and JSContext property wrapperMap
2925         since neither is used outside the class implementation.
2926
2927         * API/JSManagedValue.mm:
2928         (-[JSManagedValue initWithValue:]): Use a bridging cast.
2929         (-[JSManagedValue dealloc]): Ditto.
2930         (-[JSManagedValue didAddOwner:]): Ditto.
2931         (-[JSManagedValue didRemoveOwner:]): Ditto.
2932         (JSManagedValueHandleOwner::isReachableFromOpaqueRoots): Ditto.
2933         (JSManagedValueHandleOwner::finalize): Ditto.
2934         * API/JSValue.mm:
2935         (+[JSValue valueWithNewRegularExpressionFromPattern:flags:inContext:]): Ditto.
2936         (+[JSValue valueWithNewErrorFromMessage:inContext:]): Ditto.
2937         (-[JSValue valueForProperty:]): Ditto.
2938         (-[JSValue setValue:forProperty:]): Ditto.
2939         (-[JSValue deleteProperty:]): Ditto.
2940         (-[JSValue hasProperty:]): Ditto.
2941         (-[JSValue invokeMethod:withArguments:]): Ditto.
2942         (valueToObjectWithoutCopy): Ditto. Also removed unneeded explicit type names.
2943         (valueToArray): Ditto.
2944         (valueToDictionary): Ditto.
2945         (objectToValueWithoutCopy): Ditto.
2946         (objectToValue): Ditto.
2947         * API/JSVirtualMachine.mm:
2948         (+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]): Ditto.
2949         (+[JSVMWrapperCache wrapperForJSContextGroupRef:]): Ditto.
2950         (-[JSVirtualMachine isOldExternalObject:]): Ditto.
2951         (-[JSVirtualMachine addManagedReference:withOwner:]): Ditto.
2952         (-[JSVirtualMachine removeManagedReference:withOwner:]): Ditto.
2953         (-[JSVirtualMachine contextForGlobalContextRef:]): Ditto.
2954         (-[JSVirtualMachine addContext:forGlobalContextRef:]): Ditto.
2955         (scanExternalObjectGraph): Ditto.
2956         (scanExternalRememberedSet): Ditto.
2957         * API/JSWrapperMap.mm:
2958         (makeWrapper): Ditto.
2959         (-[JSObjCClassInfo wrapperForObject:inContext:]): Ditto.
2960         (-[JSWrapperMap objcWrapperForJSValueRef:inContext:]): Ditto.
2961         (tryUnwrapObjcObject): Ditto.
2962         * API/ObjCCallbackFunction.mm:
2963         (blockSignatureContainsClass): Ditto.
2964         (objCCallbackFunctionForMethod): Switched from retain to CFRetain, but not
2965         sure we will be keeping this the same way under ARC.
2966         (objCCallbackFunctionForBlock): Use a bridging cast.
2967
2968         * API/ObjcRuntimeExtras.h:
2969         (protocolImplementsProtocol): Use a more specific type that includes the
2970         explicit __unsafe_unretained for copied protocol lists.
2971         (forEachProtocolImplementingProtocol): Ditto.
2972
2973         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
2974         (Inspector::convertNSNullToNil): Added to replace the CONVERT_NSNULL_TO_NIL macro.
2975         (Inspector::RemoteInspector::receivedSetupMessage): Use convertNSNullToNil.
2976
2977         * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm: Moved the
2978         CFXPCBridge SPI to a header named CFXPCBridgeSPI.h.
2979         (auditTokenHasEntitlement): Deleted. Moved to Entitlements.h/cpp in WTF.
2980         (Inspector::RemoteInspectorXPCConnection::handleEvent): Use WTF::hasEntitlement.
2981         (Inspector::RemoteInspectorXPCConnection::sendMessage): Use a bridging cast.
2982
2983 2018-06-30  Adam Barth  <abarth@webkit.org>
2984
2985         Port JavaScriptCore to OS(FUCHSIA)
2986         https://bugs.webkit.org/show_bug.cgi?id=187223
2987
2988         Reviewed by Daniel Bates.
2989
2990         * assembler/ARM64Assembler.h:
2991         (JSC::ARM64Assembler::cacheFlush): Call zx_cache_flush to flush cache.
2992         * runtime/MachineContext.h: Fuchsia has the same mcontext_t as glibc.
2993         (JSC::MachineContext::stackPointerImpl):
2994         (JSC::MachineContext::framePointerImpl):
2995         (JSC::MachineContext::instructionPointerImpl):
2996         (JSC::MachineContext::argumentPointer<1>):
2997         (JSC::MachineContext::llintInstructionPointer):
2998
2999 2018-06-30  David Kilzer  <ddkilzer@apple.com>
3000
3001         Fix clang static analyzer warnings: Garbage return value
3002         <https://webkit.org/b/187224>
3003
3004         Reviewed by Eric Carlson.
3005
3006         * bytecode/UnlinkedCodeBlock.cpp:
3007         (JSC::UnlinkedCodeBlock::lineNumberForBytecodeOffset):
3008         - Use brace initialization for local variables.
3009         * debugger/DebuggerCallFrame.cpp:
3010         (class JSC::LineAndColumnFunctor):
3011         - Use class member initialization for member variables.
3012
3013 2018-06-29  Saam Barati  <sbarati@apple.com>
3014
3015         Unreviewed. Try to fix Windows build after r233377
3016
3017         * builtins/BuiltinExecutables.cpp:
3018         (JSC::BuiltinExecutables::createExecutable):
3019
3020 2018-06-29  Saam Barati  <sbarati@apple.com>
3021
3022         Don't use tracePoints in JS/Wasm entry
3023         https://bugs.webkit.org/show_bug.cgi?id=187196
3024
3025         Reviewed by Mark Lam.
3026
3027         This puts VM entry and Wasm entry tracePoints behind a runtime
3028         option. This is a ~4x speedup on a soon to be released Wasm
3029         benchmark. tracePoints should basically never run more than 50
3030         times a second. Entering the VM and entering Wasm are user controlled,
3031         and can happen hundreds of thousands of times in a second. Depending
3032         on how the Wasm/JS code is structured, this can be disastrous for
3033         performance.
3034
3035         * runtime/Options.h:
3036         * runtime/VMEntryScope.cpp:
3037         (JSC::VMEntryScope::VMEntryScope):
3038         (JSC::VMEntryScope::~VMEntryScope):
3039         * wasm/WasmBBQPlan.cpp:
3040         (JSC::Wasm::BBQPlan::compileFunctions):
3041         * wasm/js/WebAssemblyFunction.cpp:
3042         (JSC::callWebAssemblyFunction):
3043
3044 2018-06-29  Saam Barati  <sbarati@apple.com>
3045
3046         We shouldn't recurse into the parser when gathering metadata about various function offsets
3047         https://bugs.webkit.org/show_bug.cgi?id=184074
3048         <rdar://problem/37165897>
3049
3050         Reviewed by Mark Lam.
3051
3052         Prior to this patch, when we made a builtin, we had to make an UnlinkedFunctionExecutable
3053         for that builtin. This required calling into the parser. However, the parser
3054         may throw a stack overflow. We were not able to recover from that. The only
3055         reason we called into the parser here is that we were gathering text offsets
3056         and various metadata for things in the builtin function. This patch writes a
3057         mini parser that figures this information out without calling into the full
3058         parser. (I've also added a debug assert that verifies the mini parser stays in
3059         sync with the full parser.) The result of this is that BuiltinExecutbles::createExecutable
3060         always succeeds.
3061
3062         * builtins/AsyncFromSyncIteratorPrototype.js:
3063         (globalPrivate.createAsyncFromSyncIterator):
3064         (globalPrivate.AsyncFromSyncIteratorConstructor):
3065         * builtins/BuiltinExecutables.cpp:
3066         (JSC::BuiltinExecutables::createExecutable):
3067         * builtins/GlobalOperations.js:
3068         (globalPrivate.getter.overriddenName.string_appeared_here.speciesGetter):
3069         (globalPrivate.speciesConstructor):
3070         (globalPrivate.copyDataProperties):
3071         (globalPrivate.copyDataPropertiesNoExclusions):
3072         * builtins/PromiseOperations.js:
3073         (globalPrivate.newHandledRejectedPromise):
3074         * builtins/RegExpPrototype.js:
3075         (globalPrivate.hasObservableSideEffectsForRegExpMatch):
3076         (globalPrivate.hasObservableSideEffectsForRegExpSplit):
3077         * builtins/StringPrototype.js:
3078         (globalPrivate.hasObservableSideEffectsForStringReplace):
3079         (globalPrivate.getDefaultCollator):
3080         * parser/Nodes.cpp:
3081         (JSC::FunctionMetadataNode::FunctionMetadataNode):
3082         (JSC::FunctionMetadataNode::operator== const):
3083         (JSC::FunctionMetadataNode::dump const):
3084         * parser/Nodes.h:
3085         * parser/Parser.h:
3086         (JSC::parse):
3087         * parser/ParserError.h:
3088         (JSC::ParserError::type const):
3089         * parser/ParserTokens.h:
3090         (JSC::JSTextPosition::operator== const):
3091         (JSC::JSTextPosition::operator!= const):
3092         * parser/SourceCode.h:
3093         (JSC::SourceCode::operator== const):
3094         (JSC::SourceCode::operator!= const):
3095         (JSC::SourceCode::subExpression const):
3096         (JSC::SourceCode::subExpression): Deleted.
3097
3098 2018-06-28  Michael Saboff  <msaboff@apple.com>
3099   
3100         IsoCellSet::sweepToFreeList() not safe when Full GC in process
3101         https://bugs.webkit.org/show_bug.cgi?id=187157
3102
3103         Reviewed by Mark Lam.
3104
3105         * heap/IsoCellSet.cpp:
3106         (JSC::IsoCellSet::sweepToFreeList): Changed the "stale marks logic" to match what
3107         is in MarkedBlock::Handle::specializedSweep where it takes into account whether
3108         or not we are in the process of marking during a full GC.
3109         * heap/MarkedBlock.h:
3110         * heap/MarkedBlockInlines.h:
3111         (JSC::MarkedBlock::Handle::areMarksStaleForSweep): New helper.
3112
3113 2018-06-27  Saam Barati  <sbarati@apple.com>
3114
3115         Add some more register state information when we crash in repatchPutById
3116         https://bugs.webkit.org/show_bug.cgi?id=187112
3117
3118         Reviewed by Mark Lam.
3119
3120         This will help us gather info when we end up seeing a ObjectPropertyConditionSet
3121         with an offset that is different than what the put tells us.
3122
3123         * jit/Repatch.cpp:
3124         (JSC::tryCachePutByID):
3125
3126 2018-06-27  Mark Lam  <mark.lam@apple.com>
3127
3128         Fix a bug in $vm.callFrame() and apply previously requested renaming of $vm.println to print.
3129         https://bugs.webkit.org/show_bug.cgi?id=187119
3130
3131         Reviewed by Keith Miller.
3132
3133         $vm.callFrame()'s JSDollarVMCallFrame::finishCreation()
3134         should be checking for codeBlock instead of !codeBlock
3135         before using the codeBlock.
3136
3137         I also renamed some other "print" functions to use "dump" instead
3138         to match their underlying C++ code that they will call e.g.
3139         CodeBlock::dumpSource().
3140
3141         * tools/JSDollarVM.cpp:
3142         (WTF::JSDollarVMCallFrame::finishCreation):
3143         (JSC::functionDumpSourceFor):
3144         (JSC::functionDumpBytecodeFor):
3145         (JSC::doPrint):
3146         (JSC::functionDataLog):
3147         (JSC::functionPrint):
3148         (JSC::functionDumpCallFrame):
3149         (JSC::functionDumpStack):
3150         (JSC::JSDollarVM::finishCreation):
3151         (JSC::functionPrintSourceFor): Deleted.
3152         (JSC::functionPrintBytecodeFor): Deleted.
3153         (JSC::doPrintln): Deleted.
3154         (JSC::functionPrintln): Deleted.
3155         (JSC::functionPrintCallFrame): Deleted.
3156         (JSC::functionPrintStack): Deleted.
3157         * tools/VMInspector.cpp:
3158         (JSC::DumpFrameFunctor::DumpFrameFunctor):
3159         (JSC::DumpFrameFunctor::operator() const):
3160         (JSC::VMInspector::dumpCallFrame):
3161         (JSC::VMInspector::dumpStack):
3162         (JSC::VMInspector::dumpValue):
3163         (JSC::PrintFrameFunctor::PrintFrameFunctor): Deleted.
3164         (JSC::PrintFrameFunctor::operator() const): Deleted.
3165         (JSC::VMInspector::printCallFrame): Deleted.
3166         (JSC::VMInspector::printStack): Deleted.
3167         (JSC::VMInspector::printValue): Deleted.
3168         * tools/VMInspector.h:
3169
3170 2018-06-27  Keith Miller  <keith_miller@apple.com>
3171
3172         Add logging to try to diagnose where we get a null structure.
3173         https://bugs.webkit.org/show_bug.cgi?id=187106
3174
3175         Reviewed by Mark Lam.
3176
3177         Add a logging to JSObject::toPrimitive to help diagnose a nullptr
3178         structure crash.
3179
3180         This code should be removed when we fix <rdar://problem/33451840>
3181
3182         * runtime/JSObject.cpp:
3183         (JSC::callToPrimitiveFunction):
3184         * runtime/JSObject.h:
3185         (JSC::JSObject::getPropertySlot):
3186
3187 2018-06-27  Mark Lam  <mark.lam@apple.com>
3188
3189         DFG's compileReallocatePropertyStorage() and compileAllocatePropertyStorage() slow paths should also clear unused properties.
3190         https://bugs.webkit.org/show_bug.cgi?id=187091
3191         <rdar://problem/41395624>
3192
3193         Reviewed by Yusuke Suzuki.
3194
3195         Previously, when compileReallocatePropertyStorage() and compileAllocatePropertyStorage()
3196         take their slow paths, the slow path would jump back to the fast path right after
3197         the emitted code which clears the unused property values.  As a result, the
3198         unused properties are not initialized.  We've fixed this by adding the slow path
3199         generators before we emit the code to clear the unused properties.
3200
3201         * dfg/DFGSpeculativeJIT.cpp:
3202         (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage):
3203         (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage):
3204
3205 2018-06-27  Yusuke Suzuki  <utatane.tea@gmail.com>
3206
3207         [JSC] ArrayPatternNode::emitDirectBinding does not return assignment target value if dst is nullptr
3208         https://bugs.webkit.org/show_bug.cgi?id=185943
3209
3210         Reviewed by Mark Lam.
3211
3212         ArrayPatternNode::emitDirectBinding should return a register with an assignment target instead of filling
3213         the result with undefined if `dst` is nullptr. While `dst == ignoredResult()` means we do not require
3214         the result, `dst == nullptr` just means "dst is required, but a register for dst is not allocated.".
3215         This patch fixes emitDirectBinding to return an appropriate value with an allocated register for dst.
3216
3217         ArrayPatternNode::emitDirectBinding() should be removed later since it does not follow array spreading protocol,
3218         but it should be done in a separate patch since it would be performance sensitive.
3219
3220         * bytecompiler/NodesCodegen.cpp:
3221         (JSC::ArrayPatternNode::emitDirectBinding):
3222
3223 2018-06-26  Yusuke Suzuki  <utatane.tea@gmail.com>
3224
3225         [JSC] Pass VM& to functions more
3226         https://bugs.webkit.org/show_bug.cgi?id=186241
3227
3228         Reviewed by Mark Lam.
3229
3230         This patch threads VM& to functions requiring VM& more.
3231
3232         * API/JSObjectRef.cpp:
3233         (JSObjectIsConstructor):
3234         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp:
3235         (JSC::AdaptiveInferredPropertyValueWatchpointBase::install):
3236         (JSC::AdaptiveInferredPropertyValueWatchpointBase::fire):
3237         (JSC::AdaptiveInferredPropertyValueWatchpointBase::StructureWatchpoint::fireInternal):
3238         (JSC::AdaptiveInferredPropertyValueWatchpointBase::PropertyWatchpoint::fireInternal):
3239         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.h:
3240         * bytecode/CodeBlockJettisoningWatchpoint.cpp:
3241         (JSC::CodeBlockJettisoningWatchpoint::fireInternal):
3242         * bytecode/CodeBlockJettisoningWatchpoint.h:
3243         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp:
3244         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::install):
3245         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal):
3246         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h:
3247         * bytecode/StructureStubClearingWatchpoint.cpp:
3248         (JSC::StructureStubClearingWatchpoint::fireInternal):
3249         * bytecode/StructureStubClearingWatchpoint.h:
3250         * bytecode/Watchpoint.cpp:
3251         (JSC::Watchpoint::fire):
3252         (JSC::WatchpointSet::fireAllWatchpoints):
3253         * bytecode/Watchpoint.h:
3254         * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp:
3255         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::handleFire):
3256         * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.h:
3257         * dfg/DFGAdaptiveStructureWatchpoint.cpp:
3258         (JSC::DFG::AdaptiveStructureWatchpoint::install):
3259         (JSC::DFG::AdaptiveStructureWatchpoint::fireInternal):
3260         * dfg/DFGAdaptiveStructureWatchpoint.h:
3261         * dfg/DFGDesiredWatchpoints.cpp:
3262         (JSC::DFG::AdaptiveStructureWatchpointAdaptor::add):
3263         * llint/LLIntSlowPaths.cpp:
3264         (JSC::LLInt::setupGetByIdPrototypeCache):
3265         * runtime/ArrayPrototype.cpp:
3266         (JSC::ArrayPrototype::tryInitializeSpeciesWatchpoint):
3267         (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::handleFire):
3268         * runtime/ECMAScriptSpecInternalFunctions.cpp:
3269         (JSC::esSpecIsConstructor):
3270         * runtime/FunctionRareData.cpp:
3271         (JSC::FunctionRareData::AllocationProfileClearingWatchpoint::fireInternal):
3272         * runtime/FunctionRareData.h:
3273         * runtime/InferredStructureWatchpoint.cpp:
3274         (JSC::InferredStructureWatchpoint::fireInternal):
3275         * runtime/InferredStructureWatchpoint.h:
3276         * runtime/InternalFunction.cpp:
3277         (JSC::InternalFunction::createSubclassStructureSlow):
3278         * runtime/InternalFunction.h:
3279         (JSC::InternalFunction::createSubclassStructure):
3280         * runtime/JSCJSValue.h:
3281         * runtime/JSCJSValueInlines.h:
3282         (JSC::JSValue::isConstructor const):
3283         * runtime/JSCell.h:
3284         * runtime/JSCellInlines.h:
3285         (JSC::JSCell::isConstructor):
3286         (JSC::JSCell::methodTable const):
3287         * runtime/JSGlobalObject.cpp:
3288         (JSC::JSGlobalObject::init):
3289         * runtime/ObjectPropertyChangeAdaptiveWatchpoint.h:
3290         (JSC::ObjectPropertyChangeAdaptiveWatchpoint::ObjectPropertyChangeAdaptiveWatchpoint):
3291         * runtime/ProxyObject.cpp:
3292         (JSC::ProxyObject::finishCreation):
3293         * runtime/ReflectObject.cpp:
3294         (JSC::reflectObjectConstruct):
3295         * runtime/StructureRareData.cpp:
3296         (JSC::StructureRareData::setObjectToStringValue):
3297         (JSC::ObjectToStringAdaptiveStructureWatchpoint::install):
3298         (JSC::ObjectToStringAdaptiveStructureWatchpoint::fireInternal):
3299         (JSC::ObjectToStringAdaptiveInferredPropertyValueWatchpoint::handleFire):
3300
3301 2018-06-26  Mark Lam  <mark.lam@apple.com>
3302
3303         eval() is wrong about the LiteralParser never throwing any exceptions.
3304         https://bugs.webkit.org/show_bug.cgi?id=187074
3305         <rdar://problem/41461099>
3306
3307         Reviewed by Saam Barati.
3308
3309         Added the missing exception check, and removed an erroneous assertion.
3310
3311         * interpreter/Interpreter.cpp:
3312         (JSC::eval):
3313
3314 2018-06-26  Saam Barati  <sbarati@apple.com>
3315
3316         JSImmutableButterfly can't be allocated from a subspace with HeapCell::Kind::Auxiliary
3317         https://bugs.webkit.org/show_bug.cgi?id=186878
3318         <rdar://problem/40568659>
3319
3320         Reviewed by Filip Pizlo.
3321
3322         This patch fixes a bug in our JSImmutableButterfly implementation uncovered by
3323         our stress GC bots. Before this patch, JSImmutableButterfly was allocated
3324         with HeapCell::Kind::Auxiliary. This is wrong. Things that are JSCells can't
3325         be allocated from HeapCell::Kind::Auxiliary. This patch adds a new HeapCell::Kind
3326         called JSCellWithInteriorPointers. It behaves like JSCell in all ways, except
3327         conservative scan knows to treat it like a butterfly in when we we may be
3328         pointing into the middle of it.
3329         
3330         The way we were crashing on the stress GC bots is that our conservative marking
3331         won't do cell visiting for things that are Auxiliary. This meant that if the
3332         stack were the only thing pointing to a JSImmutableButterfly when a GC took place,
3333         that JSImm