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