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