Source/JavaScriptCore:
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2019-04-10  Devin Rousso  <drousso@apple.com>
2
3        Web Inspector: Inspector: lazily create the agent
4        https://bugs.webkit.org/show_bug.cgi?id=195971
5        <rdar://problem/49039645>
6
7        Reviewed by Joseph Pecoraro.
8
9        * inspector/JSGlobalObjectInspectorController.cpp:
10        (Inspector::JSGlobalObjectInspectorController::JSGlobalObjectInspectorController):
11        (Inspector::JSGlobalObjectInspectorController::connectFrontend):
12        (Inspector::JSGlobalObjectInspectorController::appendExtraAgent):
13        (Inspector::JSGlobalObjectInspectorController::createLazyAgents):
14
15        * inspector/agents/InspectorAgent.h:
16        * inspector/agents/InspectorAgent.cpp:
17
18 2019-04-10  Saam Barati  <sbarati@apple.com>
19
20         Work around an arm64_32 LLVM miscompile bug
21         https://bugs.webkit.org/show_bug.cgi?id=196788
22
23         Reviewed by Yusuke Suzuki.
24
25         * runtime/CachedTypes.cpp:
26
27 2019-04-10  Devin Rousso  <drousso@apple.com>
28
29         Web Inspector: Timelines: can't reliably stop/start a recording
30         https://bugs.webkit.org/show_bug.cgi?id=196778
31         <rdar://problem/47606798>
32
33         Reviewed by Timothy Hatcher.
34
35         * inspector/protocol/ScriptProfiler.json:
36         * inspector/protocol/Timeline.json:
37         It is possible to determine when programmatic capturing starts/stops in the frontend based
38         on the state when the backend causes the state to change, such as if the state is "inactive"
39         when the frontend is told that the backend has started capturing.
40
41         * inspector/protocol/CPUProfiler.json:
42         * inspector/protocol/Memory.json:
43         Send an end timestamp to match other instruments.
44
45         * inspector/JSGlobalObjectConsoleClient.cpp:
46         (Inspector::JSGlobalObjectConsoleClient::startConsoleProfile):
47         (Inspector::JSGlobalObjectConsoleClient::stopConsoleProfile):
48
49         * inspector/agents/InspectorScriptProfilerAgent.h:
50         * inspector/agents/InspectorScriptProfilerAgent.cpp:
51         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
52         (Inspector::InspectorScriptProfilerAgent::programmaticCaptureStarted): Deleted.
53         (Inspector::InspectorScriptProfilerAgent::programmaticCaptureStopped): Deleted.
54
55 2019-04-10  Tadeu Zagallo  <tzagallo@apple.com>
56
57         Unreviewed, fix watch build after r244143
58         https://bugs.webkit.org/show_bug.cgi?id=195000
59
60         The result of `lseek` should be `off_t` rather than `int`.
61
62         * jsc.cpp:
63
64 2019-04-10  Tadeu Zagallo  <tzagallo@apple.com>
65
66         Add support for incremental bytecode cache updates
67         https://bugs.webkit.org/show_bug.cgi?id=195000
68
69         Reviewed by Filip Pizlo.
70
71         Add support for incremental updates to the bytecode cache. The cache
72         is constructed as follows:
73         - When the cache is empty, the initial payload can be added to the BytecodeCache
74         by calling BytecodeCache::addGlobalUpdate. This represents the encoded
75         top-level UnlinkedCodeBlock.
76         - Afterwards, updates can be added by calling BytecodeCache::addFunctionUpdate.
77         The update is applied by appending the encoded UnlinkedFunctionCodeBlock
78         to the existing cache and updating the CachedFunctionExecutableMetadata
79         and the offset of the new CachedFunctionCodeBlock in the owner CachedFunctionExecutable.
80
81         * API/JSScript.mm:
82         (-[JSScript readCache]):
83         (-[JSScript isUsingBytecodeCache]):
84         (-[JSScript init]):
85         (-[JSScript cachedBytecode]):
86         (-[JSScript writeCache:]):
87         * API/JSScriptInternal.h:
88         * API/JSScriptSourceProvider.h:
89         * API/JSScriptSourceProvider.mm:
90         (JSScriptSourceProvider::cachedBytecode const):
91         * CMakeLists.txt:
92         * JavaScriptCore.xcodeproj/project.pbxproj:
93         * Sources.txt:
94         * bytecode/UnlinkedFunctionExecutable.cpp:
95         (JSC::generateUnlinkedFunctionCodeBlock):
96         * jsc.cpp:
97         (ShellSourceProvider::~ShellSourceProvider):
98         (ShellSourceProvider::cachePath const):
99         (ShellSourceProvider::loadBytecode const):
100         (ShellSourceProvider::ShellSourceProvider):
101         (ShellSourceProvider::cacheEnabled):
102         * parser/SourceProvider.h:
103         (JSC::SourceProvider::cachedBytecode const):
104         (JSC::SourceProvider::updateCache const):
105         (JSC::SourceProvider::commitCachedBytecode const):
106         * runtime/CachePayload.cpp: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
107         (JSC::CachePayload::makeMappedPayload):
108         (JSC::CachePayload::makeMallocPayload):
109         (JSC::CachePayload::makeEmptyPayload):
110         (JSC::CachePayload::CachePayload):
111         (JSC::CachePayload::~CachePayload):
112         (JSC::CachePayload::operator=):
113         (JSC::CachePayload::freeData):
114         * runtime/CachePayload.h: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
115         (JSC::CachePayload::data const):
116         (JSC::CachePayload::size const):
117         (JSC::CachePayload::CachePayload):
118         * runtime/CacheUpdate.cpp: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
119         (JSC::CacheUpdate::CacheUpdate):
120         (JSC::CacheUpdate::operator=):
121         (JSC::CacheUpdate::isGlobal const):
122         (JSC::CacheUpdate::asGlobal const):
123         (JSC::CacheUpdate::asFunction const):
124         * runtime/CacheUpdate.h: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
125         * runtime/CachedBytecode.cpp: Added.
126         (JSC::CachedBytecode::addGlobalUpdate):
127         (JSC::CachedBytecode::addFunctionUpdate):
128         (JSC::CachedBytecode::copyLeafExecutables):
129         (JSC::CachedBytecode::commitUpdates const):
130         * runtime/CachedBytecode.h: Added.
131         (JSC::CachedBytecode::create):
132         (JSC::CachedBytecode::leafExecutables):
133         (JSC::CachedBytecode::data const):
134         (JSC::CachedBytecode::size const):
135         (JSC::CachedBytecode::hasUpdates const):
136         (JSC::CachedBytecode::sizeForUpdate const):
137         (JSC::CachedBytecode::CachedBytecode):
138         * runtime/CachedTypes.cpp:
139         (JSC::Encoder::addLeafExecutable):
140         (JSC::Encoder::release):
141         (JSC::Decoder::Decoder):
142         (JSC::Decoder::create):
143         (JSC::Decoder::size const):
144         (JSC::Decoder::offsetOf):
145         (JSC::Decoder::ptrForOffsetFromBase):
146         (JSC::Decoder::addLeafExecutable):
147         (JSC::VariableLengthObject::VariableLengthObject):
148         (JSC::VariableLengthObject::buffer const):
149         (JSC::CachedPtrOffsets::offsetOffset):
150         (JSC::CachedWriteBarrierOffsets::ptrOffset):
151         (JSC::CachedFunctionExecutable::features const):
152         (JSC::CachedFunctionExecutable::hasCapturedVariables const):
153         (JSC::CachedFunctionExecutableOffsets::codeBlockForCallOffset):
154         (JSC::CachedFunctionExecutableOffsets::codeBlockForConstructOffset):
155         (JSC::CachedFunctionExecutableOffsets::metadataOffset):
156         (JSC::CachedFunctionExecutable::encode):
157         (JSC::CachedFunctionExecutable::decode const):
158         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
159         (JSC::encodeCodeBlock):
160         (JSC::encodeFunctionCodeBlock):
161         (JSC::decodeCodeBlockImpl):
162         (JSC::isCachedBytecodeStillValid):
163         * runtime/CachedTypes.h:
164         (JSC::VariableLengthObjectBase::VariableLengthObjectBase):
165         (JSC::decodeCodeBlock):
166         * runtime/CodeCache.cpp:
167         (JSC::CodeCache::getUnlinkedGlobalCodeBlock):
168         (JSC::CodeCache::updateCache):
169         (JSC::CodeCache::write):
170         (JSC::writeCodeBlock):
171         (JSC::serializeBytecode):
172         * runtime/CodeCache.h:
173         (JSC::SourceCodeValue::SourceCodeValue):
174         (JSC::CodeCacheMap::findCacheAndUpdateAge):
175         (JSC::CodeCacheMap::fetchFromDiskImpl):
176         * runtime/Completion.cpp:
177         (JSC::generateProgramBytecode):
178         (JSC::generateModuleBytecode):
179         * runtime/Completion.h:
180         * runtime/LeafExecutable.cpp: Copied from Source/JavaScriptCore/API/JSScriptSourceProvider.mm.
181         (JSC::LeafExecutable::operator+ const):
182         * runtime/LeafExecutable.h: Copied from Source/JavaScriptCore/API/JSScriptSourceProvider.mm.
183         (JSC::LeafExecutable::LeafExecutable):
184         (JSC::LeafExecutable::base const):
185
186 2019-04-10  Michael Catanzaro  <mcatanzaro@igalia.com>
187
188         Unreviewed, rolling out r243989.
189
190         Broke i686 builds
191
192         Reverted changeset:
193
194         "[CMake] Detect SSE2 at compile time"
195         https://bugs.webkit.org/show_bug.cgi?id=196488
196         https://trac.webkit.org/changeset/243989
197
198 2019-04-10  Robin Morisset  <rmorisset@apple.com>
199
200         We should clear m_needsOverflowCheck when hitting an exception in defineProperties in ObjectConstructor.cpp
201         https://bugs.webkit.org/show_bug.cgi?id=196746
202
203         Reviewed by Yusuke Suzuki..
204
205         It should be safe as in that case we are not completing the operation, and so not going to have any buffer overflow.
206
207         * runtime/ObjectConstructor.cpp:
208         (JSC::defineProperties):
209
210 2019-04-10  Antoine Quint  <graouts@apple.com>
211
212         Enable Pointer Events on watchOS
213         https://bugs.webkit.org/show_bug.cgi?id=196771
214         <rdar://problem/49040909>
215
216         Reviewed by Dean Jackson.
217
218         * Configurations/FeatureDefines.xcconfig:
219
220 2019-04-09  Keith Rollin  <krollin@apple.com>
221
222         Unreviewed build maintenance -- update .xcfilelists.
223
224         * DerivedSources-input.xcfilelist:
225
226 2019-04-09  Ross Kirsling  <ross.kirsling@sony.com>
227
228         JSC should build successfully even with -DENABLE_UNIFIED_BUILDS=OFF
229         https://bugs.webkit.org/show_bug.cgi?id=193073
230
231         Reviewed by Keith Miller.
232
233         * bytecompiler/BytecodeGenerator.cpp:
234         (JSC::BytecodeGenerator::emitEqualityOpImpl):
235         (JSC::BytecodeGenerator::emitEqualityOp): Deleted.
236         * bytecompiler/BytecodeGenerator.h:
237         (JSC::BytecodeGenerator::emitEqualityOp):
238         Factor out the logic that uses the template parameter and keep it in the header.
239
240         * jit/JITPropertyAccess.cpp:
241         List off the template specializations needed by JITOperations.cpp.
242         This is unfortunate but at least there are only two (x2) by definition?
243         Trying to do away with this incurs a severe domino effect...
244
245         * API/JSValueRef.cpp:
246         * b3/B3OptimizeAssociativeExpressionTrees.cpp:
247         * b3/air/AirHandleCalleeSaves.cpp:
248         * builtins/BuiltinNames.cpp:
249         * bytecode/AccessCase.cpp:
250         * bytecode/BytecodeIntrinsicRegistry.cpp:
251         * bytecode/BytecodeIntrinsicRegistry.h:
252         * bytecode/BytecodeRewriter.cpp:
253         * bytecode/BytecodeUseDef.h:
254         * bytecode/CodeBlock.cpp:
255         * bytecode/InstanceOfAccessCase.cpp:
256         * bytecode/MetadataTable.cpp:
257         * bytecode/PolyProtoAccessChain.cpp:
258         * bytecode/StructureSet.cpp:
259         * bytecompiler/NodesCodegen.cpp:
260         * dfg/DFGCFAPhase.cpp:
261         * dfg/DFGPureValue.cpp:
262         * heap/GCSegmentedArray.h:
263         * heap/HeapInlines.h:
264         * heap/IsoSubspace.cpp:
265         * heap/LocalAllocator.cpp:
266         * heap/LocalAllocator.h:
267         * heap/LocalAllocatorInlines.h:
268         * heap/MarkingConstraintSolver.cpp:
269         * inspector/ScriptArguments.cpp:
270         (Inspector::ScriptArguments::isEqual const):
271         * inspector/ScriptCallStackFactory.cpp:
272         * interpreter/CallFrame.h:
273         * interpreter/Interpreter.cpp:
274         * interpreter/StackVisitor.cpp:
275         * llint/LLIntEntrypoint.cpp:
276         * runtime/ArrayIteratorPrototype.cpp:
277         * runtime/BigIntPrototype.cpp:
278         * runtime/CachedTypes.cpp:
279         * runtime/ErrorType.cpp:
280         * runtime/IndexingType.cpp:
281         * runtime/JSCellInlines.h:
282         * runtime/JSImmutableButterfly.h:
283         * runtime/Operations.h:
284         * runtime/RegExpCachedResult.cpp:
285         * runtime/RegExpConstructor.cpp:
286         * runtime/RegExpGlobalData.cpp:
287         * runtime/StackFrame.h:
288         * wasm/WasmSignature.cpp:
289         * wasm/js/JSToWasm.cpp:
290         * wasm/js/JSToWasmICCallee.cpp:
291         * wasm/js/WebAssemblyFunction.h:
292         Fix includes / forward declarations (and a couple of nearby clang warnings).
293
294 2019-04-09  Don Olmstead  <don.olmstead@sony.com>
295
296         [CMake] Apple builds should use ICU_INCLUDE_DIRS
297         https://bugs.webkit.org/show_bug.cgi?id=196720
298
299         Reviewed by Konstantin Tokarev.
300
301         * PlatformMac.cmake:
302
303 2019-04-09  Saam barati  <sbarati@apple.com>
304
305         Clean up Int52 code and some bugs in it
306         https://bugs.webkit.org/show_bug.cgi?id=196639
307         <rdar://problem/49515757>
308
309         Reviewed by Yusuke Suzuki.
310
311         This patch fixes bugs in our Int52 code. The primary change in this patch is
312         adopting a segregated type lattice for Int52. Previously, for Int52 values,
313         we represented them with SpecInt32Only and SpecInt52Only. For an Int52,
314         SpecInt32Only meant that the value is in int32 range. And SpecInt52Only meant
315         that the is outside of the int32 range.
316         
317         However, this got confusing because we reused SpecInt32Only both for JSValue
318         representations and Int52 representations. This actually lead to some bugs.
319         
320         1. It's possible that roundtripping through Int52 representation would say
321         it produces the wrong type. For example, consider this program and how we
322         used to annotate types in AI:
323         a: JSConstant(10.0) => m_type is SpecAnyIntAsDouble
324         b: Int52Rep(@a) => m_type is SpecInt52Only
325         c: ValueRep(@b) => m_type is SpecAnyIntAsDouble
326         
327         In AI, for the above program, we'd say that @c produces SpecAnyIntAsDouble.
328         However, the execution semantics are such that it'd actually produce a boxed
329         Int32. This patch fixes the bug where we'd say that Int52Rep over SpecAnyIntAsDouble
330         would produce SpecInt52Only. This is clearly wrong, as SpecAnyIntAsDouble can
331         mean an int value in either int32 or int52 range.
332         
333         2. AsbstractValue::validateTypeAcceptingBoxedInt52 was wrong in how it
334         accepted Int52 values. It was wrong in two different ways:
335         a: If the AbstractValue's type was SpecInt52Only, and the incoming value
336         was a boxed double, but represented a value in int32 range, the incoming
337         value would incorrectly validate as being acceptable. However, we should
338         have rejected this value.
339         b: If the AbstractValue's type was SpecInt32Only, and the incoming value
340         was an Int32 boxed in a double, this would not validate, even though
341         it should have validated.
342         
343         Solving 2 was easiest if we segregated out the Int52 type into its own
344         lattice. This patch makes a new Int52 lattice, which is composed of
345         SpecInt32AsInt52 and SpecNonInt32AsInt52.
346         
347         The conversion rules are now really simple.
348         
349         Int52 rep => JSValue rep
350         SpecInt32AsInt52 => SpecInt32Only
351         SpecNonInt32AsInt52 => SpecAnyIntAsDouble
352         
353         JSValue rep => Int52 rep
354         SpecInt32Only => SpecInt32AsInt52
355         SpecAnyIntAsDouble => SpecInt52Any
356         
357         With these rules, the program in (1) will now correctly report that @c
358         returns SpecInt32Only | SpecAnyIntAsDouble.
359
360         * bytecode/SpeculatedType.cpp:
361         (JSC::dumpSpeculation):
362         (JSC::speculationToAbbreviatedString):
363         (JSC::int52AwareSpeculationFromValue):
364         (JSC::leastUpperBoundOfStrictlyEquivalentSpeculations):
365         (JSC::speculationFromString):
366         * bytecode/SpeculatedType.h:
367         (JSC::isInt32SpeculationForArithmetic):
368         (JSC::isInt32OrBooleanSpeculationForArithmetic):
369         (JSC::isAnyInt52Speculation):
370         (JSC::isIntAnyFormat):
371         (JSC::isInt52Speculation): Deleted.
372         (JSC::isAnyIntSpeculation): Deleted.
373         * dfg/DFGAbstractInterpreterInlines.h:
374         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
375         * dfg/DFGAbstractValue.cpp:
376         (JSC::DFG::AbstractValue::fixTypeForRepresentation):
377         (JSC::DFG::AbstractValue::checkConsistency const):
378         * dfg/DFGAbstractValue.h:
379         (JSC::DFG::AbstractValue::isInt52Any const):
380         (JSC::DFG::AbstractValue::validateTypeAcceptingBoxedInt52 const):
381         * dfg/DFGFixupPhase.cpp:
382         (JSC::DFG::FixupPhase::fixupArithMul):
383         (JSC::DFG::FixupPhase::fixupNode):
384         (JSC::DFG::FixupPhase::fixupGetPrototypeOf):
385         (JSC::DFG::FixupPhase::fixupToThis):
386         (JSC::DFG::FixupPhase::fixupToStringOrCallStringConstructor):
387         (JSC::DFG::FixupPhase::observeUseKindOnNode):
388         (JSC::DFG::FixupPhase::fixIntConvertingEdge):
389         (JSC::DFG::FixupPhase::attemptToMakeIntegerAdd):
390         (JSC::DFG::FixupPhase::fixupCompareStrictEqAndSameValue):
391         (JSC::DFG::FixupPhase::fixupChecksInBlock):
392         * dfg/DFGGraph.h:
393         (JSC::DFG::Graph::addShouldSpeculateInt52):
394         (JSC::DFG::Graph::binaryArithShouldSpeculateInt52):
395         (JSC::DFG::Graph::unaryArithShouldSpeculateInt52):
396         (JSC::DFG::Graph::addShouldSpeculateAnyInt): Deleted.
397         (JSC::DFG::Graph::binaryArithShouldSpeculateAnyInt): Deleted.
398         (JSC::DFG::Graph::unaryArithShouldSpeculateAnyInt): Deleted.
399         * dfg/DFGNode.h:
400         (JSC::DFG::Node::shouldSpeculateInt52):
401         (JSC::DFG::Node::shouldSpeculateAnyInt): Deleted.
402         * dfg/DFGPredictionPropagationPhase.cpp:
403         * dfg/DFGSpeculativeJIT.cpp:
404         (JSC::DFG::SpeculativeJIT::setIntTypedArrayLoadResult):
405         (JSC::DFG::SpeculativeJIT::compileArithAdd):
406         (JSC::DFG::SpeculativeJIT::compileArithSub):
407         (JSC::DFG::SpeculativeJIT::compileArithNegate):
408         * dfg/DFGSpeculativeJIT64.cpp:
409         (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal):
410         (JSC::DFG::SpeculativeJIT::fillSpeculateInt52):
411         * dfg/DFGUseKind.h:
412         (JSC::DFG::typeFilterFor):
413         * dfg/DFGVariableAccessData.cpp:
414         (JSC::DFG::VariableAccessData::makePredictionForDoubleFormat):
415         (JSC::DFG::VariableAccessData::couldRepresentInt52Impl):
416         * ftl/FTLLowerDFGToB3.cpp:
417         (JSC::FTL::DFG::LowerDFGToB3::compileArithAddOrSub):
418         (JSC::FTL::DFG::LowerDFGToB3::compileArithNegate):
419         (JSC::FTL::DFG::LowerDFGToB3::setIntTypedArrayLoadResult):
420
421 2019-04-09  Tadeu Zagallo  <tzagallo@apple.com>
422
423         ASSERTION FAILED: !scope.exception() || !hasProperty in JSObject::get
424         https://bugs.webkit.org/show_bug.cgi?id=196708
425         <rdar://problem/49556803>
426
427         Reviewed by Yusuke Suzuki.
428
429         `operationPutToScope` needs to return early if an exception is thrown while
430         checking if `hasProperty`.
431
432         * jit/JITOperations.cpp:
433
434 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
435
436         [JSC] DFG should respect node's strict flag
437         https://bugs.webkit.org/show_bug.cgi?id=196617
438
439         Reviewed by Saam Barati.
440
441         We accidentally use codeBlock->isStrictMode() directly in DFG and FTL. But this is wrong since this CodeBlock is the top level DFG/FTL CodeBlock,
442         and this code does not respect the isStrictMode flag for the inlined CodeBlocks. In this patch, we start using isStrictModeFor(CodeOrigin) consistently
443         in DFG and FTL to get the right isStrictMode flag for the DFG node.
444         And we also split compilePutDynamicVar into compilePutDynamicVarStrict and compilePutDynamicVarNonStrict since (1) it is cleaner than accessing inlined
445         callframe in the operation function, and (2) it is aligned to the other functions like operationPutByValDirectNonStrict etc.
446         This bug is discovered by RandomizingFuzzerAgent by expanding the DFG coverage.
447
448         * dfg/DFGAbstractInterpreterInlines.h:
449         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
450         * dfg/DFGConstantFoldingPhase.cpp:
451         (JSC::DFG::ConstantFoldingPhase::foldConstants):
452         * dfg/DFGFixupPhase.cpp:
453         (JSC::DFG::FixupPhase::fixupToThis):
454         * dfg/DFGOperations.cpp:
455         * dfg/DFGOperations.h:
456         * dfg/DFGPredictionPropagationPhase.cpp:
457         * dfg/DFGSpeculativeJIT.cpp:
458         (JSC::DFG::SpeculativeJIT::compileDoublePutByVal):
459         (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray):
460         (JSC::DFG::SpeculativeJIT::compilePutDynamicVar):
461         (JSC::DFG::SpeculativeJIT::compileToThis):
462         * dfg/DFGSpeculativeJIT32_64.cpp:
463         (JSC::DFG::SpeculativeJIT::compileContiguousPutByVal):
464         (JSC::DFG::SpeculativeJIT::compile):
465         * dfg/DFGSpeculativeJIT64.cpp:
466         (JSC::DFG::SpeculativeJIT::compile):
467         * ftl/FTLLowerDFGToB3.cpp:
468         (JSC::FTL::DFG::LowerDFGToB3::compilePutByVal):
469         (JSC::FTL::DFG::LowerDFGToB3::compilePutDynamicVar):
470
471 2019-04-08  Don Olmstead  <don.olmstead@sony.com>
472
473         [CMake][WinCairo] Separate copied headers into different directories
474         https://bugs.webkit.org/show_bug.cgi?id=196655
475
476         Reviewed by Michael Catanzaro.
477
478         * CMakeLists.txt:
479         * shell/PlatformWin.cmake:
480
481 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
482
483         [JSC] isRope jump in StringSlice should not jump over register allocations
484         https://bugs.webkit.org/show_bug.cgi?id=196716
485
486         Reviewed by Saam Barati.
487
488         Jumping over the register allocation code in DFG (like the following) is wrong.
489
490             auto jump = m_jit.branchXXX();
491             {
492                 GPRTemporary reg(this);
493                 GPRReg regGPR = reg.gpr();
494                 ...
495             }
496             jump.link(&m_jit);
497
498         When GPRTemporary::gpr allocates a new register, it can flush the previous register value into the stack and make the register usable.
499         Jumping over this register allocation code skips the flushing code, and makes the DFG's stack and register content tracking inconsistent:
500         DFG thinks that the content is flushed and stored in particular stack slot even while this flushing code is skipped.
501         In this patch, we perform register allocations before jumping to the slow path based on `isRope` condition in StringSlice.
502
503         * dfg/DFGSpeculativeJIT.cpp:
504         (JSC::DFG::SpeculativeJIT::compileStringSlice):
505
506 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
507
508         [JSC] to_index_string should not assume incoming value is Uint32
509         https://bugs.webkit.org/show_bug.cgi?id=196713
510
511         Reviewed by Saam Barati.
512
513         The slow path of to_index_string assumes that incoming value is Uint32. But we should not have
514         this assumption since DFG may decide we should have it double format. This patch removes this
515         assumption, and instead, we should assume that incoming value is AnyInt and the range of this
516         is within Uint32.
517
518         * runtime/CommonSlowPaths.cpp:
519         (JSC::SLOW_PATH_DECL):
520
521 2019-04-08  Justin Fan  <justin_fan@apple.com>
522
523         [Web GPU] Fix Web GPU experimental feature on iOS
524         https://bugs.webkit.org/show_bug.cgi?id=196632
525
526         Reviewed by Myles C. Maxfield.
527
528         Properly make Web GPU available on iOS 11+.
529
530         * Configurations/FeatureDefines.xcconfig:
531         * Configurations/WebKitTargetConditionals.xcconfig:
532
533 2019-04-08  Ross Kirsling  <ross.kirsling@sony.com>
534
535         -f[no-]var-tracking-assignments is GCC-only
536         https://bugs.webkit.org/show_bug.cgi?id=196699
537
538         Reviewed by Don Olmstead.
539
540         * CMakeLists.txt:
541         Just remove the build flag altogether -- it supposedly doesn't solve the problem it was meant to
542         and said problem evidently no longer occurs as of GCC 9.
543
544 2019-04-08  Saam Barati  <sbarati@apple.com>
545
546         WebAssembly.RuntimeError missing exception check
547         https://bugs.webkit.org/show_bug.cgi?id=196700
548         <rdar://problem/49693932>
549
550         Reviewed by Yusuke Suzuki.
551
552         * wasm/js/JSWebAssemblyRuntimeError.h:
553         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
554         (JSC::constructJSWebAssemblyRuntimeError):
555
556 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
557
558         Unreviewed, rolling in r243948 with test fix
559         https://bugs.webkit.org/show_bug.cgi?id=196486
560
561         * parser/ASTBuilder.h:
562         (JSC::ASTBuilder::createString):
563         * parser/Lexer.cpp:
564         (JSC::Lexer<T>::parseMultilineComment):
565         (JSC::Lexer<T>::lexWithoutClearingLineTerminator):
566         (JSC::Lexer<T>::lex): Deleted.
567         * parser/Lexer.h:
568         (JSC::Lexer::hasLineTerminatorBeforeToken const):
569         (JSC::Lexer::setHasLineTerminatorBeforeToken):
570         (JSC::Lexer<T>::lex):
571         (JSC::Lexer::prevTerminator const): Deleted.
572         (JSC::Lexer::setTerminator): Deleted.
573         * parser/Parser.cpp:
574         (JSC::Parser<LexerType>::allowAutomaticSemicolon):
575         (JSC::Parser<LexerType>::parseSingleFunction):
576         (JSC::Parser<LexerType>::parseStatementListItem):
577         (JSC::Parser<LexerType>::maybeParseAsyncFunctionDeclarationStatement):
578         (JSC::Parser<LexerType>::parseFunctionInfo):
579         (JSC::Parser<LexerType>::parseClass):
580         (JSC::Parser<LexerType>::parseExportDeclaration):
581         (JSC::Parser<LexerType>::parseAssignmentExpression):
582         (JSC::Parser<LexerType>::parseYieldExpression):
583         (JSC::Parser<LexerType>::parseProperty):
584         (JSC::Parser<LexerType>::parsePrimaryExpression):
585         (JSC::Parser<LexerType>::parseMemberExpression):
586         * parser/Parser.h:
587         (JSC::Parser::nextWithoutClearingLineTerminator):
588         (JSC::Parser::lexCurrentTokenAgainUnderCurrentContext):
589         (JSC::Parser::internalSaveLexerState):
590         (JSC::Parser::restoreLexerState):
591
592 2019-04-08  Ryan Haddad  <ryanhaddad@apple.com>
593
594         Unreviewed, rolling out r243948.
595
596         Caused inspector/runtime/parse.html to fail
597
598         Reverted changeset:
599
600         "SIGSEGV in JSC::BytecodeGenerator::addStringConstant"
601         https://bugs.webkit.org/show_bug.cgi?id=196486
602         https://trac.webkit.org/changeset/243948
603
604 2019-04-08  Ryan Haddad  <ryanhaddad@apple.com>
605
606         Unreviewed, rolling out r243943.
607
608         Caused test262 failures.
609
610         Reverted changeset:
611
612         "[JSC] Filter DontEnum properties in
613         ProxyObject::getOwnPropertyNames()"
614         https://bugs.webkit.org/show_bug.cgi?id=176810
615         https://trac.webkit.org/changeset/243943
616
617 2019-04-08  Claudio Saavedra  <csaavedra@igalia.com>
618
619         [JSC] Partially fix the build with unified builds disabled
620         https://bugs.webkit.org/show_bug.cgi?id=196647
621
622         Reviewed by Konstantin Tokarev.
623
624         If you disable unified builds you find all kind of build
625         errors. This partially tries to fix them but there's a lot
626         more.
627
628         * API/JSBaseInternal.h:
629         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp:
630         * b3/air/AirHandleCalleeSaves.h:
631         * bytecode/ExecutableToCodeBlockEdge.cpp:
632         * bytecode/ExitFlag.h:
633         * bytecode/ICStatusUtils.h:
634         * bytecode/UnlinkedMetadataTable.h:
635         * dfg/DFGPureValue.h:
636         * heap/IsoAlignedMemoryAllocator.cpp:
637         * heap/IsoAlignedMemoryAllocator.h:
638
639 2019-04-08  Guillaume Emont  <guijemont@igalia.com>
640
641         Enable DFG on MIPS
642         https://bugs.webkit.org/show_bug.cgi?id=196689
643
644         Reviewed by Žan Doberšek.
645
646         Since the bytecode change, we enabled the baseline JIT on mips in
647         r240432, but DFG is still missing. With this change, all tests are
648         passing on a ci20 board.
649
650         * jit/RegisterSet.cpp:
651         (JSC::RegisterSet::calleeSaveRegisters):
652         Added s0, which is used in llint.
653
654 2019-04-08  Xan Lopez  <xan@igalia.com>
655
656         [CMake] Detect SSE2 at compile time
657         https://bugs.webkit.org/show_bug.cgi?id=196488
658
659         Reviewed by Carlos Garcia Campos.
660
661         * assembler/MacroAssemblerX86Common.cpp: Remove unnecessary (and
662         incorrect) static_assert.
663
664 2019-04-07  Michael Saboff  <msaboff@apple.com>
665
666         REGRESSION (r243642): Crash in reddit.com page
667         https://bugs.webkit.org/show_bug.cgi?id=196684
668
669         Reviewed by Geoffrey Garen.
670
671         In r243642, the code that saves and restores the count for non-greedy character classes
672         was inadvertently put inside an if statement.  This code should be generated for all
673         non-greedy character classes.
674
675         * yarr/YarrJIT.cpp:
676         (JSC::Yarr::YarrGenerator::generateCharacterClassNonGreedy):
677         (JSC::Yarr::YarrGenerator::backtrackCharacterClassNonGreedy):
678
679 2019-04-07  Yusuke Suzuki  <ysuzuki@apple.com>
680
681         [JSC] CallLinkInfo should clear Callee or CodeBlock even if it is unlinked by jettison
682         https://bugs.webkit.org/show_bug.cgi?id=196683
683
684         Reviewed by Saam Barati.
685
686         In r243626, we stop repatching CallLinkInfo when the CallLinkInfo is held by jettisoned CodeBlock.
687         But we still need to clear the Callee or CodeBlock since they are now dead. Otherwise, CodeBlock's
688         visitWeak eventually accesses this dead cells and crashes because the owner CodeBlock of CallLinkInfo
689         can be still live.
690
691         We also move all repatching operations from CallLinkInfo.cpp to Repatch.cpp for consistency because the
692         other repatching operations in CallLinkInfo are implemented in Repatch.cpp side.
693
694         * bytecode/CallLinkInfo.cpp:
695         (JSC::CallLinkInfo::setCallee):
696         (JSC::CallLinkInfo::clearCallee):
697         * jit/Repatch.cpp:
698         (JSC::linkFor):
699         (JSC::revertCall):
700
701 2019-04-05  Yusuke Suzuki  <ysuzuki@apple.com>
702
703         [JSC] OSRExit recovery for SpeculativeAdd does not consier "A = A + A" pattern
704         https://bugs.webkit.org/show_bug.cgi?id=196582
705
706         Reviewed by Saam Barati.
707
708         In DFG, our ArithAdd with overflow is executed speculatively, and we recover the value when overflow flag is set.
709         The recovery is subtracting the operand from the destination to get the original two operands. Our recovery code
710         handles A + B = A, A + B = B cases. But it misses A + A = A case (here, A and B are GPRReg). Our recovery code
711         attempts to produce the original operand by performing A - A, and it always produces zero accidentally.
712
713         This patch adds the recovery code for A + A = A case. Because we know that this ArithAdd overflows, and operands were
714         same values, we can calculate the original operand from the destination value by `((int32_t)value >> 1) ^ 0x80000000`.
715
716         We also found that FTL recovery code is dead. We remove them in this patch.
717
718         * dfg/DFGOSRExit.cpp:
719         (JSC::DFG::OSRExit::executeOSRExit):
720         (JSC::DFG::OSRExit::compileExit):
721         * dfg/DFGOSRExit.h:
722         (JSC::DFG::SpeculationRecovery::SpeculationRecovery):
723         * dfg/DFGSpeculativeJIT.cpp:
724         (JSC::DFG::SpeculativeJIT::compileArithAdd):
725         * ftl/FTLExitValue.cpp:
726         (JSC::FTL::ExitValue::dataFormat const):
727         (JSC::FTL::ExitValue::dumpInContext const):
728         * ftl/FTLExitValue.h:
729         (JSC::FTL::ExitValue::isArgument const):
730         (JSC::FTL::ExitValue::hasIndexInStackmapLocations const):
731         (JSC::FTL::ExitValue::adjustStackmapLocationsIndexByOffset):
732         (JSC::FTL::ExitValue::recovery): Deleted.
733         (JSC::FTL::ExitValue::isRecovery const): Deleted.
734         (JSC::FTL::ExitValue::leftRecoveryArgument const): Deleted.
735         (JSC::FTL::ExitValue::rightRecoveryArgument const): Deleted.
736         (JSC::FTL::ExitValue::recoveryFormat const): Deleted.
737         (JSC::FTL::ExitValue::recoveryOpcode const): Deleted.
738         * ftl/FTLLowerDFGToB3.cpp:
739         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
740         (JSC::FTL::DFG::LowerDFGToB3::preparePatchpointForExceptions):
741         (JSC::FTL::DFG::LowerDFGToB3::appendOSRExit):
742         (JSC::FTL::DFG::LowerDFGToB3::exitValueForNode):
743         (JSC::FTL::DFG::LowerDFGToB3::addAvailableRecovery): Deleted.
744         * ftl/FTLOSRExitCompiler.cpp:
745         (JSC::FTL::compileRecovery):
746
747 2019-04-05  Ryan Haddad  <ryanhaddad@apple.com>
748
749         Unreviewed, rolling out r243665.
750
751         Caused iOS JSC tests to exit with an exception.
752
753         Reverted changeset:
754
755         "Assertion failed in JSC::createError"
756         https://bugs.webkit.org/show_bug.cgi?id=196305
757         https://trac.webkit.org/changeset/243665
758
759 2019-04-05  Yusuke Suzuki  <ysuzuki@apple.com>
760
761         SIGSEGV in JSC::BytecodeGenerator::addStringConstant
762         https://bugs.webkit.org/show_bug.cgi?id=196486
763
764         Reviewed by Saam Barati.
765
766         When parsing a FunctionExpression / FunctionDeclaration etc., we use SyntaxChecker for the body of the function because we do not have any interest on the nodes of the body at that time.
767         The nodes will be parsed with the ASTBuilder when the function itself is parsed for code generation. This works well previously because all the function ends with "}" previously.
768         SyntaxChecker lexes this "}" token, and parser restores the context back to ASTBuilder and continues parsing.
769
770         But now, we have ArrowFunctionExpression without braces `arrow => expr`. Let's consider the following code.
771
772                 arrow => expr
773                 "string!"
774
775         We parse arrow function's body with SyntaxChecker. At that time, we lex "string!" token under the SyntaxChecker context. But this means that we may not build string content for this token
776         since SyntaxChecker may not have interest on string content itself in certain case. After the parser is back to ASTBuilder, we parse "string!" as ExpressionStatement with string constant,
777         generate StringNode with non-built identifier (nullptr), and we accidentally create StringNode with nullptr.
778
779         This patch fixes this problem. The root cause of this problem is that the last token lexed in the previous context is used. We add lexCurrentTokenAgainUnderCurrentContext which will re-lex
780         the current token under the current context (may be ASTBuilder). This should be done only when the caller's context is different from SyntaxChecker, which avoids unnecessary lexing.
781         We leverage existing SavePoint mechanism to implement lexCurrentTokenAgainUnderCurrentContext cleanly.
782
783         And we also fix the bug in the existing SavePoint mechanism, which is shown in the attached test script. When we save LexerState, we do not save line terminator status. This patch also introduces
784         lexWithoutClearingLineTerminator, which lex the token without clearing line terminator status.
785
786         * parser/ASTBuilder.h:
787         (JSC::ASTBuilder::createString):
788         * parser/Lexer.cpp:
789         (JSC::Lexer<T>::parseMultilineComment):
790         (JSC::Lexer<T>::lexWithoutClearingLineTerminator): EOF token also should record offset information. This offset information is correctly handled in Lexer::setOffset too.
791         (JSC::Lexer<T>::lex): Deleted.
792         * parser/Lexer.h:
793         (JSC::Lexer::hasLineTerminatorBeforeToken const):
794         (JSC::Lexer::setHasLineTerminatorBeforeToken):
795         (JSC::Lexer<T>::lex):
796         (JSC::Lexer::prevTerminator const): Deleted.
797         (JSC::Lexer::setTerminator): Deleted.
798         * parser/Parser.cpp:
799         (JSC::Parser<LexerType>::allowAutomaticSemicolon):
800         (JSC::Parser<LexerType>::parseSingleFunction):
801         (JSC::Parser<LexerType>::parseStatementListItem):
802         (JSC::Parser<LexerType>::maybeParseAsyncFunctionDeclarationStatement):
803         (JSC::Parser<LexerType>::parseFunctionInfo):
804         (JSC::Parser<LexerType>::parseClass):
805         (JSC::Parser<LexerType>::parseExportDeclaration):
806         (JSC::Parser<LexerType>::parseAssignmentExpression):
807         (JSC::Parser<LexerType>::parseYieldExpression):
808         (JSC::Parser<LexerType>::parseProperty):
809         (JSC::Parser<LexerType>::parsePrimaryExpression):
810         (JSC::Parser<LexerType>::parseMemberExpression):
811         * parser/Parser.h:
812         (JSC::Parser::nextWithoutClearingLineTerminator):
813         (JSC::Parser::lexCurrentTokenAgainUnderCurrentContext):
814         (JSC::Parser::internalSaveLexerState):
815         (JSC::Parser::restoreLexerState):
816
817 2019-04-05  Caitlin Potter  <caitp@igalia.com>
818
819         [JSC] Filter DontEnum properties in ProxyObject::getOwnPropertyNames()
820         https://bugs.webkit.org/show_bug.cgi?id=176810
821
822         Reviewed by Saam Barati.
823
824         This adds conditional logic following the invariant checks, to perform
825         filtering in common uses of getOwnPropertyNames.
826
827         While this would ideally only be done in JSPropertyNameEnumerator, adding
828         the filtering to ProxyObject::performGetOwnPropertyNames maintains the
829         invariant that the EnumerationMode is properly followed.
830
831         * runtime/PropertyNameArray.h:
832         (JSC::PropertyNameArray::reset):
833         * runtime/ProxyObject.cpp:
834         (JSC::ProxyObject::performGetOwnPropertyNames):
835
836 2019-04-05  Commit Queue  <commit-queue@webkit.org>
837
838         Unreviewed, rolling out r243833.
839         https://bugs.webkit.org/show_bug.cgi?id=196645
840
841         This change breaks build of WPE and GTK ports (Requested by
842         annulen on #webkit).
843
844         Reverted changeset:
845
846         "[CMake][WTF] Mirror XCode header directories"
847         https://bugs.webkit.org/show_bug.cgi?id=191662
848         https://trac.webkit.org/changeset/243833
849
850 2019-04-05  Caitlin Potter  <caitp@igalia.com>
851
852         [JSC] throw if ownKeys Proxy trap result contains duplicate keys
853         https://bugs.webkit.org/show_bug.cgi?id=185211
854
855         Reviewed by Saam Barati.
856
857         Implements the normative spec change in https://github.com/tc39/ecma262/pull/833
858
859         This involves tracking duplicate keys returned from the ownKeys trap in yet
860         another HashTable, and may incur a minor performance penalty in some cases. This
861         is not expected to significantly affect web performance.
862
863         * runtime/ProxyObject.cpp:
864         (JSC::ProxyObject::performGetOwnPropertyNames):
865
866 2019-04-04  Yusuke Suzuki  <ysuzuki@apple.com>
867
868         [JSC] makeBoundFunction should not assume incoming "length" value is Int32 because it performs some calculation in bytecode
869         https://bugs.webkit.org/show_bug.cgi?id=196631
870
871         Reviewed by Saam Barati.
872
873         makeBoundFunction assumes that "length" argument is always Int32. But this should not be done since this "length" value is calculated in builtin JS code.
874         DFG may store this value in Double format so that we should not rely on that this value is Int32. This patch fixes makeBoundFunction function to perform
875         toInt32 operation. We also insert a missing exception check for `JSString::value(ExecState*)` in makeBoundFunction.
876
877         * JavaScriptCore.xcodeproj/project.pbxproj:
878         * Sources.txt:
879         * interpreter/CallFrameInlines.h:
880         * runtime/DoublePredictionFuzzerAgent.cpp: Copied from Source/JavaScriptCore/interpreter/CallFrameInlines.h.
881         (JSC::DoublePredictionFuzzerAgent::DoublePredictionFuzzerAgent):
882         (JSC::DoublePredictionFuzzerAgent::getPrediction):
883         * runtime/DoublePredictionFuzzerAgent.h: Copied from Source/JavaScriptCore/interpreter/CallFrameInlines.h.
884         * runtime/JSGlobalObject.cpp:
885         (JSC::makeBoundFunction):
886         * runtime/Options.h:
887         * runtime/VM.cpp:
888         (JSC::VM::VM):
889
890 2019-04-04  Robin Morisset  <rmorisset@apple.com>
891
892         B3ReduceStrength should know that Mul distributes over Add and Sub
893         https://bugs.webkit.org/show_bug.cgi?id=196325
894         <rdar://problem/49441650>
895
896         Reviewed by Saam Barati.
897
898         Fix some obviously wrong code that was due to an accidental copy-paste.
899         It made the entire optimization dead code that never ran.
900
901         * b3/B3ReduceStrength.cpp:
902
903 2019-04-04  Saam Barati  <sbarati@apple.com>
904
905         Unreviewed, build fix for CLoop after r243886
906
907         * interpreter/Interpreter.cpp:
908         (JSC::UnwindFunctor::copyCalleeSavesToEntryFrameCalleeSavesBuffer const):
909         * interpreter/StackVisitor.cpp:
910         (JSC::StackVisitor::Frame::calleeSaveRegistersForUnwinding):
911         * interpreter/StackVisitor.h:
912
913 2019-04-04  Commit Queue  <commit-queue@webkit.org>
914
915         Unreviewed, rolling out r243898.
916         https://bugs.webkit.org/show_bug.cgi?id=196624
917
918         `#if !ENABLE(C_LOOP) && NUMBER_OF_CALLEE_SAVES_REGISTERS > 0`
919         does not work well (Requested by yusukesuzuki on #webkit).
920
921         Reverted changeset:
922
923         "Unreviewed, build fix for CLoop and Windows after r243886"
924         https://bugs.webkit.org/show_bug.cgi?id=196387
925         https://trac.webkit.org/changeset/243898
926
927 2019-04-04  Yusuke Suzuki  <ysuzuki@apple.com>
928
929         Unreviewed, build fix for CLoop and Windows after r243886
930         https://bugs.webkit.org/show_bug.cgi?id=196387
931
932         RegisterAtOffsetList does not exist if ENABLE(ASSEMBLER) is false.
933
934         * interpreter/StackVisitor.cpp:
935         (JSC::StackVisitor::Frame::calleeSaveRegistersForUnwinding):
936         * interpreter/StackVisitor.h:
937
938 2019-04-04  Saam barati  <sbarati@apple.com>
939
940         Teach Call ICs how to call Wasm
941         https://bugs.webkit.org/show_bug.cgi?id=196387
942
943         Reviewed by Filip Pizlo.
944
945         This patch teaches JS to call Wasm without going through the native thunk.
946         Currently, we emit a JIT "JS" callee stub which marshals arguments from
947         JS to Wasm. Like the native version of this, this thunk is responsible
948         for saving and restoring the VM's current Wasm context. Instead of emitting
949         an exception handler, we also teach the unwinder how to read the previous
950         wasm context to restore it as it unwindws past this frame.
951         
952         This patch is straight forward, and leaves some areas for perf improvement:
953         - We can teach the DFG/FTL to directly use the Wasm calling convention when
954           it knows it's calling a single Wasm function. This way we don't shuffle
955           registers to the stack and then back into registers.
956         - We bail out to the slow path for mismatched arity. I opened a bug to fix
957           optimize arity check failures: https://bugs.webkit.org/show_bug.cgi?id=196564
958         - We bail out to the slow path Double JSValues flowing into i32 arguments.
959           We should teach this thunk how to do that conversion directly.
960         
961         This patch also refactors the code to explicitly have a single pinned size register.
962         We used pretend in some places that we could have more than one pinned size register.
963         However, there was other code that just asserted the size was one. This patch just rips
964         out this code since we never moved to having more than one pinned size register. Doing
965         this refactoring cleans up the various places where we set up the size register.
966         
967         This patch is a 50-60% progression on JetStream 2's richards-wasm.
968
969         * JavaScriptCore.xcodeproj/project.pbxproj:
970         * Sources.txt:
971         * assembler/MacroAssemblerCodeRef.h:
972         (JSC::MacroAssemblerCodeRef::operator=):
973         (JSC::MacroAssemblerCodeRef::MacroAssemblerCodeRef):
974         * interpreter/Interpreter.cpp:
975         (JSC::UnwindFunctor::operator() const):
976         (JSC::UnwindFunctor::copyCalleeSavesToEntryFrameCalleeSavesBuffer const):
977         * interpreter/StackVisitor.cpp:
978         (JSC::StackVisitor::Frame::calleeSaveRegistersForUnwinding):
979         (JSC::StackVisitor::Frame::calleeSaveRegisters): Deleted.
980         * interpreter/StackVisitor.h:
981         * jit/JITOperations.cpp:
982         * jit/RegisterSet.cpp:
983         (JSC::RegisterSet::runtimeTagRegisters):
984         (JSC::RegisterSet::specialRegisters):
985         (JSC::RegisterSet::runtimeRegisters): Deleted.
986         * jit/RegisterSet.h:
987         * jit/Repatch.cpp:
988         (JSC::linkPolymorphicCall):
989         * runtime/JSFunction.cpp:
990         (JSC::getCalculatedDisplayName):
991         * runtime/JSGlobalObject.cpp:
992         (JSC::JSGlobalObject::init):
993         (JSC::JSGlobalObject::visitChildren):
994         * runtime/JSGlobalObject.h:
995         (JSC::JSGlobalObject::jsToWasmICCalleeStructure const):
996         * runtime/VM.cpp:
997         (JSC::VM::VM):
998         * runtime/VM.h:
999         * wasm/WasmAirIRGenerator.cpp:
1000         (JSC::Wasm::AirIRGenerator::AirIRGenerator):
1001         (JSC::Wasm::AirIRGenerator::restoreWebAssemblyGlobalState):
1002         (JSC::Wasm::AirIRGenerator::addCallIndirect):
1003         * wasm/WasmB3IRGenerator.cpp:
1004         (JSC::Wasm::B3IRGenerator::B3IRGenerator):
1005         (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState):
1006         (JSC::Wasm::B3IRGenerator::addCallIndirect):
1007         * wasm/WasmBinding.cpp:
1008         (JSC::Wasm::wasmToWasm):
1009         * wasm/WasmContext.h:
1010         (JSC::Wasm::Context::pointerToInstance):
1011         * wasm/WasmContextInlines.h:
1012         (JSC::Wasm::Context::store):
1013         * wasm/WasmMemoryInformation.cpp:
1014         (JSC::Wasm::getPinnedRegisters):
1015         (JSC::Wasm::PinnedRegisterInfo::get):
1016         (JSC::Wasm::PinnedRegisterInfo::PinnedRegisterInfo):
1017         * wasm/WasmMemoryInformation.h:
1018         (JSC::Wasm::PinnedRegisterInfo::toSave const):
1019         * wasm/WasmOMGPlan.cpp:
1020         (JSC::Wasm::OMGPlan::work):
1021         * wasm/js/JSToWasm.cpp:
1022         (JSC::Wasm::createJSToWasmWrapper):
1023         * wasm/js/JSToWasmICCallee.cpp: Added.
1024         (JSC::JSToWasmICCallee::create):
1025         (JSC::JSToWasmICCallee::createStructure):
1026         (JSC::JSToWasmICCallee::visitChildren):
1027         * wasm/js/JSToWasmICCallee.h: Added.
1028         (JSC::JSToWasmICCallee::function):
1029         (JSC::JSToWasmICCallee::JSToWasmICCallee):
1030         * wasm/js/WebAssemblyFunction.cpp:
1031         (JSC::WebAssemblyFunction::useTagRegisters const):
1032         (JSC::WebAssemblyFunction::calleeSaves const):
1033         (JSC::WebAssemblyFunction::usedCalleeSaveRegisters const):
1034         (JSC::WebAssemblyFunction::previousInstanceOffset const):
1035         (JSC::WebAssemblyFunction::previousInstance):
1036         (JSC::WebAssemblyFunction::jsCallEntrypointSlow):
1037         (JSC::WebAssemblyFunction::visitChildren):
1038         (JSC::WebAssemblyFunction::destroy):
1039         * wasm/js/WebAssemblyFunction.h:
1040         * wasm/js/WebAssemblyFunctionHeapCellType.cpp: Added.
1041         (JSC::WebAssemblyFunctionDestroyFunc::operator() const):
1042         (JSC::WebAssemblyFunctionHeapCellType::WebAssemblyFunctionHeapCellType):
1043         (JSC::WebAssemblyFunctionHeapCellType::~WebAssemblyFunctionHeapCellType):
1044         (JSC::WebAssemblyFunctionHeapCellType::finishSweep):
1045         (JSC::WebAssemblyFunctionHeapCellType::destroy):
1046         * wasm/js/WebAssemblyFunctionHeapCellType.h: Added.
1047         * wasm/js/WebAssemblyPrototype.h:
1048
1049 2019-04-04  Yusuke Suzuki  <ysuzuki@apple.com>
1050
1051         [JSC] Pass CodeOrigin to FuzzerAgent
1052         https://bugs.webkit.org/show_bug.cgi?id=196590
1053
1054         Reviewed by Saam Barati.
1055
1056         Pass CodeOrigin instead of bytecodeIndex. CodeOrigin includes richer information (InlineCallFrame*).
1057         We also mask prediction with SpecBytecodeTop in DFGByteCodeParser. The fuzzer can produce any SpeculatedTypes,
1058         but DFGByteCodeParser should only see predictions that can be actually produced from the bytecode execution.
1059
1060         * dfg/DFGByteCodeParser.cpp:
1061         (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit):
1062         * runtime/FuzzerAgent.cpp:
1063         (JSC::FuzzerAgent::getPrediction):
1064         * runtime/FuzzerAgent.h:
1065         * runtime/RandomizingFuzzerAgent.cpp:
1066         (JSC::RandomizingFuzzerAgent::getPrediction):
1067         * runtime/RandomizingFuzzerAgent.h:
1068
1069 2019-04-04  Caio Lima  <ticaiolima@gmail.com>
1070
1071         [JSC] We should consider moving UnlinkedFunctionExecutable::m_parentScopeTDZVariables to RareData
1072         https://bugs.webkit.org/show_bug.cgi?id=194944
1073
1074         Reviewed by Keith Miller.
1075
1076         Based on profile data collected on JetStream2, Speedometer 2 and
1077         other benchmarks, it is very rare having non-empty
1078         UnlinkedFunctionExecutable::m_parentScopeTDZVariables.
1079
1080         - Data collected from Speedometer2
1081             Total number of UnlinkedFunctionExecutable: 39463
1082             Total number of non-empty parentScopeTDZVars: 428 (~1%)
1083
1084         - Data collected from JetStream2
1085             Total number of UnlinkedFunctionExecutable: 83715
1086             Total number of non-empty parentScopeTDZVars: 5285 (~6%)
1087
1088         We also collected numbers on 6 of top 10 Alexia sites.
1089
1090         - Data collected from youtube.com
1091             Total number of UnlinkedFunctionExecutable: 29599
1092             Total number of non-empty parentScopeTDZVars: 97 (~0.3%)
1093
1094         - Data collected from twitter.com
1095             Total number of UnlinkedFunctionExecutable: 23774
1096             Total number of non-empty parentScopeTDZVars: 172 (~0.7%)
1097
1098         - Data collected from google.com
1099             Total number of UnlinkedFunctionExecutable: 33209
1100             Total number of non-empty parentScopeTDZVars: 174 (~0.5%)
1101
1102         - Data collected from amazon.com:
1103             Total number of UnlinkedFunctionExecutable: 15182
1104             Total number of non-empty parentScopeTDZVars: 166 (~1%)
1105
1106         - Data collected from facebook.com:
1107             Total number of UnlinkedFunctionExecutable: 54443
1108             Total number of non-empty parentScopeTDZVars: 269 (~0.4%)
1109
1110         - Data collected from netflix.com:
1111             Total number of UnlinkedFunctionExecutable: 39266
1112             Total number of non-empty parentScopeTDZVars: 97 (~0.2%)
1113
1114         Considering such numbers, this patch is moving `m_parentScopeTDZVariables`
1115         to RareData. This decreases sizeof(UnlinkedFunctionExecutable) by
1116         16 bytes. With this change, now UnlinkedFunctionExecutable constructors
1117         receives an `Optional<VariableEnvironmentMap::Handle>` and only stores
1118         it when `value != WTF::nullopt`. We also changed
1119         UnlinkedFunctionExecutable::parentScopeTDZVariables() and it returns
1120         `VariableEnvironment()` whenever the Executable doesn't have RareData,
1121         or VariableEnvironmentMap::Handle is unitialized. This is required
1122         because RareData is instantiated when any of its field is stored and
1123         we can have an unitialized `Handle` even on cases when parentScopeTDZVariables
1124         is `WTF::nullopt`.
1125
1126         Results on memory usage on JetStrem2 is neutral.
1127
1128             Mean of memory peak on ToT: 4258633728 bytes (confidence interval: 249720072.95)
1129             Mean of memory peak on Changes: 4367325184 bytes (confidence interval: 321285583.61)
1130
1131         * builtins/BuiltinExecutables.cpp:
1132         (JSC::BuiltinExecutables::createExecutable):
1133         * bytecode/UnlinkedFunctionExecutable.cpp:
1134         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1135         * bytecode/UnlinkedFunctionExecutable.h:
1136         * bytecompiler/BytecodeGenerator.cpp:
1137         (JSC::BytecodeGenerator::getVariablesUnderTDZ):
1138
1139         BytecodeGenerator::getVariablesUnderTDZ now also caches if m_cachedVariablesUnderTDZ
1140         is empty, so we can properly return `WTF::nullopt` without the
1141         reconstruction of a VariableEnvironment to check if it is empty.
1142
1143         * bytecompiler/BytecodeGenerator.h:
1144         (JSC::BytecodeGenerator::makeFunction):
1145         * parser/VariableEnvironment.h:
1146         (JSC::VariableEnvironment::isEmpty const):
1147         * runtime/CachedTypes.cpp:
1148         (JSC::CachedCompactVariableMapHandle::decode const):
1149
1150         It returns an unitialized Handle when there is no
1151         CompactVariableEnvironment. This can happen when RareData is ensured
1152         because of another field.
1153
1154         (JSC::CachedFunctionExecutableRareData::encode):
1155         (JSC::CachedFunctionExecutableRareData::decode const):
1156         (JSC::CachedFunctionExecutable::encode):
1157         (JSC::CachedFunctionExecutable::decode const):
1158         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1159         * runtime/CodeCache.cpp:
1160
1161         Instead of creating a dummyVariablesUnderTDZ, we simply pass
1162         WTF::nullopt.
1163
1164         (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
1165
1166 2019-04-04  Tadeu Zagallo  <tzagallo@apple.com>
1167
1168         Cache bytecode for jsc.cpp helpers and fix CachedStringImpl
1169         https://bugs.webkit.org/show_bug.cgi?id=196409
1170
1171         Reviewed by Saam Barati.
1172
1173         Some of the helpers in jsc.cpp, such as `functionRunString`, were stll using
1174         using `makeSource` instead of `jscSource`, which does not use the ShellSourceProvider
1175         and therefore does not write the bytecode cache to disk.
1176
1177         Changing that revealed a bug in bytecode cache. The Encoder keeps a mapping
1178         of pointers to offsets of already cached objects, in order to avoid caching
1179         the same object twice. Similarly, the Decoder keeps a mapping from offsets
1180         to pointers, in order to avoid creating multiple objects in memory for the
1181         same cached object. The following was happening:
1182         1) A StringImpl* S was cached as CachedPtr<CachedStringImpl> at offset O. We add
1183         an entry in the Encoder mapping that S has already been encoded at O.
1184         2) We cache StringImpl* S again, but now as CachedPtr<CachedUniquedStringImpl>.
1185         We find an entry in the Encoder mapping for S, and return the offset O. However,
1186         the object cached at O is a CachedPtr<CachedStringImpl> (i.e. not Uniqued).
1187
1188         3) When decoding, there are 2 possibilities:
1189         3.1) We find S for the first time through a CachedPtr<CachedStringImpl>. In
1190         this case, everything works as expected since we add an entry in the decoder
1191         mapping from the offset O to the decoded StringImpl* S. The next time we find
1192         S through the uniqued version, we'll return the already decoded S.
1193         3.2) We find S through a CachedPtr<CachedUniquedStringImpl>. Now we have a
1194         problem, since the CachedPtr has the offset of a CachedStringImpl (not uniqued),
1195         which has a different shape and we crash.
1196
1197         We fix this by making CachedStringImpl and CachedUniquedStringImpl share the
1198         same implementation. Since it doesn't matter whether a string is uniqued for
1199         encoding, and we always decode strings as uniqued either way, they can be used
1200         interchangeably.
1201
1202         * jsc.cpp:
1203         (functionRunString):
1204         (functionLoadString):
1205         (functionDollarAgentStart):
1206         (functionCheckModuleSyntax):
1207         (runInteractive):
1208         * runtime/CachedTypes.cpp:
1209         (JSC::CachedUniquedStringImplBase::decode const):
1210         (JSC::CachedFunctionExecutable::rareData const):
1211         (JSC::CachedCodeBlock::rareData const):
1212         (JSC::CachedFunctionExecutable::encode):
1213         (JSC::CachedCodeBlock<CodeBlockType>::encode):
1214         (JSC::CachedUniquedStringImpl::encode): Deleted.
1215         (JSC::CachedUniquedStringImpl::decode const): Deleted.
1216         (JSC::CachedStringImpl::encode): Deleted.
1217         (JSC::CachedStringImpl::decode const): Deleted.
1218
1219 2019-04-04  Tadeu Zagallo  <tzagallo@apple.com>
1220
1221         UnlinkedCodeBlock constructor from cache should initialize m_didOptimize
1222         https://bugs.webkit.org/show_bug.cgi?id=196396
1223
1224         Reviewed by Saam Barati.
1225
1226         The UnlinkedCodeBlock constructor in CachedTypes was missing the initialization
1227         for m_didOptimize, which leads to crashes in CodeBlock::thresholdForJIT.
1228
1229         * runtime/CachedTypes.cpp:
1230         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
1231
1232 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
1233
1234         Unreviewed, rolling in r243843 with the build fix
1235         https://bugs.webkit.org/show_bug.cgi?id=196586
1236
1237         * runtime/Options.cpp:
1238         (JSC::recomputeDependentOptions):
1239         * runtime/Options.h:
1240         * runtime/RandomizingFuzzerAgent.cpp:
1241         (JSC::RandomizingFuzzerAgent::getPrediction):
1242
1243 2019-04-03  Ryan Haddad  <ryanhaddad@apple.com>
1244
1245         Unreviewed, rolling out r243843.
1246
1247         Broke CLoop and Windows builds.
1248
1249         Reverted changeset:
1250
1251         "[JSC] Add dump feature for RandomizingFuzzerAgent"
1252         https://bugs.webkit.org/show_bug.cgi?id=196586
1253         https://trac.webkit.org/changeset/243843
1254
1255 2019-04-03  Robin Morisset  <rmorisset@apple.com>
1256
1257         B3 should use associativity to optimize expression trees
1258         https://bugs.webkit.org/show_bug.cgi?id=194081
1259
1260         Reviewed by Filip Pizlo.
1261
1262         This patch adds a new B3 pass, that tries to find and optimize expression trees made purely of any one associative and commutative operator (Add/Mul/BitOr/BitAnd/BitXor).
1263         The pass only runs in O2, and runs once, after lowerMacros and just before a run of B3ReduceStrength (which helps clean up the dead code it tends to leave behind).
1264         I had to separate killDeadCode out of B3ReduceStrength (as a new B3EliminateDeadCode pass) to run it before B3OptimizeAssociativeExpressionTrees, as otherwise it is stopped by high use counts
1265         inherited from CSE.
1266         This extra run of DCE is by itself a win, most notably on microbenchmarks/instanceof-always-hit-two (1.5x faster), and on microbenchmarks/licm-dragons(-out-of-bounds) (both get 1.16x speedup).
1267         I suspect it is because it runs between CSE and tail-dedup, and as a result allows a lot more tail-dedup to occur.
1268
1269         The pass is currently extremely conservative, not trying anything if it would cause _any_ code duplication.
1270         For this purpose, it starts by computing use counts for the potentially interesting nodes (those with the right opcodes), and segregate them into expression trees.
1271         The root of an expression tree is a node that is either used in multiple places, or is used by a value with a different opcode.
1272         The leaves of an expression tree are nodes that are either used in multiple places, or have a different opcode.
1273         All constant leaves of a tree are combined, as well as all leaves that are identical. What remains is then laid out into a balanced binary tree, hopefully maximizing ILP.
1274
1275         This optimization was implemented as a stand-alone pass and not as part of B3ReduceStrength mostly because it needs use counts to avoid code duplication.
1276         It also benefits from finding all tree roots first, and not trying to repeatedly optimize subtrees.
1277
1278         I added several tests to testB3 with varying patterns of trees. It is also tested in a less focused way by lots of older tests.
1279
1280         In the future this pass could be expanded to allow some bounded amount of code duplication, and merging more leaves (e.g. Mul(a, 3) and a in an Add tree, into Mul(a, 4))
1281         The latter will need exposing the peephole optimizations out of B3ReduceStrength to avoid duplicating code.
1282
1283         * JavaScriptCore.xcodeproj/project.pbxproj:
1284         * Sources.txt:
1285         * b3/B3Common.cpp:
1286         (JSC::B3::shouldDumpIR):
1287         (JSC::B3::shouldDumpIRAtEachPhase):
1288         * b3/B3Common.h:
1289         * b3/B3EliminateDeadCode.cpp: Added.
1290         (JSC::B3::EliminateDeadCode::run):
1291         (JSC::B3::eliminateDeadCode):
1292         * b3/B3EliminateDeadCode.h: Added.
1293         (JSC::B3::EliminateDeadCode::EliminateDeadCode):
1294         * b3/B3Generate.cpp:
1295         (JSC::B3::generateToAir):
1296         * b3/B3OptimizeAssociativeExpressionTrees.cpp: Added.
1297         (JSC::B3::OptimizeAssociativeExpressionTrees::OptimizeAssociativeExpressionTrees):
1298         (JSC::B3::OptimizeAssociativeExpressionTrees::neutralElement):
1299         (JSC::B3::OptimizeAssociativeExpressionTrees::isAbsorbingElement):
1300         (JSC::B3::OptimizeAssociativeExpressionTrees::combineConstants):
1301         (JSC::B3::OptimizeAssociativeExpressionTrees::emitValue):
1302         (JSC::B3::OptimizeAssociativeExpressionTrees::optimizeRootedTree):
1303         (JSC::B3::OptimizeAssociativeExpressionTrees::run):
1304         (JSC::B3::optimizeAssociativeExpressionTrees):
1305         * b3/B3OptimizeAssociativeExpressionTrees.h: Added.
1306         * b3/B3ReduceStrength.cpp:
1307         * b3/B3Value.cpp:
1308         (JSC::B3::Value::replaceWithIdentity):
1309         * b3/testb3.cpp:
1310         (JSC::B3::testBitXorTreeArgs):
1311         (JSC::B3::testBitXorTreeArgsEven):
1312         (JSC::B3::testBitXorTreeArgImm):
1313         (JSC::B3::testAddTreeArg32):
1314         (JSC::B3::testMulTreeArg32):
1315         (JSC::B3::testBitAndTreeArg32):
1316         (JSC::B3::testBitOrTreeArg32):
1317         (JSC::B3::run):
1318
1319 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
1320
1321         [JSC] Add dump feature for RandomizingFuzzerAgent
1322         https://bugs.webkit.org/show_bug.cgi?id=196586
1323
1324         Reviewed by Saam Barati.
1325
1326         Towards deterministic tests for the results from randomizing fuzzer agent, this patch adds Options::dumpRandomizingFuzzerAgentPredictions, which dumps the generated types.
1327         The results is like this.
1328
1329             getPrediction name:(#C2q9xD),bytecodeIndex:(22),original:(Array),generated:(OtherObj|Array|Float64Array|BigInt|NonIntAsDouble)
1330             getPrediction name:(makeUnwriteableUnconfigurableObject#AiEJv1),bytecodeIndex:(14),original:(OtherObj),generated:(Final|Uint8Array|Float64Array|SetObject|WeakSetObject|BigInt|NonIntAsDouble)
1331
1332         * runtime/Options.cpp:
1333         (JSC::recomputeDependentOptions):
1334         * runtime/Options.h:
1335         * runtime/RandomizingFuzzerAgent.cpp:
1336         (JSC::RandomizingFuzzerAgent::getPrediction):
1337
1338 2019-04-03  Myles C. Maxfield  <mmaxfield@apple.com>
1339
1340         -apple-trailing-word is needed for browser detection
1341         https://bugs.webkit.org/show_bug.cgi?id=196575
1342
1343         Unreviewed.
1344
1345         * Configurations/FeatureDefines.xcconfig:
1346
1347 2019-04-03  Michael Saboff  <msaboff@apple.com>
1348
1349         REGRESSION (r243642): com.apple.JavaScriptCore crash in JSC::RegExpObject::execInline
1350         https://bugs.webkit.org/show_bug.cgi?id=196477
1351
1352         Reviewed by Keith Miller.
1353
1354         The problem here is that when we advance the index by 2 for a character class that only
1355         has non-BMP characters, we might go past the end of the string.  This can happen for
1356         greedy counted character classes that are part of a alternative where there is one
1357         character to match after the greedy non-BMP character class.
1358
1359         The "do we have string left to match" check at the top of the JIT loop for the counted
1360         character class checks to see if index is not equal to the string length.  For non-BMP
1361         character classes, we need to check to see if there are at least 2 characters left.
1362         Therefore we now temporarily add 1 to the current index before comparing.  This checks
1363         to see if there are iat least 2 characters left to match, instead of 1.
1364
1365         * yarr/YarrJIT.cpp:
1366         (JSC::Yarr::YarrGenerator::generateCharacterClassGreedy):
1367         (JSC::Yarr::YarrGenerator::backtrackCharacterClassNonGreedy):
1368
1369 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
1370
1371         [JSC] Exception verification crash on operationArrayIndexOfValueInt32OrContiguous
1372         https://bugs.webkit.org/show_bug.cgi?id=196574
1373
1374         Reviewed by Saam Barati.
1375
1376         This patch adds missing exception check in operationArrayIndexOfValueInt32OrContiguous.
1377
1378         * dfg/DFGOperations.cpp:
1379
1380 2019-04-03  Don Olmstead  <don.olmstead@sony.com>
1381
1382         [CMake][WTF] Mirror XCode header directories
1383         https://bugs.webkit.org/show_bug.cgi?id=191662
1384
1385         Reviewed by Konstantin Tokarev.
1386
1387         Use WTFFramework as a dependency and include frameworks/WTF.cmake for AppleWin internal
1388         builds.
1389
1390         * CMakeLists.txt:
1391         * shell/CMakeLists.txt:
1392
1393 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
1394
1395         [JSC] Add FuzzerAgent, which has a hooks to get feedback & inject fuzz data into JSC
1396         https://bugs.webkit.org/show_bug.cgi?id=196530
1397
1398         Reviewed by Saam Barati.
1399
1400         This patch adds FuzzerAgent interface and simple RandomizingFuzzerAgent to JSC.
1401         This RandomizingFuzzerAgent returns random SpeculatedType for value profiling to find
1402         the issues in JSC. The seed for randomization can be specified by seedOfRandomizingFuzzerAgent.
1403
1404         I ran this with seedOfRandomizingFuzzerAgent=1 last night and it finds 3 failures in the current JSC tests,
1405         they should be fixed in subsequent patches.
1406
1407         * CMakeLists.txt:
1408         * JavaScriptCore.xcodeproj/project.pbxproj:
1409         * Sources.txt:
1410         * dfg/DFGByteCodeParser.cpp:
1411         (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit):
1412         * runtime/FuzzerAgent.cpp: Added.
1413         (JSC::FuzzerAgent::~FuzzerAgent):
1414         (JSC::FuzzerAgent::getPrediction):
1415         * runtime/FuzzerAgent.h: Added.
1416         * runtime/JSGlobalObjectFunctions.cpp:
1417         * runtime/Options.h:
1418         * runtime/RandomizingFuzzerAgent.cpp: Added.
1419         (JSC::RandomizingFuzzerAgent::RandomizingFuzzerAgent):
1420         (JSC::RandomizingFuzzerAgent::getPrediction):
1421         * runtime/RandomizingFuzzerAgent.h: Added.
1422         * runtime/RegExpCachedResult.h:
1423         * runtime/RegExpGlobalData.cpp:
1424         * runtime/VM.cpp:
1425         (JSC::VM::VM):
1426         * runtime/VM.h:
1427         (JSC::VM::fuzzerAgent const):
1428         (JSC::VM::setFuzzerAgent):
1429
1430 2019-04-03  Myles C. Maxfield  <mmaxfield@apple.com>
1431
1432         Remove support for -apple-trailing-word
1433         https://bugs.webkit.org/show_bug.cgi?id=196525
1434
1435         Reviewed by Zalan Bujtas.
1436
1437         This CSS property is nonstandard and not used.
1438
1439         * Configurations/FeatureDefines.xcconfig:
1440
1441 2019-04-03  Joseph Pecoraro  <pecoraro@apple.com>
1442
1443         Web Inspector: Remote Inspector indicate callback should always happen on the main thread
1444         https://bugs.webkit.org/show_bug.cgi?id=196513
1445         <rdar://problem/49498284>
1446
1447         Reviewed by Devin Rousso.
1448
1449         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
1450         (Inspector::RemoteInspector::receivedIndicateMessage):
1451         When we have a WebThread, don't just run on the WebThread,
1452         run on the MainThread with the WebThreadLock.
1453
1454 2019-04-02  Michael Saboff  <msaboff@apple.com>
1455
1456         Crash in Options::setOptions() using --configFile option and libgmalloc
1457         https://bugs.webkit.org/show_bug.cgi?id=196506
1458
1459         Reviewed by Keith Miller.
1460
1461         Changed to call CString::data() while making the call to Options::setOptions().  This keeps
1462         the implicit CString temporary alive until after setOptions() returns.
1463
1464         * runtime/ConfigFile.cpp:
1465         (JSC::ConfigFile::parse):
1466
1467 2019-04-02  Fujii Hironori  <Hironori.Fujii@sony.com>
1468
1469         [CMake] WEBKIT_MAKE_FORWARDING_HEADERS shouldn't use POST_BUILD to copy generated headers
1470         https://bugs.webkit.org/show_bug.cgi?id=182757
1471
1472         Reviewed by Don Olmstead.
1473
1474         * CMakeLists.txt: Do not use DERIVED_SOURCE_DIRECTORIES parameter
1475         of WEBKIT_MAKE_FORWARDING_HEADERS. Added generated headers to
1476         JavaScriptCore_PRIVATE_FRAMEWORK_HEADERS.
1477
1478 2019-04-02  Saam barati  <sbarati@apple.com>
1479
1480         Add a ValueRepReduction phase
1481         https://bugs.webkit.org/show_bug.cgi?id=196234
1482
1483         Reviewed by Filip Pizlo.
1484
1485         This patch adds a ValueRepReduction phase. The main idea here is
1486         to try to reduce DoubleRep(RealNumberUse:ValueRep(DoubleRepUse:@x))
1487         to just be @x. This patch handles such above strengh reduction rules
1488         as long as we prove that all users of the ValueRep can be converted
1489         to using the incoming double value. That way we prevent introducing
1490         a parallel live range for the double value.
1491         
1492         This patch tracks the uses of the ValueRep through Phi variables,
1493         so we can convert entire Phi variables to being Double instead
1494         of JSValue if the Phi also has only double uses.
1495         
1496         This is implemented through a simple escape analysis. DoubleRep(RealNumberUse:)
1497         and OSR exit hints are not counted as escapes. All other uses are counted
1498         as escapes. Connected Phi graphs are converted to being Double only if the
1499         entire graph is ok with the result being Double.
1500         
1501         Some ways we could extend this phase in the future:
1502         - There are a lot of DoubleRep(NumberUse:@ValueRep(@x)) uses. This ensures
1503           that the result of the DoubleRep of @x is not impure NaN. We could
1504           handle this case if we introduced a PurifyNaN node and replace the DoubleRep
1505           with PurifyNaN(@x). Alternatively, we could see if certain users of this
1506           DoubleRep are okay with impure NaN flowing into them and we'd need to ensure
1507           their output type is always treated as if the input is impure NaN.
1508         - We could do sinking of ValueRep where we think it's profitable. So instead
1509           of an escape making it so we never represent the variable as a Double, we
1510           could make the escape reconstruct the JSValueRep where profitable.
1511         - We can extend this phase to handle Int52Rep if it's profitable.
1512         - We can opt other nodes into accepting incoming Doubles so we no longer
1513           treat them as escapes.
1514         
1515         This patch is somewhere between neutral and a 1% progression on JetStream 2.
1516
1517         * JavaScriptCore.xcodeproj/project.pbxproj:
1518         * Sources.txt:
1519         * dfg/DFGPlan.cpp:
1520         (JSC::DFG::Plan::compileInThreadImpl):
1521         * dfg/DFGValueRepReductionPhase.cpp: Added.
1522         (JSC::DFG::ValueRepReductionPhase::ValueRepReductionPhase):
1523         (JSC::DFG::ValueRepReductionPhase::run):
1524         (JSC::DFG::ValueRepReductionPhase::convertValueRepsToDouble):
1525         (JSC::DFG::performValueRepReduction):
1526         * dfg/DFGValueRepReductionPhase.h: Added.
1527         * runtime/Options.h:
1528
1529 2019-04-01  Yusuke Suzuki  <ysuzuki@apple.com>
1530
1531         [JSC] JSRunLoopTimer::Manager should be small
1532         https://bugs.webkit.org/show_bug.cgi?id=196425
1533
1534         Reviewed by Darin Adler.
1535
1536         Using very large Key or Value in HashMap potentially bloats memory since HashMap pre-allocates large size of
1537         memory ((sizeof(Key) + sizeof(Value)) * N) for its backing storage's array. Using std::unique_ptr<> for JSRunLoopTimer's
1538         PerVMData to keep HashMap's backing store size small.
1539
1540         * runtime/JSRunLoopTimer.cpp:
1541         (JSC::JSRunLoopTimer::Manager::timerDidFire):
1542         (JSC::JSRunLoopTimer::Manager::registerVM):
1543         (JSC::JSRunLoopTimer::Manager::scheduleTimer):
1544         (JSC::JSRunLoopTimer::Manager::cancelTimer):
1545         (JSC::JSRunLoopTimer::Manager::timeUntilFire):
1546         (JSC::JSRunLoopTimer::Manager::didChangeRunLoop):
1547         * runtime/JSRunLoopTimer.h:
1548
1549 2019-04-01  Stephan Szabo  <stephan.szabo@sony.com>
1550
1551         [PlayStation] Add initialization for JSC shell for PlayStation port
1552         https://bugs.webkit.org/show_bug.cgi?id=195411
1553
1554         Reviewed by Ross Kirsling.
1555
1556         Add ps options
1557
1558         * shell/PlatformPlayStation.cmake: Added.
1559         * shell/playstation/Initializer.cpp: Added.
1560         (initializer):
1561
1562 2019-04-01  Michael Catanzaro  <mcatanzaro@igalia.com>
1563
1564         Stop trying to support building JSC with clang 3.8
1565         https://bugs.webkit.org/show_bug.cgi?id=195947
1566         <rdar://problem/49069219>
1567
1568         Reviewed by Darin Adler.
1569
1570         It seems WebKit hasn't built with clang 3.8 in a while, no devs are using this compiler, we
1571         don't know how much effort it would be to make JSC work again, and it's making the code
1572         worse. Remove my hacks to support clang 3.8 from JSC.
1573
1574         * bindings/ScriptValue.cpp:
1575         (Inspector::jsToInspectorValue):
1576         * bytecode/GetterSetterAccessCase.cpp:
1577         (JSC::GetterSetterAccessCase::create):
1578         (JSC::GetterSetterAccessCase::clone const):
1579         * bytecode/InstanceOfAccessCase.cpp:
1580         (JSC::InstanceOfAccessCase::clone const):
1581         * bytecode/IntrinsicGetterAccessCase.cpp:
1582         (JSC::IntrinsicGetterAccessCase::clone const):
1583         * bytecode/ModuleNamespaceAccessCase.cpp:
1584         (JSC::ModuleNamespaceAccessCase::clone const):
1585         * bytecode/ProxyableAccessCase.cpp:
1586         (JSC::ProxyableAccessCase::clone const):
1587
1588 2019-03-31  Yusuke Suzuki  <ysuzuki@apple.com>
1589
1590         [JSC] Butterfly allocation from LargeAllocation should try "realloc" behavior if collector thread is not active
1591         https://bugs.webkit.org/show_bug.cgi?id=196160
1592
1593         Reviewed by Saam Barati.
1594
1595         "realloc" can be effective in terms of peak/current memory footprint when realloc succeeds because,
1596
1597         1. It does not allocate additional memory while expanding a vector
1598         2. It does not deallocate an old memory, just reusing the current memory by expanding, so that memory footprint is tight even before scavenging
1599
1600         We found that we can "realloc" large butterflies in certain conditions are met because,
1601
1602         1. If it goes to LargeAllocation, this memory region is never reused until GC sweeps it.
1603         2. Butterflies are owned by owner JSObjects, so we know the lifetime of Butterflies.
1604
1605         This patch attempts to use "realloc" onto butterflies if,
1606
1607         1. Butterflies are allocated in LargeAllocation kind
1608         2. Concurrent collector is not active
1609         3. Butterflies do not have property storage
1610
1611         The condition (2) is required to avoid deallocating butterflies while the concurrent collector looks into it. The condition (3) is
1612         also required to avoid deallocating butterflies while the concurrent compiler looks into it.
1613
1614         We also change LargeAllocation mechanism to using "malloc" and "free" instead of "posix_memalign". This allows us to use "realloc"
1615         safely in all the platforms. Since LargeAllocation uses alignment to distinguish LargeAllocation and MarkedBlock, we manually adjust
1616         16B alignment by allocating 8B more memory in "malloc".
1617
1618         Speedometer2 and JetStream2 are neutral. RAMification shows about 1% progression (even in some of JIT tests).
1619
1620         * heap/AlignedMemoryAllocator.h:
1621         * heap/CompleteSubspace.cpp:
1622         (JSC::CompleteSubspace::tryAllocateSlow):
1623         (JSC::CompleteSubspace::reallocateLargeAllocationNonVirtual):
1624         * heap/CompleteSubspace.h:
1625         * heap/FastMallocAlignedMemoryAllocator.cpp:
1626         (JSC::FastMallocAlignedMemoryAllocator::tryAllocateMemory):
1627         (JSC::FastMallocAlignedMemoryAllocator::freeMemory):
1628         (JSC::FastMallocAlignedMemoryAllocator::tryReallocateMemory):
1629         * heap/FastMallocAlignedMemoryAllocator.h:
1630         * heap/GigacageAlignedMemoryAllocator.cpp:
1631         (JSC::GigacageAlignedMemoryAllocator::tryAllocateMemory):
1632         (JSC::GigacageAlignedMemoryAllocator::freeMemory):
1633         (JSC::GigacageAlignedMemoryAllocator::tryReallocateMemory):
1634         * heap/GigacageAlignedMemoryAllocator.h:
1635         * heap/IsoAlignedMemoryAllocator.cpp:
1636         (JSC::IsoAlignedMemoryAllocator::tryAllocateMemory):
1637         (JSC::IsoAlignedMemoryAllocator::freeMemory):
1638         (JSC::IsoAlignedMemoryAllocator::tryReallocateMemory):
1639         * heap/IsoAlignedMemoryAllocator.h:
1640         * heap/LargeAllocation.cpp:
1641         (JSC::isAlignedForLargeAllocation):
1642         (JSC::LargeAllocation::tryCreate):
1643         (JSC::LargeAllocation::tryReallocate):
1644         (JSC::LargeAllocation::LargeAllocation):
1645         (JSC::LargeAllocation::destroy):
1646         * heap/LargeAllocation.h:
1647         (JSC::LargeAllocation::indexInSpace):
1648         (JSC::LargeAllocation::setIndexInSpace):
1649         (JSC::LargeAllocation::basePointer const):
1650         * heap/MarkedSpace.cpp:
1651         (JSC::MarkedSpace::sweepLargeAllocations):
1652         (JSC::MarkedSpace::prepareForConservativeScan):
1653         * heap/WeakSet.h:
1654         (JSC::WeakSet::isTriviallyDestructible const):
1655         * runtime/Butterfly.h:
1656         * runtime/ButterflyInlines.h:
1657         (JSC::Butterfly::reallocArrayRightIfPossible):
1658         * runtime/JSObject.cpp:
1659         (JSC::JSObject::ensureLengthSlow):
1660
1661 2019-03-31  Sam Weinig  <weinig@apple.com>
1662
1663         Remove more i386 specific configurations
1664         https://bugs.webkit.org/show_bug.cgi?id=196430
1665
1666         Reviewed by Alexey Proskuryakov.
1667
1668         * Configurations/FeatureDefines.xcconfig:
1669         ENABLE_WEB_AUTHN_macosx can now be enabled unconditionally on macOS.
1670
1671         * Configurations/ToolExecutable.xcconfig:
1672         ARC can be enabled unconditionally now.
1673
1674 2019-03-29  Yusuke Suzuki  <ysuzuki@apple.com>
1675
1676         [JSC] JSWrapperMap should not use Objective-C Weak map (NSMapTable with NSPointerFunctionsWeakMemory) for m_cachedObjCWrappers
1677         https://bugs.webkit.org/show_bug.cgi?id=196392
1678
1679         Reviewed by Saam Barati.
1680
1681         Weak representation in Objective-C is surprisingly costly in terms of memory. We can see that very easy program shows 10KB memory consumption due to
1682         this weak wrapper map in JavaScriptCore.framework. But we do not need this weak map since Objective-C JSValue has a dealloc. We can unregister itself
1683         from the map when it is deallocated without using Objective-C weak mechanism. And since Objective-C JSValue is tightly coupled to a specific JSContext,
1684         and wrapper map is created per JSContext, JSValue wrapper and actual JavaScriptCore value is one-on-one, and [JSValue dealloc] knows which JSContext's
1685         wrapper map holds itself.
1686
1687         1. We do not use Objective-C weak mechanism. We use WTF::HashSet instead. When JSValue is allocated, we register it to JSWrapperMap's HashSet. And unregister
1688            JSValue from this map when JSValue is deallocated.
1689         2. We use HashSet<JSValue> (logically) instead of HashMap<JSValueRef, JSValue> to keep JSValueRef and JSValue relationship. We can achieve it because JSValue
1690            holds JSValueRef inside it.
1691
1692         * API/JSContext.mm:
1693         (-[JSContext removeWrapper:]):
1694         * API/JSContextInternal.h:
1695         * API/JSValue.mm:
1696         (-[JSValue dealloc]):
1697         (-[JSValue initWithValue:inContext:]):
1698         * API/JSWrapperMap.h:
1699         * API/JSWrapperMap.mm:
1700         (WrapperKey::hashTableDeletedValue):
1701         (WrapperKey::WrapperKey):
1702         (WrapperKey::isHashTableDeletedValue const):
1703         (WrapperKey::Hash::hash):
1704         (WrapperKey::Hash::equal):
1705         (WrapperKey::Traits::isEmptyValue):
1706         (WrapperKey::Translator::hash):
1707         (WrapperKey::Translator::equal):
1708         (WrapperKey::Translator::translate):
1709         (-[JSWrapperMap initWithGlobalContextRef:]):
1710         (-[JSWrapperMap dealloc]):
1711         (-[JSWrapperMap objcWrapperForJSValueRef:inContext:]):
1712         (-[JSWrapperMap removeWrapper:]):
1713         * API/tests/testapi.mm:
1714         (testObjectiveCAPIMain):
1715
1716 2019-03-29  Robin Morisset  <rmorisset@apple.com>
1717
1718         B3ReduceStrength should know that Mul distributes over Add and Sub
1719         https://bugs.webkit.org/show_bug.cgi?id=196325
1720
1721         Reviewed by Michael Saboff.
1722
1723         In this patch I add the following patterns to B3ReduceStrength:
1724         - Turn this: Integer Neg(Mul(value, c))
1725           Into this: Mul(value, -c), as long as -c does not overflow
1726         - Turn these: Integer Mul(value, Neg(otherValue)) and Integer Mul(Neg(value), otherValue)
1727           Into this: Neg(Mul(value, otherValue))
1728         - For Op==Add or Sub, turn any of these:
1729              Op(Mul(x1, x2), Mul(x1, x3))
1730              Op(Mul(x2, x1), Mul(x1, x3))
1731              Op(Mul(x1, x2), Mul(x3, x1))
1732              Op(Mul(x2, x1), Mul(x3, x1))
1733           Into this: Mul(x1, Op(x2, x3))
1734
1735         Also includes a trivial change: a similar reduction for the distributivity of BitAnd over BitOr/BitXor now
1736         emits the arguments to BitAnd in the other order, to minimize the probability that we'll spend a full fixpoint step just to flip them.
1737
1738         * b3/B3ReduceStrength.cpp:
1739         * b3/testb3.cpp:
1740         (JSC::B3::testAddMulMulArgs):
1741         (JSC::B3::testMulArgNegArg):
1742         (JSC::B3::testMulNegArgArg):
1743         (JSC::B3::testNegMulArgImm):
1744         (JSC::B3::testSubMulMulArgs):
1745         (JSC::B3::run):
1746
1747 2019-03-29  Yusuke Suzuki  <ysuzuki@apple.com>
1748
1749         [JSC] Remove distancing for LargeAllocation
1750         https://bugs.webkit.org/show_bug.cgi?id=196335
1751
1752         Reviewed by Saam Barati.
1753
1754         In r230226, we removed distancing feature from our GC. This patch removes remaining distancing thing in LargeAllocation.
1755
1756         * heap/HeapCell.h:
1757         * heap/LargeAllocation.cpp:
1758         (JSC::LargeAllocation::tryCreate):
1759         * heap/MarkedBlock.h:
1760
1761 2019-03-29  Myles C. Maxfield  <mmaxfield@apple.com>
1762
1763         Delete WebMetal implementation in favor of WebGPU
1764         https://bugs.webkit.org/show_bug.cgi?id=195418
1765
1766         Reviewed by Dean Jackson.
1767
1768         * Configurations/FeatureDefines.xcconfig:
1769         * inspector/protocol/Canvas.json:
1770         * inspector/scripts/codegen/generator.py:
1771
1772 2019-03-29  Tadeu Zagallo  <tzagallo@apple.com>
1773
1774         Assertion failed in JSC::createError
1775         https://bugs.webkit.org/show_bug.cgi?id=196305
1776         <rdar://problem/49387382>
1777
1778         Reviewed by Saam Barati.
1779
1780         JSC::createError assumes that `errorDescriptionForValue` will either
1781         throw an exception or return a valid description string. However, that
1782         is not true if the value is a rope string and we successfully resolve it,
1783         but later fail to wrap the string in quotes with `tryMakeString`.
1784
1785         * runtime/ExceptionHelpers.cpp:
1786         (JSC::createError):
1787
1788 2019-03-29  Devin Rousso  <drousso@apple.com>
1789
1790         Web Inspector: add fast returns for instrumentation hooks that have no affect before a frontend is connected
1791         https://bugs.webkit.org/show_bug.cgi?id=196382
1792         <rdar://problem/49403417>
1793
1794         Reviewed by Joseph Pecoraro.
1795
1796         Ensure that all instrumentation hooks use `FAST_RETURN_IF_NO_FRONTENDS` or check that
1797         `developerExtrasEnabled`. There should be no activity to/from any inspector objects until
1798         developer extras are enabled.
1799
1800         * inspector/agents/InspectorConsoleAgent.cpp:
1801         (Inspector::InspectorConsoleAgent::startTiming):
1802         (Inspector::InspectorConsoleAgent::stopTiming):
1803         (Inspector::InspectorConsoleAgent::count):
1804         (Inspector::InspectorConsoleAgent::addConsoleMessage):
1805
1806 2019-03-29  Cathie Chen  <cathiechen@igalia.com>
1807
1808         Implement ResizeObserver.
1809         https://bugs.webkit.org/show_bug.cgi?id=157743
1810
1811         Reviewed by Simon Fraser.
1812
1813         Add ENABLE_RESIZE_OBSERVER.
1814
1815         * Configurations/FeatureDefines.xcconfig:
1816
1817 2019-03-28  Michael Saboff  <msaboff@apple.com>
1818
1819         [YARR] Precompute BMP / non-BMP status when constructing character classes
1820         https://bugs.webkit.org/show_bug.cgi?id=196296
1821
1822         Reviewed by Keith Miller.
1823
1824         Changed CharacterClass::m_hasNonBMPCharacters into a character width bit field which
1825         indicateis if the class includes characters from either BMP, non-BMP or both ranges.
1826         This allows the recognizing code to eliminate checks for the width of a matched
1827         characters when the class has only one width.  The character width is needed to
1828         determine if we advance 1 or 2 character.  Also, the pre-computed width of character
1829         classes that contains either all BMP or all non-BMP characters allows the parser to
1830         use fixed widths for terms using those character classes.  Changed both the code gen
1831         scripts and Yarr compiler to compute this bit field during the construction of
1832         character classes.
1833
1834         For JIT'ed code of character classes that contain either all BMP or all non-BMP
1835         characters, we can eliminate the generic check we were doing do compute how much
1836         to advance after sucessfully matching a character in the class.
1837
1838                 Generic isBMP check      BMP only            non-BMP only
1839                 --------------           --------------      --------------
1840                 inc %r9d                 inc %r9d            add $0x2, %r9d
1841                 cmp $0x10000, %eax
1842                 jl isBMP
1843                 cmp %edx, %esi
1844                 jz atEndOfString
1845                 inc %r9d
1846                 inc %esi
1847          isBMP:
1848
1849         For character classes that contained non-BMP characters, we were always generating
1850         the code in the left column.  The middle column is the code we generate for character
1851         classes that contain only BMP characters.  The right column is the code we now
1852         generate if the character class has only non-BMP characters.  In the fix width cases,
1853         we can eliminate both the isBMP check as well as the atEndOfString check.  The
1854         atEndOfstring check is eliminated since we know how many characters this character
1855         class requires and that check can be factored out to the beginning of the current
1856         alternative.  For character classes that contain both BMP and non-BMP characters,
1857         we still generate the generic left column.
1858
1859         This change is a ~8% perf progression on UniPoker and a ~2% improvement on RexBench
1860         as a whole.
1861
1862         * runtime/RegExp.cpp:
1863         (JSC::RegExp::matchCompareWithInterpreter):
1864         * runtime/RegExpInlines.h:
1865         (JSC::RegExp::matchInline):
1866         * yarr/YarrInterpreter.cpp:
1867         (JSC::Yarr::Interpreter::checkCharacterClassDontAdvanceInputForNonBMP):
1868         (JSC::Yarr::Interpreter::matchCharacterClass):
1869         * yarr/YarrJIT.cpp:
1870         (JSC::Yarr::YarrGenerator::optimizeAlternative):
1871         (JSC::Yarr::YarrGenerator::matchCharacterClass):
1872         (JSC::Yarr::YarrGenerator::advanceIndexAfterCharacterClassTermMatch):
1873         (JSC::Yarr::YarrGenerator::tryReadUnicodeCharImpl):
1874         (JSC::Yarr::YarrGenerator::generateCharacterClassOnce):
1875         (JSC::Yarr::YarrGenerator::generateCharacterClassFixed):
1876         (JSC::Yarr::YarrGenerator::generateCharacterClassGreedy):
1877         (JSC::Yarr::YarrGenerator::backtrackCharacterClassGreedy):
1878         (JSC::Yarr::YarrGenerator::generateCharacterClassNonGreedy):
1879         (JSC::Yarr::YarrGenerator::backtrackCharacterClassNonGreedy):
1880         (JSC::Yarr::YarrGenerator::generateEnter):
1881         (JSC::Yarr::YarrGenerator::YarrGenerator):
1882         (JSC::Yarr::YarrGenerator::compile):
1883         * yarr/YarrPattern.cpp:
1884         (JSC::Yarr::CharacterClassConstructor::CharacterClassConstructor):
1885         (JSC::Yarr::CharacterClassConstructor::reset):
1886         (JSC::Yarr::CharacterClassConstructor::charClass):
1887         (JSC::Yarr::CharacterClassConstructor::addSorted):
1888         (JSC::Yarr::CharacterClassConstructor::addSortedRange):
1889         (JSC::Yarr::CharacterClassConstructor::hasNonBMPCharacters):
1890         (JSC::Yarr::CharacterClassConstructor::characterWidths):
1891         (JSC::Yarr::PatternTerm::dump):
1892         (JSC::Yarr::anycharCreate):
1893         * yarr/YarrPattern.h:
1894         (JSC::Yarr::operator|):
1895         (JSC::Yarr::operator&):
1896         (JSC::Yarr::operator|=):
1897         (JSC::Yarr::CharacterClass::CharacterClass):
1898         (JSC::Yarr::CharacterClass::hasNonBMPCharacters):
1899         (JSC::Yarr::CharacterClass::hasOneCharacterSize):
1900         (JSC::Yarr::CharacterClass::hasOnlyNonBMPCharacters):
1901         (JSC::Yarr::PatternTerm::invert const):
1902         (JSC::Yarr::PatternTerm::invert): Deleted.
1903         * yarr/create_regex_tables:
1904         * yarr/generateYarrUnicodePropertyTables.py:
1905
1906 2019-03-28  Saam Barati  <sbarati@apple.com>
1907
1908         BackwardsGraph needs to consider back edges as the backward's root successor
1909         https://bugs.webkit.org/show_bug.cgi?id=195991
1910
1911         Reviewed by Filip Pizlo.
1912
1913         * b3/testb3.cpp:
1914         (JSC::B3::testInfiniteLoopDoesntCauseBadHoisting):
1915         (JSC::B3::run):
1916
1917 2019-03-28  Fujii Hironori  <Hironori.Fujii@sony.com>
1918
1919         Opcode.h(159,27): warning: adding 'unsigned int' to a string does not append to the string [-Wstring-plus-int]
1920         https://bugs.webkit.org/show_bug.cgi?id=196343
1921
1922         Reviewed by Saam Barati.
1923
1924         Clang reports a compilation warning and recommend '&PADDING_STRING[PADDING_STRING_LENGTH]'
1925         instead of 'PADDING_STRING + PADDING_STRING_LENGTH'.
1926
1927         * bytecode/Opcode.cpp:
1928         (JSC::padOpcodeName): Moved padOpcodeName from Opcode.h because
1929         this function is used only in Opcode.cpp. Changed macros
1930         PADDING_STRING and PADDING_STRING_LENGTH to simple variables.
1931         (JSC::compareOpcodePairIndices): Replaced pair with std::pair.
1932         * bytecode/Opcode.h:
1933         (JSC::padOpcodeName): Moved.
1934
1935 2019-03-28  Tadeu Zagallo  <tzagallo@apple.com>
1936
1937         CodeBlock::jettison() should disallow repatching its own calls
1938         https://bugs.webkit.org/show_bug.cgi?id=196359
1939         <rdar://problem/48973663>
1940
1941         Reviewed by Saam Barati.
1942
1943         CodeBlock::jettison() calls CommonData::invalidate, which replaces the `hlt`
1944         instruction with the jump to OSR exit. However, if the `hlt` was immediately
1945         followed by a call to the CodeBlock being jettisoned, we would write over the
1946         OSR exit address while unlinking all the incoming CallLinkInfos later in
1947         CodeBlock::jettison().
1948
1949         Change it so that we set a flag, `clearedByJettison`, in all the CallLinkInfos
1950         owned by the CodeBlock being jettisoned. If the flag is set, we will avoid
1951         repatching the call during unlinking. This is safe because this call will never
1952         be reachable again after the CodeBlock is jettisoned.
1953
1954         * bytecode/CallLinkInfo.cpp:
1955         (JSC::CallLinkInfo::CallLinkInfo):
1956         (JSC::CallLinkInfo::setCallee):
1957         (JSC::CallLinkInfo::clearCallee):
1958         (JSC::CallLinkInfo::setCodeBlock):
1959         (JSC::CallLinkInfo::clearCodeBlock):
1960         * bytecode/CallLinkInfo.h:
1961         (JSC::CallLinkInfo::clearedByJettison):
1962         (JSC::CallLinkInfo::setClearedByJettison):
1963         * bytecode/CodeBlock.cpp:
1964         (JSC::CodeBlock::jettison):
1965         * jit/Repatch.cpp:
1966         (JSC::revertCall):
1967
1968 2019-03-27  Yusuke Suzuki  <ysuzuki@apple.com>
1969
1970         [JSC] Drop VM and Context cache map in JavaScriptCore.framework
1971         https://bugs.webkit.org/show_bug.cgi?id=196341
1972
1973         Reviewed by Saam Barati.
1974
1975         Previously, we created Objective-C weak map to maintain JSVirtualMachine and JSContext wrappers corresponding to VM and JSGlobalObject.
1976         But Objective-C weak map is really memory costly. Even if the entry is only one, it consumes 2.5KB per weak map. Since we can modify
1977         JSC intrusively for JavaScriptCore.framework (and we already did it, like, holding JSWrapperMap in JSGlobalObject), we can just hold
1978         a pointer to a wrapper in VM and JSGlobalObject.
1979
1980         This patch adds void* members to VM and JSGlobalObject, which holds a non-strong reference to a wrapper. When a wrapper is gone, we
1981         clear this pointer too. This removes unnecessary two Objective-C weak maps, and save 5KB.
1982
1983         * API/JSContext.mm:
1984         (-[JSContext initWithVirtualMachine:]):
1985         (-[JSContext dealloc]):
1986         (-[JSContext initWithGlobalContextRef:]):
1987         (-[JSContext wrapperMap]):
1988         (+[JSContext contextWithJSGlobalContextRef:]):
1989         * API/JSVirtualMachine.mm:
1990         (-[JSVirtualMachine initWithContextGroupRef:]):
1991         (-[JSVirtualMachine dealloc]):
1992         (+[JSVirtualMachine virtualMachineWithContextGroupRef:]):
1993         (scanExternalObjectGraph):
1994         (scanExternalRememberedSet):
1995         (initWrapperCache): Deleted.
1996         (wrapperCache): Deleted.
1997         (+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]): Deleted.
1998         (+[JSVMWrapperCache wrapperForJSContextGroupRef:]): Deleted.
1999         (-[JSVirtualMachine contextForGlobalContextRef:]): Deleted.
2000         (-[JSVirtualMachine addContext:forGlobalContextRef:]): Deleted.
2001         * API/JSVirtualMachineInternal.h:
2002         * runtime/JSGlobalObject.h:
2003         (JSC::JSGlobalObject::setAPIWrapper):
2004         (JSC::JSGlobalObject::apiWrapper const):
2005         * runtime/VM.h:
2006
2007 2019-03-28  Tadeu Zagallo  <tzagallo@apple.com>
2008
2009         In-memory code cache should not share bytecode across domains
2010         https://bugs.webkit.org/show_bug.cgi?id=196321
2011
2012         Reviewed by Geoffrey Garen.
2013
2014         Use the SourceProvider's URL to make sure that the hosts match for the
2015         two SourceCodeKeys in operator==.
2016
2017         * parser/SourceCodeKey.h:
2018         (JSC::SourceCodeKey::host const):
2019         (JSC::SourceCodeKey::operator== const):
2020
2021 2019-03-28  Víctor Manuel Jáquez Leal  <vjaquez@igalia.com>
2022
2023         Silence lot of warnings when compiling with clang
2024         https://bugs.webkit.org/show_bug.cgi?id=196310
2025
2026         Reviewed by Michael Catanzaro.
2027
2028         Initialize variable with default constructor.
2029
2030         * API/glib/JSCOptions.cpp:
2031         (jsc_options_foreach):
2032
2033 2019-03-27  Saam Barati  <sbarati@apple.com>
2034
2035         validateOSREntryValue with Int52 should box the value being checked into double format
2036         https://bugs.webkit.org/show_bug.cgi?id=196313
2037         <rdar://problem/49306703>
2038
2039         Reviewed by Yusuke Suzuki.
2040
2041         * dfg/DFGOSREntry.cpp:
2042         (JSC::DFG::prepareOSREntry):
2043         * ftl/FTLLowerDFGToB3.cpp:
2044         (JSC::FTL::DFG::LowerDFGToB3::validateAIState):
2045
2046 2019-03-27  Yusuke Suzuki  <ysuzuki@apple.com>
2047
2048         [JSC] Owner of watchpoints should validate at GC finalizing phase
2049         https://bugs.webkit.org/show_bug.cgi?id=195827
2050
2051         Reviewed by Filip Pizlo.
2052
2053         This patch fixes JSC's watchpoint liveness issue by the following two policies.
2054
2055         1. Watchpoint should have owner cell, and "fire" operation should be gaurded with owner cell's isLive check.
2056
2057         Watchpoints should hold its owner cell, and fire procedure should be guarded by `owner->isLive()`.
2058         When the owner cell is destroyed, these watchpoints are destroyed too. But this destruction can
2059         be delayed due to incremental sweeper. So the following condition can happen.
2060
2061         When we have a watchpoint like the following.
2062
2063             class XXXWatchpoint {
2064                 ObjectPropertyCondition m_key;
2065                 JSCell* m_owner;
2066             };
2067
2068         Both m_key's cell and m_owner is now unreachable from the root. So eventually, m_owner cell's destructor
2069         is called and this watchpoint will be destroyed. But before that, m_key's cell can be destroyed. And this
2070         watchpoint's fire procedure can be called since m_owner's destructor is not called yet. In this situation,
2071         we encounter the destroyed cell held in m_key. This problem can be avoided if we guard fire procedure with
2072         `m_owner->isLive()`. Until the owner cell is destroyed, this guard avoids "fire" procedure execution. And
2073         once the destructor of m_owner is called, this watchpoint will be destroyed too.
2074
2075         2. Watchpoint liveness should be maintained by owner cell's unconditional finalizer
2076
2077         Watchpoints often hold weak references to the other cell (like, m_key in the above example). If we do not
2078         delete watchpoints with dead cells when these weak cells become dead, these watchpoints continue holding dead cells,
2079         and watchpoint's fire operation can use these dead cells accidentally. isLive / isStillLive check for these weak cells
2080         in fire operation is not useful. Because these dead cells can be reused to the other live cells eventually, and this
2081         isLive / isStillLive checks fail to see these cells are live if they are reused. Appropriate way is deleting watchpoints
2082         with dead cells when finalizing GC. In this patch, we do this in unconditional finalizers in owner cells of watchpoints.
2083         We already did this in CodeBlock etc. We add the same thing to StructureRareData which owns watchpoints for toString operations.
2084
2085         * JavaScriptCore.xcodeproj/project.pbxproj:
2086         * Sources.txt:
2087         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.h:
2088         (JSC::AdaptiveInferredPropertyValueWatchpointBase::StructureWatchpoint::StructureWatchpoint): Deleted.
2089         (JSC::AdaptiveInferredPropertyValueWatchpointBase::PropertyWatchpoint::PropertyWatchpoint): Deleted.
2090         * bytecode/CodeBlockJettisoningWatchpoint.h:
2091         (JSC::CodeBlockJettisoningWatchpoint::CodeBlockJettisoningWatchpoint): Deleted.
2092         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp:
2093         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::LLIntPrototypeLoadAdaptiveStructureWatchpoint):
2094         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal):
2095         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h:
2096         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::key const): Deleted.
2097         * bytecode/StructureStubClearingWatchpoint.cpp:
2098         (JSC::StructureStubClearingWatchpoint::fireInternal):
2099         (JSC::WatchpointsOnStructureStubInfo::isValid const):
2100         * bytecode/StructureStubClearingWatchpoint.h:
2101         (JSC::StructureStubClearingWatchpoint::StructureStubClearingWatchpoint): Deleted.
2102         * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp:
2103         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::isValid const):
2104         * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.h:
2105         * dfg/DFGAdaptiveStructureWatchpoint.cpp:
2106         (JSC::DFG::AdaptiveStructureWatchpoint::fireInternal):
2107         * dfg/DFGAdaptiveStructureWatchpoint.h:
2108         (JSC::DFG::AdaptiveStructureWatchpoint::key const): Deleted.
2109         * dfg/DFGDesiredWatchpoints.cpp:
2110         (JSC::DFG::ArrayBufferViewWatchpointAdaptor::add):
2111         * heap/Heap.cpp:
2112         (JSC::Heap::finalizeUnconditionalFinalizers):
2113         * llint/LLIntSlowPaths.cpp:
2114         (JSC::LLInt::setupGetByIdPrototypeCache):
2115         * runtime/ArrayBuffer.cpp:
2116         (JSC::ArrayBuffer::notifyIncommingReferencesOfTransfer):
2117         * runtime/ArrayBufferNeuteringWatchpointSet.cpp: Renamed from Source/JavaScriptCore/runtime/ArrayBufferNeuteringWatchpoint.cpp.
2118         (JSC::ArrayBufferNeuteringWatchpointSet::ArrayBufferNeuteringWatchpointSet):
2119         (JSC::ArrayBufferNeuteringWatchpointSet::destroy):
2120         (JSC::ArrayBufferNeuteringWatchpointSet::create):
2121         (JSC::ArrayBufferNeuteringWatchpointSet::createStructure):
2122         (JSC::ArrayBufferNeuteringWatchpointSet::fireAll):
2123         * runtime/ArrayBufferNeuteringWatchpointSet.h: Renamed from Source/JavaScriptCore/runtime/ArrayBufferNeuteringWatchpoint.h.
2124         * runtime/FunctionRareData.h:
2125         * runtime/JSGlobalObject.cpp:
2126         (JSC::JSGlobalObject::init):
2127         (JSC::JSGlobalObject::tryInstallArraySpeciesWatchpoint):
2128         * runtime/ObjectPropertyChangeAdaptiveWatchpoint.h:
2129         (JSC::ObjectPropertyChangeAdaptiveWatchpoint::ObjectPropertyChangeAdaptiveWatchpoint): Deleted.
2130         * runtime/StructureRareData.cpp:
2131         (JSC::StructureRareData::finalizeUnconditionally):
2132         * runtime/StructureRareData.h:
2133         * runtime/VM.cpp:
2134         (JSC::VM::VM):
2135
2136 2019-03-26  Saam Barati  <sbarati@apple.com>
2137
2138         FTL: Emit code to validate AI's state when running the compiled code
2139         https://bugs.webkit.org/show_bug.cgi?id=195924
2140         <rdar://problem/49003422>
2141
2142         Reviewed by Filip Pizlo.
2143
2144         This patch adds code that between the execution of each node that validates
2145         the types that AI proves. This option is too expensive to turn on for our
2146         regression testing, but we think it will be valuable in other types of running
2147         modes, such as when running with a fuzzer.
2148         
2149         This patch also adds options to only probabilistically run this validation
2150         after the execution of each node. As the probability is lowered, there is
2151         less of a perf hit.
2152         
2153         This patch just adds this validation in the FTL. A follow-up patch will land
2154         it in the DFG too: https://bugs.webkit.org/show_bug.cgi?id=196219
2155
2156         * ftl/FTLLowerDFGToB3.cpp:
2157         (JSC::FTL::DFG::LowerDFGToB3::LowerDFGToB3):
2158         (JSC::FTL::DFG::LowerDFGToB3::compileBlock):
2159         (JSC::FTL::DFG::LowerDFGToB3::validateAIState):
2160         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
2161         (JSC::FTL::DFG::LowerDFGToB3::lowJSValue):
2162         * runtime/Options.h:
2163
2164 2019-03-26  Tadeu Zagallo  <tzagallo@apple.com>
2165
2166         WebAssembly: Fix f32.min, f64.min and f64.max operations on NaN
2167         https://bugs.webkit.org/show_bug.cgi?id=196217
2168
2169         Reviewed by Saam Barati.
2170
2171         Generalize the fix for f32.max to properly handle NaN by doing an extra GreatherThan
2172         comparison in r243446 to all min and max float operations.
2173
2174         * wasm/WasmAirIRGenerator.cpp:
2175         (JSC::Wasm::AirIRGenerator::addOp<OpType::F32Min>):
2176         (JSC::Wasm::AirIRGenerator::addFloatingPointMinOrMax):
2177         (JSC::Wasm::AirIRGenerator::addOp<OpType::F32Max>):
2178         (JSC::Wasm::AirIRGenerator::addOp<OpType::F64Min>):
2179         (JSC::Wasm::AirIRGenerator::addOp<OpType::F64Max>):
2180         * wasm/wasm.json:
2181
2182 2019-03-26  Andy VanWagoner  <andy@vanwagoner.family>
2183
2184         Intl.DateTimeFormat should obey 2-digit hour
2185         https://bugs.webkit.org/show_bug.cgi?id=195974
2186
2187         Reviewed by Keith Miller.
2188
2189         * runtime/IntlDateTimeFormat.cpp:
2190         (JSC::IntlDateTimeFormat::initializeDateTimeFormat):
2191
2192 2019-03-25  Yusuke Suzuki  <ysuzuki@apple.com>
2193
2194         Heap::isMarked and friends should be instance methods
2195         https://bugs.webkit.org/show_bug.cgi?id=179988
2196
2197         Reviewed by Saam Barati.
2198
2199         Almost all the callers of Heap::isMarked have VM& reference. We should make Heap::isMarked instance function instead of static function
2200         so that we do not need to look up Heap from the cell.
2201
2202         * API/JSAPIWrapperObject.mm:
2203         (JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots):
2204         * API/JSMarkingConstraintPrivate.cpp:
2205         (JSC::isMarked):
2206         * API/glib/JSAPIWrapperObjectGLib.cpp:
2207         (JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots):
2208         * builtins/BuiltinExecutables.cpp:
2209         (JSC::BuiltinExecutables::finalizeUnconditionally):
2210         * bytecode/AccessCase.cpp:
2211         (JSC::AccessCase::visitWeak const):
2212         (JSC::AccessCase::propagateTransitions const):
2213         * bytecode/CallLinkInfo.cpp:
2214         (JSC::CallLinkInfo::visitWeak):
2215         * bytecode/CallLinkStatus.cpp:
2216         (JSC::CallLinkStatus::finalize):
2217         * bytecode/CallLinkStatus.h:
2218         * bytecode/CallVariant.cpp:
2219         (JSC::CallVariant::finalize):
2220         * bytecode/CallVariant.h:
2221         * bytecode/CodeBlock.cpp:
2222         (JSC::CodeBlock::shouldJettisonDueToWeakReference):
2223         (JSC::CodeBlock::shouldJettisonDueToOldAge):
2224         (JSC::shouldMarkTransition):
2225         (JSC::CodeBlock::propagateTransitions):
2226         (JSC::CodeBlock::determineLiveness):
2227         (JSC::CodeBlock::finalizeLLIntInlineCaches):
2228         (JSC::CodeBlock::finalizeUnconditionally):
2229         (JSC::CodeBlock::jettison):
2230         * bytecode/CodeBlock.h:
2231         * bytecode/ExecutableToCodeBlockEdge.cpp:
2232         (JSC::ExecutableToCodeBlockEdge::visitChildren):
2233         (JSC::ExecutableToCodeBlockEdge::finalizeUnconditionally):
2234         (JSC::ExecutableToCodeBlockEdge::runConstraint):
2235         * bytecode/GetByIdStatus.cpp:
2236         (JSC::GetByIdStatus::finalize):
2237         * bytecode/GetByIdStatus.h:
2238         * bytecode/GetByIdVariant.cpp:
2239         (JSC::GetByIdVariant::finalize):
2240         * bytecode/GetByIdVariant.h:
2241         * bytecode/InByIdStatus.cpp:
2242         (JSC::InByIdStatus::finalize):
2243         * bytecode/InByIdStatus.h:
2244         * bytecode/InByIdVariant.cpp:
2245         (JSC::InByIdVariant::finalize):
2246         * bytecode/InByIdVariant.h:
2247         * bytecode/ObjectPropertyCondition.cpp:
2248         (JSC::ObjectPropertyCondition::isStillLive const):
2249         * bytecode/ObjectPropertyCondition.h:
2250         * bytecode/ObjectPropertyConditionSet.cpp:
2251         (JSC::ObjectPropertyConditionSet::areStillLive const):
2252         * bytecode/ObjectPropertyConditionSet.h:
2253         * bytecode/PolymorphicAccess.cpp:
2254         (JSC::PolymorphicAccess::visitWeak const):
2255         * bytecode/PropertyCondition.cpp:
2256         (JSC::PropertyCondition::isStillLive const):
2257         * bytecode/PropertyCondition.h:
2258         * bytecode/PutByIdStatus.cpp:
2259         (JSC::PutByIdStatus::finalize):
2260         * bytecode/PutByIdStatus.h:
2261         * bytecode/PutByIdVariant.cpp:
2262         (JSC::PutByIdVariant::finalize):
2263         * bytecode/PutByIdVariant.h:
2264         * bytecode/RecordedStatuses.cpp:
2265         (JSC::RecordedStatuses::finalizeWithoutDeleting):
2266         (JSC::RecordedStatuses::finalize):
2267         * bytecode/RecordedStatuses.h:
2268         * bytecode/StructureSet.cpp:
2269         (JSC::StructureSet::isStillAlive const):
2270         * bytecode/StructureSet.h:
2271         * bytecode/StructureStubInfo.cpp:
2272         (JSC::StructureStubInfo::visitWeakReferences):
2273         * dfg/DFGPlan.cpp:
2274         (JSC::DFG::Plan::finalizeInGC):
2275         (JSC::DFG::Plan::isKnownToBeLiveDuringGC):
2276         * heap/GCIncomingRefCounted.h:
2277         * heap/GCIncomingRefCountedInlines.h:
2278         (JSC::GCIncomingRefCounted<T>::filterIncomingReferences):
2279         * heap/GCIncomingRefCountedSet.h:
2280         * heap/GCIncomingRefCountedSetInlines.h:
2281         (JSC::GCIncomingRefCountedSet<T>::lastChanceToFinalize):
2282         (JSC::GCIncomingRefCountedSet<T>::sweep):
2283         (JSC::GCIncomingRefCountedSet<T>::removeAll): Deleted.
2284         (JSC::GCIncomingRefCountedSet<T>::removeDead): Deleted.
2285         * heap/Heap.cpp:
2286         (JSC::Heap::addToRememberedSet):
2287         (JSC::Heap::runEndPhase):
2288         (JSC::Heap::sweepArrayBuffers):
2289         (JSC::Heap::addCoreConstraints):
2290         * heap/Heap.h:
2291         * heap/HeapInlines.h:
2292         (JSC::Heap::isMarked):
2293         * heap/HeapSnapshotBuilder.cpp:
2294         (JSC::HeapSnapshotBuilder::appendNode):
2295         * heap/SlotVisitor.cpp:
2296         (JSC::SlotVisitor::appendToMarkStack):
2297         (JSC::SlotVisitor::visitChildren):
2298         * jit/PolymorphicCallStubRoutine.cpp:
2299         (JSC::PolymorphicCallStubRoutine::visitWeak):
2300         * runtime/ErrorInstance.cpp:
2301         (JSC::ErrorInstance::finalizeUnconditionally):
2302         * runtime/InferredValueInlines.h:
2303         (JSC::InferredValue::finalizeUnconditionally):
2304         * runtime/StackFrame.h:
2305         (JSC::StackFrame::isMarked const):
2306         * runtime/Structure.cpp:
2307         (JSC::Structure::isCheapDuringGC):
2308         (JSC::Structure::markIfCheap):
2309         * runtime/Structure.h:
2310         * runtime/TypeProfiler.cpp:
2311         (JSC::TypeProfiler::invalidateTypeSetCache):
2312         * runtime/TypeProfiler.h:
2313         * runtime/TypeSet.cpp:
2314         (JSC::TypeSet::invalidateCache):
2315         * runtime/TypeSet.h:
2316         * runtime/WeakMapImpl.cpp:
2317         (JSC::WeakMapImpl<WeakMapBucket<WeakMapBucketDataKeyValue>>::visitOutputConstraints):
2318         * runtime/WeakMapImplInlines.h:
2319         (JSC::WeakMapImpl<WeakMapBucket>::finalizeUnconditionally):
2320
2321 2019-03-25  Keith Miller  <keith_miller@apple.com>
2322
2323         ASSERTION FAILED: m_op == CompareStrictEq in JSC::DFG::Node::convertToCompareEqPtr(JSC::DFG::FrozenValue *, JSC::DFG::Edge)
2324         https://bugs.webkit.org/show_bug.cgi?id=196176
2325
2326         Reviewed by Saam Barati.
2327
2328         convertToCompareEqPtr should allow for either CompareStrictEq or
2329         the SameValue DFG node. This fixes the old assertion that only
2330         allowed CompareStrictEq.
2331
2332         * dfg/DFGNode.h:
2333         (JSC::DFG::Node::convertToCompareEqPtr):
2334
2335 2019-03-25  Tadeu Zagallo  <tzagallo@apple.com>
2336
2337         WebAssembly: f32.max with NaN generates incorrect result
2338         https://bugs.webkit.org/show_bug.cgi?id=175691
2339         <rdar://problem/33952228>
2340
2341         Reviewed by Saam Barati.
2342
2343         Fix the B3 and Air compilation for f32.max. In order to handle the NaN
2344         case, we need an extra GreaterThan comparison on top of the existing
2345         Equal and LessThan ones.
2346
2347         * wasm/WasmAirIRGenerator.cpp:
2348         (JSC::Wasm::AirIRGenerator::addOp<OpType::F32Max>):
2349         * wasm/wasm.json:
2350
2351 2019-03-25  Yusuke Suzuki  <ysuzuki@apple.com>
2352
2353         Unreviewed, speculative fix for CLoop build on CPU(UNKNOWN)
2354         https://bugs.webkit.org/show_bug.cgi?id=195982
2355
2356         * jit/ExecutableAllocator.h:
2357         (JSC::ExecutableAllocator::initializeUnderlyingAllocator):
2358
2359 2019-03-25  Gyuyoung Kim  <gyuyoung.kim@webkit.org>
2360
2361         Remove NavigatorContentUtils in WebCore/Modules
2362         https://bugs.webkit.org/show_bug.cgi?id=196070
2363
2364         Reviewed by Alex Christensen.
2365
2366         NavigatorContentUtils was to support the custom scheme spec [1].
2367         However, in WebKit side, no port has supported the feature in
2368         WebKit layer after EFL port was removed. So there has been the
2369         only IDL implementation of the NavigatorContentUtils in WebCore.
2370         So we don't need to keep the implementation in WebCore anymore.
2371
2372         [1] https://html.spec.whatwg.org/multipage/system-state.html#custom-handlers
2373
2374         * Configurations/FeatureDefines.xcconfig:
2375
2376 2019-03-23  Mark Lam  <mark.lam@apple.com>
2377
2378         Rolling out r243032 and r243071 because the fix is incorrect.
2379         https://bugs.webkit.org/show_bug.cgi?id=195892
2380         <rdar://problem/48981239>
2381
2382         Not reviewed.
2383
2384         The fix is incorrect: it relies on being able to determine liveness of an object
2385         in an ObjectPropertyCondition based on the state of the object's MarkedBit.
2386         However, there's no guarantee that GC has run and that the MarkedBit is already
2387         set even if the object is live.  As a result, we may not re-install adaptive
2388         watchpoints based on presumed dead objects which are actually live.
2389
2390         I'm rolling this out, and will implement a more comprehensive fix to handle
2391         watchpoint liveness later.
2392
2393         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp:
2394         (JSC::AdaptiveInferredPropertyValueWatchpointBase::fire):
2395         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp:
2396         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal):
2397         * bytecode/ObjectPropertyCondition.cpp:
2398         (JSC::ObjectPropertyCondition::dumpInContext const):
2399         * bytecode/StructureStubClearingWatchpoint.cpp:
2400         (JSC::StructureStubClearingWatchpoint::fireInternal):
2401         * dfg/DFGAdaptiveStructureWatchpoint.cpp:
2402         (JSC::DFG::AdaptiveStructureWatchpoint::fireInternal):
2403         * runtime/StructureRareData.cpp:
2404         (JSC::ObjectToStringAdaptiveStructureWatchpoint::fireInternal):
2405
2406 2019-03-23  Keith Miller  <keith_miller@apple.com>
2407
2408         Refactor clz/ctz and fix getLSBSet.
2409         https://bugs.webkit.org/show_bug.cgi?id=196162
2410
2411         Reviewed by Saam Barati.
2412
2413         Refactor references of clz32/64 and ctz32 to use clz and ctz,
2414         respectively.
2415
2416         * dfg/DFGAbstractInterpreterInlines.h:
2417         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2418         * dfg/DFGOperations.cpp:
2419         * runtime/JSBigInt.cpp:
2420         (JSC::JSBigInt::digitDiv):
2421         (JSC::JSBigInt::absoluteDivWithBigIntDivisor):
2422         (JSC::JSBigInt::calculateMaximumCharactersRequired):
2423         (JSC::JSBigInt::toStringBasePowerOfTwo):
2424         (JSC::JSBigInt::compareToDouble):
2425         * runtime/MathObject.cpp:
2426         (JSC::mathProtoFuncClz32):
2427
2428 2019-03-23  Yusuke Suzuki  <ysuzuki@apple.com>
2429
2430         [JSC] Shrink sizeof(RegExp)
2431         https://bugs.webkit.org/show_bug.cgi?id=196133
2432
2433         Reviewed by Mark Lam.
2434
2435         Some applications have many RegExp cells. But RegExp cells are very large (144B).
2436         This patch reduces the size from 144B to 48B by,
2437
2438         1. Allocate Yarr::YarrCodeBlock in non-GC heap. We can avoid this allocation if JIT is disabled.
2439         2. m_captureGroupNames and m_namedGroupToParenIndex are moved to RareData. They are only used when RegExp has named capture groups.
2440
2441         * runtime/RegExp.cpp:
2442         (JSC::RegExp::finishCreation):
2443         (JSC::RegExp::estimatedSize):
2444         (JSC::RegExp::compile):
2445         (JSC::RegExp::matchConcurrently):
2446         (JSC::RegExp::compileMatchOnly):
2447         (JSC::RegExp::deleteCode):
2448         (JSC::RegExp::printTraceData):
2449         * runtime/RegExp.h:
2450         * runtime/RegExpInlines.h:
2451         (JSC::RegExp::hasCodeFor):
2452         (JSC::RegExp::matchInline):
2453         (JSC::RegExp::hasMatchOnlyCodeFor):
2454
2455 2019-03-22  Keith Rollin  <krollin@apple.com>
2456
2457         Enable ThinLTO support in Production builds
2458         https://bugs.webkit.org/show_bug.cgi?id=190758
2459         <rdar://problem/45413233>
2460
2461         Reviewed by Daniel Bates.
2462
2463         Tweak JavaScriptCore's Base.xcconfig to be more in-line with other
2464         .xcconfig files with regards to LTO settings. However, don't actually
2465         enable LTO for JavaScriptCore. LTO is not enabled for JavaScriptCore
2466         due to <rdar://problem/24543547>.
2467
2468         * Configurations/Base.xcconfig:
2469
2470 2019-03-22  Mark Lam  <mark.lam@apple.com>
2471
2472         Placate exception check validation in genericTypedArrayViewProtoFuncLastIndexOf().
2473         https://bugs.webkit.org/show_bug.cgi?id=196154
2474         <rdar://problem/49145307>
2475
2476         Reviewed by Filip Pizlo.
2477
2478         * runtime/JSGenericTypedArrayViewPrototypeFunctions.h:
2479         (JSC::genericTypedArrayViewProtoFuncLastIndexOf):
2480
2481 2019-03-22  Mark Lam  <mark.lam@apple.com>
2482
2483         Placate exception check validation in constructJSWebAssemblyLinkError().
2484         https://bugs.webkit.org/show_bug.cgi?id=196152
2485         <rdar://problem/49145257>
2486
2487         Reviewed by Michael Saboff.
2488
2489         * wasm/js/WebAssemblyLinkErrorConstructor.cpp:
2490         (JSC::constructJSWebAssemblyLinkError):
2491
2492 2019-03-22  Timothy Hatcher  <timothy@apple.com>
2493
2494         Change macosx() to macos() in WK_API... and JSC_API... macros.
2495         https://bugs.webkit.org/show_bug.cgi?id=196106
2496
2497         Reviewed by Brian Burg.
2498
2499         * API/JSBasePrivate.h:
2500         * API/JSContext.h:
2501         * API/JSContextPrivate.h:
2502         * API/JSContextRef.h:
2503         * API/JSContextRefInternal.h:
2504         * API/JSContextRefPrivate.h:
2505         * API/JSManagedValue.h:
2506         * API/JSObjectRef.h:
2507         * API/JSObjectRefPrivate.h:
2508         * API/JSRemoteInspector.h:
2509         * API/JSScript.h:
2510         * API/JSTypedArray.h:
2511         * API/JSValue.h:
2512         * API/JSValuePrivate.h:
2513         * API/JSValueRef.h:
2514         * API/JSVirtualMachinePrivate.h:
2515
2516 2019-03-22  Yusuke Suzuki  <ysuzuki@apple.com>
2517
2518         Unreviewed, build fix for Windows
2519         https://bugs.webkit.org/show_bug.cgi?id=196122
2520
2521         * runtime/FunctionExecutable.cpp:
2522
2523 2019-03-21  Yusuke Suzuki  <ysuzuki@apple.com>
2524
2525         [JSC] Shrink sizeof(FunctionExecutable) by 16bytes
2526         https://bugs.webkit.org/show_bug.cgi?id=196122
2527
2528         Reviewed by Saam Barati.
2529
2530         This patch reduces sizeof(FunctionExecutable) by 16 bytes.
2531
2532         1. ScriptExecutable::m_numParametersForCall and ScriptExecutable::m_numParametersForConstruct are not used in a meaningful way. Removed them.
2533         2. ScriptExecutable::m_lastLine and ScriptExecutable::m_endColumn can be calculated from UnlinkedFunctionExecutable. So FunctionExecutable does not need to hold it.
2534            This patch adds GlobalExecutable, which are non-function ScriptExecutables, and move m_lastLine and m_endColumn to this class.
2535         3. FunctionExecutable still needs to have the feature overriding m_lastLine and m_endColumn. We move overridden data in FunctionExecutable::RareData.
2536
2537         * CMakeLists.txt:
2538         * JavaScriptCore.xcodeproj/project.pbxproj:
2539         * Sources.txt:
2540         * bytecode/UnlinkedFunctionExecutable.cpp:
2541         (JSC::UnlinkedFunctionExecutable::link):
2542         * runtime/EvalExecutable.cpp:
2543         (JSC::EvalExecutable::EvalExecutable):
2544         * runtime/EvalExecutable.h:
2545         * runtime/FunctionExecutable.cpp:
2546         (JSC::FunctionExecutable::FunctionExecutable):
2547         (JSC::FunctionExecutable::ensureRareDataSlow):
2548         (JSC::FunctionExecutable::overrideInfo):
2549         * runtime/FunctionExecutable.h:
2550         * runtime/GlobalExecutable.cpp: Copied from Source/JavaScriptCore/tools/FunctionOverrides.h.
2551         * runtime/GlobalExecutable.h: Copied from Source/JavaScriptCore/tools/FunctionOverrides.h.
2552         (JSC::GlobalExecutable::lastLine const):
2553         (JSC::GlobalExecutable::endColumn const):
2554         (JSC::GlobalExecutable::recordParse):
2555         (JSC::GlobalExecutable::GlobalExecutable):
2556         * runtime/ModuleProgramExecutable.cpp:
2557         (JSC::ModuleProgramExecutable::ModuleProgramExecutable):
2558         * runtime/ModuleProgramExecutable.h:
2559         * runtime/ProgramExecutable.cpp:
2560         (JSC::ProgramExecutable::ProgramExecutable):
2561         * runtime/ProgramExecutable.h:
2562         * runtime/ScriptExecutable.cpp:
2563         (JSC::ScriptExecutable::clearCode):
2564         (JSC::ScriptExecutable::installCode):
2565         (JSC::ScriptExecutable::hasClearableCode const):
2566         (JSC::ScriptExecutable::newCodeBlockFor):
2567         (JSC::ScriptExecutable::typeProfilingEndOffset const):
2568         (JSC::ScriptExecutable::recordParse):
2569         (JSC::ScriptExecutable::lastLine const):
2570         (JSC::ScriptExecutable::endColumn const):
2571         * runtime/ScriptExecutable.h:
2572         (JSC::ScriptExecutable::hasJITCodeForCall const):
2573         (JSC::ScriptExecutable::hasJITCodeForConstruct const):
2574         (JSC::ScriptExecutable::recordParse):
2575         (JSC::ScriptExecutable::lastLine const): Deleted.
2576         (JSC::ScriptExecutable::endColumn const): Deleted.
2577         * tools/FunctionOverrides.h:
2578
2579 2019-03-21  Yusuke Suzuki  <ysuzuki@apple.com>
2580
2581         [JSC] Shrink sizeof(RegExpObject)
2582         https://bugs.webkit.org/show_bug.cgi?id=196130
2583
2584         Reviewed by Saam Barati.
2585
2586         sizeof(RegExpObject) is 48B due to one bool flag. We should compress this flag into lower bit of RegExp* field so that we can make RegExpObject 32B.
2587         It saves memory footprint 1.3% in RAMification's regexp.
2588
2589         * dfg/DFGSpeculativeJIT.cpp:
2590         (JSC::DFG::SpeculativeJIT::compileNewRegexp):
2591         (JSC::DFG::SpeculativeJIT::compileSetRegExpObjectLastIndex):
2592         * ftl/FTLAbstractHeapRepository.h:
2593         * ftl/FTLLowerDFGToB3.cpp:
2594         (JSC::FTL::DFG::LowerDFGToB3::compileNewRegexp):
2595         (JSC::FTL::DFG::LowerDFGToB3::compileSetRegExpObjectLastIndex):
2596         * runtime/RegExpObject.cpp:
2597         (JSC::RegExpObject::RegExpObject):
2598         (JSC::RegExpObject::visitChildren):
2599         (JSC::RegExpObject::getOwnPropertySlot):
2600         (JSC::RegExpObject::defineOwnProperty):
2601         * runtime/RegExpObject.h:
2602
2603 2019-03-21  Tomas Popela  <tpopela@redhat.com>
2604
2605         [JSC] Fix build after r243232 on unsupported 64bit architectures
2606         https://bugs.webkit.org/show_bug.cgi?id=196072
2607
2608         Reviewed by Keith Miller.
2609
2610         As Keith suggested we already expect 16 free bits at the top of any
2611         pointer for JSValue even for the unsupported 64 bit arches.
2612
2613         * bytecode/CodeOrigin.h:
2614
2615 2019-03-21  Mark Lam  <mark.lam@apple.com>
2616
2617         Remove an invalid assertion in DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNullOrUndefined().
2618         https://bugs.webkit.org/show_bug.cgi?id=196116
2619         <rdar://problem/48976951>
2620
2621         Reviewed by Filip Pizlo.
2622
2623         The DFG backend should not make assumptions about what optimizations the front end
2624         will or will not do.  The assertion asserts that the operand cannot be known to be
2625         a cell.  However, it is not guaranteed that the front end will fold away this case.
2626         Also, the DFG backend is perfectly capable of generating code to handle the case
2627         where the operand is a cell.
2628
2629         The attached test case demonstrates a case where the operand can be a known cell.
2630         The test needs to be run with the concurrent JIT and GC, and is racy.  It used to
2631         trip up this assertion about once every 10 runs or so.
2632
2633         * dfg/DFGSpeculativeJIT64.cpp:
2634         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNullOrUndefined):
2635
2636 2019-03-21  Tadeu Zagallo  <tzagallo@apple.com>
2637
2638         JSC::createError should clear exception thrown by errorDescriptionForValue
2639         https://bugs.webkit.org/show_bug.cgi?id=196089
2640
2641         Reviewed by Mark Lam.
2642
2643         errorDescriptionForValue returns a nullString in case of failure, but it
2644         might also throw an OOM exception when resolving a rope string. We need
2645         to clear any potential exceptions thrown by errorDescriptionForValue
2646         before returning the OOM from JSC::createError.
2647
2648         * runtime/ExceptionHelpers.cpp:
2649         (JSC::createError):
2650
2651 2019-03-21  Robin Morisset  <rmorisset@apple.com>
2652
2653         B3::Opcode can fit in a single byte, shrinking B3Value by 8 bytes
2654         https://bugs.webkit.org/show_bug.cgi?id=196014
2655
2656         Reviewed by Keith Miller.
2657
2658         B3::Opcode has less than one hundred cases, so it can easily fit in one byte (from two currently)
2659         This shrinks B3::Kind from 4 bytes to 2 (by removing the byte of padding at the end).
2660         This in turns eliminate padding from B3::Value, shrinking it by 8 bytes (out of 80).
2661
2662         * b3/B3Opcode.h:
2663
2664 2019-03-21  Michael Catanzaro  <mcatanzaro@igalia.com>
2665
2666         Unreviewed, more clang 3.8 build fixes
2667         https://bugs.webkit.org/show_bug.cgi?id=195947
2668         <rdar://problem/49069219>
2669
2670         In the spirit of making our code worse to please old compilers....
2671
2672         * bindings/ScriptValue.cpp:
2673         (Inspector::jsToInspectorValue):
2674         * bytecode/GetterSetterAccessCase.cpp:
2675         (JSC::GetterSetterAccessCase::create):
2676         (JSC::GetterSetterAccessCase::clone const):
2677         * bytecode/InstanceOfAccessCase.cpp:
2678         (JSC::InstanceOfAccessCase::clone const):
2679         * bytecode/IntrinsicGetterAccessCase.cpp:
2680         (JSC::IntrinsicGetterAccessCase::clone const):
2681         * bytecode/ModuleNamespaceAccessCase.cpp:
2682         (JSC::ModuleNamespaceAccessCase::clone const):
2683         * bytecode/ProxyableAccessCase.cpp:
2684         (JSC::ProxyableAccessCase::clone const):
2685
2686 2019-03-21  Yusuke Suzuki  <ysuzuki@apple.com>
2687
2688         [JSC] Do not create JIT related data under non-JIT mode
2689         https://bugs.webkit.org/show_bug.cgi?id=195982
2690
2691         Reviewed by Mark Lam.
2692
2693         We avoid creations of JIT related data structures under non-JIT mode.
2694         This patch removes the following allocations.
2695
2696         1. JITThunks
2697         2. FTLThunks
2698         3. FixedVMPoolExecutableAllocator
2699         4. noJITValueProfileSingleton since it is no longer used
2700         5. ARM disassembler should be initialized when it is used
2701         6. Wasm related data structures are accidentally allocated if VM::canUseJIT() == false &&
2702            Options::useWebAssembly() == true. Add Wasm::isSupported() function to check the both conditions.
2703
2704         * CMakeLists.txt:
2705         * JavaScriptCore.xcodeproj/project.pbxproj:
2706         * heap/Heap.cpp:
2707         (JSC::Heap::runEndPhase):
2708         * jit/ExecutableAllocator.cpp:
2709         (JSC::FixedVMPoolExecutableAllocator::~FixedVMPoolExecutableAllocator):
2710         (JSC::ExecutableAllocator::initializeUnderlyingAllocator):
2711         (JSC::ExecutableAllocator::isValid const):
2712         (JSC::ExecutableAllocator::underMemoryPressure):
2713         (JSC::ExecutableAllocator::memoryPressureMultiplier):
2714         (JSC::ExecutableAllocator::allocate):
2715         (JSC::ExecutableAllocator::isValidExecutableMemory):
2716         (JSC::ExecutableAllocator::getLock const):
2717         (JSC::ExecutableAllocator::committedByteCount):
2718         (JSC::ExecutableAllocator::dumpProfile):
2719         (JSC::startOfFixedExecutableMemoryPoolImpl):
2720         (JSC::endOfFixedExecutableMemoryPoolImpl):
2721         (JSC::ExecutableAllocator::initialize):
2722         (JSC::ExecutableAllocator::initializeAllocator): Deleted.
2723         (JSC::ExecutableAllocator::ExecutableAllocator): Deleted.
2724         (JSC::ExecutableAllocator::~ExecutableAllocator): Deleted.
2725         * jit/ExecutableAllocator.h:
2726         (JSC::ExecutableAllocatorBase::isValid const):
2727         (JSC::ExecutableAllocatorBase::underMemoryPressure):
2728         (JSC::ExecutableAllocatorBase::memoryPressureMultiplier):
2729         (JSC::ExecutableAllocatorBase::dumpProfile):
2730         (JSC::ExecutableAllocatorBase::allocate):
2731         (JSC::ExecutableAllocatorBase::setJITEnabled):
2732         (JSC::ExecutableAllocatorBase::isValidExecutableMemory):
2733         (JSC::ExecutableAllocatorBase::committedByteCount):
2734         (JSC::ExecutableAllocatorBase::getLock const):
2735         (JSC::ExecutableAllocator::isValid const): Deleted.
2736         (JSC::ExecutableAllocator::underMemoryPressure): Deleted.
2737         (JSC::ExecutableAllocator::memoryPressureMultiplier): Deleted.
2738         (JSC::ExecutableAllocator::allocate): Deleted.
2739         (JSC::ExecutableAllocator::setJITEnabled): Deleted.
2740         (JSC::ExecutableAllocator::isValidExecutableMemory): Deleted.
2741         (JSC::ExecutableAllocator::committedByteCount): Deleted.
2742         (JSC::ExecutableAllocator::getLock const): Deleted.
2743         * jsc.cpp:
2744         (functionWebAssemblyMemoryMode):
2745         * runtime/InitializeThreading.cpp:
2746         (JSC::initializeThreading):
2747         * runtime/JSGlobalObject.cpp:
2748         (JSC::JSGlobalObject::init):
2749         * runtime/JSLock.cpp:
2750         (JSC::JSLock::didAcquireLock):
2751         * runtime/Options.cpp:
2752         (JSC::recomputeDependentOptions):
2753         * runtime/VM.cpp:
2754         (JSC::enableAssembler):
2755         (JSC::VM::canUseAssembler):
2756         (JSC::VM::VM):
2757         * runtime/VM.h:
2758         * wasm/WasmCapabilities.h: Added.
2759         (JSC::Wasm::isSupported):
2760         * wasm/WasmFaultSignalHandler.cpp:
2761         (JSC::Wasm::enableFastMemory):
2762
2763 2019-03-21  Yusuke Suzuki  <ysuzuki@apple.com>
2764
2765         [JSC] Fix JSC build with newer ICU
2766         https://bugs.webkit.org/show_bug.cgi?id=196098
2767
2768         Reviewed by Keith Miller.
2769
2770         IntlDateTimeFormat and IntlNumberFormat have switch statement over ICU's enums. However it lacks "default" clause so that
2771         the compile error occurs when a new enum value is added in ICU side. We should have "default" clause which just fallbacks
2772         "unknown"_s case. The behavior is not changed since we already have `return "unknown"_s;` statement anyway after the
2773         switch statement. This patch just suppresses a compile error.
2774
2775         * runtime/IntlDateTimeFormat.cpp:
2776         (JSC::IntlDateTimeFormat::partTypeString):
2777         * runtime/IntlNumberFormat.cpp:
2778         (JSC::IntlNumberFormat::partTypeString):
2779
2780 2019-03-21  Tadeu Zagallo  <tzagallo@apple.com>
2781
2782         JSObject::putDirectIndexSlowOrBeyondVectorLength should check if indexIsSufficientlyBeyondLengthForSparseMap
2783         https://bugs.webkit.org/show_bug.cgi?id=196078
2784         <rdar://problem/35925380>
2785
2786         Reviewed by Mark Lam.
2787
2788         Unlike the other variations of putByIndex, it only checked if the index
2789         was larger than MIN_SPARSE_ARRAY_INDEX when the indexingType was
2790         ALL_BLANK_INDEXING_TYPES. This resulted in a huge butterfly being
2791         allocated for object literals (e.g. `{[9e4]: ...}`) and objects parsed
2792         from JSON.
2793
2794         * runtime/JSObject.cpp:
2795         (JSC::JSObject::putDirectIndexSlowOrBeyondVectorLength):
2796
2797 2019-03-21  Tadeu Zagallo  <tzagallo@apple.com>
2798
2799         CachedUnlinkedSourceCodeShape::m_provider should be a CachedRefPtr
2800         https://bugs.webkit.org/show_bug.cgi?id=196079
2801
2802         Reviewed by Saam Barati.
2803
2804         It was mistakenly cached as CachedPtr, which was leaking the decoded SourceProvider.
2805
2806         * runtime/CachedTypes.cpp:
2807         (JSC::CachedUnlinkedSourceCodeShape::encode):
2808
2809 2019-03-21  Mark Lam  <mark.lam@apple.com>
2810
2811         Placate exception check validation in operationArrayIndexOfString().
2812         https://bugs.webkit.org/show_bug.cgi?id=196067
2813         <rdar://problem/49056572>
2814
2815         Reviewed by Michael Saboff.
2816
2817         * dfg/DFGOperations.cpp:
2818
2819 2019-03-21  Xan Lopez  <xan@igalia.com>
2820
2821         [JSC][x86] Drop support for x87 floating point
2822         https://bugs.webkit.org/show_bug.cgi?id=194853
2823
2824         Reviewed by Don Olmstead.
2825
2826         Require SSE2 throughout the codebase, and remove x87 support where
2827         it was optionally available. SSE2 detection happens at compile
2828         time through a static_assert.
2829
2830         * assembler/MacroAssemblerX86.h:
2831         (JSC::MacroAssemblerX86::storeDouble):
2832         (JSC::MacroAssemblerX86::moveDoubleToInts):
2833         (JSC::MacroAssemblerX86::supportsFloatingPoint):
2834         (JSC::MacroAssemblerX86::supportsFloatingPointTruncate):
2835         (JSC::MacroAssemblerX86::supportsFloatingPointSqrt):
2836         (JSC::MacroAssemblerX86::supportsFloatingPointAbs):
2837         * assembler/MacroAssemblerX86Common.cpp:
2838         * assembler/MacroAssemblerX86Common.h:
2839         (JSC::MacroAssemblerX86Common::moveDouble):
2840         (JSC::MacroAssemblerX86Common::loadDouble):
2841         (JSC::MacroAssemblerX86Common::loadFloat):
2842         (JSC::MacroAssemblerX86Common::storeDouble):
2843         (JSC::MacroAssemblerX86Common::storeFloat):
2844         (JSC::MacroAssemblerX86Common::convertDoubleToFloat):
2845         (JSC::MacroAssemblerX86Common::convertFloatToDouble):
2846         (JSC::MacroAssemblerX86Common::addDouble):
2847         (JSC::MacroAssemblerX86Common::addFloat):
2848         (JSC::MacroAssemblerX86Common::divDouble):
2849         (JSC::MacroAssemblerX86Common::divFloat):
2850         (JSC::MacroAssemblerX86Common::subDouble):
2851         (JSC::MacroAssemblerX86Common::subFloat):
2852         (JSC::MacroAssemblerX86Common::mulDouble):
2853         (JSC::MacroAssemblerX86Common::mulFloat):
2854         (JSC::MacroAssemblerX86Common::convertInt32ToDouble):
2855         (JSC::MacroAssemblerX86Common::convertInt32ToFloat):
2856         (JSC::MacroAssemblerX86Common::branchDouble):
2857         (JSC::MacroAssemblerX86Common::branchFloat):
2858         (JSC::MacroAssemblerX86Common::compareDouble):
2859         (JSC::MacroAssemblerX86Common::compareFloat):
2860         (JSC::MacroAssemblerX86Common::branchTruncateDoubleToInt32):
2861         (JSC::MacroAssemblerX86Common::truncateDoubleToInt32):
2862         (JSC::MacroAssemblerX86Common::truncateFloatToInt32):
2863         (JSC::MacroAssemblerX86Common::branchConvertDoubleToInt32):
2864         (JSC::MacroAssemblerX86Common::branchDoubleNonZero):
2865         (JSC::MacroAssemblerX86Common::branchDoubleZeroOrNaN):
2866         (JSC::MacroAssemblerX86Common::lshiftPacked):
2867         (JSC::MacroAssemblerX86Common::rshiftPacked):
2868         (JSC::MacroAssemblerX86Common::orPacked):
2869         (JSC::MacroAssemblerX86Common::move32ToFloat):
2870         (JSC::MacroAssemblerX86Common::moveFloatTo32):
2871         (JSC::MacroAssemblerX86Common::moveConditionallyDouble):
2872         (JSC::MacroAssemblerX86Common::moveConditionallyFloat):
2873         * offlineasm/x86.rb:
2874         * runtime/MathCommon.cpp:
2875         (JSC::operationMathPow):
2876
2877 2019-03-21  Carlos Garcia Campos  <cgarcia@igalia.com>
2878
2879         [GLIB] User data not correctly passed to callback of functions and constructors with no parameters
2880         https://bugs.webkit.org/show_bug.cgi?id=196073
2881
2882         Reviewed by Michael Catanzaro.
2883
2884         This is because GClosure always expects a first parameter as instance. In case of functions or constructors with
2885         no parameters we insert a fake instance which is just a null pointer that is ignored by the callback. But
2886         if the function/constructor has user data the callback will expect one parameter for the user data. In that case
2887         we can simply swap instance/user data so that the fake instance will be the second argument and user data the
2888         first one.
2889
2890         * API/glib/JSCClass.cpp:
2891         (jscClassCreateConstructor): Use g_cclosure_new_swap() if parameters is empty and user data was provided.
2892         * API/glib/JSCValue.cpp:
2893         (jscValueFunctionCreate): Ditto.
2894
2895 2019-03-21  Pablo Saavedra  <psaavedra@igalia.com>
2896
2897         [JSC][32-bit] Build failure after r243232
2898         https://bugs.webkit.org/show_bug.cgi?id=196068
2899
2900         Reviewed by Mark Lam.
2901
2902         * dfg/DFGOSRExit.cpp:
2903         (JSC::DFG::reifyInlinedCallFrames):
2904         * dfg/DFGOSRExitCompilerCommon.cpp:
2905         (JSC::DFG::reifyInlinedCallFrames):
2906
2907 2019-03-21  Carlos Garcia Campos  <cgarcia@igalia.com>
2908
2909         [GLib] Returning G_TYPE_OBJECT from a method does not work
2910         https://bugs.webkit.org/show_bug.cgi?id=195574
2911
2912         Reviewed by Michael Catanzaro.
2913
2914         Add more documentation to clarify the ownership of wrapped objects when created and when returned by functions.
2915
2916         * API/glib/JSCCallbackFunction.cpp:
2917         (JSC::JSCCallbackFunction::construct): Also allow to return boxed types from a constructor.
2918         * API/glib/JSCClass.cpp:
2919         * API/glib/JSCValue.cpp:
2920
2921 2019-03-21  Mark Lam  <mark.lam@apple.com>
2922
2923         Cap length of an array with spread to MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH.
2924         https://bugs.webkit.org/show_bug.cgi?id=196055
2925         <rdar://problem/49067448>
2926
2927         Reviewed by Yusuke Suzuki.
2928
2929         We are doing this because:
2930         1. We expect the array to be densely packed.
2931         2. SpeculativeJIT::compileAllocateNewArrayWithSize() (and the FTL equivalent)
2932            expects the array length to be less than MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH
2933            if we don't want to use an ArrayStorage shape.
2934         3. There's no reason why an array with spread needs to be that large anyway.
2935            MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH is plenty.
2936
2937         In this patch, we also add a debug assert in compileAllocateNewArrayWithSize() and
2938         emitAllocateButterfly() to check for overflows.
2939
2940         * assembler/AbortReason.h:
2941         * dfg/DFGOperations.cpp:
2942         * dfg/DFGSpeculativeJIT.cpp:
2943         (JSC::DFG::SpeculativeJIT::compileCreateRest):
2944         (JSC::DFG::SpeculativeJIT::compileNewArrayWithSpread):
2945         (JSC::DFG::SpeculativeJIT::emitAllocateButterfly):
2946         (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize):
2947         * ftl/FTLLowerDFGToB3.cpp:
2948         (JSC::FTL::DFG::LowerDFGToB3::compileNewArrayWithSpread):
2949         * runtime/ArrayConventions.h:
2950         * runtime/CommonSlowPaths.cpp:
2951         (JSC::SLOW_PATH_DECL):
2952
2953 2019-03-20  Yusuke Suzuki  <ysuzuki@apple.com>
2954
2955         [JSC] Use finalizer in JSGlobalLexicalEnvironment and JSGlobalObject
2956         https://bugs.webkit.org/show_bug.cgi?id=195992
2957
2958         Reviewed by Keith Miller and Mark Lam.
2959
2960         JSGlobalLexicalEnvironment and JSGlobalObject have their own CompleteSubspace to call destructors while they are not inheriting JSDestructibleObject.
2961         But it is too costly since (1) it requires CompleteSubspace in VM, (2) both objects allocate MarkedBlocks while # of them are really small.
2962
2963         Instead of using CompleteSubspace, we just set finalizers for them. Since these objects are rarely allocated, setting finalizers does not show
2964         memory / performance problems (actually, previously we used finalizer for ArrayPrototype due to the same reason, and it does not show any problems).
2965
2966         And we also add following two changes to JSSegmentedVariableObject.
2967
2968         1. Remove one boolean used for debugging in Release build. It enlarges sizeof(JSSegmentedVariableObject) and allocates one more MarkedBlock.
2969         2. Use cellLock() instead.
2970
2971         * CMakeLists.txt:
2972         * JavaScriptCore.xcodeproj/project.pbxproj:
2973         * Sources.txt:
2974         * runtime/JSSegmentedVariableObject.cpp:
2975         (JSC::JSSegmentedVariableObject::findVariableIndex):
2976         (JSC::JSSegmentedVariableObject::addVariables):
2977         (JSC::JSSegmentedVariableObject::visitChildren):
2978         (JSC::JSSegmentedVariableObject::~JSSegmentedVariableObject):
2979         (JSC::JSSegmentedVariableObject::finishCreation):
2980         * runtime/JSSegmentedVariableObject.h:
2981         (JSC::JSSegmentedVariableObject::subspaceFor): Deleted.
2982         * runtime/JSSegmentedVariableObjectHeapCellType.cpp: Removed.
2983         * runtime/JSSegmentedVariableObjectHeapCellType.h: Removed.
2984         * runtime/StringIteratorPrototype.cpp:
2985         * runtime/VM.cpp:
2986         (JSC::VM::VM):
2987         * runtime/VM.h:
2988
2989 2019-03-20  Saam Barati  <sbarati@apple.com>
2990
2991         DFG::AbstractValue::validateOSREntry is wrong when isHeapTop and the incoming value is Empty
2992         https://bugs.webkit.org/show_bug.cgi?id=195721
2993
2994         Reviewed by Filip Pizlo.
2995
2996         There was a check in AbstractValue::validateOSREntry where it checked
2997         if isHeapTop(), and if so, just returned true. However, this is wrong
2998         if the value we're checking against is the empty value, since HeapTop
2999         does not include the Empty value. Instead, this check should be
3000         isBytecodeTop(), which does account for the empty value.
3001         
3002         This patch also does a couple of other things:
3003         - For our OSR entry AbstractValues, we were using HeapTop to mark
3004          a dead value. That is now changed to BytecodeTop. (The idea here
3005          is just to have validateOSREntry return early.)
3006         - It wasn't obvious to me how I could make this fail in JS code.
3007          The symptom we'd end up seeing is something like a nullptr derefernece
3008          from forgetting to do a TDZ check. Instead, I've added a unit test.
3009          This unit test lives in a new test file: testdfg. testdfg is similar
3010          to testb3/testair/testapi.
3011
3012         * JavaScriptCore.xcodeproj/project.pbxproj:
3013         * bytecode/SpeculatedType.h:
3014         * dfg/DFGAbstractValue.h:
3015         (JSC::DFG::AbstractValue::isBytecodeTop const):
3016         (JSC::DFG::AbstractValue::validateOSREntryValue const):
3017         * dfg/testdfg.cpp: Added.
3018         (hiddenTruthBecauseNoReturnIsStupid):
3019         (usage):
3020         (JSC::DFG::testEmptyValueDoesNotValidateWithHeapTop):
3021         (JSC::DFG::run):
3022         (run):
3023         (main):
3024         * shell/CMakeLists.txt:
3025
3026 2019-03-20  Saam Barati  <sbarati@apple.com>
3027
3028         typeOfDoubleSum is wrong for when NaN can be produced
3029         https://bugs.webkit.org/show_bug.cgi?id=196030
3030
3031         Reviewed by Filip Pizlo.
3032
3033         We were using typeOfDoubleSum(SpeculatedType, SpeculatedType) for add/sub/mul.
3034         It assumed that the only way the resulting type could be NaN is if one of
3035         the inputs were NaN. However, this is wrong. NaN can be produced in at least
3036         these cases:
3037           Infinity - Infinity
3038           Infinity + (-Infinity)
3039           Infinity * 0
3040
3041         * bytecode/SpeculatedType.cpp:
3042         (JSC::typeOfDoubleSumOrDifferenceOrProduct):
3043         (JSC::typeOfDoubleSum):
3044         (JSC::typeOfDoubleDifference):
3045         (JSC::typeOfDoubleProduct):
3046
3047 2019-03-20  Simon Fraser  <simon.fraser@apple.com>
3048
3049         Rename ENABLE_ACCELERATED_OVERFLOW_SCROLLING macro to ENABLE_OVERFLOW_SCROLLING_TOUCH
3050         https://bugs.webkit.org/show_bug.cgi?id=196049
3051
3052         Reviewed by Tim Horton.
3053
3054         This macro is about the -webkit-overflow-scrolling CSS property, not accelerated
3055         overflow scrolling in general, so rename it.
3056
3057         * Configurations/FeatureDefines.xcconfig:
3058
3059 2019-03-20  Saam Barati  <sbarati@apple.com>
3060
3061         GetCallee does not report the correct type in AI
3062         https://bugs.webkit.org/show_bug.cgi?id=195981
3063
3064         Reviewed by Yusuke Suzuki.
3065
3066         I found this as part of my work in:
3067         https://bugs.webkit.org/show_bug.cgi?id=195924
3068         
3069         I'm not sure how to write a test for it.
3070         
3071         GetCallee was always reporting that the result is SpecFunction. However,
3072         for eval, it may result in just a JSCallee object, which is not a JSFunction.
3073
3074         * dfg/DFGAbstractInterpreterInlines.h:
3075         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3076
3077 2019-03-20  Mark Lam  <mark.lam@apple.com>
3078
3079         Open source arm64e code.
3080         https://bugs.webkit.org/show_bug.cgi?id=196012
3081         <rdar://problem/49066237>
3082
3083         Reviewed by Keith Miller.
3084
3085         * JavaScriptCore.xcodeproj/project.pbxproj:
3086         * Sources.txt:
3087         * assembler/ARM64EAssembler.h: Added.
3088         (JSC::ARM64EAssembler::encodeGroup1):
3089         (JSC::ARM64EAssembler::encodeGroup2):
3090         (JSC::ARM64EAssembler::encodeGroup4):
3091         (JSC::ARM64EAssembler::pacia1716):
3092         (JSC::ARM64EAssembler::pacib1716):
3093         (JSC::ARM64EAssembler::autia1716):
3094         (JSC::ARM64EAssembler::autib1716):
3095         (JSC::ARM64EAssembler::paciaz):
3096         (JSC::ARM64EAssembler::paciasp):
3097         (JSC::ARM64EAssembler::pacibz):
3098         (JSC::ARM64EAssembler::pacibsp):
3099         (JSC::ARM64EAssembler::autiaz):
3100         (JSC::ARM64EAssembler::autiasp):
3101         (JSC::ARM64EAssembler::autibz):
3102         (JSC::ARM64EAssembler::autibsp):
3103         (JSC::ARM64EAssembler::xpaclri):
3104         (JSC::ARM64EAssembler::pacia):
3105         (JSC::ARM64EAssembler::pacib):
3106         (JSC::ARM64EAssembler::pacda):
3107         (JSC::ARM64EAssembler::pacdb):
3108         (JSC::ARM64EAssembler::autia):
3109         (JSC::ARM64EAssembler::autib):
3110         (JSC::ARM64EAssembler::autda):
3111         (JSC::ARM64EAssembler::autdb):
3112         (JSC::ARM64EAssembler::paciza):
3113         (JSC::ARM64EAssembler::pacizb):
3114         (JSC::ARM64EAssembler::pacdza):
3115         (JSC::ARM64EAssembler::pacdzb):
3116         (JSC::ARM64EAssembler::autiza):
3117         (JSC::ARM64EAssembler::autizb):
3118         (JSC::ARM64EAssembler::autdza):
3119         (JSC::ARM64EAssembler::autdzb):
3120         (JSC::ARM64EAssembler::xpaci):
3121         (JSC::ARM64EAssembler::xpacd):
3122         (JSC::ARM64EAssembler::pacga):
3123         (JSC::ARM64EAssembler::braa):
3124         (JSC::ARM64EAssembler::brab):
3125         (JSC::ARM64EAssembler::blraa):
3126         (JSC::ARM64EAssembler::blrab):
3127         (JSC::ARM64EAssembler::braaz):
3128         (JSC::ARM64EAssembler::brabz):
3129         (JSC::ARM64EAssembler::blraaz):
3130         (JSC::ARM64EAssembler::blrabz):
3131         (JSC::ARM64EAssembler::retaa):
3132         (JSC::ARM64EAssembler::retab):
3133         (JSC::ARM64EAssembler::eretaa):
3134         (JSC::ARM64EAssembler::eretab):
3135         (JSC::ARM64EAssembler::linkPointer):
3136         (JSC::ARM64EAssembler::repatchPointer):
3137         (JSC::ARM64EAssembler::setPointer):
3138         (JSC::ARM64EAssembler::readPointer):
3139         (JSC::ARM64EAssembler::readCallTarget):
3140         (JSC::ARM64EAssembler::ret):
3141         * assembler/MacroAssembler.cpp:
3142         * assembler/MacroAssembler.h:
3143         * assembler/MacroAssemblerARM64.cpp:
3144         * assembler/MacroAssemblerARM64E.h: Added.
3145         (JSC::MacroAssemblerARM64E::tagReturnAddress):
3146         (JSC::MacroAssemblerARM64E::untagReturnAddress):
3147         (JSC::MacroAssemblerARM64E::tagPtr):
3148         (JSC::MacroAssemblerARM64E::untagPtr):
3149         (JSC::MacroAssemblerARM64E::removePtrTag):
3150         (JSC::MacroAssemblerARM64E::callTrustedPtr):
3151         (JSC::MacroAssemblerARM64E::call):
3152         (JSC::MacroAssemblerARM64E::callRegister):
3153         (JSC::MacroAssemblerARM64E::jump):
3154         * dfg/DFGOSRExit.cpp:
3155         (JSC::DFG::reifyInlinedCallFrames):
3156         * dfg/DFGOSRExitCompilerCommon.cpp:
3157         (JSC::DFG::reifyInlinedCallFrames):
3158         * ftl/FTLThunks.cpp:
3159         (JSC::FTL::genericGenerationThunkGenerator):
3160         * jit/CCallHelpers.h:
3161         (JSC::CCallHelpers::prepareForTailCallSlow):
3162         * jit/CallFrameShuffler.cpp:
3163         (JSC::CallFrameShuffler::prepareForTailCall):
3164         * jit/ExecutableAllocator.cpp:
3165         (JSC::ExecutableAllocator::allocate):
3166         * jit/ThunkGenerators.cpp:
3167         (JSC::arityFixupGenerator):
3168         * llint/LLIntOfflineAsmConfig.h:
3169         * llint/LowLevelInterpreter.asm:
3170         * llint/LowLevelInterpreter64.asm:
3171         * runtime/ClassInfo.h:
3172         * runtime/InitializeThreading.cpp:
3173         (JSC::initializeThreading):
3174         * runtime/JSCPtrTag.cpp: Added.
3175         (JSC::tagForPtr):
3176         (JSC::ptrTagName):
3177         (JSC::initializePtrTagLookup):
3178         * runtime/JSCPtrTag.h:
3179         (JSC::initializePtrTagLookup):
3180         * runtime/Options.cpp:
3181         (JSC::recomputeDependentOptions):
3182
3183 2019-03-20  Tadeu Zagallo  <tzagallo@apple.com>
3184
3185         JSC::createError needs to check for OOM in errorDescriptionForValue
3186         https://bugs.webkit.org/show_bug.cgi?id=196032
3187         <rdar://problem/46842740>
3188
3189         Reviewed by Mark Lam.
3190
3191         We were missing exceptions checks at two levels:
3192         - In errorDescriptionForValue, when the value is a string, we should
3193           check that JSString::value returns a valid string, since we might run
3194           out of memory if it is a rope and we need to resolve it.
3195         - In createError, we should check for the result of errorDescriptionForValue
3196           before concatenating it with the message provided by the caller.
3197
3198         * runtime/ExceptionHelpers.cpp:
3199         (JSC::errorDescriptionForValue):
3200         (JSC::createError):
3201         * runtime/ExceptionHelpers.h:
3202
3203 2019-03-20  Devin Rousso  <drousso@apple.com>
3204
3205         Web Inspector: DOM: include window as part of any event listener chain
3206         https://bugs.webkit.org/show_bug.cgi?id=195730
3207         <rdar://problem/48916872>
3208
3209         Reviewed by Timothy Hatcher.
3210
3211         * inspector/protocol/DOM.json:
3212         Modify `DOM.getEventListenersForNode` to not save the handler object, as that was never
3213         used by the frontend. Add an `onWindow` optional property to `DOM.EventListener` that is set
3214         when the event listener was retrieved from the `window` object.
3215
3216 2019-03-20  Devin Rousso  <drousso@apple.com>
3217
3218         Web Inspector: Runtime: lazily create the agent
3219         https://bugs.webkit.org/show_bug.cgi?id=195972
3220         <rdar://problem/49039655>
3221
3222         Reviewed by Timothy Hatcher.
3223
3224         * inspector/JSGlobalObjectInspectorController.cpp:
3225         (Inspector::JSGlobalObjectInspectorController::JSGlobalObjectInspectorController):
3226         (Inspector::JSGlobalObjectInspectorController::createLazyAgents):
3227
3228         * inspector/agents/InspectorRuntimeAgent.h:
3229         (Inspector::InspectorRuntimeAgent::enabled): Deleted.
3230         * inspector/agents/InspectorRuntimeAgent.cpp:
3231         (Inspector::InspectorRuntimeAgent::didCreateFrontendAndBackend): Added.
3232         (Inspector::InspectorRuntimeAgent::willDestroyFrontendAndBackend):
3233
3234         * inspector/agents/JSGlobalObjectRuntimeAgent.h:
3235         * inspector/agents/JSGlobalObjectRuntimeAgent.cpp:
3236         (Inspector::JSGlobalObjectRuntimeAgent::didCreateFrontendAndBackend): Deleted.
3237
3238 2019-03-20  Michael Saboff  <msaboff@apple.com>
3239
3240         JSC test crash: stress/dont-strength-reduce-regexp-with-compile-error.js.default
3241         https://bugs.webkit.org/show_bug.cgi?id=195906
3242
3243         Reviewed by Mark Lam.
3244
3245         The problem here as that we may successfully parsed a RegExp without running out of stack,
3246         but later run out of stack when trying to JIT compile the same expression.
3247
3248         Added a check for available stack space when we call into one of the parenthesis compilation
3249         functions that recurse.  When we don't have enough stack space to recurse, we fail the JIT
3250         compilation and let the interpreter handle the expression.
3251
3252         From code inspection of the YARR interpreter it has the same issue, but I couldn't cause a failure.
3253         Filed a new bug and added a FIXME comment for the Interpreter to have similar checks.
3254         Given that we can reproduce a failure, this is sufficient for now.
3255
3256         This change is covered by the previously added failing test,
3257         JSTests/stress/dont-strength-reduce-regexp-with-compile-error.js.
3258
3259         * yarr/YarrInterpreter.cpp:
3260         (JSC::Yarr::Interpreter::interpret):
3261         * yarr/YarrJIT.cpp:
3262         (JSC::Yarr::YarrGenerator::opCompileParenthesesSubpattern):
3263         (JSC::Yarr::YarrGenerator::opCompileParentheticalAssertion):
3264         (JSC::Yarr::YarrGenerator::opCompileBody):
3265         (JSC::Yarr::dumpCompileFailure):
3266         * yarr/YarrJIT.h:
3267
3268 2019-03-20  Robin Morisset  <rmorisset@apple.com>
3269
3270         DFGNodeAllocator.h is dead code
3271         https://bugs.webkit.org/show_bug.cgi?id=196019
3272
3273         Reviewed by Yusuke Suzuki.
3274
3275         As explained by Yusuke on IRC, the comment on DFG::Node saying that it cannot have a destructor is obsolete since https://trac.webkit.org/changeset/216815/webkit.
3276         This patch removes both the comment and DFGNodeAllocator.h that that patch forgot to remove.
3277
3278         * dfg/DFGNode.h:
3279         (JSC::DFG::Node::dumpChildren):
3280         * dfg/DFGNodeAllocator.h: Removed.
3281
3282 2019-03-20  Robin Morisset  <rmorisset@apple.com>
3283
3284         Compress CodeOrigin into a single word in the common case
3285         https://bugs.webkit.org/show_bug.cgi?id=195928
3286
3287         Reviewed by Saam Barati.
3288
3289         The trick is that pointers only take 48 bits on x86_64 in practice (and we can even use the bottom three bits of that thanks to alignment), and even less on ARM64.
3290         So we can shove the bytecode index in the top bits almost all the time.
3291         If the bytecodeIndex is too ginormous (1<<16 in practice on x86_64), we just set one bit at the bottom and store a pointer to some out-of-line storage instead.
3292         Finally we represent an invalid bytecodeIndex (which used to be represented by UINT_MAX) by setting the second least signifcant bit.
3293
3294         The patch looks very long, but most of it is just replacing direct accesses to inlineCallFrame and bytecodeIndex by the relevant getters.
3295
3296         End result: CodeOrigin in the common case moves from 16 bytes (8 for InlineCallFrame*, 4 for unsigned bytecodeIndex, 4 of padding) to 8.
3297         As a reference, during running JetStream2 we allocate more than 35M CodeOrigins. While they won't all be alive at the same time, it is still quite a lot of objects, so I am hoping for some small
3298         improvement to RAMification from this work.
3299
3300         The one slightly tricky part is that we must implement copy and move assignment operators and constructors to make sure that any out-of-line storage belongs to a single CodeOrigin and is destroyed exactly once.
3301
3302         * bytecode/ByValInfo.h:
3303         * bytecode/CallLinkStatus.cpp:
3304         (JSC::CallLinkStatus::computeFor):
3305         * bytecode/CodeBlock.cpp:
3306         (JSC::CodeBlock::globalObjectFor):
3307         (JSC::CodeBlock::updateOSRExitCounterAndCheckIfNeedToReoptimize):
3308         (JSC::CodeBlock::bytecodeOffsetFromCallSiteIndex):
3309         * bytecode/CodeOrigin.cpp:
3310         (JSC::CodeOrigin::inlineDepth const):
3311         (JSC::CodeOrigin::isApproximatelyEqualTo const):
3312         (JSC::CodeOrigin::approximateHash const):
3313         (JSC::CodeOrigin::inlineStack const):
3314         (JSC::CodeOrigin::codeOriginOwner const):
3315         (JSC::CodeOrigin::stackOffset const):
3316         (JSC::CodeOrigin::dump const):
3317         (JSC::CodeOrigin::inlineDepthForCallFrame): Deleted.
3318         * bytecode/CodeOrigin.h:
3319         (JSC::OutOfLineCodeOrigin::OutOfLineCodeOrigin):
3320         (JSC::CodeOrigin::CodeOrigin):
3321         (JSC::CodeOrigin::~CodeOrigin):
3322         (JSC::CodeOrigin::isSet const):
3323         (JSC::CodeOrigin::isHashTableDeletedValue const):
3324         (JSC::CodeOrigin::bytecodeIndex const):
3325         (JSC::CodeOrigin::inlineCallFrame const):
3326         (JSC::CodeOrigin::buildCompositeValue):
3327         (JSC::CodeOrigin::hash const):
3328         (JSC::CodeOrigin::operator== const):
3329         (JSC::CodeOrigin::exitingInlineKind const): Deleted.
3330         * bytecode/DeferredSourceDump.h:
3331         * bytecode/GetByIdStatus.cpp:
3332         (JSC::GetByIdStatus::computeForStubInfo):
3333         (JSC::GetByIdStatus::computeFor):
3334         * bytecode/ICStatusMap.cpp:
3335         (JSC::ICStatusContext::isInlined const):
3336         * bytecode/InByIdStatus.cpp:
3337         (JSC::InByIdStatus::computeFor):
3338         (JSC::InByIdStatus::compute