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