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