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