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