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