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