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