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