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