ParserError can be shrunk by 8 bytes
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2019-03-17  Robin Morisset  <rmorisset@apple.com>
2
3         ParserError can be shrunk by 8 bytes
4         https://bugs.webkit.org/show_bug.cgi?id=195496
5
6         Reviewed by Mark Lam.
7
8         * parser/ParserError.h:
9
10 2019-03-17  Diego Pino Garcia  <dpino@igalia.com>
11
12         Fix WPE and GTK Debug builds after r243049
13         https://bugs.webkit.org/show_bug.cgi?id=195860
14
15         Unreviewed, build fix after r243049.
16
17         * runtime/StringPrototype.cpp:
18         (JSC::normalizationAffects8Bit):
19
20 2019-03-17  Yusuke Suzuki  <ysuzuki@apple.com>
21
22         REGRESSION: !vm.isInitializingObject() void* JSC::tryAllocateCellHelper<JSC::Structure> JSC::Structure::create
23         https://bugs.webkit.org/show_bug.cgi?id=195858
24
25         Reviewed by Mark Lam.
26
27         r243011 changed WebAssembly related structures lazily-allocated. It means that this lazy allocation must not be done in the middle of
28         the other object allocations. This patch changes the signature of wasm related objects' ::create functions to taking Structure*.
29         This prevents us from materializing lazily-allocated structures while allocating wasm related objects, and this style is used in the
30         other places to fix the same problem. This bug is caught by existing debug tests for wasm.
31
32         * runtime/JSGlobalObject.h:
33         * wasm/js/JSWebAssemblyCompileError.cpp:
34         (JSC::createJSWebAssemblyCompileError):
35         * wasm/js/JSWebAssemblyInstance.cpp:
36         (JSC::JSWebAssemblyInstance::finalizeCreation):
37         (JSC::JSWebAssemblyInstance::create):
38         * wasm/js/JSWebAssemblyLinkError.cpp:
39         (JSC::createJSWebAssemblyLinkError):
40         * wasm/js/JSWebAssemblyModule.cpp:
41         (JSC::JSWebAssemblyModule::createStub):
42         (JSC::JSWebAssemblyModule::finishCreation):
43         * wasm/js/WasmToJS.cpp:
44         (JSC::Wasm::wasmToJSException):
45         * wasm/js/WebAssemblyCompileErrorConstructor.cpp:
46         (JSC::constructJSWebAssemblyCompileError):
47         (JSC::callJSWebAssemblyCompileError):
48         * wasm/js/WebAssemblyFunction.cpp:
49         (JSC::WebAssemblyFunction::create):
50         * wasm/js/WebAssemblyFunction.h:
51         * wasm/js/WebAssemblyInstanceConstructor.cpp:
52         (JSC::constructJSWebAssemblyInstance):
53         * wasm/js/WebAssemblyLinkErrorConstructor.cpp:
54         (JSC::constructJSWebAssemblyLinkError):
55         (JSC::callJSWebAssemblyLinkError):
56         * wasm/js/WebAssemblyMemoryConstructor.cpp:
57         (JSC::constructJSWebAssemblyMemory):
58         * wasm/js/WebAssemblyModuleConstructor.cpp:
59         (JSC::WebAssemblyModuleConstructor::createModule):
60         * wasm/js/WebAssemblyModuleRecord.cpp:
61         (JSC::WebAssemblyModuleRecord::link):
62         (JSC::WebAssemblyModuleRecord::evaluate):
63         * wasm/js/WebAssemblyPrototype.cpp:
64         (JSC::webAssemblyModuleValidateAsyncInternal):
65         (JSC::instantiate):
66         (JSC::compileAndInstantiate):
67         (JSC::webAssemblyModuleInstantinateAsyncInternal):
68         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
69         (JSC::constructJSWebAssemblyRuntimeError):
70         (JSC::callJSWebAssemblyRuntimeError):
71         * wasm/js/WebAssemblyTableConstructor.cpp:
72         (JSC::constructJSWebAssemblyTable):
73         * wasm/js/WebAssemblyToJSCallee.cpp:
74         (JSC::WebAssemblyToJSCallee::create):
75         * wasm/js/WebAssemblyToJSCallee.h:
76         * wasm/js/WebAssemblyWrapperFunction.cpp:
77         (JSC::WebAssemblyWrapperFunction::create):
78         * wasm/js/WebAssemblyWrapperFunction.h:
79
80 2019-03-16  Darin Adler  <darin@apple.com>
81
82         Improve normalization code, including moving from unorm.h to unorm2.h
83         https://bugs.webkit.org/show_bug.cgi?id=195330
84
85         Reviewed by Michael Catanzaro.
86
87         * runtime/JSString.h: Move StringViewWithUnderlyingString to StringView.h.
88
89         * runtime/StringPrototype.cpp: Include unorm2.h instead of unorm.h.
90         (JSC::normalizer): Added. Function to create normalizer object given
91         enumeration value indicating which is selected. Simplified because we
92         know the function will not fail and so we don't need error handling code.
93         (JSC::normalize): Changed this function to take a JSString* so we can
94         optimize the case where no normalization is needed. Added an early exit
95         if the string is stored as 8-bit and another if the string is already
96         normalized, using unorm2_isNormalized. Changed error handling to only
97         check cases that can actually fail in practice. Also did other small
98         optimizations like passing VM rather than ExecState.
99         (JSC::stringProtoFuncNormalize): Used smaller enumeration names that are
100         identical to the names used in the API and normalization parlance rather
101         than longer ones that expand the acronyms. Updated to pass JSString* to
102         the normalize function, so we can optimize 8-bit and already-normalized
103         cases, rather than callling the expensive String::upconvertedCharacters
104         function. Use throwVMRangeError.
105
106 2019-03-15  Mark Lam  <mark.lam@apple.com>
107
108         Need to check ObjectPropertyCondition liveness before accessing it when firing watchpoints.
109         https://bugs.webkit.org/show_bug.cgi?id=195827
110         <rdar://problem/48845513>
111
112         Reviewed by Filip Pizlo.
113
114         m_object in ObjectPropertyCondition may no longer be live by the time the watchpoint fires.
115
116         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp:
117         (JSC::AdaptiveInferredPropertyValueWatchpointBase::fire):
118         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp:
119         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal):
120         * bytecode/ObjectPropertyCondition.cpp:
121         (JSC::ObjectPropertyCondition::dumpInContext const):
122         * bytecode/StructureStubClearingWatchpoint.cpp:
123         (JSC::StructureStubClearingWatchpoint::fireInternal):
124         * dfg/DFGAdaptiveStructureWatchpoint.cpp:
125         (JSC::DFG::AdaptiveStructureWatchpoint::fireInternal):
126         * runtime/StructureRareData.cpp:
127         (JSC::ObjectToStringAdaptiveStructureWatchpoint::fireInternal):
128
129 2019-03-15  Yusuke Suzuki  <ysuzuki@apple.com>
130
131         [JSC] Make more properties lazily-allocated in JSGlobalObject, including properties only used in JIT mode
132         https://bugs.webkit.org/show_bug.cgi?id=195816
133
134         Reviewed by Michael Saboff.
135
136         This patch makes more properties lazily-allocated in JSGlobalObject. This patch makes the following lazily-allocated.
137
138         1. iteratorResultObjectStructure
139         2. WebAssembly related objects except for JSWebAssembly top-level object.
140
141         * CMakeLists.txt:
142         * DerivedSources-input.xcfilelist:
143         * DerivedSources-output.xcfilelist:
144         * DerivedSources.make:
145         * runtime/JSGlobalObject.cpp:
146         (JSC::JSGlobalObject::init):
147         (JSC::JSGlobalObject::visitChildren):
148         * runtime/JSGlobalObject.h:
149         (JSC::JSGlobalObject::iteratorResultObjectStructure const):
150         (JSC::JSGlobalObject::webAssemblyModuleRecordStructure const):
151         (JSC::JSGlobalObject::webAssemblyFunctionStructure const):
152         (JSC::JSGlobalObject::webAssemblyWrapperFunctionStructure const):
153         (JSC::JSGlobalObject::webAssemblyToJSCalleeStructure const):
154         * wasm/js/JSWebAssembly.cpp:
155         * wasm/js/JSWebAssembly.h:
156
157 2019-03-15  Dominik Infuehr  <dinfuehr@igalia.com>
158
159         [CMake] Move test .js files into testapiScripts
160         https://bugs.webkit.org/show_bug.cgi?id=195565
161
162         Reviewed by Yusuke Suzuki.
163
164         testapi expect .js file in the testapiScripts-directory.
165
166         * shell/CMakeLists.txt:
167
168 2019-03-15  Mark Lam  <mark.lam@apple.com>
169
170         Gardening: add a missing exception check after r242991.
171         https://bugs.webkit.org/show_bug.cgi?id=195791
172
173         Unreviewed.
174
175         * tools/JSDollarVM.cpp:
176         (JSC::functionGetGetterSetter):
177
178 2019-03-15  Devin Rousso  <drousso@apple.com>
179
180         Web Inspector: provide a way to capture a screenshot of a node from within the page
181         https://bugs.webkit.org/show_bug.cgi?id=194279
182         <rdar://problem/10731573>
183
184         Reviewed by Joseph Pecoraro.
185
186         Add `console.screenshot` functionality, which displays a screenshot of a given object (if
187         able) within Web Inspector's Console tab. From there, it can be viewed and saved.
188
189         Currently, `console.screenshot` will
190          - capture an image of a `Node` (if provided)
191          - capture an image of the viewport if nothing is provided
192
193         * inspector/protocol/Console.json:
194         Add `Image` enum value to `ConsoleMessage` type.
195         * runtime/ConsoleTypes.h:
196         * inspector/ConsoleMessage.h:
197         * inspector/ConsoleMessage.cpp:
198         (Inspector::messageTypeValue):
199
200         * runtime/ConsoleClient.h:
201         * runtime/ConsoleObject.cpp:
202         (JSC::ConsoleObject::finishCreation):
203         (JSC::consoleProtoFuncScreenshot): Added.
204
205         * inspector/JSGlobalObjectConsoleClient.h:
206         * inspector/JSGlobalObjectConsoleClient.cpp:
207         (Inspector::JSGlobalObjectConsoleClient::screenshot): Added.
208
209 2019-03-14  Yusuke Suzuki  <ysuzuki@apple.com>
210
211         [JSC] Retain PrivateName of Symbol before passing it to operations potentially incurring GC
212         https://bugs.webkit.org/show_bug.cgi?id=195791
213         <rdar://problem/48806130>
214
215         Reviewed by Mark Lam.
216
217         Consider the following example:
218
219             void putByVal(JSObject*, PropertyName propertyName, ...);
220
221             putByVal(object, symbol->privateName(), ...);
222
223         PropertyName does not retain the passed UniquedStringImpl*. It just holds the pointer to UniquedStringImpl*.
224         It means that since `Symbol::privateName()` returns `const PrivateName&` instead of `PrivateName`, putByVal
225         and its caller does not retain UniquedStringImpl* held in PropertyName. The problem happens when the putByVal
226         incurs GC, and when the `symbol` is missing in the conservative GC scan. The underlying UniquedStringImpl* of
227         PropertyName can be accidentally destroyed in the middle of the putByVal operation. We should retain PrivateName
228         before passing it to operations which takes it as PropertyName.
229
230         1. We use the code pattern like this.
231
232             auto propertyName = symbol->privateName();
233             someOperation(..., propertyName);
234
235         This pattern is well aligned to existing `JSValue::toPropertyKey(exec)` and `JSString::toIdentifier(exec)` code patterns.
236
237             auto propertyName = value.toPropertyKey(exec);
238             RETURN_IF_EXCEPTION(scope, { });
239             someOperation(..., propertyName);
240
241         2. We change `Symbol::privateName()` to returning `PrivateName` instead of `const PrivateName&` to avoid
242            potential dangerous use cases. This is OK because the code using `Symbol::privateName()` is not a critical path,
243            and they typically need to retain PrivateName.
244
245         3. We audit similar functions `toPropertyKey(exec)` and `toIdentifier(exec)` for needed but missing exception checks.
246            BTW, these functions are safe to the problem fixed in this patch since they return `Identifier` instead
247            of `const Identifier&`.
248
249         Mark and Robin investigated and offered important data to understand what went wrong. And figured out the reason behind
250         the mysterious behavior shown in the data, and now, we confirm that this is the right fix for this bug.
251
252         * dfg/DFGOperations.cpp:
253         * jit/JITOperations.cpp:
254         (JSC::tryGetByValOptimize):
255         * runtime/JSFunction.cpp:
256         (JSC::JSFunction::setFunctionName):
257         * runtime/JSModuleLoader.cpp:
258         (JSC::printableModuleKey):
259         * runtime/JSONObject.cpp:
260         (JSC::Stringifier::Stringifier):
261         * runtime/Symbol.cpp:
262         (JSC::Symbol::descriptiveString const):
263         (JSC::Symbol::description const):
264         * runtime/Symbol.h:
265         * runtime/SymbolConstructor.cpp:
266         (JSC::symbolConstructorKeyFor):
267         * tools/JSDollarVM.cpp:
268         (JSC::functionGetGetterSetter):
269
270 2019-03-14  Yusuke Suzuki  <ysuzuki@apple.com>
271
272         REGRESSION(r242841): Fix conservative DFG OSR entry validation to accept values which will be stored in AnyInt / Double flush formats
273         https://bugs.webkit.org/show_bug.cgi?id=195752
274
275         Reviewed by Saam Barati.
276
277         We fixed the bug skipping AbstractValue validations when the flush format is Double or AnyInt. But it
278         was too conservative. While validating inputs with AbstractValue is mandatory (without it, whole CFA
279         falls into wrong condition), our validation does not care AnyInt and Double representations in lower
280         tiers. For example, if a value is stored in Double flush format in DFG, its AbstractValue becomes
281         SpecFullDouble. However, it does not include Int32 and OSR entry is rejected if Int32 comes for DoubleRep
282         OSR entry value. This is wrong since we later convert these numbers into DoubleRep representation
283         before entering DFG code.
284
285         This patch performs AbstractValue validation onto the correctly converted value with flush format hint.
286
287         And it still does not fix OSR entry failures in navier-stokes. This is because AbstractValue representation
288         in navier-stokes's lin_solve was too strict. Then, this patch reverts r242627. Instead of removing must handle
289         value handling in CFA, DFG OSR entry now correctly validates inputs with AbstractValues even if the flush format
290         is Double or AnyInt. As long as DFG OSR entry validates inputs, merging must handle values as proven constants is OK.
291
292         We can see that # of OSR entry failures in navier-stokes.js becomes the same to the previous count. And we can see
293         AnyInt OSR entry actually works in microbenchmarks/large-int.js. However, AnyInt effect is hard to observe because this
294         is super rare. Since we inject type prediction based on must handle value, the flush format tends to be SpecAnyIntAsDouble
295         and it accepts JSValues simply.
296
297         * bytecode/SpeculatedType.cpp:
298         (JSC::dumpSpeculation):
299         * dfg/DFGAbstractValue.cpp:
300         (JSC::DFG::AbstractValue::filterValueByType):
301         * dfg/DFGAbstractValue.h:
302         (JSC::DFG::AbstractValue::validateOSREntryValue const):
303         (JSC::DFG::AbstractValue::validateTypeAcceptingBoxedInt52 const):
304         (JSC::DFG::AbstractValue::validate const): Deleted.
305         (JSC::DFG::AbstractValue::validateType const): Deleted.
306         * dfg/DFGCFAPhase.cpp:
307         (JSC::DFG::CFAPhase::run):
308         (JSC::DFG::CFAPhase::injectOSR):
309         (JSC::DFG::CFAPhase::performBlockCFA):
310         * dfg/DFGOSREntry.cpp:
311         (JSC::DFG::prepareOSREntry):
312
313 2019-03-14  Saam barati  <sbarati@apple.com>
314
315         We can't remove code after ForceOSRExit until after FixupPhase
316         https://bugs.webkit.org/show_bug.cgi?id=186916
317         <rdar://problem/41396612>
318
319         Reviewed by Yusuke Suzuki.
320
321         There was an optimization in the bytecode parser I added in r232742 that converted blocks
322         with ForceOSRExit in them to remove all IR after the ForceOSRExit. However,
323         this is incorrect because it breaks backwards propagation. For example, it
324         could incorrectly lead us to think it's safe to not check for overflow in
325         an Add because such Add has no non-int uses. Backwards propagation relies on
326         having a view over bytecode uses, and this optimization broke that. This patch
327         rolls out that optimization, as initial perf data shows it may no longer be
328         needed.
329
330         * dfg/DFGByteCodeParser.cpp:
331         (JSC::DFG::ByteCodeParser::addToGraph):
332         (JSC::DFG::ByteCodeParser::parse):
333
334 2019-03-14  Saam barati  <sbarati@apple.com>
335
336         JSScript should have an accessor saying if it's cached or not
337         https://bugs.webkit.org/show_bug.cgi?id=195783
338
339         Reviewed by Michael Saboff.
340
341         * API/JSScript.h:
342         * API/JSScript.mm:
343         (-[JSScript isUsingBytecodeCache]):
344         * API/tests/testapi.mm:
345         (testIsUsingBytecodeCacheAccessor):
346         (testObjectiveCAPI):
347
348 2019-03-14  Saam barati  <sbarati@apple.com>
349
350         Remove retain cycle from JSScript and also don't keep the cache file descriptor open so many JSScripts can be cached in a loop
351         https://bugs.webkit.org/show_bug.cgi?id=195782
352         <rdar://problem/48880625>
353
354         Reviewed by Michael Saboff.
355
356         This patch fixes two issues with JSScript API:
357         
358         1. There was a retain cycle causing us to never destroy a JSScript once it
359         created a JSSourceCode. The reason for this is that JSScript had a 
360         Strong<JSSourceCode> field. And JSSourceCode transitively had RetainPtr<JSScript>.
361         
362         This patch fixes this issue by making the "jsSourceCode" accessor return a transient object.
363         
364         2. r242585 made it so that JSScript would keep the cache file descriptor open
365         (and locked) for the duration of the lifetime of the JSScript itself. Our
366         anticipation here is that it would make implementing iterative cache updates
367         easier. However, this made using the API super limiting in other ways. For
368         example, if a program had a loop that cached 3000 different JSScripts, it's
369         likely that such a program would exhaust the open file count limit. This patch
370         reverts to the behavior prior to r242585 where we just keep open the file descriptor
371         while we read or write it.
372
373         * API/JSAPIGlobalObject.mm:
374         (JSC::JSAPIGlobalObject::moduleLoaderFetch):
375         * API/JSContext.mm:
376         (-[JSContext evaluateJSScript:]):
377         * API/JSScript.mm:
378         (-[JSScript dealloc]):
379         (-[JSScript readCache]):
380         (-[JSScript init]):
381         (-[JSScript sourceCode]):
382         (-[JSScript jsSourceCode]):
383         (-[JSScript writeCache:]):
384         (-[JSScript forceRecreateJSSourceCode]): Deleted.
385         * API/JSScriptInternal.h:
386         * API/tests/testapi.mm:
387         (testCanCacheManyFilesWithTheSameVM):
388         (testObjectiveCAPI):
389         (testCacheFileIsExclusive): Deleted.
390
391 2019-03-14  Michael Saboff  <msaboff@apple.com>
392
393         ASSERTION FAILED: regexp->isValid() or ASSERTION FAILED: !isCompilationThread()
394         https://bugs.webkit.org/show_bug.cgi?id=195735
395
396         Reviewed by Mark Lam.
397
398         There are two bug fixes here.
399
400         The first bug happens due to a race condition when we are compiling on a separate thread while the
401         main thread is compiling the RegExp at a place where it can run out of stack.  When that happens,
402         the RegExp becomes invalid due to the out of stack error.  If we check the ASSERT condition in the DFG
403         compilation thread, we crash.  After the main thread throws an exception, it resets the RegExp as
404         it might compile successfully the next time we try to execute it on a shallower stack.
405         The main thread will see the regular expression as valid when it executes the JIT'ed code we are compiling
406         or any slow path we call out to.  Therefore ASSERTs like this in compilation code can be eliminated.
407
408         The second bug is due to incorrect logic when we go to run the regexp in the Strength Reduction phase.
409         The current check for "do we have code to run the RegExp?" only checks that the RegExp's state
410         is != NotCompiled.  We also can't run the RegExp if there the state is ParseError.
411         Changing hasCode() to take this into account fixes the second issue.
412
413         (JSC::FTL::DFG::LowerDFGToB3::compileNewRegexp):
414         * runtime/RegExp.h:
415         * dfg/DFGSpeculativeJIT.cpp:
416         (JSC::DFG::SpeculativeJIT::compileNewRegexp):
417         * runtime/RegExp.h:
418
419 2019-03-14  Saam barati  <sbarati@apple.com>
420
421         Fixup uses KnownInt32 incorrectly in some nodes
422         https://bugs.webkit.org/show_bug.cgi?id=195279
423         <rdar://problem/47915654>
424
425         Reviewed by Yusuke Suzuki.
426
427         Fixup was sometimes using KnownInt32 edges when it knew some
428         incoming value is an Int32 based on what the bytecode would return.
429         However, because bytecode may result in Int32 for some node does
430         not mean we'll pick Int32 as the value format for that local. For example,
431         we may choose for a value to be represented as a double. This patch
432         corrects such uses of KnownInt32.
433
434         * dfg/DFGArgumentsEliminationPhase.cpp:
435         * dfg/DFGFixupPhase.cpp:
436         (JSC::DFG::FixupPhase::fixupNode):
437         * dfg/DFGSpeculativeJIT.cpp:
438         (JSC::DFG::SpeculativeJIT::compileArrayPush):
439         (JSC::DFG::SpeculativeJIT::compileGetDirectPname):
440         * ftl/FTLLowerDFGToB3.cpp:
441         (JSC::FTL::DFG::LowerDFGToB3::compileArrayPush):
442
443 2019-03-14  Keith Miller  <keith_miller@apple.com>
444
445         DFG liveness can't skip tail caller inline frames
446         https://bugs.webkit.org/show_bug.cgi?id=195715
447         <rdar://problem/46221598>
448
449         Reviewed by Saam Barati.
450
451         In order to simplify OSR exit/DFG bytecode parsing our bytecode
452         generator always emits an op_ret after any tail call. However, the
453         DFG when computing the liveness of locals, would skip any tail
454         caller inline frames. This mean that if we ended up inserting a
455         Check that would OSR to the op_ret we wouldn't have kept
456         availability data around for it.
457
458         * dfg/DFGGraph.cpp:
459         (JSC::DFG::Graph::isLiveInBytecode):
460         * dfg/DFGGraph.h:
461         (JSC::DFG::Graph::forAllLocalsLiveInBytecode):
462
463 2019-03-14  Robin Morisset  <rmorisset@apple.com>
464
465         DFG::Worklist can be shrunk by 16 bytes
466         https://bugs.webkit.org/show_bug.cgi?id=195490
467
468         Reviewed by Darin Adler.
469
470         * dfg/DFGWorklist.cpp:
471         (JSC::DFG::Worklist::Worklist):
472         * dfg/DFGWorklist.h:
473
474 2019-03-14  Devin Rousso  <drousso@apple.com>
475
476         Web Inspector: Audit: provide a way to get the contents of resources
477         https://bugs.webkit.org/show_bug.cgi?id=195266
478         <rdar://problem/48550911>
479
480         Reviewed by Joseph Pecoraro.
481
482         * inspector/InjectedScriptBase.cpp:
483         (Inspector::InjectedScriptBase::makeAsyncCall):
484         Drive-by: fix missing `else`.
485
486 2019-03-14  Devin Rousso  <drousso@apple.com>
487
488         Web Inspector: Styles: `::-webkit-scrollbar*` rules aren't shown
489         https://bugs.webkit.org/show_bug.cgi?id=195123
490         <rdar://problem/48450148>
491
492         Reviewed by Joseph Pecoraro.
493
494         * inspector/protocol/CSS.json:
495         Add `CSS.PseudoId` enum, rather than send a number, so that we have more knowledge about
496         which pseudo type the rule corresponds to (e.g. a string is more descriptive than a number).
497
498 2019-03-13  Caio Lima  <ticaiolima@gmail.com>
499
500         [JSC] CodeBlock::visitChildren is reporting extra memory even when its JITCode is singleton
501         https://bugs.webkit.org/show_bug.cgi?id=195638
502
503         Reviewed by Mark Lam.
504
505         This patch introduces a m_isShared flag to track whether the
506         JITCode is shared between many CodeBlocks. This flag is used in
507         `CodeBlock::setJITCode` and `CodeBlock::visitChildren` to avoid
508         reporting duplicated extra memory for singleton JITCodes.
509         With those changes, we now stop counting singleton LLIntEntrypoints
510         as extra memory, since they are declared as static variables. This
511         change can potentially avoid unecessary GC pressure, because
512         extra memory is used by Heap::updateAllocationLimits() to update Heap
513         limits.
514         Even though it is hard to show performance difference for this change
515         (see results below), it is important to keep extra memory usage
516         correct. Otherwise, it can be a source of a complicated bug on
517         GC in the future.
518
519         Results from last run of Speedometer 2 comparing ToT and changes. We
520         collected those numbers running Minibrowser on a MacBook Pro 15-inch
521         with 2,6 GHz Intel Core i7. Both versions are with JIT disabled,
522         since these singleton JITCode are only used by this configuration:
523
524         Speedometer2 Run #1
525             ToT: 58.2 +- 1.1
526             changes: 57.9 +- 0.99
527
528         Speedometer2 Run #2
529             ToT: 58.5 +- 1.7
530             changes: 58.0 +- 1.5
531
532         Speedometer2 Run #2
533             ToT: 58.5 +- 0.99
534             changes: 57.1 +- 1.5
535
536         * bytecode/CodeBlock.cpp:
537         (JSC::CodeBlock::estimatedSize):
538         (JSC::CodeBlock::visitChildren):
539         * bytecode/CodeBlock.h:
540         (JSC::CodeBlock::setJITCode):
541         * jit/JITCode.cpp:
542         (JSC::JITCode::JITCode):
543         (JSC::JITCodeWithCodeRef::JITCodeWithCodeRef):
544         (JSC::DirectJITCode::DirectJITCode):
545         (JSC::NativeJITCode::NativeJITCode):
546         * jit/JITCode.h:
547         (JSC::JITCode::isShared const):
548         * llint/LLIntEntrypoint.cpp:
549         (JSC::LLInt::setFunctionEntrypoint):
550         (JSC::LLInt::setEvalEntrypoint):
551         (JSC::LLInt::setProgramEntrypoint):
552         (JSC::LLInt::setModuleProgramEntrypoint):
553
554 2019-03-13  Keith Rollin  <krollin@apple.com>
555
556         Add support for new StagedFrameworks layout
557         https://bugs.webkit.org/show_bug.cgi?id=195543
558
559         Reviewed by Alexey Proskuryakov.
560
561         When creating the WebKit layout for out-of-band Safari/WebKit updates,
562         use an optional path prefix when called for.
563
564         * Configurations/Base.xcconfig:
565
566 2019-03-13  Mark Lam  <mark.lam@apple.com>
567
568         Remove unneeded --tradeDestructorBlocks option.
569         https://bugs.webkit.org/show_bug.cgi?id=195698
570         <rdar://problem/39681388>
571
572         Reviewed by Yusuke Suzuki.
573
574         There's no reason why we would ever want --tradeDestructorBlocks to be false.
575
576         Also, there was an assertion in BlockDirectory::endMarking() for when
577         (!Options::tradeDestructorBlocks() && needsDestruction()).  This assertion is
578         outdated because the BlockDirectory's m_empty set used to mean the set of all
579         blocks that have no live (as in not reachable by GC) objects and dead objects
580         also do not require destructors to be called on them.  The current meaning of
581         m_empty is that it is the set of all blocks that have no live objects,
582         independent of whether they needs destructors to be called on them or not.
583         The assertion is no longer valid for the new meaning of m_empty as m_empty may
584         now contain destructible blocks.  This assertion is now removed as part of this
585         patch.
586
587         * heap/BlockDirectory.cpp:
588         (JSC::BlockDirectory::endMarking):
589         * heap/LocalAllocator.cpp:
590         (JSC::LocalAllocator::tryAllocateWithoutCollecting):
591         * runtime/Options.h:
592
593 2019-03-13  Dominik Infuehr  <dinfuehr@igalia.com>
594
595         String overflow when using StringBuilder in JSC::createError
596         https://bugs.webkit.org/show_bug.cgi?id=194957
597
598         Reviewed by Mark Lam.
599
600         StringBuilder in notAFunctionSourceAppender didn't check
601         for overflows but just failed.
602
603         * runtime/ExceptionHelpers.cpp:
604         (JSC::notAFunctionSourceAppender):
605
606 2019-03-11  Yusuke Suzuki  <ysuzuki@apple.com>
607
608         [JSC] Move species watchpoint installation from ArrayPrototype to JSGlobalObject
609         https://bugs.webkit.org/show_bug.cgi?id=195593
610
611         Reviewed by Keith Miller.
612
613         This patch moves watchpoints installation and watchpoints themselves from ArrayPrototype to JSGlobalObject because of the following two reasons.
614
615         1. ArrayPrototype configures finalizer because of std::unique_ptr<> for watchpoints. If we move them from ArrayPrototype to JSGlobalObject, we do
616            not need to set finalizer. And we can avoid unnecessary WeakBlock allocation.
617
618         2. This code lazily configures watchpoints instead of setting watchpoints eagerly in JSGlobalObject::init. We would like to expand this mechanism
619            to other watchpoints which are eagerly configured in JSGlobalObject::init. Putting these code in JSGlobalObject instead of scattering them in
620            each XXXPrototype / XXXConstructor can encourage the reuse of the code.
621
622         * runtime/ArrayPrototype.cpp:
623         (JSC::ArrayPrototype::create):
624         (JSC::speciesWatchpointIsValid):
625         (JSC::ArrayPrototype::destroy): Deleted.
626         (JSC::ArrayPrototype::tryInitializeSpeciesWatchpoint): Deleted.
627         (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::ArrayPrototypeAdaptiveInferredPropertyWatchpoint): Deleted.
628         (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::handleFire): Deleted.
629         * runtime/ArrayPrototype.h:
630         * runtime/JSGlobalObject.cpp:
631         (JSC::JSGlobalObject::tryInstallArraySpeciesWatchpoint): Instead of using ArrayPrototypeAdaptiveInferredPropertyWatchpoint,
632         we use ObjectPropertyChangeAdaptiveWatchpoint. We create watchpoints after touching WatchpointSet since ObjectPropertyChangeAdaptiveWatchpoint
633         requires WatchpointSet is IsWatched state.
634         * runtime/JSGlobalObject.h:
635
636 2019-03-12  Yusuke Suzuki  <ysuzuki@apple.com>
637
638         [JSC] OSR entry should respect abstract values in addition to flush formats
639         https://bugs.webkit.org/show_bug.cgi?id=195653
640
641         Reviewed by Mark Lam.
642
643         Let's consider the following graph.
644
645         Block #0
646             ...
647             27:< 2:loc13> JSConstant(JS|UseAsOther, StringIdent, Strong:String (atomic) (identifier): , StructureID: 42679, bc#10, ExitValid)
648             ...
649             28:< 2:loc13> ArithPow(DoubleRep:@437<Double>, Int32:@27, Double|UseAsOther, BytecodeDouble, Exits, bc#10, ExitValid)
650             29:<!0:->     MovHint(DoubleRep:@28<Double>, MustGen, loc7, W:SideState, ClobbersExit, bc#10, ExitValid)
651             30:< 1:->     SetLocal(DoubleRep:@28<Double>, loc7(M<Double>/FlushedDouble), machine:loc6, W:Stack(-8), bc#10, exit: bc#14, ExitValid)  predicting BytecodeDouble
652             ...
653             73:<!0:->     Jump(MustGen, T:#1, W:SideState, bc#71, ExitValid)
654
655         Block #1 (bc#71): (OSR target) pred, #0
656             ...
657            102:<!2:loc15> GetLocal(Check:Untyped:@400, Double|MustGen|PureInt, BytecodeDouble, loc7(M<Double>/FlushedDouble), machine:loc6, R:Stack(-8), bc#120, ExitValid)  predicting BytecodeDouble
658             ...
659
660         CFA at @28 says it is invalid since there are type contradiction (Int32:@27 v.s. StringIdent). So, of course, we do not propagate #0's type information to #1 since we become invalid state.
661         However, #1 is still reachable since it is an OSR target. Since #0 was only the predecessor of #1, loc7's type information becomes None at the head of #1.
662         Since loc7's AbstractValue is None, @102 GetLocal emits breakpoint. It is OK as long as OSR entry fails because AbstractValue validation requires the given value is None type.
663
664         The issue here is that we skipped AbstractValue validation when we have FlushFormat information. Since loc7 has FlushedDouble format, DFG OSR entry code does not validate it against AbstractValue,
665         which is None. Then, we hit the breakpoint emitted by @102.
666
667         This patch performs AbstractValue validation against values even if we have FlushFormat. We should correctly configure AbstractValue for OSR entry's locals too to avoid unnecessary OSR entry
668         failures in the future but anyway validating locals with AbstractValue is correct behavior here since DFGSpeculativeJIT relies on that.
669
670         * dfg/DFGOSREntry.cpp:
671         (JSC::DFG::prepareOSREntry):
672
673 2019-03-12  Michael Saboff  <msaboff@apple.com>
674
675         REGRESSION (iOS 12.2): Webpage using CoffeeScript crashes
676         https://bugs.webkit.org/show_bug.cgi?id=195613
677
678         Reviewed by Mark Lam.
679
680         The bug here is in Yarr JIT backreference matching code.  We are incorrectly
681         using a checkedOffset / inputPosition correction when checking for the available
682         length left in a string.  It is improper to do these corrections as a backreference's
683         match length is based on what was matched in the referenced capture group and not
684         part of the checkedOffset and inputPosition computed when we compiled the RegExp.
685         In some cases, the resulting incorrect calculation would allow us to go past
686         the subject string's length.  Removed these adjustments.
687
688         After writing tests for the first bug, found another bug where the non-greedy
689         backreference backtracking code didn't do an "are we at the end of the input?" check.
690         This caused an infinite loop as we'd jump from the backtracking code back to
691         try matching one more backreference, fail and then backtrack.
692
693         * yarr/YarrJIT.cpp:
694         (JSC::Yarr::YarrGenerator::generateBackReference):
695         (JSC::Yarr::YarrGenerator::backtrackBackReference):
696
697 2019-03-12  Robin Morisset  <rmorisset@apple.com>
698
699         A lot more classes have padding that can be reduced by reordering their fields
700         https://bugs.webkit.org/show_bug.cgi?id=195579
701
702         Reviewed by Mark Lam.
703
704         * assembler/LinkBuffer.h:
705         * dfg/DFGArrayifySlowPathGenerator.h:
706         (JSC::DFG::ArrayifySlowPathGenerator::ArrayifySlowPathGenerator):
707         * dfg/DFGCallArrayAllocatorSlowPathGenerator.h:
708         (JSC::DFG::CallArrayAllocatorSlowPathGenerator::CallArrayAllocatorSlowPathGenerator):
709         (JSC::DFG::CallArrayAllocatorWithVariableSizeSlowPathGenerator::CallArrayAllocatorWithVariableSizeSlowPathGenerator):
710         * dfg/DFGGraph.h:
711         * dfg/DFGNode.h:
712         (JSC::DFG::SwitchData::SwitchData):
713         * dfg/DFGPlan.cpp:
714         (JSC::DFG::Plan::Plan):
715         * dfg/DFGPlan.h:
716         * dfg/DFGSlowPathGenerator.h:
717         (JSC::DFG::CallSlowPathGenerator::CallSlowPathGenerator):
718         * dfg/DFGSpeculativeJIT.cpp:
719         (JSC::DFG::SpeculativeJIT::SpeculativeJIT):
720         * dfg/DFGSpeculativeJIT.h:
721         * domjit/DOMJITSignature.h:
722         (JSC::DOMJIT::Signature::Signature):
723         (JSC::DOMJIT::Signature::effect):
724         (JSC::DOMJIT::Signature::argumentCount): Deleted.
725         * heap/MarkingConstraintSolver.h:
726         * heap/SlotVisitor.h:
727         * jit/CallFrameShuffleData.h:
728         * jit/JITDivGenerator.h:
729         * jit/SpillRegistersMode.h:
730         * parser/Nodes.h:
731         * profiler/ProfilerOSRExit.cpp:
732         (JSC::Profiler::OSRExit::OSRExit):
733         * profiler/ProfilerOSRExit.h:
734         * runtime/ArrayBufferView.h:
735         * runtime/SamplingProfiler.cpp:
736         (JSC::SamplingProfiler::SamplingProfiler):
737         * runtime/SamplingProfiler.h:
738         * runtime/TypeSet.cpp:
739         (JSC::StructureShape::StructureShape):
740         * runtime/TypeSet.h:
741         * runtime/Watchdog.h:
742
743 2019-03-12  Mark Lam  <mark.lam@apple.com>
744
745         The HasIndexedProperty node does GC.
746         https://bugs.webkit.org/show_bug.cgi?id=195559
747         <rdar://problem/48767923>
748
749         Reviewed by Yusuke Suzuki.
750
751         HasIndexedProperty can call the slow path operationHasIndexedPropertyByInt(),
752         which can eventually call JSString::getIndex(), which can resolve a rope.
753
754         * dfg/DFGDoesGC.cpp:
755         (JSC::DFG::doesGC):
756
757 2019-03-12  Devin Rousso  <drousso@apple.com>
758
759         Web Inspector: Audit: there should be a centralized place for reusable code
760         https://bugs.webkit.org/show_bug.cgi?id=195265
761         <rdar://problem/47040673>
762
763         Reviewed by Joseph Pecoraro.
764
765         * inspector/protocol/Audit.json:
766         Increment version.
767
768 2019-03-12  Robin Morisset  <rmorisset@apple.com>
769
770         blocksInPreOrder and blocksInPostOrder should reserve the right capacity for their result vector
771         https://bugs.webkit.org/show_bug.cgi?id=195595
772
773         Reviewed by Saam Barati.
774
775         Also change BlockList from being Vector<BasicBlock*, 5> to Vector<BasicBlock*>
776
777         * dfg/DFGBasicBlock.h:
778         * dfg/DFGGraph.cpp:
779         (JSC::DFG::Graph::blocksInPreOrder):
780         (JSC::DFG::Graph::blocksInPostOrder):
781
782 2019-03-11  Ross Kirsling  <ross.kirsling@sony.com>
783
784         Add Optional to Forward.h.
785         https://bugs.webkit.org/show_bug.cgi?id=195586
786
787         Reviewed by Darin Adler.
788
789         * b3/B3Common.cpp:
790         * b3/B3Common.h:
791         * debugger/DebuggerParseData.cpp:
792         * debugger/DebuggerParseData.h:
793         * heap/HeapSnapshot.cpp:
794         * heap/HeapSnapshot.h:
795         * jit/PCToCodeOriginMap.cpp:
796         * jit/PCToCodeOriginMap.h:
797         * runtime/AbstractModuleRecord.cpp:
798         * runtime/AbstractModuleRecord.h:
799         * wasm/WasmInstance.h:
800         * wasm/WasmModuleParser.h:
801         * wasm/WasmSectionParser.cpp:
802         * wasm/WasmSectionParser.h:
803         * wasm/WasmStreamingParser.cpp:
804         * wasm/WasmStreamingParser.h:
805         * yarr/YarrFlags.cpp:
806         * yarr/YarrFlags.h:
807         * yarr/YarrUnicodeProperties.cpp:
808         * yarr/YarrUnicodeProperties.h:
809         Remove unnecessary includes from headers.
810
811 2019-03-11  Justin Fan  <justin_fan@apple.com>
812
813         [Web GPU] Update GPUSwapChainDescriptor, GPUSwapChain and implement GPUCanvasContext
814         https://bugs.webkit.org/show_bug.cgi?id=194406
815         <rdar://problem/47892466>
816
817         Reviewed by Myles C. Maxfield.
818
819         Added WebGPU to inspector context types.
820
821         * inspector/protocol/Canvas.json:
822         * inspector/scripts/codegen/generator.py:
823
824 2019-03-11  Yusuke Suzuki  <ysuzuki@apple.com>
825
826         [JSC] Reduce # of structures in JSGlobalObject initialization
827         https://bugs.webkit.org/show_bug.cgi?id=195498
828
829         Reviewed by Darin Adler.
830
831         This patch reduces # of structure allocations in JSGlobalObject initialization. Now it becomes 141, it fits in one
832         MarkedBlock and this patch drops one MarkedBlock used for Structure previously.
833
834         * CMakeLists.txt:
835         * DerivedSources-output.xcfilelist:
836         * DerivedSources.make:
837         * JavaScriptCore.xcodeproj/project.pbxproj:
838         * runtime/ArrayIteratorPrototype.cpp:
839         (JSC::ArrayIteratorPrototype::finishCreation): ArrayIteratorPrototype, MapIteratorPrototype, and StringIteratorPrototype's
840         "next" properties are referenced by JSGlobalObject::init, and it causes reification of the lazy "next" property and structure
841         transition anyway. So we should put it eagerly "without-transition" configuration to avoid one structure transition.
842
843         * runtime/ArrayPrototype.cpp:
844         (JSC::ArrayPrototype::finishCreation): @@unscopable object's structure should be dictionary because (1) it is used as a dictionary
845         in with-scope-resolution and (2) since with-scope-resolution is C++ runtime function anyway, non-dictionary structure does not add
846         any performance benefit. This change saves several structures that are not useful.
847
848         * runtime/ClonedArguments.cpp:
849         (JSC::ClonedArguments::createStructure): Bake CloneArguments's structure with 'without-transition' manner.
850
851         * runtime/JSGlobalObject.cpp:
852         (JSC::JSGlobalObject::init): Previously we are always call resetProtoype at the end of JSGlobalObject::init. But it is not necessary
853         since we do not change [[Prototype]] of JSGlobalObject. All we want is (1) fixupPrototypeChainWithObjectPrototype's operation and (2) setGlobalThis
854         operation. Since setGlobalThis part is done in JSGlobalObject::finishCreation, fixupPrototypeChainWithObjectPrototype is only the thing
855         we should do here.
856
857         (JSC::JSGlobalObject::fixupPrototypeChainWithObjectPrototype):
858         (JSC::JSGlobalObject::resetPrototype): If the [[Prototype]] is the same to the current [[Prototype]], we can skip the operation.
859
860         * runtime/JSGlobalObject.h:
861         * runtime/MapIteratorPrototype.cpp:
862         (JSC::MapIteratorPrototype::finishCreation):
863         * runtime/NullGetterFunction.h:
864         * runtime/NullSetterFunction.h: Since structures of them are allocated per JSGlobalObject and they are per-JSGlobalObject,
865         we can use without-transition property addition.
866
867         * runtime/StringIteratorPrototype.cpp:
868         (JSC::StringIteratorPrototype::finishCreation):
869         * runtime/VM.cpp:
870         (JSC::VM::VM):
871         (JSC::VM::setIteratorStructureSlow):
872         (JSC::VM::mapIteratorStructureSlow): These structures are only used in WebCore's main thread.
873         * runtime/VM.h:
874         (JSC::VM::setIteratorStructure):
875         (JSC::VM::mapIteratorStructure):
876
877 2019-03-08  Yusuke Suzuki  <ysuzuki@apple.com>
878
879         [JSC] BuiltinExecutables should behave like a WeakSet instead of generic WeakHandleOwner for memory footprint
880         https://bugs.webkit.org/show_bug.cgi?id=195508
881
882         Reviewed by Darin Adler.
883
884         Weak<> is not cheap in terms of memory footprint. We allocate WeakBlock (256 bytes) for book-keeping Weak<>.
885         Currently BuiltinExecutables has 203 Weak<> members and many WeakBlocks are actually allocated because
886         many UnlinkedFunctionExecutables in BuiltinExecutables are allocated during JSGlobalObject initialization process.
887
888         This patch changes two things in BuiltinExecutables.
889
890         1. Previously we have m_xxxSourceCode fields too. But we do not need to keep it since we know how to produce it when it is required.
891            We generate SourceCode in xxxSourceCode() method instead of just returning m_xxxSourceCode. This reduces sizeof(BuiltinExecutables) 24 x 203 = 4KB.
892
893         2. Instead of using Weak<>, BuiltinExecutables holds raw array of UnlinkedFunctionExecutable*. And Heap::finalizeUnconditionalFinalizers() correctly clears dead executables.
894            This is similar to JSWeakSet implementation. And it saves WeakBlock allocations.
895
896         * builtins/BuiltinExecutables.cpp:
897         (JSC::BuiltinExecutables::BuiltinExecutables):
898         (JSC::BuiltinExecutables::finalizeUnconditionally):
899         (JSC::JSC_FOREACH_BUILTIN_CODE): Deleted.
900         (JSC::BuiltinExecutables::finalize): Deleted.
901         * builtins/BuiltinExecutables.h:
902         (JSC::BuiltinExecutables::static_cast<unsigned>):
903         (): Deleted.
904         * heap/Heap.cpp:
905         (JSC::Heap::finalizeUnconditionalFinalizers):
906
907 2019-03-11  Robin Morisset  <rmorisset@apple.com>
908
909         IntlDateTimeFormat can be shrunk by 32 bytes
910         https://bugs.webkit.org/show_bug.cgi?id=195504
911
912         Reviewed by Darin Adler.
913
914         * runtime/IntlDateTimeFormat.h:
915
916 2019-03-11  Robin Morisset  <rmorisset@apple.com>
917
918         IntlCollator can be shrunk by 16 bytes
919         https://bugs.webkit.org/show_bug.cgi?id=195503
920
921         Reviewed by Darin Adler.
922
923         * runtime/IntlCollator.h:
924
925 2019-03-11  Robin Morisset  <rmorisset@apple.com>
926
927         IntlNumberFormat can be shrunk by 16 bytes
928         https://bugs.webkit.org/show_bug.cgi?id=195505
929
930         Reviewed by Darin Adler.
931
932         * runtime/IntlNumberFormat.h:
933
934 2019-03-11  Caio Lima  <ticaiolima@gmail.com>
935
936         [ESNext][BigInt] Implement "~" unary operation
937         https://bugs.webkit.org/show_bug.cgi?id=182216
938
939         Reviewed by Keith Miller.
940
941         This patch is adding support of BigInt into op_bitnot operations. In
942         addition, we are changing ArithBitNot to handle only Number operands,
943         while introducing a new node named ValueBitNot to handle Untyped and
944         BigInt. This node follows the same approach we are doing into other
945         arithimetic operations into DFG.
946
947         * dfg/DFGAbstractInterpreterInlines.h:
948         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
949
950         It is possible that fixup and prediction propagation don't convert a
951         ValueBitNot(ConstInt32) into ArithBitNot(ConstInt32) because these
952         analysis are conservative. In such case, we are adding constant
953         folding rules to ValueBitNot AI.
954
955         * dfg/DFGBackwardsPropagationPhase.cpp:
956         (JSC::DFG::BackwardsPropagationPhase::propagate):
957
958         ValueBitNot has same rules as ArithBitNot on backwards propagation.
959
960         * dfg/DFGByteCodeParser.cpp:
961         (JSC::DFG::ByteCodeParser::parseBlock):
962
963         We can emit ArithBitNot if we know that operand of op_bitnot is a
964         Number or any int. Otherwise we fallback to ValueBitNot and rely on
965         fixup to convert the node to ArithBitNot when it is possible.
966         ValueBitNot uses heap prediction on prediction propagation and we
967         collect its type from op_bitnot's value profiler.
968
969         * dfg/DFGClobberize.h:
970         (JSC::DFG::clobberize):
971
972         When we have the case with ValueBitNot(BigInt), we don't clobberize
973         world.
974
975         * dfg/DFGDoesGC.cpp:
976         (JSC::DFG::doesGC):
977
978         ValueBitNot can GC on BigIntUse because, right now, all bitNot
979         operation allocates temporary BigInts to perform calculations and it
980         can potentially trigger GC.
981
982         * dfg/DFGFixupPhase.cpp:
983         (JSC::DFG::FixupPhase::fixupNode):
984
985         ValueBitNot is responsible do handle BigIntUse and UntypedUse. To all
986         other uses, we fallback to ArithBitNot.
987
988         * dfg/DFGNode.h:
989         (JSC::DFG::Node::hasHeapPrediction):
990         * dfg/DFGNodeType.h:
991         * dfg/DFGOperations.cpp:
992         (JSC::DFG::bitwiseBinaryOp):
993
994         This template function is abstracting the new semantics of numeric
995         values operations on bitwise operations. These operations usually
996         folow these steps:
997
998             1. rhsNumeric = GetInt32OrBigInt(rhs)
999             2. lhsNumeric = GetInt32OrBigInt(lhs)
1000             3. trhow error if TypeOf(rhsNumeric) != TypeOf(lhsNumeric)
1001             4. return BigInt::bitwiseOp(bitOp, rhs, lhs) if TypeOf(lhsNumeric) == BigInt
1002             5. return rhs <int32BitOp> lhs
1003
1004         Since we have almost the same code for every bitwise op,
1005         we use such template to avoid code duplication. The template receives
1006         Int32 and BigInt operations as parameter. Error message is received as
1007         `const char*` instead of `String&` to avoid String allocation even when
1008         there is no error to throw.
1009
1010         * dfg/DFGOperations.h:
1011         * dfg/DFGPredictionPropagationPhase.cpp:
1012         * dfg/DFGSafeToExecute.h:
1013         (JSC::DFG::safeToExecute):
1014         * dfg/DFGSpeculativeJIT.cpp:
1015         (JSC::DFG::SpeculativeJIT::compileValueBitNot):
1016
1017         ValueBitNot generates speculative code for BigIntUse and this code is a
1018         call to `operationBitNotBigInt`. This operation is faster than
1019         `operationValueBitNot` because there is no need to check types of
1020         operands and execute properly operation. We still need to check
1021         exceptions after `operationBitNotBigInt` because it can throw OOM.
1022
1023         (JSC::DFG::SpeculativeJIT::compileBitwiseNot):
1024         * dfg/DFGSpeculativeJIT.h:
1025         * dfg/DFGSpeculativeJIT32_64.cpp:
1026         (JSC::DFG::SpeculativeJIT::compile):
1027         * dfg/DFGSpeculativeJIT64.cpp:
1028         (JSC::DFG::SpeculativeJIT::compile):
1029         * ftl/FTLCapabilities.cpp:
1030         (JSC::FTL::canCompile):
1031         * ftl/FTLLowerDFGToB3.cpp:
1032         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
1033         (JSC::FTL::DFG::LowerDFGToB3::compileValueBitNot):
1034         (JSC::FTL::DFG::LowerDFGToB3::compileArithBitNot):
1035         * runtime/CommonSlowPaths.cpp:
1036         (JSC::SLOW_PATH_DECL):
1037         * runtime/JSBigInt.cpp:
1038         (JSC::JSBigInt::bitwiseNot):
1039         * runtime/JSBigInt.h:
1040
1041 2019-03-11  Darin Adler  <darin@apple.com>
1042
1043         Specify fixed precision explicitly to prepare to change String::number and StringBuilder::appendNumber floating point behavior
1044         https://bugs.webkit.org/show_bug.cgi?id=195533
1045
1046         Reviewed by Brent Fulgham.
1047
1048         * API/tests/ExecutionTimeLimitTest.cpp:
1049         (testExecutionTimeLimit): Use appendFixedPrecisionNumber.
1050         * runtime/NumberPrototype.cpp:
1051         (JSC::numberProtoFuncToPrecision): Use numberToStringFixedPrecision.
1052         * runtime/Options.cpp:
1053         (JSC::Option::dump const): Use appendFixedPrecisionNumber.
1054
1055 2019-03-10  Ross Kirsling  <ross.kirsling@sony.com>
1056
1057         Invalid flags in a RegExp literal should be an early SyntaxError
1058         https://bugs.webkit.org/show_bug.cgi?id=195514
1059
1060         Reviewed by Darin Adler.
1061
1062         Currently we're throwing a *runtime* SyntaxError; this should occur at parse time. 
1063
1064           12.2.8.1 Static Semantics: Early Errors
1065             PrimaryExpression : RegularExpressionLiteral
1066               - It is a Syntax Error if BodyText of RegularExpressionLiteral cannot be recognized
1067                 using the goal symbol Pattern of the ECMAScript RegExp grammar specified in 21.2.1.
1068               - It is a Syntax Error if FlagText of RegularExpressionLiteral contains any code points
1069                 other than "g", "i", "m",  "s", "u", or "y", or if it contains the same code point more than once.
1070
1071         In fixing this, let's also move flag handling from runtime/ to yarr/.
1072
1073         * yarr/YarrSyntaxChecker.cpp:
1074         (JSC::Yarr::checkSyntax):
1075         Check flags before checking pattern.
1076
1077         * CMakeLists.txt:
1078         * JavaScriptCore.xcodeproj/project.pbxproj:
1079         * Sources.txt:
1080         * bytecompiler/NodesCodegen.cpp:
1081         (JSC::RegExpNode::emitBytecode):
1082         * inspector/ContentSearchUtilities.cpp:
1083         (Inspector::ContentSearchUtilities::findMagicComment):
1084         * runtime/CachedTypes.cpp:
1085         * runtime/RegExp.cpp:
1086         (JSC::RegExp::RegExp):
1087         (JSC::RegExp::createWithoutCaching):
1088         (JSC::RegExp::create):
1089         (JSC::regExpFlags): Deleted.
1090         * runtime/RegExp.h:
1091         * runtime/RegExpCache.cpp:
1092         (JSC::RegExpCache::lookupOrCreate):
1093         (JSC::RegExpCache::ensureEmptyRegExpSlow):
1094         * runtime/RegExpCache.h:
1095         * runtime/RegExpConstructor.cpp:
1096         (JSC::toFlags):
1097         (JSC::regExpCreate):
1098         (JSC::constructRegExp):
1099         * runtime/RegExpKey.h:
1100         (JSC::RegExpKey::RegExpKey):
1101         (WTF::HashTraits<JSC::RegExpKey>::constructDeletedValue):
1102         (WTF::HashTraits<JSC::RegExpKey>::isDeletedValue):
1103         (): Deleted.
1104         * runtime/RegExpPrototype.cpp:
1105         (JSC::regExpProtoFuncCompile):
1106         * testRegExp.cpp:
1107         (parseRegExpLine):
1108         * yarr/RegularExpression.cpp:
1109         (JSC::Yarr::RegularExpression::Private::compile):
1110         * yarr/YarrFlags.cpp: Added.
1111         (JSC::Yarr::parseFlags):
1112         * yarr/YarrFlags.h: Added.
1113         * yarr/YarrInterpreter.h:
1114         (JSC::Yarr::BytecodePattern::ignoreCase const):
1115         (JSC::Yarr::BytecodePattern::multiline const):
1116         (JSC::Yarr::BytecodePattern::sticky const):
1117         (JSC::Yarr::BytecodePattern::unicode const):
1118         (JSC::Yarr::BytecodePattern::dotAll const):
1119         * yarr/YarrPattern.cpp:
1120         (JSC::Yarr::YarrPattern::compile):
1121         (JSC::Yarr::YarrPattern::YarrPattern):
1122         (JSC::Yarr::YarrPattern::dumpPattern):
1123         * yarr/YarrPattern.h:
1124         (JSC::Yarr::YarrPattern::global const):
1125         (JSC::Yarr::YarrPattern::ignoreCase const):
1126         (JSC::Yarr::YarrPattern::multiline const):
1127         (JSC::Yarr::YarrPattern::sticky const):
1128         (JSC::Yarr::YarrPattern::unicode const):
1129         (JSC::Yarr::YarrPattern::dotAll const):
1130         Move flag handling to Yarr and modernize API.
1131
1132 2019-03-09  Robin Morisset  <rmorisset@apple.com>
1133
1134         Compilation can be shrunk by 8 bytes
1135         https://bugs.webkit.org/show_bug.cgi?id=195500
1136
1137         Reviewed by Mark Lam.
1138
1139         * profiler/ProfilerCompilation.cpp:
1140         (JSC::Profiler::Compilation::Compilation):
1141         * profiler/ProfilerCompilation.h:
1142
1143 2019-03-09  Robin Morisset  <rmorisset@apple.com>
1144
1145         BinarySwitch can be shrunk by 8 bytes
1146         https://bugs.webkit.org/show_bug.cgi?id=195493
1147
1148         Reviewed by Mark Lam.
1149
1150         * jit/BinarySwitch.cpp:
1151         (JSC::BinarySwitch::BinarySwitch):
1152         * jit/BinarySwitch.h:
1153
1154 2019-03-09  Robin Morisset  <rmorisset@apple.com>
1155
1156         AsyncStackTrace can be shrunk by 8 bytes
1157         https://bugs.webkit.org/show_bug.cgi?id=195491
1158
1159         Reviewed by Mark Lam.
1160
1161         * inspector/AsyncStackTrace.h:
1162
1163 2019-03-08  Mark Lam  <mark.lam@apple.com>
1164
1165         Stack overflow crash in JSC::JSObject::hasInstance.
1166         https://bugs.webkit.org/show_bug.cgi?id=195458
1167         <rdar://problem/48710195>
1168
1169         Reviewed by Yusuke Suzuki.
1170
1171         * runtime/JSObject.cpp:
1172         (JSC::JSObject::hasInstance):
1173
1174 2019-03-08  Robin Morisset  <rmorisset@apple.com>
1175
1176         IntegerCheckCombiningPhase::Range can be shrunk by 8 bytes
1177         https://bugs.webkit.org/show_bug.cgi?id=195487
1178
1179         Reviewed by Saam Barati.
1180
1181         * dfg/DFGIntegerCheckCombiningPhase.cpp:
1182
1183 2019-03-08  Robin Morisset  <rmorisset@apple.com>
1184
1185         TypeLocation can be shrunk by 8 bytes
1186         https://bugs.webkit.org/show_bug.cgi?id=195483
1187
1188         Reviewed by Mark Lam.
1189
1190         * bytecode/TypeLocation.h:
1191         (JSC::TypeLocation::TypeLocation):
1192
1193 2019-03-08  Robin Morisset  <rmorisset@apple.com>
1194
1195         GetByIdStatus can be shrunk by 16 bytes
1196         https://bugs.webkit.org/show_bug.cgi?id=195480
1197
1198         Reviewed by Saam Barati.
1199
1200         8 bytes from reordering fields
1201         8 more bytes by making the enum State only use 1 byte.
1202
1203         * bytecode/GetByIdStatus.cpp:
1204         (JSC::GetByIdStatus::GetByIdStatus):
1205         * bytecode/GetByIdStatus.h:
1206
1207 2019-03-08  Robin Morisset  <rmorisset@apple.com>
1208
1209         PutByIdVariant can be shrunk by 8 bytes
1210         https://bugs.webkit.org/show_bug.cgi?id=195482
1211
1212         Reviewed by Mark Lam.
1213
1214         * bytecode/PutByIdVariant.h:
1215         (JSC::PutByIdVariant::PutByIdVariant):
1216
1217 2019-03-08  Yusuke Suzuki  <ysuzuki@apple.com>
1218
1219         Unreviewed, follow-up after r242568
1220
1221         Robin pointed that calculation of `numberOfChildren` and `nonEmptyIndex` is unnecessary.
1222
1223         * dfg/DFGAbstractInterpreterInlines.h:
1224         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1225
1226 2019-03-08  Yusuke Suzuki  <ysuzuki@apple.com>
1227
1228         [JSC] We should have more WithoutTransition functions which are usable for JSGlobalObject initialization
1229         https://bugs.webkit.org/show_bug.cgi?id=195447
1230
1231         Reviewed by Filip Pizlo.
1232
1233         This patch reduces # of unnecessary structure transitions in JSGlobalObject initialization to avoid unnecessary allocations
1234         caused by Structure transition. One example is WeakBlock allocation for StructureTransitionTable.
1235         To achieve this, we (1) add putDirectNonIndexAccessorWithoutTransition and putDirectNativeIntrinsicGetterWithoutTransition
1236         to add accessor properties without transition, and (2) add NameAdditionMode::WithoutStructureTransition mode to InternalFunction::finishCreation
1237         to use `putDirectWithoutTransition` instead of `putDirect`.
1238
1239         * inspector/JSInjectedScriptHostPrototype.cpp:
1240         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
1241         * inspector/JSJavaScriptCallFramePrototype.cpp:
1242         (Inspector::JSJavaScriptCallFramePrototype::finishCreation):
1243         * runtime/ArrayConstructor.cpp:
1244         (JSC::ArrayConstructor::finishCreation):
1245         * runtime/AsyncFunctionConstructor.cpp:
1246         (JSC::AsyncFunctionConstructor::finishCreation):
1247         * runtime/AsyncGeneratorFunctionConstructor.cpp:
1248         (JSC::AsyncGeneratorFunctionConstructor::finishCreation):
1249         * runtime/BigIntConstructor.cpp:
1250         (JSC::BigIntConstructor::finishCreation):
1251         * runtime/BooleanConstructor.cpp:
1252         (JSC::BooleanConstructor::finishCreation):
1253         * runtime/DateConstructor.cpp:
1254         (JSC::DateConstructor::finishCreation):
1255         * runtime/ErrorConstructor.cpp:
1256         (JSC::ErrorConstructor::finishCreation):
1257         * runtime/FunctionConstructor.cpp:
1258         (JSC::FunctionConstructor::finishCreation):
1259         * runtime/FunctionPrototype.cpp:
1260         (JSC::FunctionPrototype::finishCreation):
1261         (JSC::FunctionPrototype::addFunctionProperties):
1262         (JSC::FunctionPrototype::initRestrictedProperties):
1263         * runtime/FunctionPrototype.h:
1264         * runtime/GeneratorFunctionConstructor.cpp:
1265         (JSC::GeneratorFunctionConstructor::finishCreation):
1266         * runtime/InternalFunction.cpp:
1267         (JSC::InternalFunction::finishCreation):
1268         * runtime/InternalFunction.h:
1269         * runtime/IntlCollatorConstructor.cpp:
1270         (JSC::IntlCollatorConstructor::finishCreation):
1271         * runtime/IntlDateTimeFormatConstructor.cpp:
1272         (JSC::IntlDateTimeFormatConstructor::finishCreation):
1273         * runtime/IntlNumberFormatConstructor.cpp:
1274         (JSC::IntlNumberFormatConstructor::finishCreation):
1275         * runtime/IntlPluralRulesConstructor.cpp:
1276         (JSC::IntlPluralRulesConstructor::finishCreation):
1277         * runtime/JSArrayBufferConstructor.cpp:
1278         (JSC::JSGenericArrayBufferConstructor<sharingMode>::finishCreation):
1279         * runtime/JSArrayBufferPrototype.cpp:
1280         (JSC::JSArrayBufferPrototype::finishCreation):
1281         * runtime/JSGenericTypedArrayViewConstructorInlines.h:
1282         (JSC::JSGenericTypedArrayViewConstructor<ViewClass>::finishCreation):
1283         * runtime/JSGlobalObject.cpp:
1284         (JSC::JSGlobalObject::init):
1285         * runtime/JSObject.cpp:
1286         (JSC::JSObject::putDirectNonIndexAccessorWithoutTransition):
1287         (JSC::JSObject::putDirectNativeIntrinsicGetterWithoutTransition):
1288         * runtime/JSObject.h:
1289         * runtime/JSPromiseConstructor.cpp:
1290         (JSC::JSPromiseConstructor::finishCreation):
1291         * runtime/JSTypedArrayViewConstructor.cpp:
1292         (JSC::JSTypedArrayViewConstructor::finishCreation):
1293         * runtime/JSTypedArrayViewPrototype.cpp:
1294         (JSC::JSTypedArrayViewPrototype::finishCreation):
1295         * runtime/MapConstructor.cpp:
1296         (JSC::MapConstructor::finishCreation):
1297         * runtime/MapPrototype.cpp:
1298         (JSC::MapPrototype::finishCreation):
1299         * runtime/NativeErrorConstructor.cpp:
1300         (JSC::NativeErrorConstructorBase::finishCreation):
1301         * runtime/NullGetterFunction.h:
1302         * runtime/NullSetterFunction.h:
1303         * runtime/NumberConstructor.cpp:
1304         (JSC::NumberConstructor::finishCreation):
1305         * runtime/ObjectConstructor.cpp:
1306         (JSC::ObjectConstructor::finishCreation):
1307         * runtime/ProxyConstructor.cpp:
1308         (JSC::ProxyConstructor::finishCreation):
1309         * runtime/RegExpConstructor.cpp:
1310         (JSC::RegExpConstructor::finishCreation):
1311         * runtime/RegExpPrototype.cpp:
1312         (JSC::RegExpPrototype::finishCreation):
1313         * runtime/SetConstructor.cpp:
1314         (JSC::SetConstructor::finishCreation):
1315         * runtime/SetPrototype.cpp:
1316         (JSC::SetPrototype::finishCreation):
1317         * runtime/StringConstructor.cpp:
1318         (JSC::StringConstructor::finishCreation):
1319         * runtime/SymbolConstructor.cpp:
1320         (JSC::SymbolConstructor::finishCreation):
1321         * runtime/WeakMapConstructor.cpp:
1322         (JSC::WeakMapConstructor::finishCreation):
1323         * runtime/WeakSetConstructor.cpp:
1324         (JSC::WeakSetConstructor::finishCreation):
1325         * wasm/js/WebAssemblyCompileErrorConstructor.cpp:
1326         (JSC::WebAssemblyCompileErrorConstructor::finishCreation):
1327         * wasm/js/WebAssemblyInstanceConstructor.cpp:
1328         (JSC::WebAssemblyInstanceConstructor::finishCreation):
1329         * wasm/js/WebAssemblyLinkErrorConstructor.cpp:
1330         (JSC::WebAssemblyLinkErrorConstructor::finishCreation):
1331         * wasm/js/WebAssemblyMemoryConstructor.cpp:
1332         (JSC::WebAssemblyMemoryConstructor::finishCreation):
1333         * wasm/js/WebAssemblyModuleConstructor.cpp:
1334         (JSC::WebAssemblyModuleConstructor::finishCreation):
1335         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
1336         (JSC::WebAssemblyRuntimeErrorConstructor::finishCreation):
1337         * wasm/js/WebAssemblyTableConstructor.cpp:
1338         (JSC::WebAssemblyTableConstructor::finishCreation):
1339
1340 2019-03-08  Tadeu Zagallo  <tzagallo@apple.com>
1341
1342         op_check_tdz does not def its argument
1343         https://bugs.webkit.org/show_bug.cgi?id=192880
1344         <rdar://problem/46221598>
1345
1346         Reviewed by Saam Barati.
1347
1348         This prevented the for-in loop optimization in the bytecode generator, since
1349         the analysis sees a redefinition of the loop variable.
1350
1351         * bytecode/BytecodeUseDef.h:
1352         (JSC::computeDefsForBytecodeOffset):
1353
1354 2019-03-07  Yusuke Suzuki  <ysuzuki@apple.com>
1355
1356         [JSC] Make more fields lazy in JSGlobalObject
1357         https://bugs.webkit.org/show_bug.cgi?id=195449
1358
1359         Reviewed by Mark Lam.
1360
1361         This patch makes more fields lazy-allocated in JSGlobalObject to save memory.
1362
1363         1. Some minor structures like moduleRecordStructure.
1364         2. Some functions like parseInt / parseFloat. While they are eagerly created in JIT mode anyway to materialize NumberConstructor, we can lazily allocate them in non JIT mode.
1365         3. ArrayBuffer constructor. While it is eagerly allocated in WebCore, we can make lazily allocated in JSC.
1366
1367         * interpreter/Interpreter.cpp:
1368         (JSC::Interpreter::execute):
1369         * runtime/JSArrayBufferPrototype.h:
1370         * runtime/JSGlobalObject.cpp:
1371         (JSC::JSGlobalObject::init):
1372         (JSC::JSGlobalObject::visitChildren):
1373         * runtime/JSGlobalObject.h:
1374         (JSC::JSGlobalObject::parseIntFunction const):
1375         (JSC::JSGlobalObject::parseFloatFunction const):
1376         (JSC::JSGlobalObject::evalFunction const):
1377         (JSC::JSGlobalObject::strictEvalActivationStructure const):
1378         (JSC::JSGlobalObject::moduleRecordStructure const):
1379         (JSC::JSGlobalObject::moduleNamespaceObjectStructure const):
1380         (JSC::JSGlobalObject::proxyObjectStructure const):
1381         (JSC::JSGlobalObject::callableProxyObjectStructure const):
1382         (JSC::JSGlobalObject::proxyRevokeStructure const):
1383         (JSC::JSGlobalObject::arrayBufferConstructor const):
1384         (JSC::JSGlobalObject::arrayBufferPrototype const):
1385         (JSC::JSGlobalObject::arrayBufferStructure const):
1386         * runtime/ProxyObject.h:
1387         * runtime/StrictEvalActivation.cpp:
1388         (JSC::StrictEvalActivation::StrictEvalActivation):
1389         * runtime/StrictEvalActivation.h:
1390         * wasm/js/JSWebAssemblyMemory.cpp:
1391         (JSC::JSWebAssemblyMemory::buffer):
1392         * wasm/js/WebAssemblyModuleConstructor.cpp:
1393         (JSC::webAssemblyModuleCustomSections):
1394
1395 2019-03-07  Yusuke Suzuki  <ysuzuki@apple.com>
1396
1397         [JSC] Remove merging must handle values into proven types in CFA
1398         https://bugs.webkit.org/show_bug.cgi?id=195444
1399
1400         Reviewed by Saam Barati.
1401
1402         Previously, we are merging must handle values as a proven constant in CFA. This is OK as long as this proven AbstractValue is blurred by merging the other legit AbstractValues
1403         from the successors. But let's consider the following code, this is actually generated DFG graph from the attached test in r242626.
1404
1405             Block #2 (loop header) succ #3, #4
1406             ...
1407             1: ForceOSRExit
1408             ...
1409             2: JSConstant(0)
1410             3: SetLocal(@2, loc6)
1411             ...
1412             4: Branch(#3, #4)
1413
1414             Block #3 (This is OSR entry target) pred #2, #3, must handle value for loc6 => JSConstant(Int32, 31)
1415             ...
1416             5: GetLocal(loc6)
1417             6: StringFromCharCode(@5)
1418             ...
1419
1420         Block #3 is OSR entry target. So we have must handle value for loc6 and it is Int32 constant 31. Then we merge this constant as a proven value in #3's loc6 AbstractValue.
1421         If the value from #2 blurs the value, it is OK. However, #2 has ForceOSRExit. So must handle value suddenly becomes the only source of loc6 in #3. Then we use this constant
1422         as a proven value. But this is not expected behavior since must handle value is just a snapshot of the locals when we kick off the concurrent compilation. In the above example,
1423         we assume that loop index is an constant 31, but it is wrong, and OSR entry fails. Because there is no strong assumption that the must handle value is the proven type or value,
1424         we should not merge it in CFA.
1425
1426         Since (1) this is just an optimization, (2) type information is already propagated in prediction injection phase, and (3) the must handle value does not show the performance
1427         progression in r211461 and we no longer see type misprediction in marsaglia-osr-entry.js, this patch simply removes must handle value type widening in CFA.
1428
1429         * dfg/DFGCFAPhase.cpp:
1430         (JSC::DFG::CFAPhase::run):
1431         (JSC::DFG::CFAPhase::performBlockCFA):
1432         (JSC::DFG::CFAPhase::injectOSR): Deleted.
1433
1434 2019-03-07  Yusuke Suzuki  <ysuzuki@apple.com>
1435
1436         [JSC] StringFromCharCode fast path should accept 0xff in DFG and FTL
1437         https://bugs.webkit.org/show_bug.cgi?id=195429
1438
1439         Reviewed by Saam Barati.
1440
1441         We can create single characters without allocation up to 0xff character code. But currently, DFGSpeculativeJIT and FTLLowerDFGToB3 go to the slow path
1442         for 0xff case. On the other hand, DFG DoesGC phase says GC won't happen if the child is int32 constant and it is <= 0xff. So, if you have `String.fromCharCode(0xff)`,
1443         this breaks the assumption in DFG DoesGC. The correct fix is changing the check in DFGSpeculativeJIT and FTLLowerDFGToB3 from AboveOrEqual to Above.
1444         Note that ThunkGenerators's StringFromCharCode thunk was correct.
1445
1446         * dfg/DFGSpeculativeJIT.cpp:
1447         (JSC::DFG::SpeculativeJIT::compileFromCharCode):
1448         * ftl/FTLLowerDFGToB3.cpp:
1449         (JSC::FTL::DFG::LowerDFGToB3::compileStringFromCharCode):
1450
1451 2019-03-07  Mark Lam  <mark.lam@apple.com>
1452
1453         Follow up refactoring in try-finally code after r242591.
1454         https://bugs.webkit.org/show_bug.cgi?id=195428
1455
1456         Reviewed by Saam Barati.
1457
1458         1. Added some comments in emitFinallyCompletion() to describe each completion case.
1459         2. Converted CatchEntry into a struct.
1460         3. Renamed variable hasBreaksOrContinuesNotCoveredByJumps to hasBreaksOrContinuesThatEscapeCurrentFinally
1461            to be more clear about its purpose.
1462
1463         * bytecompiler/BytecodeGenerator.cpp:
1464         (JSC::BytecodeGenerator::generate):
1465         (JSC::BytecodeGenerator::emitOutOfLineExceptionHandler):
1466         (JSC::BytecodeGenerator::emitFinallyCompletion):
1467         * bytecompiler/BytecodeGenerator.h:
1468
1469 2019-03-07  Saam Barati  <sbarati@apple.com>
1470
1471         CompactVariableMap::Handle's copy operator= leaks the previous data
1472         https://bugs.webkit.org/show_bug.cgi?id=195398
1473
1474         Reviewed by Yusuke Suzuki.
1475
1476         The copy constructor was just assigning |this| to the new value,
1477         forgetting to decrement the ref count of the thing pointed to by
1478         the |this| handle. Based on Yusuke's suggestion, this patch refactors
1479         the move constructor, move operator=, and copy operator= to use the
1480         swap() primitive and the copy constructor primitive.
1481
1482         * parser/VariableEnvironment.cpp:
1483         (JSC::CompactVariableMap::Handle::Handle):
1484         (JSC::CompactVariableMap::Handle::swap):
1485         (JSC::CompactVariableMap::Handle::operator=): Deleted.
1486         * parser/VariableEnvironment.h:
1487         (JSC::CompactVariableMap::Handle::Handle):
1488         (JSC::CompactVariableMap::Handle::operator=):
1489
1490 2019-03-07  Tadeu Zagallo  <tzagallo@apple.com>
1491
1492         Lazily decode cached bytecode
1493         https://bugs.webkit.org/show_bug.cgi?id=194810
1494
1495         Reviewed by Saam Barati.
1496
1497         Like lazy parsing, we should pause at code block boundaries. Instead
1498         of always eagerly decoding UnlinkedFunctionExecutable's UnlinkedCodeBlocks,
1499         we store their offsets in the executable and lazily decode them on the next
1500         call to `unlinkedCodeBlockFor`.
1501
1502         * bytecode/UnlinkedFunctionExecutable.cpp:
1503         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1504         (JSC::UnlinkedFunctionExecutable::~UnlinkedFunctionExecutable):
1505         (JSC::UnlinkedFunctionExecutable::visitChildren):
1506         (JSC::UnlinkedFunctionExecutable::unlinkedCodeBlockFor):
1507         (JSC::UnlinkedFunctionExecutable::decodeCachedCodeBlocks):
1508         * bytecode/UnlinkedFunctionExecutable.h:
1509         * runtime/CachedTypes.cpp:
1510         (JSC::Decoder::Decoder):
1511         (JSC::Decoder::~Decoder):
1512         (JSC::Decoder::create):
1513         (JSC::Decoder::offsetOf):
1514         (JSC::Decoder::cacheOffset):
1515         (JSC::Decoder::ptrForOffsetFromBase):
1516         (JSC::Decoder::handleForEnvironment const):
1517         (JSC::Decoder::setHandleForEnvironment):
1518         (JSC::Decoder::addFinalizer):
1519         (JSC::VariableLengthObject::isEmpty const):
1520         (JSC::CachedWriteBarrier::isEmpty const):
1521         (JSC::CachedFunctionExecutable::unlinkedCodeBlockForCall const):
1522         (JSC::CachedFunctionExecutable::unlinkedCodeBlockForConstruct const):
1523         (JSC::CachedFunctionExecutable::decode const):
1524         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1525         (JSC::decodeCodeBlockImpl):
1526         (JSC::isCachedBytecodeStillValid):
1527         (JSC::decodeFunctionCodeBlock):
1528         * runtime/CachedTypes.h:
1529         (JSC::Decoder::vm):
1530
1531 2019-03-06  Mark Lam  <mark.lam@apple.com>
1532
1533         Exception is a JSCell, not a JSObject.
1534         https://bugs.webkit.org/show_bug.cgi?id=195392
1535
1536         Reviewed by Saam Barati.
1537
1538         Exception is a VM implementation construct to carry a stack trace for the point
1539         where it is thrown from.  As a reminder, an Exception is needed because:
1540         1. JS code can throw primitives as well that are non-cells.
1541         2. Error objects capture the stack trace at the point where they are constructed,
1542            which is not always the same as the point where they are thrown (if they are
1543            thrown).
1544
1545         Hence, Exception should not be visible to JS code, and therefore should not be a
1546         JSObject.  Hence, it should not inherit from JSDestructibleObject.
1547
1548         This patch changes the following:
1549
1550         1. Exception now inherits directly from JSCell instead.
1551
1552         2. Places where we return an Exception masquerading as a JSObject* are now
1553            updated to return a nullptr when we encounter an exception.
1554
1555         3. We still return Exception* as JSValue or EncodedJSValue when we encounter an
1556            exception in functions that return JSValue or EncodedJSValue.  This is because
1557            the number that implements the following pattern is too numerous:
1558
1559                 return throw<Some Error>(...)
1560
1561            We'll leave these as is for now.
1562
1563         * bytecode/CodeBlock.h:
1564         (JSC::ScriptExecutable::prepareForExecution):
1565         * interpreter/Interpreter.cpp:
1566         (JSC::Interpreter::executeProgram):
1567         (JSC::Interpreter::executeCall):
1568         (JSC::Interpreter::executeConstruct):
1569         (JSC::Interpreter::prepareForRepeatCall):
1570         (JSC::Interpreter::execute):
1571         (JSC::Interpreter::executeModuleProgram):
1572         * jit/JITOperations.cpp:
1573         * llint/LLIntSlowPaths.cpp:
1574         (JSC::LLInt::setUpCall):
1575         * runtime/ConstructData.cpp:
1576         (JSC::construct):
1577         * runtime/Error.cpp:
1578         (JSC::throwConstructorCannotBeCalledAsFunctionTypeError):
1579         (JSC::throwTypeError):
1580         (JSC::throwSyntaxError):
1581         * runtime/Error.h:
1582         (JSC::throwRangeError):
1583         * runtime/Exception.cpp:
1584         (JSC::Exception::createStructure):
1585         * runtime/Exception.h:
1586         * runtime/ExceptionHelpers.cpp:
1587         (JSC::throwOutOfMemoryError):
1588         (JSC::throwStackOverflowError):
1589         (JSC::throwTerminatedExecutionException):
1590         * runtime/ExceptionHelpers.h:
1591         * runtime/FunctionConstructor.cpp:
1592         (JSC::constructFunction):
1593         (JSC::constructFunctionSkippingEvalEnabledCheck):
1594         * runtime/IntlPluralRules.cpp:
1595         (JSC::IntlPluralRules::resolvedOptions):
1596         * runtime/JSGenericTypedArrayViewConstructorInlines.h:
1597         (JSC::constructGenericTypedArrayViewWithArguments):
1598         * runtime/JSObject.h:
1599         * runtime/ObjectConstructor.cpp:
1600         (JSC::objectConstructorSeal):
1601         (JSC::objectConstructorFreeze):
1602         * runtime/ProgramExecutable.cpp:
1603         (JSC::ProgramExecutable::initializeGlobalProperties):
1604         * runtime/RegExpConstructor.cpp:
1605         (JSC::regExpCreate):
1606         (JSC::constructRegExp):
1607         * runtime/ScriptExecutable.cpp:
1608         (JSC::ScriptExecutable::newCodeBlockFor):
1609         (JSC::ScriptExecutable::prepareForExecutionImpl):
1610         * runtime/ScriptExecutable.h:
1611         * runtime/ThrowScope.cpp:
1612         (JSC::ThrowScope::throwException):
1613         * runtime/ThrowScope.h:
1614         (JSC::ThrowScope::throwException):
1615         (JSC::throwException):
1616         * runtime/VM.cpp:
1617         (JSC::VM::throwException):
1618         * runtime/VM.h:
1619
1620 2019-03-06  Ross Kirsling  <ross.kirsling@sony.com>
1621
1622         [Win] Remove -DUCHAR_TYPE=wchar_t stopgap and learn to live with char16_t.
1623         https://bugs.webkit.org/show_bug.cgi?id=195346
1624
1625         Reviewed by Fujii Hironori.
1626
1627         * jsc.cpp:
1628         (currentWorkingDirectory):
1629         (fetchModuleFromLocalFileSystem):
1630         * runtime/DateConversion.cpp:
1631         (JSC::formatDateTime):
1632         Use wchar helpers as needed.
1633
1634 2019-03-06  Mark Lam  <mark.lam@apple.com>
1635
1636         Fix incorrect handling of try-finally completion values.
1637         https://bugs.webkit.org/show_bug.cgi?id=195131
1638         <rdar://problem/46222079>
1639
1640         Reviewed by Saam Barati and Yusuke Suzuki.
1641
1642         Consider the following:
1643
1644             function foo() {                        // line 1
1645                 try {
1646                     return 42;                      // line 3
1647                 } finally {
1648                     for (var j = 0; j < 1; j++) {   // line 5
1649                         try {
1650                             throw '';               // line 7
1651                         } finally {
1652                             continue;               // line 9
1653                         }
1654                     }
1655                 }                                   // line 11
1656             }
1657             var result = foo();
1658
1659         With the current (before fix) code base, result will be the exception object thrown
1660         at line 7.  The expected result should be 42, returned at line 3.
1661
1662         The bug is that we were previously only using one set of completion type and
1663         value registers for the entire function.  This is inadequate because the outer
1664         try-finally needs to preserve its own completion type and value ({ Return, 42 }
1665         in this case) in order to be able to complete correctly.
1666
1667         One might be deceived into thinking that the above example should complete with
1668         the exception thrown at line 7.  However, according to Section 13.15.8 of the
1669         ECMAScript spec, the 'continue' in the finally at line 9 counts as an abrupt
1670         completion.  As a result, it overrides the throw from line 7.  After the continue,
1671         execution resumes at the top of the loop at line 5, followed by a normal completion
1672         at line 11.
1673
1674         Also according to Section 13.15.8, given that the completion type of the outer
1675         finally is normal, the resultant completion of the outer try-finally should be
1676         the completion of the outer try block i.e. { Return, 42 }.
1677
1678         This patch makes the following changes:
1679         
1680         1. Fix handling of finally completion to use a unique set of completion
1681            type and value registers for each FinallyContext.
1682
1683         2. Move the setting of Throw completion type to the out of line exception handler.
1684            This makes the mainline code slightly less branchy.
1685
1686         3. Introduce emitOutOfLineCatchHandler(), emitOutOfLineFinallyHandler(), and
1687            emitOutOfLineExceptionHandler() to make it clearer that these are not emitting
1688            bytecode inline.  Also, these make it clearer when we're emitting a handler
1689            for a catch vs a finally.
1690
1691         4. Allocate the FinallyContext on the stack instead of as a member of the
1692            heap allocated ControlFlowScope.  This simplifies its life-cycle management
1693            and reduces the amount of needed copying.
1694
1695         5. Update emitFinallyCompletion() to propagate the completion type and value to
1696            the outer FinallyContext when needed.
1697
1698         6. Fix emitJumpIf() to use the right order of operands.  Previously, we were
1699            only using it to do op_stricteq and op_nstricteq comparisons.  So, the order
1700            wasn't important.  We now use it to also do op_beloweq comparisons.  Hence,
1701            the order needs to be corrected.
1702
1703         7. Remove the unused CompletionType::Break and Continue.  These are encoded with
1704            the jumpIDs of the jump targets instead.
1705
1706         Relevant specifications:
1707         Section 13.15.8: https://www.ecma-international.org/ecma-262/9.0/index.html#sec-try-statement-runtime-semantics-evaluation
1708         Section 6.3.2.4: https://www.ecma-international.org/ecma-262/9.0/index.html#sec-updateempty
1709
1710         * bytecompiler/BytecodeGenerator.cpp:
1711         (JSC::FinallyContext::FinallyContext):
1712         (JSC::BytecodeGenerator::generate):
1713         (JSC::BytecodeGenerator::BytecodeGenerator):
1714         (JSC::BytecodeGenerator::pushFinallyControlFlowScope):
1715         (JSC::BytecodeGenerator::popFinallyControlFlowScope):
1716         (JSC::BytecodeGenerator::emitOutOfLineCatchHandler):
1717         (JSC::BytecodeGenerator::emitOutOfLineFinallyHandler):
1718         (JSC::BytecodeGenerator::emitOutOfLineExceptionHandler):
1719         (JSC::BytecodeGenerator::emitEnumeration):
1720         (JSC::BytecodeGenerator::emitJumpViaFinallyIfNeeded):
1721         (JSC::BytecodeGenerator::emitReturnViaFinallyIfNeeded):
1722         (JSC::BytecodeGenerator::emitFinallyCompletion):
1723         (JSC::BytecodeGenerator::emitJumpIf):
1724         (JSC::BytecodeGenerator::emitCatch): Deleted.
1725         (JSC::BytecodeGenerator::allocateCompletionRecordRegisters): Deleted.
1726         (JSC::BytecodeGenerator::releaseCompletionRecordRegisters): Deleted.
1727         * bytecompiler/BytecodeGenerator.h:
1728         (JSC::FinallyContext::completionTypeRegister const):
1729         (JSC::FinallyContext::completionValueRegister const):
1730         (JSC::ControlFlowScope::ControlFlowScope):
1731         (JSC::BytecodeGenerator::emitLoad):
1732         (JSC::BytecodeGenerator::CompletionRecordScope::CompletionRecordScope): Deleted.
1733         (JSC::BytecodeGenerator::CompletionRecordScope::~CompletionRecordScope): Deleted.
1734         (JSC::BytecodeGenerator::completionTypeRegister const): Deleted.
1735         (JSC::BytecodeGenerator::completionValueRegister const): Deleted.
1736         (JSC::BytecodeGenerator::emitSetCompletionType): Deleted.
1737         (JSC::BytecodeGenerator::emitSetCompletionValue): Deleted.
1738         * bytecompiler/NodesCodegen.cpp:
1739         (JSC::TryNode::emitBytecode):
1740
1741 2019-03-06  Saam Barati  <sbarati@apple.com>
1742
1743         JSScript should keep the cache file locked for the duration of its existence and should truncate the cache when it is out of date
1744         https://bugs.webkit.org/show_bug.cgi?id=195186
1745
1746         Reviewed by Keith Miller.
1747
1748         This patch makes it so that JSScript will keep its bytecode cache file
1749         locked as long as the JSScript is alive. This makes it obvious that it's
1750         safe to update that file, as it will only be used in a single VM, across
1751         all processes, at a single time. We may be able to extend this in the future
1752         if we can atomically update it across VMs/processes. However, we're choosing
1753         more restricted semantics now as it's always easier to extend these semantics
1754         in the future opposed to having to support the more flexible behavior
1755         up front.
1756         
1757         This patch also:
1758         - Adds error messages if writing the cache fails. We don't expect this to
1759           fail, but previously we would say we cached it even if write() fails.
1760         - Removes the unused m_moduleKey field.
1761         - Makes calling cacheBytecodeWithError with an already non-empty cache file fail.
1762           In the future, we should extend this to just fill in the parts of the cache
1763           that are not present. But we don't have the ability to do that yet, so we
1764           just result in an error for now.
1765
1766         * API/JSScript.mm:
1767         (-[JSScript dealloc]):
1768         (-[JSScript readCache]):
1769         (-[JSScript init]):
1770         (-[JSScript writeCache:]):
1771         * API/JSScriptInternal.h:
1772         * API/tests/testapi.mm:
1773         (testCacheFileIsExclusive):
1774         (testCacheFileFailsWhenItsAlreadyCached):
1775         (testObjectiveCAPI):
1776
1777 2019-03-06  Christopher Reid  <chris.reid@sony.com>
1778
1779         Followups to (r242306): Use LockHolder instead of std::lock_guard on Remote Inspector Locks
1780         https://bugs.webkit.org/show_bug.cgi?id=195381
1781
1782         Reviewed by Mark Lam.
1783
1784         Replacing std::lock_guard uses in Remote Inspector with WTF::LockHolder.
1785         Also using `= { }` for struct initialization instead of memeset.
1786
1787         * inspector/remote/RemoteConnectionToTarget.cpp:
1788         * inspector/remote/RemoteInspector.cpp:
1789         * inspector/remote/cocoa/RemoteConnectionToTargetCocoa.mm:
1790         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
1791         * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm:
1792         * inspector/remote/glib/RemoteInspectorGlib.cpp:
1793         * inspector/remote/playstation/RemoteInspectorPlayStation.cpp:
1794         * inspector/remote/playstation/RemoteInspectorSocketClientPlayStation.cpp:
1795         * inspector/remote/playstation/RemoteInspectorSocketPlayStation.cpp:
1796         * inspector/remote/playstation/RemoteInspectorSocketServerPlayStation.cpp:
1797
1798 2019-03-06  Saam Barati  <sbarati@apple.com>
1799
1800         Air::reportUsedRegisters must padInterference
1801         https://bugs.webkit.org/show_bug.cgi?id=195303
1802         <rdar://problem/48270343>
1803
1804         Reviewed by Keith Miller.
1805
1806         reportUsedRegisters uses reg liveness to eliminate loads/moves into dead
1807         registers. However, liveness can report incorrect results in certain 
1808         scenarios when considering liveness at instruction boundaries. For example,
1809         it can go wrong when an Inst has a LateUse of a register and the following
1810         Inst has an EarlyDef of that same register. Such a scenario could lead us
1811         to incorrectly say the register is not live-in to the first Inst. Pad
1812         interference inserts Nops between such instruction boundaries that cause
1813         this issue.
1814         
1815         The test with this patch fixes the issue in reportUsedRegisters. This patch
1816         also conservatively makes it so that lowerAfterRegAlloc calls padInterference
1817         since it also reasons about liveness.
1818
1819         * b3/air/AirLowerAfterRegAlloc.cpp:
1820         (JSC::B3::Air::lowerAfterRegAlloc):
1821         * b3/air/AirPadInterference.h:
1822         * b3/air/AirReportUsedRegisters.cpp:
1823         (JSC::B3::Air::reportUsedRegisters):
1824         * b3/testb3.cpp:
1825         (JSC::B3::testReportUsedRegistersLateUseNotDead):
1826         (JSC::B3::run):
1827
1828 2019-03-06  Yusuke Suzuki  <ysuzuki@apple.com>
1829
1830         [JSC] AI should not propagate AbstractValue relying on constant folding phase
1831         https://bugs.webkit.org/show_bug.cgi?id=195375
1832
1833         Reviewed by Saam Barati.
1834
1835         MakeRope rule in AI attempts to propagate the node, which will be produced after constant folding phase runs.
1836         This is wrong since we do not guarantee that constant folding phase runs after AI runs (e.g. DFGSpeculativeJIT
1837         and FTLLowerDFGToB3 run AI). This results in the bug that the value produced at runtime is different from the
1838         proven constant value in AI. In the attached test, AI says the value is SpecStringIdent while the resulted value
1839         at runtime is SpecStringVar, resulting in wrong MakeRope code. This patch removes the path propagating the node
1840         relying on constant folding phase.
1841
1842         * dfg/DFGAbstractInterpreterInlines.h:
1843         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1844
1845 2019-03-05  Saam barati  <sbarati@apple.com>
1846
1847         op_switch_char broken for rope strings after JSRopeString layout rewrite
1848         https://bugs.webkit.org/show_bug.cgi?id=195339
1849         <rdar://problem/48592545>
1850
1851         Reviewed by Yusuke Suzuki.
1852
1853         When we did the JSString rewrite, we accidentally broke LLInt's switch_char
1854         for rope strings. That change made it so that we always go to the slow path
1855         for ropes. That's wrong. The slow path should only be taken when the rope
1856         is of length 1. For lengths other than 1, we need to fall through to the
1857         default case. This patch fixes this.
1858
1859         * llint/LowLevelInterpreter32_64.asm:
1860         * llint/LowLevelInterpreter64.asm:
1861         * runtime/JSString.h:
1862
1863 2019-03-05  Yusuke Suzuki  <ysuzuki@apple.com>
1864
1865         [JSC] Should check exception for JSString::toExistingAtomicString
1866         https://bugs.webkit.org/show_bug.cgi?id=195337
1867
1868         Reviewed by Keith Miller, Saam Barati, and Mark Lam.
1869
1870         We missed the exception check for JSString::toExistingAtomicString while it can resolve
1871         a rope and throw an OOM exception. This patch adds necessary exception checks. This patch
1872         fixes test failures in debug build, reported in https://bugs.webkit.org/show_bug.cgi?id=194375#c93.
1873
1874         * dfg/DFGOperations.cpp:
1875         * jit/JITOperations.cpp:
1876         (JSC::getByVal):
1877         * llint/LLIntSlowPaths.cpp:
1878         (JSC::LLInt::getByVal):
1879         * runtime/CommonSlowPaths.cpp:
1880         (JSC::SLOW_PATH_DECL):
1881
1882 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
1883
1884         Unreviewed, build fix for debug builds after r242397
1885
1886         * runtime/JSString.h:
1887
1888 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
1889
1890         [JSC] Store bits for JSRopeString in 3 stores
1891         https://bugs.webkit.org/show_bug.cgi?id=195234
1892
1893         Reviewed by Saam Barati.
1894
1895         This patch cleans up the initialization of JSRopeString fields in DFG and FTL.
1896         Previously, we store some part of data separately. Instead, this patch calculates
1897         the data first by bit operations and store calculated data with fewer stores.
1898
1899         This patch also cleans up is8Bit and isSubstring flags. We put them in lower bits
1900         of the first fiber instead of the upper 16 bits. Since we only have 3 bit flags, (isRope, is8Bit, isSubstring),
1901         we can put them into the lower 3 bits, they are always empty due to alignment.
1902
1903         * bytecode/AccessCase.cpp:
1904         (JSC::AccessCase::generateImpl): A bit clean up of StringLength IC to give a chance of unnecessary mov removal.
1905         * dfg/DFGSpeculativeJIT.cpp:
1906         (JSC::DFG::SpeculativeJIT::canBeRope):
1907         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
1908         (JSC::DFG::SpeculativeJIT::compileMakeRope):
1909         * dfg/DFGSpeculativeJIT.h:
1910         * ftl/FTLAbstractHeapRepository.cpp:
1911         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
1912         * ftl/FTLAbstractHeapRepository.h:
1913         * ftl/FTLLowerDFGToB3.cpp:
1914         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
1915         (JSC::FTL::DFG::LowerDFGToB3::isRopeString):
1916         (JSC::FTL::DFG::LowerDFGToB3::isNotRopeString):
1917         * runtime/JSString.cpp:
1918         (JSC::JSString::visitChildren):
1919         * runtime/JSString.h:
1920         (JSC::JSString::is8Bit const):
1921         (JSC::JSString::isSubstring const):
1922         * tools/JSDollarVM.cpp:
1923         (JSC::functionCreateNullRopeString):
1924         (JSC::JSDollarVM::finishCreation):
1925
1926 2019-03-04  Joseph Pecoraro  <pecoraro@apple.com>
1927
1928         ITMLKit Inspector: Data Bindings / Associated Data for nodes
1929         https://bugs.webkit.org/show_bug.cgi?id=195290
1930         <rdar://problem/48304019>
1931
1932         Reviewed by Devin Rousso.
1933
1934         * inspector/protocol/DOM.json:
1935
1936 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
1937
1938         [JSC] Make Reflect lazily-allocated by dropping @Reflect references from builtin JS
1939         https://bugs.webkit.org/show_bug.cgi?id=195250
1940
1941         Reviewed by Saam Barati.
1942
1943         By removing @Reflect from builtin JS, we can make Reflect object allocation lazy.
1944         We move @ownKeys function from @Reflect to @Object to remove @Reflect reference.
1945
1946         We also remove m_intlObject field from JSGlobalObject since we no longer use it.
1947
1948         * builtins/BuiltinNames.h:
1949         * builtins/GlobalOperations.js:
1950         (globalPrivate.copyDataProperties):
1951         (globalPrivate.copyDataPropertiesNoExclusions):
1952         * runtime/JSGlobalObject.cpp:
1953         (JSC::createReflectProperty):
1954         (JSC::JSGlobalObject::init):
1955         (JSC::JSGlobalObject::visitChildren):
1956         * runtime/JSGlobalObject.h:
1957         * runtime/ObjectConstructor.cpp:
1958         (JSC::ObjectConstructor::finishCreation):
1959         (JSC::objectConstructorOwnKeys):
1960         * runtime/ReflectObject.cpp:
1961         (JSC::ReflectObject::finishCreation):
1962
1963 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
1964
1965         [JSC] Offer @makeTypeError instead of exposing @TypeError
1966         https://bugs.webkit.org/show_bug.cgi?id=193858
1967
1968         Reviewed by Mark Lam.
1969
1970         Instead of exposing @TypeError, we expose @makeTypeError function.
1971         And we make TypeError and Error lazily-allocated objects in non JIT environment.
1972         In JIT environment, only TypeError becomes lazily-allocated since WebAssembly errors
1973         touch Error prototype anyway. But we can make them lazy in a subsequent patch.
1974
1975         * builtins/AsyncFromSyncIteratorPrototype.js:
1976         * builtins/AsyncGeneratorPrototype.js:
1977         (globalPrivate.asyncGeneratorEnqueue):
1978         * builtins/BuiltinNames.h:
1979         * builtins/PromiseOperations.js:
1980         (globalPrivate.createResolvingFunctions.resolve):
1981         * runtime/JSGlobalObject.cpp:
1982         (JSC::JSGlobalObject::initializeErrorConstructor):
1983         (JSC::JSGlobalObject::init):
1984         (JSC::JSGlobalObject::visitChildren):
1985         * runtime/JSGlobalObject.h:
1986         (JSC::JSGlobalObject::errorPrototype const):
1987         (JSC::JSGlobalObject::errorStructure const):
1988         * runtime/JSGlobalObjectFunctions.cpp:
1989         (JSC::globalFuncMakeTypeError):
1990         * runtime/JSGlobalObjectFunctions.h:
1991
1992 2019-03-04  Carlos Garcia Campos  <cgarcia@igalia.com>
1993
1994         [GLib] Returning G_TYPE_OBJECT from a constructor does not work
1995         https://bugs.webkit.org/show_bug.cgi?id=195206
1996
1997         Reviewed by Žan Doberšek.
1998
1999         We are freeing the newly created object before returning from the constructor.
2000
2001         * API/glib/JSCCallbackFunction.cpp:
2002         (JSC::JSCCallbackFunction::construct):
2003
2004 2019-03-02  Darin Adler  <darin@apple.com>
2005
2006         Retire legacy dtoa function and DecimalNumber class
2007         https://bugs.webkit.org/show_bug.cgi?id=195253
2008
2009         Reviewed by Daniel Bates.
2010
2011         * runtime/NumberPrototype.cpp:
2012         (JSC::numberProtoFuncToExponential): Removed dependency on NumberToStringBufferLength,
2013         using NumberToStringBuffer instead. Also tweaked style of implementation a bit.
2014
2015 2019-03-01  Darin Adler  <darin@apple.com>
2016
2017         Finish removing String::format
2018         https://bugs.webkit.org/show_bug.cgi?id=194893
2019
2020         Reviewed by Daniel Bates.
2021
2022         * bytecode/CodeBlock.cpp:
2023         (JSC::CodeBlock::nameForRegister): Use makeString instead of String::format,
2024         using the new "pad" function.
2025
2026 2019-03-01  Christopher Reid  <chris.reid@sony.com>
2027
2028         [PlayStation] Upstream playstation's remote inspector server
2029         https://bugs.webkit.org/show_bug.cgi?id=193806
2030
2031         Reviewed by Joseph Pecoraro.
2032
2033         Upstreaming PlayStation's Remote Inspector implementation.
2034         It is using a JSON RPC protocol over TCP sockets.
2035         This inspector implementation is planned to also support running on a WinCairo Client and Server.
2036
2037         * PlatformPlayStation.cmake:
2038         * SourcesGTK.txt:
2039         * SourcesWPE.txt:
2040         * inspector/remote/RemoteConnectionToTarget.cpp: Renamed from Source/JavaScriptCore/inspector/remote/glib/RemoteConnectionToTargetGlib.cpp.
2041         * inspector/remote/RemoteInspector.h:
2042         * inspector/remote/playstation/RemoteInspectorConnectionClient.h: Added.
2043         * inspector/remote/playstation/RemoteInspectorConnectionClientPlayStation.cpp: Added.
2044         * inspector/remote/playstation/RemoteInspectorMessageParser.h: Added.
2045         * inspector/remote/playstation/RemoteInspectorMessageParserPlayStation.cpp: Added.
2046         * inspector/remote/playstation/RemoteInspectorPlayStation.cpp: Added.
2047         * inspector/remote/playstation/RemoteInspectorServer.h: Added.
2048         * inspector/remote/playstation/RemoteInspectorServerPlayStation.cpp: Added.
2049         * inspector/remote/playstation/RemoteInspectorSocket.h: Added.
2050         * inspector/remote/playstation/RemoteInspectorSocketClient.h: Added.
2051         * inspector/remote/playstation/RemoteInspectorSocketClientPlayStation.cpp: Added.
2052         * inspector/remote/playstation/RemoteInspectorSocketPlayStation.cpp: Added.
2053         * inspector/remote/playstation/RemoteInspectorSocketServer.h: Added.
2054         * inspector/remote/playstation/RemoteInspectorSocketServerPlayStation.cpp: Added.
2055
2056 2019-03-01  Saam Barati  <sbarati@apple.com>
2057
2058         Create SPI to crash if a JSC VM is created
2059         https://bugs.webkit.org/show_bug.cgi?id=195231
2060         <rdar://problem/47717990>
2061
2062         Reviewed by Mark Lam.
2063
2064         * API/JSVirtualMachine.mm:
2065         (+[JSVirtualMachine setCrashOnVMCreation:]):
2066         * API/JSVirtualMachinePrivate.h:
2067         * runtime/VM.cpp:
2068         (JSC::VM::VM):
2069         (JSC::VM::setCrashOnVMCreation):
2070         * runtime/VM.h:
2071
2072 2019-03-01  Yusuke Suzuki  <ysuzuki@apple.com>
2073
2074         [JSC] Fix FTL build on ARM32_64 by adding stubs for JSRopeString::offsetOfXXX
2075         https://bugs.webkit.org/show_bug.cgi?id=195235
2076
2077         Reviewed by Saam Barati.
2078
2079         This is a workaround until https://bugs.webkit.org/show_bug.cgi?id=195234 is done.
2080
2081         * runtime/JSString.h:
2082
2083 2019-03-01  Yusuke Suzuki  <ysuzuki@apple.com>
2084
2085         [JSC] Use runtime calls for DFG MakeRope if !CPU(ADDRESS64)
2086         https://bugs.webkit.org/show_bug.cgi?id=195221
2087
2088         Reviewed by Mark Lam.
2089
2090         ARM32_64 builds DFG 64bit, but the size of address is 32bit. Make DFG MakeRope a runtime call not only for DFG 32_64,
2091         but also DFG 64 with !CPU(ADDRESS64). This patch unifies compileMakeRope again, and use a runtime call for !CPU(ADDRESS64).
2092
2093         * dfg/DFGSpeculativeJIT.cpp:
2094         (JSC::DFG::SpeculativeJIT::compileMakeRope):
2095         * dfg/DFGSpeculativeJIT32_64.cpp:
2096         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
2097         * dfg/DFGSpeculativeJIT64.cpp:
2098         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
2099
2100 2019-03-01  Justin Fan  <justin_fan@apple.com>
2101
2102         [Web GPU] 32-bit builds broken by attempt to disable WebGPU on 32-bit
2103         https://bugs.webkit.org/show_bug.cgi?id=195191
2104
2105         Rubber-stamped by Dean Jackson.
2106
2107         Dropping support for 32-bit entirely, so I'm intentionally leaving 32-bit broken.
2108
2109         * Configurations/FeatureDefines.xcconfig:
2110
2111 2019-03-01  Dominik Infuehr  <dinfuehr@igalia.com>
2112
2113         Fix debug builds with GCC
2114         https://bugs.webkit.org/show_bug.cgi?id=195205
2115
2116         Unreviewed. Fix debug builds in GCC by removing
2117         the constexpr-keyword for this function.
2118
2119         * runtime/CachedTypes.cpp:
2120         (JSC::tagFromSourceCodeType):
2121
2122 2019-03-01  Dominik Infuehr  <dinfuehr@igalia.com>
2123
2124         [ARM] Fix assembler warnings in ctiMasmProbeTrampoline
2125         https://bugs.webkit.org/show_bug.cgi?id=195164
2126
2127         Reviewed by Mark Lam.
2128
2129         Short branches in IT blocks are deprecated in AArch32. In addition the
2130         the conditional branch was the only instruction in the IT block. Short
2131         branches are able to encode the condition code themselves, the additional
2132         IT instruction is not needed.
2133
2134         The assembler was also warning that writing into APSR without a bitmask
2135         was deprecated. Therefore use APSR_nzcvq instead, this generates the same
2136         instruction encoding.
2137
2138         * assembler/MacroAssemblerARMv7.cpp:
2139
2140 2019-02-28  Tadeu Zagallo  <tzagallo@apple.com>
2141
2142         Remove CachedPtr::m_isEmpty and CachedOptional::m_isEmpty fields
2143         https://bugs.webkit.org/show_bug.cgi?id=194999
2144
2145         Reviewed by Saam Barati.
2146
2147         These fields are unnecessary, since we can just check that m_offset
2148         has not been initialized (I added VariableLengthObject::isEmpty for
2149         that). They also add 7-byte padding to these classes, which is pretty
2150         bad given how frequently CachedPtr is used.
2151
2152         * runtime/CachedTypes.cpp:
2153         (JSC::CachedObject::operator new[]):
2154         (JSC::VariableLengthObject::allocate):
2155         (JSC::VariableLengthObject::isEmpty const):
2156         (JSC::CachedPtr::encode):
2157         (JSC::CachedPtr::decode const):
2158         (JSC::CachedPtr::get const):
2159         (JSC::CachedOptional::encode):
2160         (JSC::CachedOptional::decode const):
2161         (JSC::CachedOptional::decodeAsPtr const):
2162
2163 2019-02-28  Yusuke Suzuki  <ysuzuki@apple.com>
2164
2165         [JSC] sizeof(JSString) should be 16
2166         https://bugs.webkit.org/show_bug.cgi?id=194375
2167
2168         Reviewed by Saam Barati.
2169
2170         This patch reduces sizeof(JSString) from 24 to 16 to fit it into GC heap cell atom. And it also reduces sizeof(JSRopeString) from 48 to 32.
2171         Both classes cut 16 bytes per instance in GC allocation. This new layout is used in 64bit architectures which has little endianess.
2172
2173         JSString no longer has length and flags directly. JSString has String, and we query information to this String instead of holding duplicate
2174         information in JSString. We embed isRope bit into this String's pointer so that we can convert JSRopeString to JSString in an atomic manner.
2175         We emit store-store fence before we put String pointer. This should exist even before this patch, so this patch also fixes one concurrency issue.
2176
2177         The old JSRopeString separately had JSString* fibers along with String. In this patch, we merge the first JSString* fiber and String pointer
2178         storage into one to reduce the size of JSRopeString. JSRopeString has three pointer width storage. We pick 48bit effective address of JSString*
2179         fibers to compress three fibers + length + flags into three pointer width storage.
2180
2181         In 64bit architecture, JSString and JSRopeString have the following memory layout to make sizeof(JSString) == 16 and sizeof(JSRopeString) == 32.
2182         JSString has only one pointer. We use it for String. length() and is8Bit() queries go to StringImpl. In JSRopeString, we reuse the above pointer
2183         place for the 1st fiber. JSRopeString has three fibers so its size is 48. To keep length and is8Bit flag information in JSRopeString, JSRopeString
2184         encodes these information into the fiber pointers. is8Bit flag is encoded in the 1st fiber pointer. length is embedded directly, and two fibers
2185         are compressed into 12bytes. isRope information is encoded in the first fiber's LSB.
2186
2187         Since length of JSRopeString should be frequently accessed compared to each fiber, we put length in contiguous 32byte field, and compress 2nd
2188         and 3rd fibers into the following 80byte fields. One problem is that now 2nd and 3rd fibers are split. Storing and loading 2nd and 3rd fibers
2189         are not one pointer load operation. To make concurrent collector work correctly, we must initialize 2nd and 3rd fibers at JSRopeString creation
2190         and we must not modify these part later.
2191
2192                      0                        8        10               16                       32                                     48
2193         JSString     [   ID      ][  header  ][   String pointer      0]
2194         JSRopeString [   ID      ][  header  ][ flags ][ 1st fiber    1][  length  ][2nd lower32][2nd upper16][3rd lower16][3rd upper32]
2195                                                                       ^
2196                                                                    isRope bit
2197
2198         Since fibers in JSRopeString are not initialized in atomic pointer store manner, we must initialize all the fiber fields at JSRopeString creation.
2199         To achieve this, we modify our JSRopeString::RopeBuilder implementation not to create half-baked JSRopeString.
2200
2201         This patch also makes an empty JSString singleton per VM. This makes evaluation of JSString in boolean context one pointer comparison. This is
2202         critical in this change since this patch enlarges the code necessary to get length from JSString in JIT. Without this guarantee, our code of boolean
2203         context evaluation is bloated. This patch hides all the JSString::create and JSRopeString::create in the private permission. JSString and JSRopeString
2204         creation is only allowed from jsString and related helper functions and they return a singleton empty JSString if the length is zero. We also change
2205         JSRopeString::RopeBuilder not to construct an empty JSRopeString.
2206
2207         This patch is performance neutral in Speedometer2 and JetStream2. And it improves RAMification by 2.7%.
2208
2209         * JavaScriptCore.xcodeproj/project.pbxproj:
2210         * assembler/MacroAssemblerARM64.h:
2211         (JSC::MacroAssemblerARM64::storeZero16):
2212         * assembler/MacroAssemblerX86Common.h:
2213         (JSC::MacroAssemblerX86Common::storeZero16):
2214         (JSC::MacroAssemblerX86Common::store16):
2215         * bytecode/AccessCase.cpp:
2216         (JSC::AccessCase::generateImpl):
2217         * bytecode/InlineAccess.cpp:
2218         (JSC::InlineAccess::dumpCacheSizesAndCrash):
2219         (JSC::linkCodeInline):
2220         (JSC::InlineAccess::isCacheableStringLength):
2221         (JSC::InlineAccess::generateStringLength):
2222         * bytecode/InlineAccess.h:
2223         (JSC::InlineAccess::sizeForPropertyAccess):
2224         (JSC::InlineAccess::sizeForPropertyReplace):
2225         (JSC::InlineAccess::sizeForLengthAccess):
2226         * dfg/DFGOperations.cpp:
2227         * dfg/DFGOperations.h:
2228         * dfg/DFGSpeculativeJIT.cpp:
2229         (JSC::DFG::SpeculativeJIT::compileStringSlice):
2230         (JSC::DFG::SpeculativeJIT::compileToLowerCase):
2231         (JSC::DFG::SpeculativeJIT::compileGetCharCodeAt):
2232         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
2233         (JSC::DFG::SpeculativeJIT::compileStringEquality):
2234         (JSC::DFG::SpeculativeJIT::compileStringZeroLength):
2235         (JSC::DFG::SpeculativeJIT::compileLogicalNotStringOrOther):
2236         (JSC::DFG::SpeculativeJIT::emitStringBranch):
2237         (JSC::DFG::SpeculativeJIT::emitStringOrOtherBranch):
2238         (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage):
2239         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
2240         (JSC::DFG::SpeculativeJIT::emitPopulateSliceIndex):
2241         (JSC::DFG::SpeculativeJIT::compileArraySlice):
2242         (JSC::DFG::SpeculativeJIT::compileArrayIndexOf):
2243         (JSC::DFG::SpeculativeJIT::speculateStringIdentAndLoadStorage):
2244         (JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
2245         (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
2246         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
2247         * dfg/DFGSpeculativeJIT.h:
2248         * dfg/DFGSpeculativeJIT32_64.cpp:
2249         (JSC::DFG::SpeculativeJIT::compile):
2250         (JSC::DFG::SpeculativeJIT::compileMakeRope):
2251         * dfg/DFGSpeculativeJIT64.cpp:
2252         (JSC::DFG::SpeculativeJIT::compile):
2253         (JSC::DFG::SpeculativeJIT::compileMakeRope):
2254         * ftl/FTLAbstractHeapRepository.cpp:
2255         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
2256         * ftl/FTLAbstractHeapRepository.h:
2257         * ftl/FTLLowerDFGToB3.cpp:
2258         (JSC::FTL::DFG::LowerDFGToB3::compileGetIndexedPropertyStorage):
2259         (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength):
2260         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
2261         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharAt):
2262         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharCodeAt):
2263         (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
2264         (JSC::FTL::DFG::LowerDFGToB3::compileStringToUntypedStrictEquality):
2265         (JSC::FTL::DFG::LowerDFGToB3::compileSwitch):
2266         (JSC::FTL::DFG::LowerDFGToB3::mapHashString):
2267         (JSC::FTL::DFG::LowerDFGToB3::compileMapHash):
2268         (JSC::FTL::DFG::LowerDFGToB3::compileHasOwnProperty):
2269         (JSC::FTL::DFG::LowerDFGToB3::compileStringSlice):
2270         (JSC::FTL::DFG::LowerDFGToB3::compileToLowerCase):
2271         (JSC::FTL::DFG::LowerDFGToB3::stringsEqual):
2272         (JSC::FTL::DFG::LowerDFGToB3::boolify):
2273         (JSC::FTL::DFG::LowerDFGToB3::switchString):
2274         (JSC::FTL::DFG::LowerDFGToB3::isRopeString):
2275         (JSC::FTL::DFG::LowerDFGToB3::isNotRopeString):
2276         (JSC::FTL::DFG::LowerDFGToB3::speculateStringIdent):
2277         * jit/AssemblyHelpers.cpp:
2278         (JSC::AssemblyHelpers::emitConvertValueToBoolean):
2279         (JSC::AssemblyHelpers::branchIfValue):
2280         * jit/AssemblyHelpers.h:
2281         (JSC::AssemblyHelpers::branchIfRopeStringImpl):
2282         (JSC::AssemblyHelpers::branchIfNotRopeStringImpl):
2283         * jit/JITInlines.h:
2284         (JSC::JIT::emitLoadCharacterString):
2285         * jit/Repatch.cpp:
2286         (JSC::tryCacheGetByID):
2287         * jit/ThunkGenerators.cpp:
2288         (JSC::stringGetByValGenerator):
2289         (JSC::stringCharLoad):
2290         * llint/LowLevelInterpreter.asm:
2291         * llint/LowLevelInterpreter32_64.asm:
2292         * llint/LowLevelInterpreter64.asm:
2293         * runtime/JSString.cpp:
2294         (JSC::JSString::createEmptyString):
2295         (JSC::JSRopeString::RopeBuilder<RecordOverflow>::expand):
2296         (JSC::JSString::dumpToStream):
2297         (JSC::JSString::estimatedSize):
2298         (JSC::JSString::visitChildren):
2299         (JSC::JSRopeString::resolveRopeInternal8 const):
2300         (JSC::JSRopeString::resolveRopeInternal8NoSubstring const):
2301         (JSC::JSRopeString::resolveRopeInternal16 const):
2302         (JSC::JSRopeString::resolveRopeInternal16NoSubstring const):
2303         (JSC::JSRopeString::resolveRopeToAtomicString const):
2304         (JSC::JSRopeString::convertToNonRope const):
2305         (JSC::JSRopeString::resolveRopeToExistingAtomicString const):
2306         (JSC::JSRopeString::resolveRopeWithFunction const):
2307         (JSC::JSRopeString::resolveRope const):
2308         (JSC::JSRopeString::resolveRopeSlowCase8 const):
2309         (JSC::JSRopeString::resolveRopeSlowCase const):
2310         (JSC::JSRopeString::outOfMemory const):
2311         (JSC::JSRopeString::visitFibers): Deleted.
2312         (JSC::JSRopeString::clearFibers const): Deleted.
2313         * runtime/JSString.h:
2314         (JSC::JSString::uninitializedValueInternal const):
2315         (JSC::JSString::valueInternal const):
2316         (JSC::JSString::JSString):
2317         (JSC::JSString::finishCreation):
2318         (JSC::JSString::create):
2319         (JSC::JSString::offsetOfValue):
2320         (JSC::JSString::isRope const):
2321         (JSC::JSString::is8Bit const):
2322         (JSC::JSString::length const):
2323         (JSC::JSString::tryGetValueImpl const):
2324         (JSC::JSString::toAtomicString const):
2325         (JSC::JSString::toExistingAtomicString const):
2326         (JSC::JSString::value const):
2327         (JSC::JSString::tryGetValue const):
2328         (JSC::JSRopeString::unsafeView const):
2329         (JSC::JSRopeString::viewWithUnderlyingString const):
2330         (JSC::JSString::unsafeView const):
2331         (JSC::JSString::viewWithUnderlyingString const):
2332         (JSC::JSString::offsetOfLength): Deleted.
2333         (JSC::JSString::offsetOfFlags): Deleted.
2334         (JSC::JSString::setIs8Bit const): Deleted.
2335         (JSC::JSString::setLength): Deleted.
2336         (JSC::JSString::string): Deleted.
2337         (JSC::jsStringBuilder): Deleted.
2338         * runtime/JSStringInlines.h:
2339         (JSC::JSString::~JSString):
2340         (JSC::JSString::equal const):
2341         * runtime/ObjectPrototype.cpp:
2342         (JSC::objectProtoFuncToString):
2343         * runtime/RegExpMatchesArray.h:
2344         (JSC::createRegExpMatchesArray):
2345         * runtime/RegExpObjectInlines.h:
2346         (JSC::collectMatches):
2347         * runtime/RegExpPrototype.cpp:
2348         (JSC::regExpProtoFuncSplitFast):
2349         * runtime/SmallStrings.cpp:
2350         (JSC::SmallStrings::initializeCommonStrings):
2351         (JSC::SmallStrings::createEmptyString): Deleted.
2352         * runtime/SmallStrings.h:
2353         * runtime/StringPrototype.cpp:
2354         (JSC::stringProtoFuncSlice):
2355         * runtime/StringPrototypeInlines.h: Added.
2356         (JSC::stringSlice):
2357
2358 2019-02-28  Saam barati  <sbarati@apple.com>
2359
2360         Unreviewed. Attempt windows build fix after r242239.
2361
2362         * runtime/CachedTypes.cpp:
2363         (JSC::tagFromSourceCodeType):
2364
2365 2019-02-28  Mark Lam  <mark.lam@apple.com>
2366
2367         In cloop.rb, rename :int and :uint to :intptr and :uintptr.
2368         https://bugs.webkit.org/show_bug.cgi?id=195183
2369
2370         Reviewed by Yusuke Suzuki.
2371
2372         Also changed intMemRef and uintMemRef to intptrMemRef and uintptrMemRef respectively.
2373
2374         * offlineasm/cloop.rb:
2375
2376 2019-02-28  Saam barati  <sbarati@apple.com>
2377
2378         Make JSScript:cacheBytecodeWithError update the cache when the script changes
2379         https://bugs.webkit.org/show_bug.cgi?id=194912
2380
2381         Reviewed by Mark Lam.
2382
2383         Prior to this patch, the JSScript SPI would never check if its cached
2384         bytecode were still valid. This would lead the cacheBytecodeWithError
2385         succeeding even if the underlying cache were stale. This patch fixes
2386         that by making JSScript check if the cache is still valid. If it's not,
2387         we will cache bytecode when cacheBytecodeWithError is invoked.
2388
2389         * API/JSScript.mm:
2390         (-[JSScript readCache]):
2391         (-[JSScript writeCache:]):
2392         * API/tests/testapi.mm:
2393         (testBytecodeCacheWithSameCacheFileAndDifferentScript):
2394         (testObjectiveCAPI):
2395         * runtime/CachedTypes.cpp:
2396         (JSC::Decoder::Decoder):
2397         (JSC::VariableLengthObject::buffer const):
2398         (JSC::CachedPtr::decode const):
2399         (JSC::tagFromSourceCodeType):
2400         (JSC::GenericCacheEntry::isUpToDate const):
2401         (JSC::CacheEntry::isStillValid const):
2402         (JSC::GenericCacheEntry::decode const):
2403         (JSC::GenericCacheEntry::isStillValid const):
2404         (JSC::encodeCodeBlock):
2405         (JSC::decodeCodeBlockImpl):
2406         (JSC::isCachedBytecodeStillValid):
2407         * runtime/CachedTypes.h:
2408         * runtime/CodeCache.cpp:
2409         (JSC::sourceCodeKeyForSerializedBytecode):
2410         (JSC::sourceCodeKeyForSerializedProgram):
2411         (JSC::sourceCodeKeyForSerializedModule):
2412         (JSC::serializeBytecode):
2413         * runtime/CodeCache.h:
2414         (JSC::CodeCacheMap::fetchFromDiskImpl):
2415         * runtime/Completion.cpp:
2416         (JSC::generateProgramBytecode):
2417         (JSC::generateBytecode): Deleted.
2418         * runtime/Completion.h:
2419
2420 2019-02-28  Mark Lam  <mark.lam@apple.com>
2421
2422         cloop.rb shift mask should depend on the word size being shifted.
2423         https://bugs.webkit.org/show_bug.cgi?id=195181
2424         <rdar://problem/48484164>
2425
2426         Reviewed by Yusuke Suzuki.
2427
2428         Previously, we're always masking the shift amount with 0x1f.  This is only correct
2429         for 32-bit words.  For 64-bit words, the mask should be 0x3f.  For pointer sized
2430         shifts, the mask depends on sizeof(uintptr_t).
2431
2432         * offlineasm/cloop.rb:
2433
2434 2019-02-28  Justin Fan  <justin_fan@apple.com>
2435
2436         [Web GPU] Enable Web GPU only on 64-bit
2437         https://bugs.webkit.org/show_bug.cgi?id=195139
2438
2439         Because Metal is only supported on 64 bit apps.
2440
2441         Unreviewed build fix.
2442
2443         * Configurations/FeatureDefines.xcconfig:
2444
2445 2019-02-27  Mark Lam  <mark.lam@apple.com>
2446
2447         The parser is failing to record the token location of new in new.target.
2448         https://bugs.webkit.org/show_bug.cgi?id=195127
2449         <rdar://problem/39645578>
2450
2451         Reviewed by Yusuke Suzuki.
2452
2453         Also adjust the token location for the following to be as shown:
2454
2455             new.target
2456             ^
2457             super
2458             ^
2459             import.meta
2460             ^
2461
2462         * parser/Parser.cpp:
2463         (JSC::Parser<LexerType>::parseMemberExpression):
2464
2465 2019-02-27  Yusuke Suzuki  <ysuzuki@apple.com>
2466
2467         [JSC] mustHandleValues for dead bytecode locals should be ignored in DFG phases
2468         https://bugs.webkit.org/show_bug.cgi?id=195144
2469         <rdar://problem/47595961>
2470
2471         Reviewed by Mark Lam.
2472
2473         DFGMaximalFlushInsertionPhase inserts Flush for all the locals at the end of basic blocks. This enlarges the live ranges of
2474         locals in DFG, and it sometimes makes DFG value live while it is dead in bytecode. The issue happens when we use mustHandleValues
2475         to widen AbstractValue in CFAPhase. At that time, DFG tells "this value is live in DFG", but it may be dead in the bytecode level.
2476         At that time, we attempt to merge AbstractValue with dead mustHandleValue, which is cleared as jsUndefined() in
2477         DFG::Plan::cleanMustHandleValuesIfNecessary before start compilation, and crash because jsUndefined() may be irrelevant to the FlushFormat
2478         in VariableAccessData.
2479
2480         This patch makes the type of mustHandleValues Operands<Optional<JSValue>>. We clear dead JSValues in DFG::Plan::cleanMustHandleValuesIfNecessary.
2481         And we skip handling dead mustHandleValue in DFG phases.
2482
2483         * bytecode/Operands.h:
2484         (JSC::Operands::isLocal const):
2485         (JSC::Operands::isVariable const): Deleted.
2486         * dfg/DFGCFAPhase.cpp:
2487         (JSC::DFG::CFAPhase::injectOSR):
2488         * dfg/DFGDriver.cpp:
2489         (JSC::DFG::compileImpl):
2490         (JSC::DFG::compile):
2491         * dfg/DFGDriver.h:
2492         * dfg/DFGJITCode.cpp:
2493         (JSC::DFG::JITCode::reconstruct):
2494         * dfg/DFGJITCode.h:
2495         * dfg/DFGOperations.cpp:
2496         * dfg/DFGPlan.cpp:
2497         (JSC::DFG::Plan::Plan):
2498         (JSC::DFG::Plan::checkLivenessAndVisitChildren):
2499         (JSC::DFG::Plan::cleanMustHandleValuesIfNecessary):
2500         * dfg/DFGPlan.h:
2501         (JSC::DFG::Plan::mustHandleValues const):
2502         * dfg/DFGPredictionInjectionPhase.cpp:
2503         (JSC::DFG::PredictionInjectionPhase::run):
2504         * dfg/DFGTypeCheckHoistingPhase.cpp:
2505         (JSC::DFG::TypeCheckHoistingPhase::disableHoistingAcrossOSREntries):
2506         * ftl/FTLOSREntry.cpp:
2507         (JSC::FTL::prepareOSREntry):
2508         * jit/JITOperations.cpp:
2509
2510 2019-02-27  Simon Fraser  <simon.fraser@apple.com>
2511
2512         Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
2513
2514         * bytecode/CodeBlock.cpp:
2515         (JSC::CodeBlock::nameForRegister):
2516
2517 2019-02-27  Robin Morisset  <rmorisset@apple.com>
2518
2519         DFG: Loop-invariant code motion (LICM) should not hoist dead code
2520         https://bugs.webkit.org/show_bug.cgi?id=194945
2521         <rdar://problem/48311657>
2522
2523         Reviewed by Saam Barati.
2524
2525         * dfg/DFGLICMPhase.cpp:
2526         (JSC::DFG::LICMPhase::run):
2527
2528 2019-02-27  Antoine Quint  <graouts@apple.com>
2529
2530         Support Pointer Events on macOS
2531         https://bugs.webkit.org/show_bug.cgi?id=195008
2532         <rdar://problem/47454419>
2533
2534         Reviewed by Dean Jackson.
2535
2536         * Configurations/FeatureDefines.xcconfig:
2537
2538 2019-02-26  Mark Lam  <mark.lam@apple.com>
2539
2540         Remove poisons in JSCPoison and uses of them.
2541         https://bugs.webkit.org/show_bug.cgi?id=195082
2542
2543         Reviewed by Yusuke Suzuki.
2544
2545         Also removed unused poisoning code in WriteBarrier, AssemblyHelpers,
2546         DFG::SpeculativeJIT, FTLLowerDFGToB3, and FTL::Output.
2547
2548         * API/JSAPIWrapperObject.h:
2549         (JSC::JSAPIWrapperObject::wrappedObject):
2550         * API/JSCallbackFunction.h:
2551         * API/JSCallbackObject.h:
2552         * API/glib/JSAPIWrapperGlobalObject.h:
2553         * CMakeLists.txt:
2554         * JavaScriptCore.xcodeproj/project.pbxproj:
2555         * Sources.txt:
2556         * bytecode/AccessCase.cpp:
2557         (JSC::AccessCase::generateWithGuard):
2558         * dfg/DFGSpeculativeJIT.cpp:
2559         (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments):
2560         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
2561         (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon):
2562         (JSC::DFG::SpeculativeJIT::compileGetExecutable):
2563         (JSC::DFG::SpeculativeJIT::compileCreateThis):
2564         * dfg/DFGSpeculativeJIT.h:
2565         (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPoisonedPointer): Deleted.
2566         * ftl/FTLLowerDFGToB3.cpp:
2567         (JSC::FTL::DFG::LowerDFGToB3::compileGetExecutable):
2568         (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength):
2569         (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal):
2570         (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction):
2571         (JSC::FTL::DFG::LowerDFGToB3::weakPointer):
2572         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoison): Deleted.
2573         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnLoadedType): Deleted.
2574         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnType): Deleted.
2575         (JSC::FTL::DFG::LowerDFGToB3::weakPoisonedPointer): Deleted.
2576         * ftl/FTLOutput.h:
2577         (JSC::FTL::Output::weakPoisonedPointer): Deleted.
2578         * jit/AssemblyHelpers.cpp:
2579         (JSC::AssemblyHelpers::emitDynamicPoison): Deleted.
2580         (JSC::AssemblyHelpers::emitDynamicPoisonOnLoadedType): Deleted.
2581         (JSC::AssemblyHelpers::emitDynamicPoisonOnType): Deleted.
2582         * jit/AssemblyHelpers.h:
2583         * jit/JITOpcodes.cpp:
2584         (JSC::JIT::emit_op_create_this):
2585         * jit/JITPropertyAccess.cpp:
2586         (JSC::JIT::emitScopedArgumentsGetByVal):
2587         * jit/Repatch.cpp:
2588         (JSC::linkPolymorphicCall):
2589         * jit/ThunkGenerators.cpp:
2590         (JSC::virtualThunkFor):
2591         (JSC::nativeForGenerator):
2592         (JSC::boundThisNoArgsFunctionCallGenerator):
2593         * parser/UnlinkedSourceCode.h:
2594         * runtime/ArrayPrototype.h:
2595         * runtime/CustomGetterSetter.h:
2596         (JSC::CustomGetterSetter::getter const):
2597         (JSC::CustomGetterSetter::setter const):
2598         * runtime/InitializeThreading.cpp:
2599         (JSC::initializeThreading):
2600         * runtime/InternalFunction.cpp:
2601         (JSC::InternalFunction::getCallData):
2602         (JSC::InternalFunction::getConstructData):
2603         * runtime/InternalFunction.h:
2604         (JSC::InternalFunction::nativeFunctionFor):
2605         * runtime/JSArrayBuffer.h:
2606         * runtime/JSBoundFunction.h:
2607         * runtime/JSCPoison.cpp: Removed.
2608         * runtime/JSCPoison.h: Removed.
2609         * runtime/JSFunction.h:
2610         * runtime/JSGlobalObject.h:
2611         * runtime/JSScriptFetchParameters.h:
2612         * runtime/JSScriptFetcher.h:
2613         * runtime/JSString.h:
2614         * runtime/NativeExecutable.cpp:
2615         (JSC::NativeExecutable::hashFor const):
2616         * runtime/NativeExecutable.h:
2617         * runtime/Options.h:
2618         * runtime/ScopedArguments.h:
2619         * runtime/Structure.cpp:
2620         (JSC::StructureTransitionTable::setSingleTransition):
2621         * runtime/StructureTransitionTable.h:
2622         (JSC::StructureTransitionTable::map const):
2623         (JSC::StructureTransitionTable::weakImpl const):
2624         (JSC::StructureTransitionTable::setMap):
2625         * runtime/WriteBarrier.h:
2626         * wasm/WasmB3IRGenerator.cpp:
2627         * wasm/WasmInstance.h:
2628         * wasm/js/JSToWasm.cpp:
2629         (JSC::Wasm::createJSToWasmWrapper):
2630         * wasm/js/JSWebAssemblyCodeBlock.h:
2631         * wasm/js/JSWebAssemblyInstance.cpp:
2632         (JSC::JSWebAssemblyInstance::JSWebAssemblyInstance):
2633         (JSC::JSWebAssemblyInstance::visitChildren):
2634         * wasm/js/JSWebAssemblyInstance.h:
2635         * wasm/js/JSWebAssemblyMemory.h:
2636         * wasm/js/JSWebAssemblyModule.h:
2637         * wasm/js/JSWebAssemblyTable.cpp:
2638         (JSC::JSWebAssemblyTable::JSWebAssemblyTable):
2639         (JSC::JSWebAssemblyTable::grow):
2640         (JSC::JSWebAssemblyTable::clearFunction):
2641         * wasm/js/JSWebAssemblyTable.h:
2642         * wasm/js/WasmToJS.cpp:
2643         (JSC::Wasm::materializeImportJSCell):
2644         (JSC::Wasm::handleBadI64Use):
2645         (JSC::Wasm::wasmToJS):
2646         * wasm/js/WebAssemblyFunctionBase.h:
2647         * wasm/js/WebAssemblyModuleRecord.cpp:
2648         (JSC::WebAssemblyModuleRecord::link):
2649         (JSC::WebAssemblyModuleRecord::evaluate):
2650         * wasm/js/WebAssemblyModuleRecord.h:
2651         * wasm/js/WebAssemblyToJSCallee.h:
2652         * wasm/js/WebAssemblyWrapperFunction.h:
2653
2654 2019-02-26  Mark Lam  <mark.lam@apple.com>
2655
2656         wasmToJS() should purify incoming NaNs.
2657         https://bugs.webkit.org/show_bug.cgi?id=194807
2658         <rdar://problem/48189132>
2659
2660         Reviewed by Saam Barati.
2661
2662         * runtime/JSCJSValue.h:
2663         (JSC::jsNumber):
2664         * runtime/TypedArrayAdaptors.h:
2665         (JSC::IntegralTypedArrayAdaptor::toJSValue):
2666         * wasm/js/WasmToJS.cpp:
2667         (JSC::Wasm::wasmToJS):
2668
2669 2019-02-26  Dominik Infuehr  <dinfuehr@igalia.com>
2670
2671         Fix warnings on ARM and MIPS
2672         https://bugs.webkit.org/show_bug.cgi?id=195049
2673
2674         Reviewed by Mark Lam.
2675
2676         Fix all warnings on ARM and MIPS.
2677
2678         * assembler/MacroAssemblerPrinter.cpp:
2679         (JSC::Printer::printMemory):
2680         * assembler/testmasm.cpp:
2681         (JSC::testProbeModifiesStackValues):
2682         * bytecode/InByIdStatus.cpp:
2683         (JSC::InByIdStatus::computeFor):
2684         * runtime/CachedTypes.cpp:
2685         (JSC::VariableLengthObject::buffer const):
2686         * runtime/JSBigInt.h:
2687         * tools/JSDollarVM.cpp:
2688         (JSC::codeBlockFromArg):
2689
2690 2019-02-26  Mark Lam  <mark.lam@apple.com>
2691
2692         Misc cleanup in StructureIDTable after r242096.
2693         https://bugs.webkit.org/show_bug.cgi?id=195063
2694
2695         Reviewed by Saam Barati.
2696
2697         * runtime/StructureIDTable.cpp:
2698         (JSC::StructureIDTable::allocateID):
2699         - RELEASE_ASSERT that the StructureID allocation will succeed.
2700
2701         * runtime/StructureIDTable.h:
2702         (JSC::StructureIDTable::decode):
2703         (JSC::StructureIDTable::encode):
2704         - Add back a comment that Yusuke requested but was lost when the patch was rolled
2705           out and relanded.
2706         - Applied bitwise_casts that Saam requested.
2707
2708 2019-02-26  Mark Lam  <mark.lam@apple.com>
2709
2710         Gardening: 32-bit build fix after r242096.
2711         https://bugs.webkit.org/show_bug.cgi?id=194989
2712
2713         Not reviewed.
2714
2715         * jit/AssemblyHelpers.cpp:
2716         (JSC::AssemblyHelpers::emitLoadStructure):
2717
2718 2019-02-26  Mark Lam  <mark.lam@apple.com>
2719
2720         Unpoison MacroAssemblerCodePtr, ClassInfo pointers, and a few other things.
2721         https://bugs.webkit.org/show_bug.cgi?id=195039
2722
2723         Reviewed by Saam Barati.
2724
2725         1. Unpoison MacroAssemblerCodePtrs, ReturnAddressPtr.
2726         2. Replace PoisonedClassInfoPtr with ClassInfo*.
2727         3. Replace PoisonedMasmPtr with const void*.
2728         4. Remove all references to CodeBlockPoison, JITCodePoison, and GlobalDataPoison.
2729
2730         * API/JSCallbackObject.h:
2731         * API/JSObjectRef.cpp:
2732         (classInfoPrivate):
2733         * assembler/MacroAssemblerCodeRef.h:
2734         (JSC::FunctionPtr::FunctionPtr):
2735         (JSC::FunctionPtr::executableAddress const):
2736         (JSC::FunctionPtr::retaggedExecutableAddress const):
2737         (JSC::ReturnAddressPtr::ReturnAddressPtr):
2738         (JSC::ReturnAddressPtr::value const):
2739         (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr):
2740         (JSC::MacroAssemblerCodePtr::createFromExecutableAddress):
2741         (JSC::MacroAssemblerCodePtr:: const):
2742         (JSC::MacroAssemblerCodePtr::operator! const):
2743         (JSC::MacroAssemblerCodePtr::operator== const):
2744         (JSC::MacroAssemblerCodePtr::hash const):
2745         (JSC::MacroAssemblerCodePtr::emptyValue):
2746         (JSC::MacroAssemblerCodePtr::deletedValue):
2747         (JSC::FunctionPtr<tag>::FunctionPtr):
2748         (JSC::MacroAssemblerCodePtr::poisonedPtr const): Deleted.
2749         * b3/B3LowerMacros.cpp:
2750         * b3/testb3.cpp:
2751         (JSC::B3::testInterpreter):
2752         * dfg/DFGOSRExitCompilerCommon.h:
2753         (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk):
2754         * dfg/DFGSpeculativeJIT.cpp:
2755         (JSC::DFG::SpeculativeJIT::compileCheckSubClass):
2756         (JSC::DFG::SpeculativeJIT::compileNewStringObject):
2757         (JSC::DFG::SpeculativeJIT::emitSwitchIntJump):
2758         (JSC::DFG::SpeculativeJIT::emitSwitchImm):
2759         (JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
2760         (JSC::DFG::SpeculativeJIT::emitSwitchChar):
2761         * dfg/DFGSpeculativeJIT.h:
2762         * ftl/FTLLowerDFGToB3.cpp:
2763         (JSC::FTL::DFG::LowerDFGToB3::compileNewStringObject):
2764         (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass):
2765         * jit/AssemblyHelpers.h:
2766         (JSC::AssemblyHelpers::emitAllocateDestructibleObject):
2767         * jit/ThunkGenerators.cpp:
2768         (JSC::virtualThunkFor):
2769         (JSC::boundThisNoArgsFunctionCallGenerator):
2770         * runtime/JSCPoison.h:
2771         * runtime/JSDestructibleObject.h:
2772         (JSC::JSDestructibleObject::classInfo const):
2773         * runtime/JSSegmentedVariableObject.h:
2774         (JSC::JSSegmentedVariableObject::classInfo const):
2775         * runtime/Structure.h:
2776         * runtime/VM.h:
2777         * wasm/WasmB3IRGenerator.cpp:
2778         (JSC::Wasm::B3IRGenerator::addCall):
2779         (JSC::Wasm::B3IRGenerator::addCallIndirect):
2780         * wasm/WasmBinding.cpp:
2781         (JSC::Wasm::wasmToWasm):
2782
2783 2019-02-26  Mark Lam  <mark.lam@apple.com>
2784
2785         [Re-landing] Add some randomness into the StructureID.
2786         https://bugs.webkit.org/show_bug.cgi?id=194989
2787         <rdar://problem/47975563>
2788
2789         Reviewed by Yusuke Suzuki.
2790
2791         1. On 64-bit, the StructureID will now be encoded as:
2792
2793             ----------------------------------------------------------------
2794             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
2795             ----------------------------------------------------------------
2796
2797            The entropy bits are chosen at random and assigned when a StructureID is
2798            allocated.
2799
2800         2. Instead of Structure pointers, the StructureIDTable will now contain
2801            encodedStructureBits, which is encoded as such:
2802
2803             ----------------------------------------------------------------
2804             | 7 entropy bits |                   57 structure pointer bits |
2805             ----------------------------------------------------------------
2806
2807            The entropy bits here are the same 7 bits used in the encoding of the
2808            StructureID for this structure entry in the StructureIDTable.
2809
2810         3. Retrieval of the structure pointer given a StructureID is now computed as
2811            follows:
2812
2813                 index = structureID >> 7; // with arithmetic shift.
2814                 encodedStructureBits = structureIDTable[index];
2815                 structure = encodedStructureBits ^ (structureID << 57);
2816
2817             We use an arithmetic shift for the right shift because that will preserve
2818             the nuke bit in the high bit of the index if the StructureID was not
2819             decontaminated before use as expected.
2820
2821         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
2822
2823         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
2824            instead of always being the same as m_capacity.
2825
2826         6. Change StructureIDTable::s_unusedID's value to 0.
2827
2828            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
2829            StructureID on 64-bit.  Also, there was never any code that initializes unused
2830            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
2831            is the ID we'll get when the freelist is empty, prompting a resize of the
2832            structureIDTable.
2833
2834         This patch appears to be perf neutral on JetStream 2 run via the cli on a
2835         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
2836
2837         * ftl/FTLLowerDFGToB3.cpp:
2838         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
2839         * heap/SlotVisitor.cpp:
2840         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
2841         * jit/AssemblyHelpers.cpp:
2842         (JSC::AssemblyHelpers::emitLoadStructure):
2843         * jit/AssemblyHelpers.h:
2844         * jit/SpecializedThunkJIT.h:
2845         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
2846         * llint/LowLevelInterpreter.asm:
2847         * llint/LowLevelInterpreter64.asm:
2848         * runtime/StructureIDTable.cpp:
2849         (JSC::StructureIDTable::StructureIDTable):
2850         (JSC::StructureIDTable::makeFreeListFromRange):
2851         (JSC::StructureIDTable::resize):
2852         (JSC::StructureIDTable::allocateID):
2853         (JSC::StructureIDTable::deallocateID):
2854         * runtime/StructureIDTable.h:
2855         (JSC::StructureIDTable::decode):
2856         (JSC::StructureIDTable::encode):
2857         (JSC::StructureIDTable::get):
2858         (JSC::StructureIDTable::isValid):
2859
2860 2019-02-26  Ryan Haddad  <ryanhaddad@apple.com>
2861
2862         Unreviewed, rolling out r242071.
2863
2864         Breaks internal builds.
2865
2866         Reverted changeset:
2867
2868         "Add some randomness into the StructureID."
2869         https://bugs.webkit.org/show_bug.cgi?id=194989
2870         https://trac.webkit.org/changeset/242071
2871
2872 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
2873
2874         [JSC] Fix compilation on 32-bit platforms after r242071
2875         https://bugs.webkit.org/show_bug.cgi?id=195042
2876
2877         Reviewed by Carlos Garcia Campos.
2878
2879         * jit/AssemblyHelpers.cpp:
2880         (JSC::AssemblyHelpers::emitLoadStructure):
2881
2882 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
2883
2884         [JSC] Repeat string created from Array.prototype.join() take too much memory
2885         https://bugs.webkit.org/show_bug.cgi?id=193912
2886
2887         Reviewed by Saam Barati.
2888
2889         Added a fast case in Array.prototype.join when the array is
2890         uninitialized.
2891
2892         * runtime/ArrayPrototype.cpp:
2893         (JSC::canUseFastJoin):
2894         (JSC::fastJoin):
2895         * runtime/JSStringInlines.h:
2896         (JSC::repeatCharacter): moved from StringPrototype.cpp
2897         * runtime/StringPrototype.cpp:
2898
2899 2019-02-25  Mark Lam  <mark.lam@apple.com>
2900
2901         Add some randomness into the StructureID.
2902         https://bugs.webkit.org/show_bug.cgi?id=194989
2903         <rdar://problem/47975563>
2904
2905         Reviewed by Yusuke Suzuki.
2906
2907         1. On 64-bit, the StructureID will now be encoded as:
2908
2909             ----------------------------------------------------------------
2910             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
2911             ----------------------------------------------------------------
2912
2913            The entropy bits are chosen at random and assigned when a StructureID is
2914            allocated.
2915
2916         2. Instead of Structure pointers, the StructureIDTable will now contain
2917            encodedStructureBits, which is encoded as such:
2918
2919             ----------------------------------------------------------------
2920             | 7 entropy bits |                   57 structure pointer bits |
2921             ----------------------------------------------------------------
2922
2923            The entropy bits here are the same 7 bits used in the encoding of the
2924            StructureID for this structure entry in the StructureIDTable.
2925
2926         3. Retrieval of the structure pointer given a StructureID is now computed as
2927            follows:
2928
2929                 index = structureID >> 7; // with arithmetic shift.
2930                 encodedStructureBits = structureIDTable[index];
2931                 structure = encodedStructureBits ^ (structureID << 57);
2932
2933             We use an arithmetic shift for the right shift because that will preserve
2934             the nuke bit in the high bit of the index if the StructureID was not
2935             decontaminated before use as expected.
2936
2937         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
2938
2939         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
2940            instead of always being the same as m_capacity.
2941
2942         6. Change StructureIDTable::s_unusedID's value to 0.
2943
2944            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
2945            StructureID on 64-bit.  Also, there was never any code that initializes unused
2946            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
2947            is the ID we'll get when the freelist is empty, prompting a resize of the
2948            structureIDTable.
2949
2950         This patch appears to be perf neutral on JetStream 2 run via the cli on a
2951         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
2952
2953         * ftl/FTLLowerDFGToB3.cpp:
2954         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
2955         * heap/SlotVisitor.cpp:
2956         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
2957         * jit/AssemblyHelpers.cpp:
2958         (JSC::AssemblyHelpers::emitLoadStructure):
2959         * jit/AssemblyHelpers.h:
2960         * jit/SpecializedThunkJIT.h:
2961         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
2962         * llint/LowLevelInterpreter.asm:
2963         * llint/LowLevelInterpreter64.asm:
2964         * runtime/StructureIDTable.cpp:
2965         (JSC::StructureIDTable::StructureIDTable):
2966         (JSC::StructureIDTable::makeFreeListFromRange):
2967         (JSC::StructureIDTable::resize):
2968         (JSC::StructureIDTable::allocateID):
2969         (JSC::StructureIDTable::deallocateID):
2970         * runtime/StructureIDTable.h:
2971         (JSC::StructureIDTable::decode):
2972         (JSC::StructureIDTable::encode):
2973         (JSC::StructureIDTable::get):
2974         (JSC::StructureIDTable::isValid):
2975
2976 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
2977
2978         [JSC] Revert r226885 to make SlotVisitor creation lazy
2979         https://bugs.webkit.org/show_bug.cgi?id=195013
2980
2981         Reviewed by Saam Barati.
2982
2983         We once changed SlotVisitor creation apriori to drop the lock. Also, it turns out that SlotVisitor is memory-consuming.
2984         We should defer SlotVisitor creation until it is actually required. This patch reverts r226885. Even with this patch,
2985         we still hold many SlotVisitors after we execute many parallel markers at least once. But recovering the feature of
2986         dynamically allocating SlotVisitors helps further memory optimizations in this area.
2987
2988         * heap/Heap.cpp:
2989         (JSC::Heap::Heap):
2990         (JSC::Heap::runBeginPhase):
2991         * heap/Heap.h:
2992         * heap/HeapInlines.h:
2993         (JSC::Heap::forEachSlotVisitor):
2994         (JSC::Heap::numberOfSlotVisitors):
2995         * heap/MarkingConstraintSolver.cpp:
2996         (JSC::MarkingConstraintSolver::didVisitSomething const):
2997         * heap/SlotVisitor.h:
2998
2999 2019-02-25  Saam Barati  <sbarati@apple.com>
3000
3001         testb3 and testair should test O0/O1/O2
3002         https://bugs.webkit.org/show_bug.cgi?id=194637
3003
3004         Reviewed by Mark Lam.
3005
3006         This patch makes it so that we run all tests in testair and testb3
3007         in O0, O1, and O2. However, some tests are invalid for O0 and O1.
3008         This patch makes it so we only run those tests in O2. These are
3009         often tests that assert certain optimizations have occurred. There
3010         are also a class of tests that rely on using patchpoints to stress 
3011         the register allocator into only a single valid allocation. The
3012         O0, and sometimes O1, register allocators are not always good enough
3013         to allocate such programs. To make these valid allocators to use, we rely
3014         on the FTL and Wasm to not emit such patchpoints.
3015
3016         * b3/air/testair.cpp:
3017         (main):
3018         * b3/testb3.cpp:
3019         (JSC::B3::compileProc):
3020         (JSC::B3::testAddLoadTwice):
3021         (JSC::B3::testMulLoadTwice):
3022         (JSC::B3::testSimplePatchpointWithOuputClobbersGPArgs):
3023         (JSC::B3::testSimplePatchpointWithOuputClobbersFPArgs):
3024         (JSC::B3::testPatchpointWithEarlyClobber):
3025         (JSC::B3::testSimpleCheck):
3026         (JSC::B3::testCheckFalse):
3027         (JSC::B3::testCheckTrue):
3028         (JSC::B3::testCheckLessThan):
3029         (JSC::B3::testCheckMegaCombo):
3030         (JSC::B3::testCheckTrickyMegaCombo):
3031         (JSC::B3::testCheckTwoMegaCombos):
3032         (JSC::B3::testCheckTwoNonRedundantMegaCombos):
3033         (JSC::B3::testCheckAddImm):
3034         (JSC::B3::testCheckAddImmCommute):
3035         (JSC::B3::testCheckAddImmSomeRegister):
3036         (JSC::B3::testCheckAdd):
3037         (JSC::B3::testCheckAdd64):
3038         (JSC::B3::testCheckAddFold):
3039         (JSC::B3::testCheckAddFoldFail):
3040         (JSC::B3::testCheckAddSelfOverflow64):
3041         (JSC::B3::testCheckAddSelfOverflow32):
3042         (JSC::B3::testCheckSubImm):
3043         (JSC::B3::testCheckSubBadImm):
3044         (JSC::B3::testCheckSub):
3045         (JSC::B3::testCheckSub64):
3046         (JSC::B3::testCheckSubFold):
3047         (JSC::B3::testCheckSubFoldFail):
3048         (JSC::B3::testCheckNeg):
3049         (JSC::B3::testCheckNeg64):
3050         (JSC::B3::testCheckMul):
3051         (JSC::B3::testCheckMulMemory):
3052         (JSC::B3::testCheckMul2):
3053         (JSC::B3::testCheckMul64):
3054         (JSC::B3::testCheckMulFold):
3055         (JSC::B3::testCheckMulFoldFail):
3056         (JSC::B3::testCheckMul64SShr):
3057         (JSC::B3::testLinearScanWithCalleeOnStack):
3058         (JSC::B3::testCheckSelect):
3059         (JSC::B3::testCheckSelectCheckSelect):
3060         (JSC::B3::testCheckSelectAndCSE):
3061         (JSC::B3::testLateRegister):
3062         (JSC::B3::testReduceStrengthCheckBottomUseInAnotherBlock):
3063         (JSC::B3::testSomeEarlyRegister):
3064         (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled2):
3065         (JSC::B3::testPinRegisters):
3066         (JSC::B3::testX86LeaAddAddShlLeft):
3067         (JSC::B3::testX86LeaAddAddShlRight):
3068         (JSC::B3::testX86LeaAddAdd):
3069         (JSC::B3::testX86LeaAddShlRight):
3070         (JSC::B3::testX86LeaAddShlLeftScale1):
3071         (JSC::B3::testX86LeaAddShlLeftScale2):
3072         (JSC::B3::testX86LeaAddShlLeftScale4):
3073         (JSC::B3::testX86LeaAddShlLeftScale8):
3074         (JSC::B3::testLoadBaseIndexShift2):
3075         (JSC::B3::testOptimizeMaterialization):
3076         (JSC::B3::testLICMPure):
3077         (JSC::B3::testLICMPureSideExits):
3078         (JSC::B3::testLICMPureWritesPinned):
3079         (JSC::B3::testLICMPureWrites):
3080         (JSC::B3::testLICMReadsPinned):
3081         (JSC::B3::testLICMReads):
3082         (JSC::B3::testLICMPureNotBackwardsDominant):
3083         (JSC::B3::testLICMPureNotBackwardsDominantFoiledByChild):
3084         (JSC::B3::testLICMControlDependent):
3085         (JSC::B3::testLICMControlDependentNotBackwardsDominant):
3086         (JSC::B3::testLICMReadsWritesDifferentHeaps):
3087         (JSC::B3::testWasmBoundsCheck):
3088         (JSC::B3::run):
3089         (main):
3090
3091 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
3092
3093         [JSC] stress/function-constructor-reading-from-global-lexical-environment.js fails in 32bit arch
3094         https://bugs.webkit.org/show_bug.cgi?id=195030
3095         <rdar://problem/48385088>
3096
3097         Reviewed by Saam Barati.
3098
3099         While LLInt64 has checkTDZInGlobalPutToScopeIfNecessary for op_put_to_scope GlobalLexicalVar to check the value in the variable slot is not empty,
3100         this check is missing in LLInt32_64. Previously, this check was subsumed accidentally by the WatchpointSet check in GlobalLexicalVar in `notifyWrite`:
3101         because no "put" attempt succeeds here, the status WatchpointSet was ClearWatchpoint, we always go to the slow path, and we always throw the TDZ error
3102         before configuring the WatchpointSet in the slow path. But after r241862, WatchpointSet is not used under non-JIT configuration. This skips WatchpointSet
3103         check and LLInt32_64 starts failing tests because of lack of checkTDZInGlobalPutToScopeIfNecessary. This patch adds checkTDZInGlobalPutToScopeIfNecessary
3104         in LLInt32_64 too. This patch fixes the following four failing tests.
3105
3106             stress/function-constructor-reading-from-global-lexical-environment.js.bytecode-cache
3107             stress/function-constructor-reading-from-global-lexical-environment.js.default
3108             stress/global-lexical-variable-tdz.js.bytecode-cache
3109             stress/global-lexical-variable-tdz.js.default
3110
3111         * llint/LowLevelInterpreter32_64.asm:
3112
3113 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
3114
3115         [JSC] Make Intl fields lazily-allocated
3116         https://bugs.webkit.org/show_bug.cgi?id=195022
3117
3118         Reviewed by Mark Lam.
3119
3120         This patch makes the following memory footprint optimization in IntlObject.
3121
3122         1. Make IntlObject fields including Intl.Collator lazily-allocated because we already removed direct references from JS builtins to these constructors (@Collator etc.).
3123
3124         2. Move LazyProperty<IntlObject, Structure> structures from IntlObject to JSGlobalObject. This makes sizeof(IntlObject) the same to the other ones of usual runtime Objects,
3125            and drop one MarkedBlock.
3126
3127         * runtime/IntlCollatorConstructor.h:
3128         * runtime/IntlDateTimeFormatConstructor.h:
3129         * runtime/IntlNumberFormatConstructor.h:
3130         * runtime/IntlObject.cpp:
3131         (JSC::createCollatorConstructor):
3132         (JSC::createNumberFormatConstructor):
3133         (JSC::createDateTimeFormatConstructor):
3134         (JSC::createPluralRulesConstructor):
3135         (JSC::IntlObject::finishCreation):
3136         (JSC::IntlObject::visitChildren): Deleted.
3137         * runtime/IntlObject.h:
3138         * runtime/IntlPluralRulesConstructor.h:
3139         * runtime/JSGlobalObject.cpp:
3140         (JSC::JSGlobalObject::init):
3141         (JSC::JSGlobalObject::visitChildren):
3142         (JSC::JSGlobalObject::defaultCollator):
3143         * runtime/JSGlobalObject.h:
3144         (JSC::JSGlobalObject::collatorStructure):
3145         (JSC::JSGlobalObject::numberFormatStructure):
3146         (JSC::JSGlobalObject::dateTimeFormatStructure):
3147         (JSC::JSGlobalObject::pluralRulesStructure):
3148         (JSC::JSGlobalObject::intlObject const): Deleted.
3149         * runtime/JSGlobalObjectFunctions.cpp:
3150         (JSC::globalFuncDateTimeFormat):
3151         * runtime/NumberPrototype.cpp:
3152         (JSC::numberProtoFuncToLocaleString):
3153         * runtime/StringPrototype.cpp:
3154         (JSC::stringProtoFuncLocaleCompare):
3155
3156 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
3157
3158         Avoid hashing CompactVariableEnvironment when decoding CompactVariableMap::Handle
3159         https://bugs.webkit.org/show_bug.cgi?id=194937
3160
3161         Reviewed by Saam Barati.
3162
3163         Hashing the CompactVariableEnvironment is expensive and we could avoid it
3164         when decoding multiple handles to the same environment. This is sound because
3165         a pointer to the same CompactVariableEnvironment will hash the same.
3166
3167         * runtime/CachedTypes.cpp:
3168         (JSC::Decoder::handleForEnvironment const):
3169         (JSC::Decoder::setHandleForEnvironment):
3170         (JSC::CachedCompactVariableMapHandle::decode const):
3171
3172 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
3173
3174         Remove unnecessary WTF:: prefixes in CachedTypes
3175         https://bugs.webkit.org/show_bug.cgi?id=194936
3176
3177         Reviewed by Saam Barati.
3178
3179         Cleanup unnecessary prefixes from Optional, roundUpToMultipleOf and
3180         pageSize.
3181
3182         * runtime/CachedTypes.cpp:
3183         (JSC::Encoder::cachedOffsetForPtr):
3184         (JSC::Encoder::Page::malloc):
3185         (JSC::Encoder::allocateNewPage):
3186         (JSC::CachedPtr::encode):
3187         (JSC::CachedPtr::decode const):
3188         (JSC::CachedOptional::encode):
3189         (JSC::CachedOptional::decode const):
3190
3191 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
3192
3193         [JSC] Drop direct references to Intl constructors by rewriting Intl JS builtins in C++
3194         https://bugs.webkit.org/show_bug.cgi?id=194976
3195
3196         Reviewed by Michael Saboff.
3197
3198         This patch paves the way to making IntlObject allocation lazy by removing direct references
3199         to Intl constructors (Intl.Collator etc.) from builtin JS. To achieve that,
3200
3201         1. We implement String.prototype.toLocaleCompare and Number.prototype.toLocaleString in C++
3202            instead of JS builtins. Since these functions end up calling ICU C++ runtime, writing them in
3203            JS does not offer performance improvement.
3204
3205         2. We remove @DateTimeFormat constructor reference, and instead, exposing @dateTimeFormat function,
3206            which returns formatted string directly. We still have JS builtins for DateTimeFormat things
3207            because the initialization of its "options" JSObject involves many get_by_id / put_by_id things,
3208            which are efficient in JS. But we avoid exposing @DateTimeFormat directly, so that Intl constructors
3209            can be lazily allocated.
3210
3211         * CMakeLists.txt:
3212         * DerivedSources-input.xcfilelist:
3213         * DerivedSources.make:
3214         * JavaScriptCore.xcodeproj/project.pbxproj:
3215         * builtins/BuiltinNames.h:
3216         * builtins/DatePrototype.js:
3217         (toLocaleString):
3218         (toLocaleDateString):
3219         (toLocaleTimeString):
3220         * builtins/NumberPrototype.js: Removed.
3221         * builtins/StringPrototype.js:
3222         (intrinsic.StringPrototypeReplaceIntrinsic.replace):
3223         (globalPrivate.getDefaultCollator): Deleted.
3224         * runtime/JSGlobalObject.cpp:
3225         (JSC::JSGlobalObject::init):
3226         (JSC::JSGlobalObject::visitChildren):
3227         (JSC::JSGlobalObject::defaultCollator):
3228         * runtime/JSGlobalObject.h:
3229         * runtime/JSGlobalObjectFunctions.cpp:
3230         (JSC::globalFuncDateTimeFormat):
3231         * runtime/JSGlobalObjectFunctions.h:
3232         * runtime/NumberPrototype.cpp:
3233         (JSC::NumberPrototype::finishCreation):
3234         (JSC::throwVMToThisNumberError):
3235         (JSC::numberProtoFuncToExponential):
3236         (JSC::numberProtoFuncToFixed):
3237         (JSC::numberProtoFuncToPrecision):
3238         (JSC::numberProtoFuncToString):
3239         (JSC::numberProtoFuncToLocaleString):
3240         (JSC::numberProtoFuncValueOf):
3241         * runtime/StringPrototype.cpp:
3242         (JSC::StringPrototype::finishCreation):
3243         (JSC::stringProtoFuncLocaleCompare):
3244
3245 2019-02-24  Devin Rousso  <drousso@apple.com>
3246
3247         Web Inspector: Change the InspectorOverlay to use native rather than canvas
3248         https://bugs.webkit.org/show_bug.cgi?id=105023
3249         <rdar://problem/13443692>
3250
3251         Reviewed by Brian Burg.
3252
3253         * inspector/protocol/OverlayTypes.json: Removed.
3254         Now that the overlay is entirely generated in C++, we no longer need the special prototol
3255         types for transferring data to a JavaScript context.
3256
3257         * inspector/protocol/Debugger.json:
3258         * inspector/agents/InspectorDebuggerAgent.h:
3259         * inspector/agents/InspectorDebuggerAgent.cpp:
3260         (Inspector::InspectorDebuggerAgent::setOverlayMessage): Deleted.
3261         Remove `Debugger.setOverlayMessage` command as it hasn't been used and is no longer supported.
3262
3263         * CMakeLists.txt:
3264         * DerivedSources-input.xcfilelist:
3265         * DerivedSources.make:
3266
3267 2019-02-24  Yusuke Suzuki  <ysuzuki@apple.com>
3268
3269         [JSC] Lazily create sentinel Map and Set buckets
3270         https://bugs.webkit.org/show_bug.cgi?id=194975
3271
3272         Reviewed by Saam Barati.
3273
3274         If VM::canUseJIT() returns false, we can lazily initialize sentinel Map and Set buckets.
3275         This patch adds getters to VM which lazily allocate these buckets. We eagerly initialize
3276         them if VM::canUseJIT() returns true since they can be touched from DFG and FTL.
3277
3278         * bytecode/BytecodeIntrinsicRegistry.cpp:
3279         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
3280         (JSC::BytecodeIntrinsicRegistry::sentinelMapBucketValue):
3281         (JSC::BytecodeIntrinsicRegistry::sentinelSetBucketValue):
3282         * bytecode/BytecodeIntrinsicRegistry.h:
3283         * dfg/DFGByteCodeParser.cpp:
3284         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
3285         * dfg/DFGOperations.cpp:
3286         * dfg/DFGSpeculativeJIT.cpp:
3287         (JSC::DFG::SpeculativeJIT::compileGetMapBucketNext):
3288         * dfg/DFGSpeculativeJIT64.cpp:
3289         (JSC::DFG::SpeculativeJIT::compile):
3290         * ftl/FTLLowerDFGToB3.cpp:
3291         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucket):
3292         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucketNext):
3293         * runtime/MapConstructor.cpp:
3294         (JSC::mapPrivateFuncMapBucketNext):
3295         * runtime/SetConstructor.cpp:
3296         (JSC::setPrivateFuncSetBucketNext):
3297         * runtime/VM.cpp:
3298         (JSC::VM::VM):
3299         (JSC::VM::sentinelSetBucketSlow):
3300         (JSC::VM::sentinelMapBucketSlow):
3301         * runtime/VM.h:
3302         (JSC::VM::sentinelSetBucket):
3303         (JSC::VM::sentinelMapBucket):
3304
3305 2019-02-20  Darin Adler  <darin@apple.com>
3306
3307         Finish removing String::format
3308         https://bugs.webkit.org/show_bug.cgi?id=194893
3309
3310         Reviewed by Daniel Bates.
3311
3312         * bytecode/CodeBlock.cpp:
3313         (JSC::CodeBlock::nameForRegister): Use makeString instead of String::format,
3314         using the new "pad" function.
3315
3316 2019-02-23  Robin Morisset  <rmorisset@apple.com>
3317
3318         Remove dead code: AdjacencyList::justOneChild()
3319         https://bugs.webkit.org/show_bug.cgi?id=194965
3320
3321         Reviewed by Sam Weinig.
3322
3323         * dfg/DFGAdjacencyList.h:
3324         (JSC::DFG::AdjacencyList::justOneChild const): Deleted.
3325
3326 2019-02-23  Michael Catanzaro  <mcatanzaro@igalia.com>
3327
3328         Unreviewed, fix -Wunused-param warning
3329
3330         * jsc.cpp:
3331
3332 2019-02-23  Mark Lam  <mark.lam@apple.com>
3333
3334         Add an exception check and some assertions in StringPrototype.cpp.
3335         https://bugs.webkit.org/show_bug.cgi?id=194962
3336         <rdar://problem/48013416>
3337
3338         Reviewed by Yusuke Suzuki and Saam Barati.
3339
3340         * runtime/StringPrototype.cpp:
3341         (JSC::jsSpliceSubstrings):
3342         (JSC::jsSpliceSubstringsWithSeparators):
3343         (JSC::operationStringProtoFuncReplaceRegExpEmptyStr):
3344
3345 2019-02-23  Keith Miller  <keith_miller@apple.com>
3346
3347         Add new mac target numbers
3348         https://bugs.webkit.org/show_bug.cgi?id=194955
3349
3350         Reviewed by Tim Horton.
3351
3352         * Configurations/Base.xcconfig:
3353         * Configurations/DebugRelease.xcconfig:
3354
3355 2019-02-22  Robin Morisset  <rmorisset@apple.com>
3356
3357         DFGBytecodeParser should not declare that a node won't clobberExit if DFGFixupPhase can later declare it does clobberExit
3358         https://bugs.webkit.org/show_bug.cgi?id=194953
3359         <rdar://problem/47595253>
3360
3361         Reviewed by Saam Barati.
3362
3363         For each node that
3364         (a) may or may not clobberExit depending on their arrayMode
3365         (b) and get their arrayMode from profiling information in DFGBytecodeParser
3366         (c) and can have their arrayMode refined by DFGFixupPhase,
3367         We must make sure to be conservative in the DFGBytecodeParser and treat it as if it unconditionnally clobbered the exit.
3368         Otherwise we will hit a validation failure after fixup if the next node was marked ExitValid and exits to the same semantic origin.
3369
3370         The list of nodes that fit (a) is:
3371         - StringCharAt
3372         - HasIndexProperty
3373         - GetByVal
3374         - PutByValDirect
3375         - PutByVal
3376         - PutByValAlias
3377         - GetIndexedPropertyStorage
3378
3379         Out of these, the following also fit (b) and (c):
3380         - HasIndexedProperty
3381         - GetByVal
3382         - PutByValDirect
3383         - PutByVal
3384
3385         GetByVal already had "m_exitOK = false; // GetByVal must be treated as if it clobbers exit state, since FixupPhase may make it generic."
3386         So we just have to fix the other three the same way.
3387
3388         * dfg/DFGByteCodeParser.cpp:
3389         (JSC::DFG::ByteCodeParser::parseBlock):
3390         (JSC::DFG::ByteCodeParser::handlePutByVal):
3391
3392 2019-02-22  Robin Morisset  <rmorisset@apple.com>
3393
3394         B3ReduceStrength: missing peephole optimizations for binary operations
3395         https://bugs.webkit.org/show_bug.cgi?id=194252
3396
3397         Reviewed by Saam Barati.
3398
3399         Adds several sets of optimizations for BitAnd, BitOr and BitXor.
3400         Using BitAnd distributivity over BitOr and BitXor:
3401           Turn any of these (for Op == BitOr || Op == BitXor):
3402                 Op(BitAnd(x1, x2), BitAnd(x1, x3))
3403                 Op(BitAnd(x2, x1), BitAnd(x1, x3))
3404                 Op(BitAnd(x1, x2), BitAnd(x3, x1))
3405                 Op(BitAnd(x2, x1), BitAnd(x3, x1))
3406            Into this: BitAnd(Op(x2, x3), x1)
3407            And any of these:
3408                 Op(BitAnd(x1, x2), x1)
3409                 Op(BitAnd(x2, x1), x1)
3410                 Op(x1, BitAnd(x1, x2))
3411                 Op(x1, BitAnd(x2, x1))
3412            Into this: BitAnd(Op(x2, x1), x1)
3413            This second set is equivalent to doing x1 => BitAnd(x1, x1), and then applying the first set.
3414         Using de Morgan laws (we represent not as BitXor with allOnes):
3415           BitAnd(BitXor(x1, allOnes), BitXor(x2, allOnes)) => BitXor(BitOr(x1, x2), allOnes)
3416           BitOr(BitXor(x1, allOnes), BitXor(x2, allOnes) => BitXor(BitAnd(x1, x2), allOnes)
3417           BitOr(BitXor(x, allOnes), c) => BitXor(BitAnd(x, ~c), allOnes)
3418           BitAnd(BitXor(x, allOnes), c) => BitXor(BitOr(x, ~c), allOnes)
3419         The latter two are equivalent to doing c => BitXor(~c, allOnes), and then applying the former two.
3420
3421         All of these transformations either reduce the number of operations (which we always do when possible), or bring the expression closer to having:
3422           - BitXor with all ones at the outermost
3423           - then BitAnd
3424           - then other BitXor
3425           - then BitOr at the innermost.
3426         These transformations that don't directly reduce the number of operations are still useful for normalization (helping things like CSE), and also can enable
3427         more optimizations (for example BitXor with all ones can easily cancel each other once they are all at the outermost level).
3428
3429         * b3/B3ReduceStrength.cpp:
3430         * b3/testb3.cpp:
3431         (JSC::B3::testBitAndNotNot):
3432         (JSC::B3::testBitAndNotImm):
3433         (JSC::B3::testBitOrAndAndArgs):
3434         (JSC::B3::testBitOrAndSameArgs):
3435         (JSC::B3::testBitOrNotNot):
3436         (JSC::B3::testBitOrNotImm):
3437         (JSC::B3::testBitXorAndAndArgs):
3438         (JSC::B3::testBitXorAndSameArgs):
3439         (JSC::B3::run):
3440
3441 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
3442
3443         [JSC] putNonEnumerable in JSWrapperMap is too costly
3444         https://bugs.webkit.org/show_bug.cgi?id=194935
3445
3446         Reviewed by Mark Lam.
3447
3448         When we convert Objective-C blocks to JS objects, we need to set up a corresponding function object correctly.
3449         During this allocation, we call [JSValue defineProperty:descriptor] to connect a "prototype" object and "constructor" object.
3450         The problem is that this API has a particularly costly implementation:
3451
3452             [[_context globalObject][@"Object"] invokeMethod:@"defineProperty" withArguments:@[ self, key, descriptor ]];
3453
3454         This wraps each JS objects appear in this code with Objective-C wrapper. And we convert a NSDictionary to JSObject, which
3455         has "writable", "enumerable", "configurable", "value" fields, and call the "defineProperty" JS function through Objective-C wrapper.
3456         This allocates many Objective-C wrappers and JS objects for descriptors. Since JSC has a direct C++ API "defineOwnProperty", we should
3457         bypass these Objective-C APIs and call JSC's code directly.
3458
3459         This patch changes `putNonEnumerable` implementation, from calling [JSValue defineProperty:descriptor] to calling JSC C++ code directly.
3460         We do not change [JSValue defineProperty:descriptor] implementation for now because of two reasons. (1) This is not used in our benchmarks
3461         except for this (converting an Objective-C block to a JS object) one path. And (2) even if we were to re-write [JSValue defineProperty:descriptor]
3462         to be more optimized, we would still want to call the JSC C++ version of defineProperty directly here to avoid NSDictionary allocation for a descriptor.
3463
3464         * API/APIUtils.h:
3465         (setException):
3466         * API/JSWrapperMap.mm:
3467         (putNonEnumerable):
3468         (copyMethodsToObject):
3469         (-[JSObjCClassInfo allocateConstructorAndPrototypeInContext:]):
3470         (-[JSObjCClassInfo wrapperForObject:inContext:]):
3471
3472 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
3473
3474         Unreviewed, build fix after r241954
3475         https://bugs.webkit.org/show_bug.cgi?id=194939
3476
3477         Renaming setCanAccessHeap was incomplete.
3478
3479         * runtime/SmallStrings.cpp:
3480         (JSC::SmallStrings::initializeCommonStrings):
3481         * runtime/VM.cpp:
3482         (JSC::VM::~VM):
3483
3484 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
3485
3486         [JSC] SmallStringsStorage is unnecessary
3487         https://bugs.webkit.org/show_bug.cgi?id=194939
3488
3489         Reviewed by Mark Lam.
3490
3491         SmallStrings hold common small JSStrings. Their underlying StringImpl is also held by SmallStringsStorage.
3492         But it is duplicate since we can get StringImpl from small JSStrings. This patch removes SmallStringsStorage,
3493         and get StringImpls from JSStrings if necessary.
3494
3495         We also add m_canAccessHeap flag to SmallStrings. At the time of VM destruction, JSStrings are destroyed when
3496         VM's Heap is finalized. We must not touch JSStrings before VM's heap (and JSStrings in SmallStrings) is initialized,
3497         and after VM's Heap is destroyed. We add this m_canAccessHeap flag to allow users to get StringImpl during the
3498         this sensitive period. If m_canAccessHeap is false, we get StringImpl from AtomicStringImpl::add.
3499
3500         * runtime/SmallStrings.cpp:
3501         (JSC::SmallStrings::initializeCommonStrings):
3502         (JSC::SmallStrings::singleCharacterStringRep):
3503         (JSC::SmallStringsStorage::rep): Deleted.
3504         (JSC::SmallStringsStorage::SmallStringsStorage): Deleted.
3505         (JSC::SmallStrings::createSingleCharacterString): Deleted.
3506         * runtime/SmallStrings.h:
3507         (JSC::SmallStrings::setCanAccessHeap):
3508         * runtime/VM.cpp:
3509         (JSC::VM::VM):
3510         (JSC::VM::~VM):
3511
3512 2019-02-22  Tadeu Zagallo  <tzagallo@apple.com>
3513
3514         Cache CompactVariableMap::Handle instead of VariableEnvironment for UnlinkedFunctionExecutable
3515         https://bugs.webkit.org/show_bug.cgi?id=194706
3516
3517         Reviewed by Saam Barati.
3518
3519         In https://bugs.webkit.org/show_bug.cgi?id=194583 we started using a
3520         CompactVariableMap::Handle instead of VariableEnvironment for
3521         UnlinkedFunctionExecutables, but we were creating the full environment
3522         to encode the executable in the bytecode cache. This patch changes it so
3523         that we cache the handle instead of the environment. This avoids duplicating
3524         the VariableEnvironment whenever we have to cache two handles that point
3525         to the environment.
3526
3527         * bytecode/UnlinkedFunctionExecutable.h:
3528         * parser/VariableEnvironment.cpp:
3529         (JSC::CompactVariableMap::get):
3530         * parser/VariableEnvironment.h:
3531         * runtime/CachedTypes.cpp:
3532         (JSC::CachedCompactVariableEnvironment::encode):
3533         (JSC::CachedCompactVariableEnvironment::decode const):
3534         (JSC::CachedCompactVariableMapHandle::encode):
3535         (JSC::CachedCompactVariableMapHandle::decode const):
3536         (JSC::CachedFunctionExecutable::encode):
3537         (JSC::CachedFunctionExecutable::decode const):
3538         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
3539
3540 2019-02-21  Saam Barati  <sbarati@apple.com>
3541
3542         Update JSScript SPI based on feedback
3543         https://bugs.webkit.org/show_bug.cgi?id=194517
3544
3545         Reviewed by Keith Miller.
3546
3547         This patch updates the JSScript SPI in the following ways:
3548         - JSScript can now represent both modules and programs. This is a property
3549         of the script determined during creation.
3550         - JSScript now takes a sourceURL during construction. For modules, this acts
3551         as the module identifier.
3552         - JSScript now has SPI for writing the cache out to disk. We don't do this
3553         automatically.
3554         - JSScript will load the bytecode cache on creation if it exists.
3555         - We retrofit these new requirements on the prior JSScript SPI that
3556         we're going to remove as soon as we can: https://bugs.webkit.org/show_bug.cgi?id=194909.
3557         Previous SPI assumes all JSScripts are modules. Previous SPI also assigns
3558         a sourceURL to the JSScript based on what the module loader decided the
3559         identifier should be. We'll remove this once we remove the old SPI.
3560         
3561         This patch also adds SPI to JSContext to evaluate a JSScript. For modules,
3562         this is like returning the result of doing dynamic import. For programs,
3563         this does normal program evaluation.
3564         
3565         This patch also fixes a bug in generateBytecode/generateModuleBytecode where
3566         we would try to cache the bytecode even if recursivelyGenerateUnlinkedCodeBlock
3567         returned null. E.g, if the script had a syntax error.
3568         
3569         When writing tests, I also discovered that someone previously broke
3570         testapi. This patch also fixes those failures. They were broken when
3571         we switched to using a testapiScripts directory to hold our test .js
3572         scripts. 
3573
3574         * API/JSAPIGlobalObject.h:
3575         * API/JSAPIGlobalObject.mm:
3576         (JSC::JSAPIGlobalObject::moduleLoaderResolve):
3577         (JSC::JSAPIGlobalObject::moduleLoaderFetch):
3578         (JSC::JSAPIGlobalObject::loadAndEvaluateJSScriptModule):
3579         * API/JSBase.cpp:
3580         (JSEvaluateScriptInternal):
3581         (JSEvaluateScript):
3582         * API/JSBaseInternal.h: Added.
3583         * API/JSContext.mm:
3584         (-[JSContext evaluateScript:withSourceURL:]):
3585         (-[JSContext evaluateJSScript:]):
3586         * API/JSContextPrivate.h:
3587         * API/JSScript.h:
3588         * API/JSScript.mm:
3589         (+[JSScript scriptWithSource:inVirtualMachine:]):
3590         (+[JSScript scriptFromASCIIFile:inVirtualMachine:withCodeSigning:andBytecodeCache:]):
3591         (createError):
3592         (+[JSScript scriptOfType:inVirtualMachine:withSourceURL:andSource:andBytecodeCache:error:]):
3593         (+[JSScript scriptOfType:inVirtualMachine:memoryMappedFromASCIIFile:withSourceURL:andBytecodeCache:error:]):
3594         (-[JSScript cacheBytecodeWithError:]):
3595         (-[JSScript sourceURL]):
3596         (-[JSScript type]):
3597         (-[JSScript jsSourceCode]):
3598         (-[JSScript writeCache:]):
3599         (-[JSScript setSourceURL:]):
3600         (-[JSScript forceRecreateJSSourceCode]):
3601         (-[JSScript writeCache]): Deleted.
3602         (-[JSScript jsSourceCode:]): Deleted.
3603         * API/JSScriptInternal.h:
3604         * API/tests/FunctionOverridesTest.cpp:
3605         (testFunctionOverrides):
3606         * API/tests/testapi.c:
3607         (main):
3608         * API/tests/testapi.mm:
3609         (tempFile):
3610         (testModuleBytecodeCache):
3611         (testProgramBytecodeCache):
3612         (testBytecodeCacheWithSyntaxError):
3613         (testProgramJSScriptException):
3614         (testLoadBasicFileLegacySPI):
3615         (+[JSContextMemoryMappedLoaderDelegate newContext]):
3616         (-[JSContextMemoryMappedLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
3617         (testLoadBasicFile):
3618         (+[JSContextAugmentedLoaderDelegate newContext]):
3619         (-[JSContextAugmentedLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
3620         (testJSScriptURL):
3621         (testObjectiveCAPI):
3622         (testBytecodeCache): Deleted.
3623         * API/tests/testapiScripts/foo.js: Added.
3624         * JavaScriptCore.xcodeproj/project.pbxproj:
3625         * runtime/Completion.cpp:
3626         (JSC::generateBytecode):
3627         (JSC::generateModuleBytecode):
3628
3629 2019-02-21  Mark Lam  <mark.lam@apple.com>
3630
3631         Add more doesGC() assertions.
3632         https://bugs.webkit.org/show_bug.cgi?id=194911
3633         <rdar://problem/48285723>
3634
3635         Reviewed by Saam Barati and Yusuke Suzuki.
3636
3637         * dfg/DFGOSRExit.cpp:
3638         (JSC::DFG::OSRExit::compileOSRExit):
3639         - Set expectDoesGC here because we no longer have to worry about missing store
3640           barriers in optimized code after this point.  This will prevent false positive
3641           assertion failures arising from functions called beneath compileOSRExit().
3642
3643         (JSC::DFG::OSRExit::compileExit):
3644         - Add a comment to explain why the generated ramp needs to set expectDoesGC even
3645           though compileOSRExit() also sets it.  Reason: compileOSRExit() is only called
3646           for the first OSR from this code origin, the generated ramp is called for many
3647           subsequents OSR exits from this code origin.
3648
3649         * ftl/FTLOSRExitCompiler.cpp:
3650         (JSC::FTL::compileStub):
3651         - Added a comment for the equivalent reason to the one above.
3652
3653         (JSC::FTL::compileFTLOSRExit):
3654         - Set expectDoesGC here because we no longer have to worry about missing store
3655           barriers in optimized code after this point.  This will prevent false positive
3656           assertion failures arising from functions called beneath compileFTLOSRExit().
3657
3658         * heap/CompleteSubspace.cpp:
3659         (JSC::CompleteSubspace::tryAllocateSlow):
3660         * heap/CompleteSubspaceInlines.h:
3661         (JSC::CompleteSubspace::allocateNonVirtual):
3662         - assert expectDoesGC.
3663
3664         * heap/DeferGC.h:
3665         (JSC::DeferGC::~DeferGC):
3666         - assert expectDoesGC.
3667         - Also added WTF_FORBID_HEAP_ALLOCATION to DeferGC, DeferGCForAWhile, and DisallowGC
3668           because all 3 should be stack allocated RAII objects.
3669
3670         * heap/GCDeferralContext.h:
3671         * heap/GCDeferralContextInlines.h:
3672         (JSC::GCDeferralContext::~GCDeferralContext):
3673         - Added WTF_FORBID_HEAP_ALLOCATION.
3674         - assert expectDoesGC.
3675
3676         * heap/Heap.cpp:
3677         (JSC::Heap::collectNow):
3678         (JSC::Heap::collectAsync):
3679         (JSC::Heap::collectSync):
3680         (JSC::Heap::stopIfNecessarySlow):
3681         (JSC::Heap::collectIfNecessaryOrDefer):
3682         * heap/HeapInlines.h:
3683         (JSC::Heap::acquireAccess):
3684         (JSC::Heap::stopIfNecessary):
3685         * heap/LargeAllocation.cpp:
3686         (JSC::LargeAllocation::tryCreate):
3687         * heap/LocalAllocatorInlines.h:
3688         (JSC::LocalAllocator::allocate):
3689         - conservatively assert expectDoesGC on these functions that may trigger a GC
3690           though they don't always do.
3691
3692         * runtime/DisallowScope.h:
3693         - DisallowScope should be stack allocated because it's an RAII object.
3694
3695         * runtime/JSCellInlines.h:
3696         (JSC::tryAllocateCellHelper):
3697         - Remove the expectDoesGC assertion because it is now covered by assertions in
3698           CompleteSubspace, LargeAllocation, and LocalAllocator.
3699
3700         * runtime/RegExpMatchesArray.h:
3701         (JSC::createRegExpMatchesArray):
3702         - assert expectDoesGC.
3703
3704 2019-02-21  Yusuke Suzuki  <ysuzuki@apple.com>
3705
3706         [JSC] Use Fast Malloc as much as possible
3707         https://bugs.webkit.org/show_bug.cgi?id=194316
3708
3709         Reviewed by Mark Lam.
3710
3711         We should use Fast Malloc as much as possible to offer the whole memory view to bmalloc.
3712
3713         * inspector/scripts/codegen/cpp_generator_templates.py:
3714         * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
3715         * inspector/scripts/tests/generic/expected/enum-values.json-result:
3716         * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
3717         * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
3718         * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
3719         * jit/ExecutableAllocator.h:
3720         * jsc.cpp:
3721         * runtime/JSRunLoopTimer.h:
3722         * tools/VMInspector.h:
3723         * wasm/WasmThunks.h:
3724
3725 2019-02-20  Yusuke Suzuki  <ysuzuki@apple.com>
3726
3727         [JSC] Remove WatchpointSet creation for SymbolTable entries if VM::canUseJIT() returns false
3728         https://bugs.webkit.org/show_bug.cgi?id=194891
3729
3730         Reviewed by Geoffrey Garen.
3731
3732         WatchpointSet in SymbolTable is used to fold the value into a constant in JIT tiers. And it is
3733         not useful under the non-JIT mode. This patch avoids creation of WatchpointSet in SymbolTable
3734         if VM::canUseJIT() returns false.
3735
3736         * llint/LowLevelInterpreter32_64.asm:
3737         * llint/LowLevelInterpreter64.asm:
3738         * runtime/SymbolTable.cpp:
3739         (JSC::SymbolTableEntry::addWatchpoint): Deleted.
3740         * runtime/SymbolTable.h:
3741         (JSC::SymbolTableEntry::isWatchable const):
3742         (JSC::SymbolTableEntry::watchpointSet):
3743
3744 2019-02-20  Mark Lam  <mark.lam@apple.com>
3745
3746         Add code to validate expected GC activity modelled by doesGC() against what the runtime encounters.
3747         https://bugs.webkit.org/show_bug.cgi?id=193938
3748         <rdar://problem/47616277>
3749
3750         Reviewed by Michael Saboff, Saam Barati, and Robin Morisset.
3751
3752         In DFG::SpeculativeJIT::compile() and FTL::LowerDFGToB3::compileNode(), before
3753         emitting code / B3IR for each DFG node, we emit a write to set Heap::m_expectDoesGC
3754         to the value returned by doesGC() for that node.  In the runtime (i.e. in allocateCell()
3755         and functions that can resolve a rope), we assert that Heap::m_expectDoesGC is
3756         true.
3757
3758         This validation code is currently only enabled for debug builds.  It is disabled
3759         for release builds by default, but it can easily be made to run on release builds
3760         as well by forcing ENABLE_DFG_DOES_GC_VALIDATION to 1 in Heap.h.
3761
3762         To allow this validation code to run on release builds as well, the validation uses
3763         RELEASE_ASSERT instead of ASSERT.
3764
3765         To ensure that Heap.h is #include'd for all files that needs to do this validation
3766         (so that the validation code is accidentally disabled), we guard the validation
3767         code with an if conditional on constexpr bool validateDFGDoesGC (instead of using
3768         a #if ENABLE(DFG_DOES_GC_VALIDATION)).  This way, if Heap.h isn't #include'd, the
3769         validation code will fail to build (no silent failures).
3770
3771         Currently, all JSC tests and Layout tests should pass with this validation enabled
3772         in debug builds.  We'll only see new failures if there's a regression or if new
3773         tests reveal a previously untested code path that has an undetected issue.
3774
3775         * dfg/DFGOSRExit.cpp:
3776         (JSC::DFG::OSRExit::executeOSRExit):
3777         (JSC::DFG::OSRExit::compileExit):
3778         * dfg/DFGSpeculativeJIT64.cpp:
3779         (JSC::DFG::SpeculativeJIT::compile):
3780         * ftl/FTLLowerDFGToB3.cpp:
3781         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
3782         * ftl/FTLOSRExitCompiler.cpp:
3783         (JSC::FTL::compileStub):
3784         * heap/Heap.h:
3785         (JSC::Heap::expectDoesGC const):
3786         (JSC::Heap::setExpectDoesGC):
3787         (JSC::Heap::addressOfExpectDoesGC):
3788         * jit/JITArithmetic.cpp:
3789         (JSC::JIT::emit_compareAndJump):
3790         * runtime/JSCellInlines.h:
3791         (JSC::tryAllocateCellHelper):
3792         * runtime/JSString.h:
3793         (JSC::jsSingleCharacterString):
3794         (JSC::JSString::toAtomicString const):
3795         (JSC::JSString::toExistingAtomicString const):
3796         (JSC::JSString::value const):
3797         (JSC::JSString::tryGetValue const):
3798         (JSC::JSRopeString::unsafeView const):
3799         (JSC::JSRopeString::viewWithUnderlyingString const):
3800         (JSC::JSString::unsafeView const):
3801
3802 2019-02-20  Andy Estes  <aestes@apple.com>
3803
3804         [Xcode] Add SDKVariant.xcconfig to various Xcode projects
3805         https://bugs.webkit.org/show_bug.cgi?id=194869
3806
3807         Rubber-stamped by Jer Noble.
3808
3809         * JavaScriptCore.xcodeproj/project.pbxproj:
3810
3811 2019-02-19  Joseph Pecoraro  <pecoraro@apple.com>
3812
3813         Web Inspector: Improve ES6 Class instances in Heap Snapshot instances view
3814         https://bugs.webkit.org/show_bug.cgi?id=172848
3815         <rdar://problem/25709212>
3816
3817         Reviewed by Mark Lam.
3818
3819         * heap/HeapSnapshotBuilder.h:
3820         * heap/HeapSnapshotBuilder.cpp:
3821         Update the snapshot version. Change the node's 0 | 1 internal value
3822         to be a 32bit bit flag. This is nice in that it is both compatible
3823         with the previous snapshot version and the same size. We can use more
3824         flags in the future.
3825
3826         (JSC::HeapSnapshotBuilder::json):
3827         In cases where the classInfo gives us "Object" check for a better
3828         class name by checking (o).__proto__.constructor.name. We avoid this
3829         check in cases where (o).hasOwnProperty("constructor") which is the
3830         case for most Foo.prototype objects. Otherwise this would get the
3831         name of the Foo superclass for the Foo.prototype object.
3832
3833         * runtime/JSObject.cpp:
3834         (JSC::JSObject::calculatedClassName):
3835         Handle some possible edge cases that were not handled before, such as
3836         a JSObject without a GlobalObject or an object which doesn't
3837         have a default getPrototype. Try to make the code a little clearer.
3838
3839 2019-02-19  Truitt Savell  <tsavell@apple.com>
3840
3841         Unreviewed, rolling out r241784.
3842
3843         Broke all OpenSource builds.
3844
3845         Reverted changeset:
3846
3847         "Web Inspector: Improve ES6 Class instances in Heap Snapshot
3848         instances view"
3849         https://bugs.webkit.org/show_bug.cgi?id=172848
3850         https://trac.webkit.org/changeset/241784
3851