In cloop.rb, rename :int and :uint to :intptr and :uintptr.
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2019-02-28  Mark Lam  <mark.lam@apple.com>
2
3         In cloop.rb, rename :int and :uint to :intptr and :uintptr.
4         https://bugs.webkit.org/show_bug.cgi?id=195183
5
6         Reviewed by Yusuke Suzuki.
7
8         Also changed intMemRef and uintMemRef to intptrMemRef and uintptrMemRef respectively.
9
10         * offlineasm/cloop.rb:
11
12 2019-02-28  Saam barati  <sbarati@apple.com>
13
14         Make JSScript:cacheBytecodeWithError update the cache when the script changes
15         https://bugs.webkit.org/show_bug.cgi?id=194912
16
17         Reviewed by Mark Lam.
18
19         Prior to this patch, the JSScript SPI would never check if its cached
20         bytecode were still valid. This would lead the cacheBytecodeWithError
21         succeeding even if the underlying cache were stale. This patch fixes
22         that by making JSScript check if the cache is still valid. If it's not,
23         we will cache bytecode when cacheBytecodeWithError is invoked.
24
25         * API/JSScript.mm:
26         (-[JSScript readCache]):
27         (-[JSScript writeCache:]):
28         * API/tests/testapi.mm:
29         (testBytecodeCacheWithSameCacheFileAndDifferentScript):
30         (testObjectiveCAPI):
31         * runtime/CachedTypes.cpp:
32         (JSC::Decoder::Decoder):
33         (JSC::VariableLengthObject::buffer const):
34         (JSC::CachedPtr::decode const):
35         (JSC::tagFromSourceCodeType):
36         (JSC::GenericCacheEntry::isUpToDate const):
37         (JSC::CacheEntry::isStillValid const):
38         (JSC::GenericCacheEntry::decode const):
39         (JSC::GenericCacheEntry::isStillValid const):
40         (JSC::encodeCodeBlock):
41         (JSC::decodeCodeBlockImpl):
42         (JSC::isCachedBytecodeStillValid):
43         * runtime/CachedTypes.h:
44         * runtime/CodeCache.cpp:
45         (JSC::sourceCodeKeyForSerializedBytecode):
46         (JSC::sourceCodeKeyForSerializedProgram):
47         (JSC::sourceCodeKeyForSerializedModule):
48         (JSC::serializeBytecode):
49         * runtime/CodeCache.h:
50         (JSC::CodeCacheMap::fetchFromDiskImpl):
51         * runtime/Completion.cpp:
52         (JSC::generateProgramBytecode):
53         (JSC::generateBytecode): Deleted.
54         * runtime/Completion.h:
55
56 2019-02-28  Mark Lam  <mark.lam@apple.com>
57
58         cloop.rb shift mask should depend on the word size being shifted.
59         https://bugs.webkit.org/show_bug.cgi?id=195181
60         <rdar://problem/48484164>
61
62         Reviewed by Yusuke Suzuki.
63
64         Previously, we're always masking the shift amount with 0x1f.  This is only correct
65         for 32-bit words.  For 64-bit words, the mask should be 0x3f.  For pointer sized
66         shifts, the mask depends on sizeof(uintptr_t).
67
68         * offlineasm/cloop.rb:
69
70 2019-02-28  Justin Fan  <justin_fan@apple.com>
71
72         [Web GPU] Enable Web GPU only on 64-bit
73         https://bugs.webkit.org/show_bug.cgi?id=195139
74
75         Because Metal is only supported on 64 bit apps.
76
77         Unreviewed build fix.
78
79         * Configurations/FeatureDefines.xcconfig:
80
81 2019-02-27  Mark Lam  <mark.lam@apple.com>
82
83         The parser is failing to record the token location of new in new.target.
84         https://bugs.webkit.org/show_bug.cgi?id=195127
85         <rdar://problem/39645578>
86
87         Reviewed by Yusuke Suzuki.
88
89         Also adjust the token location for the following to be as shown:
90
91             new.target
92             ^
93             super
94             ^
95             import.meta
96             ^
97
98         * parser/Parser.cpp:
99         (JSC::Parser<LexerType>::parseMemberExpression):
100
101 2019-02-27  Yusuke Suzuki  <ysuzuki@apple.com>
102
103         [JSC] mustHandleValues for dead bytecode locals should be ignored in DFG phases
104         https://bugs.webkit.org/show_bug.cgi?id=195144
105         <rdar://problem/47595961>
106
107         Reviewed by Mark Lam.
108
109         DFGMaximalFlushInsertionPhase inserts Flush for all the locals at the end of basic blocks. This enlarges the live ranges of
110         locals in DFG, and it sometimes makes DFG value live while it is dead in bytecode. The issue happens when we use mustHandleValues
111         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.
112         At that time, we attempt to merge AbstractValue with dead mustHandleValue, which is cleared as jsUndefined() in
113         DFG::Plan::cleanMustHandleValuesIfNecessary before start compilation, and crash because jsUndefined() may be irrelevant to the FlushFormat
114         in VariableAccessData.
115
116         This patch makes the type of mustHandleValues Operands<Optional<JSValue>>. We clear dead JSValues in DFG::Plan::cleanMustHandleValuesIfNecessary.
117         And we skip handling dead mustHandleValue in DFG phases.
118
119         * bytecode/Operands.h:
120         (JSC::Operands::isLocal const):
121         (JSC::Operands::isVariable const): Deleted.
122         * dfg/DFGCFAPhase.cpp:
123         (JSC::DFG::CFAPhase::injectOSR):
124         * dfg/DFGDriver.cpp:
125         (JSC::DFG::compileImpl):
126         (JSC::DFG::compile):
127         * dfg/DFGDriver.h:
128         * dfg/DFGJITCode.cpp:
129         (JSC::DFG::JITCode::reconstruct):
130         * dfg/DFGJITCode.h:
131         * dfg/DFGOperations.cpp:
132         * dfg/DFGPlan.cpp:
133         (JSC::DFG::Plan::Plan):
134         (JSC::DFG::Plan::checkLivenessAndVisitChildren):
135         (JSC::DFG::Plan::cleanMustHandleValuesIfNecessary):
136         * dfg/DFGPlan.h:
137         (JSC::DFG::Plan::mustHandleValues const):
138         * dfg/DFGPredictionInjectionPhase.cpp:
139         (JSC::DFG::PredictionInjectionPhase::run):
140         * dfg/DFGTypeCheckHoistingPhase.cpp:
141         (JSC::DFG::TypeCheckHoistingPhase::disableHoistingAcrossOSREntries):
142         * ftl/FTLOSREntry.cpp:
143         (JSC::FTL::prepareOSREntry):
144         * jit/JITOperations.cpp:
145
146 2019-02-27  Simon Fraser  <simon.fraser@apple.com>
147
148         Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
149
150         * bytecode/CodeBlock.cpp:
151         (JSC::CodeBlock::nameForRegister):
152
153 2019-02-27  Antoine Quint  <graouts@apple.com>
154
155         Support Pointer Events on macOS
156         https://bugs.webkit.org/show_bug.cgi?id=195008
157         <rdar://problem/47454419>
158
159         Reviewed by Dean Jackson.
160
161         * Configurations/FeatureDefines.xcconfig:
162
163 2019-02-26  Mark Lam  <mark.lam@apple.com>
164
165         Remove poisons in JSCPoison and uses of them.
166         https://bugs.webkit.org/show_bug.cgi?id=195082
167
168         Reviewed by Yusuke Suzuki.
169
170         Also removed unused poisoning code in WriteBarrier, AssemblyHelpers,
171         DFG::SpeculativeJIT, FTLLowerDFGToB3, and FTL::Output.
172
173         * API/JSAPIWrapperObject.h:
174         (JSC::JSAPIWrapperObject::wrappedObject):
175         * API/JSCallbackFunction.h:
176         * API/JSCallbackObject.h:
177         * API/glib/JSAPIWrapperGlobalObject.h:
178         * CMakeLists.txt:
179         * JavaScriptCore.xcodeproj/project.pbxproj:
180         * Sources.txt:
181         * bytecode/AccessCase.cpp:
182         (JSC::AccessCase::generateWithGuard):
183         * dfg/DFGSpeculativeJIT.cpp:
184         (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments):
185         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
186         (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon):
187         (JSC::DFG::SpeculativeJIT::compileGetExecutable):
188         (JSC::DFG::SpeculativeJIT::compileCreateThis):
189         * dfg/DFGSpeculativeJIT.h:
190         (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPoisonedPointer): Deleted.
191         * ftl/FTLLowerDFGToB3.cpp:
192         (JSC::FTL::DFG::LowerDFGToB3::compileGetExecutable):
193         (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength):
194         (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal):
195         (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction):
196         (JSC::FTL::DFG::LowerDFGToB3::weakPointer):
197         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoison): Deleted.
198         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnLoadedType): Deleted.
199         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnType): Deleted.
200         (JSC::FTL::DFG::LowerDFGToB3::weakPoisonedPointer): Deleted.
201         * ftl/FTLOutput.h:
202         (JSC::FTL::Output::weakPoisonedPointer): Deleted.
203         * jit/AssemblyHelpers.cpp:
204         (JSC::AssemblyHelpers::emitDynamicPoison): Deleted.
205         (JSC::AssemblyHelpers::emitDynamicPoisonOnLoadedType): Deleted.
206         (JSC::AssemblyHelpers::emitDynamicPoisonOnType): Deleted.
207         * jit/AssemblyHelpers.h:
208         * jit/JITOpcodes.cpp:
209         (JSC::JIT::emit_op_create_this):
210         * jit/JITPropertyAccess.cpp:
211         (JSC::JIT::emitScopedArgumentsGetByVal):
212         * jit/Repatch.cpp:
213         (JSC::linkPolymorphicCall):
214         * jit/ThunkGenerators.cpp:
215         (JSC::virtualThunkFor):
216         (JSC::nativeForGenerator):
217         (JSC::boundThisNoArgsFunctionCallGenerator):
218         * parser/UnlinkedSourceCode.h:
219         * runtime/ArrayPrototype.h:
220         * runtime/CustomGetterSetter.h:
221         (JSC::CustomGetterSetter::getter const):
222         (JSC::CustomGetterSetter::setter const):
223         * runtime/InitializeThreading.cpp:
224         (JSC::initializeThreading):
225         * runtime/InternalFunction.cpp:
226         (JSC::InternalFunction::getCallData):
227         (JSC::InternalFunction::getConstructData):
228         * runtime/InternalFunction.h:
229         (JSC::InternalFunction::nativeFunctionFor):
230         * runtime/JSArrayBuffer.h:
231         * runtime/JSBoundFunction.h:
232         * runtime/JSCPoison.cpp: Removed.
233         * runtime/JSCPoison.h: Removed.
234         * runtime/JSFunction.h:
235         * runtime/JSGlobalObject.h:
236         * runtime/JSScriptFetchParameters.h:
237         * runtime/JSScriptFetcher.h:
238         * runtime/JSString.h:
239         * runtime/NativeExecutable.cpp:
240         (JSC::NativeExecutable::hashFor const):
241         * runtime/NativeExecutable.h:
242         * runtime/Options.h:
243         * runtime/ScopedArguments.h:
244         * runtime/Structure.cpp:
245         (JSC::StructureTransitionTable::setSingleTransition):
246         * runtime/StructureTransitionTable.h:
247         (JSC::StructureTransitionTable::map const):
248         (JSC::StructureTransitionTable::weakImpl const):
249         (JSC::StructureTransitionTable::setMap):
250         * runtime/WriteBarrier.h:
251         * wasm/WasmB3IRGenerator.cpp:
252         * wasm/WasmInstance.h:
253         * wasm/js/JSToWasm.cpp:
254         (JSC::Wasm::createJSToWasmWrapper):
255         * wasm/js/JSWebAssemblyCodeBlock.h:
256         * wasm/js/JSWebAssemblyInstance.cpp:
257         (JSC::JSWebAssemblyInstance::JSWebAssemblyInstance):
258         (JSC::JSWebAssemblyInstance::visitChildren):
259         * wasm/js/JSWebAssemblyInstance.h:
260         * wasm/js/JSWebAssemblyMemory.h:
261         * wasm/js/JSWebAssemblyModule.h:
262         * wasm/js/JSWebAssemblyTable.cpp:
263         (JSC::JSWebAssemblyTable::JSWebAssemblyTable):
264         (JSC::JSWebAssemblyTable::grow):
265         (JSC::JSWebAssemblyTable::clearFunction):
266         * wasm/js/JSWebAssemblyTable.h:
267         * wasm/js/WasmToJS.cpp:
268         (JSC::Wasm::materializeImportJSCell):
269         (JSC::Wasm::handleBadI64Use):
270         (JSC::Wasm::wasmToJS):
271         * wasm/js/WebAssemblyFunctionBase.h:
272         * wasm/js/WebAssemblyModuleRecord.cpp:
273         (JSC::WebAssemblyModuleRecord::link):
274         (JSC::WebAssemblyModuleRecord::evaluate):
275         * wasm/js/WebAssemblyModuleRecord.h:
276         * wasm/js/WebAssemblyToJSCallee.h:
277         * wasm/js/WebAssemblyWrapperFunction.h:
278
279 2019-02-26  Mark Lam  <mark.lam@apple.com>
280
281         wasmToJS() should purify incoming NaNs.
282         https://bugs.webkit.org/show_bug.cgi?id=194807
283         <rdar://problem/48189132>
284
285         Reviewed by Saam Barati.
286
287         * runtime/JSCJSValue.h:
288         (JSC::jsNumber):
289         * runtime/TypedArrayAdaptors.h:
290         (JSC::IntegralTypedArrayAdaptor::toJSValue):
291         * wasm/js/WasmToJS.cpp:
292         (JSC::Wasm::wasmToJS):
293
294 2019-02-26  Dominik Infuehr  <dinfuehr@igalia.com>
295
296         Fix warnings on ARM and MIPS
297         https://bugs.webkit.org/show_bug.cgi?id=195049
298
299         Reviewed by Mark Lam.
300
301         Fix all warnings on ARM and MIPS.
302
303         * assembler/MacroAssemblerPrinter.cpp:
304         (JSC::Printer::printMemory):
305         * assembler/testmasm.cpp:
306         (JSC::testProbeModifiesStackValues):
307         * bytecode/InByIdStatus.cpp:
308         (JSC::InByIdStatus::computeFor):
309         * runtime/CachedTypes.cpp:
310         (JSC::VariableLengthObject::buffer const):
311         * runtime/JSBigInt.h:
312         * tools/JSDollarVM.cpp:
313         (JSC::codeBlockFromArg):
314
315 2019-02-26  Mark Lam  <mark.lam@apple.com>
316
317         Misc cleanup in StructureIDTable after r242096.
318         https://bugs.webkit.org/show_bug.cgi?id=195063
319
320         Reviewed by Saam Barati.
321
322         * runtime/StructureIDTable.cpp:
323         (JSC::StructureIDTable::allocateID):
324         - RELEASE_ASSERT that the StructureID allocation will succeed.
325
326         * runtime/StructureIDTable.h:
327         (JSC::StructureIDTable::decode):
328         (JSC::StructureIDTable::encode):
329         - Add back a comment that Yusuke requested but was lost when the patch was rolled
330           out and relanded.
331         - Applied bitwise_casts that Saam requested.
332
333 2019-02-26  Mark Lam  <mark.lam@apple.com>
334
335         Gardening: 32-bit build fix after r242096.
336         https://bugs.webkit.org/show_bug.cgi?id=194989
337
338         Not reviewed.
339
340         * jit/AssemblyHelpers.cpp:
341         (JSC::AssemblyHelpers::emitLoadStructure):
342
343 2019-02-26  Mark Lam  <mark.lam@apple.com>
344
345         Unpoison MacroAssemblerCodePtr, ClassInfo pointers, and a few other things.
346         https://bugs.webkit.org/show_bug.cgi?id=195039
347
348         Reviewed by Saam Barati.
349
350         1. Unpoison MacroAssemblerCodePtrs, ReturnAddressPtr.
351         2. Replace PoisonedClassInfoPtr with ClassInfo*.
352         3. Replace PoisonedMasmPtr with const void*.
353         4. Remove all references to CodeBlockPoison, JITCodePoison, and GlobalDataPoison.
354
355         * API/JSCallbackObject.h:
356         * API/JSObjectRef.cpp:
357         (classInfoPrivate):
358         * assembler/MacroAssemblerCodeRef.h:
359         (JSC::FunctionPtr::FunctionPtr):
360         (JSC::FunctionPtr::executableAddress const):
361         (JSC::FunctionPtr::retaggedExecutableAddress const):
362         (JSC::ReturnAddressPtr::ReturnAddressPtr):
363         (JSC::ReturnAddressPtr::value const):
364         (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr):
365         (JSC::MacroAssemblerCodePtr::createFromExecutableAddress):
366         (JSC::MacroAssemblerCodePtr:: const):
367         (JSC::MacroAssemblerCodePtr::operator! const):
368         (JSC::MacroAssemblerCodePtr::operator== const):
369         (JSC::MacroAssemblerCodePtr::hash const):
370         (JSC::MacroAssemblerCodePtr::emptyValue):
371         (JSC::MacroAssemblerCodePtr::deletedValue):
372         (JSC::FunctionPtr<tag>::FunctionPtr):
373         (JSC::MacroAssemblerCodePtr::poisonedPtr const): Deleted.
374         * b3/B3LowerMacros.cpp:
375         * b3/testb3.cpp:
376         (JSC::B3::testInterpreter):
377         * dfg/DFGOSRExitCompilerCommon.h:
378         (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk):
379         * dfg/DFGSpeculativeJIT.cpp:
380         (JSC::DFG::SpeculativeJIT::compileCheckSubClass):
381         (JSC::DFG::SpeculativeJIT::compileNewStringObject):
382         (JSC::DFG::SpeculativeJIT::emitSwitchIntJump):
383         (JSC::DFG::SpeculativeJIT::emitSwitchImm):
384         (JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
385         (JSC::DFG::SpeculativeJIT::emitSwitchChar):
386         * dfg/DFGSpeculativeJIT.h:
387         * ftl/FTLLowerDFGToB3.cpp:
388         (JSC::FTL::DFG::LowerDFGToB3::compileNewStringObject):
389         (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass):
390         * jit/AssemblyHelpers.h:
391         (JSC::AssemblyHelpers::emitAllocateDestructibleObject):
392         * jit/ThunkGenerators.cpp:
393         (JSC::virtualThunkFor):
394         (JSC::boundThisNoArgsFunctionCallGenerator):
395         * runtime/JSCPoison.h:
396         * runtime/JSDestructibleObject.h:
397         (JSC::JSDestructibleObject::classInfo const):
398         * runtime/JSSegmentedVariableObject.h:
399         (JSC::JSSegmentedVariableObject::classInfo const):
400         * runtime/Structure.h:
401         * runtime/VM.h:
402         * wasm/WasmB3IRGenerator.cpp:
403         (JSC::Wasm::B3IRGenerator::addCall):
404         (JSC::Wasm::B3IRGenerator::addCallIndirect):
405         * wasm/WasmBinding.cpp:
406         (JSC::Wasm::wasmToWasm):
407
408 2019-02-26  Mark Lam  <mark.lam@apple.com>
409
410         [Re-landing] Add some randomness into the StructureID.
411         https://bugs.webkit.org/show_bug.cgi?id=194989
412         <rdar://problem/47975563>
413
414         Reviewed by Yusuke Suzuki.
415
416         1. On 64-bit, the StructureID will now be encoded as:
417
418             ----------------------------------------------------------------
419             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
420             ----------------------------------------------------------------
421
422            The entropy bits are chosen at random and assigned when a StructureID is
423            allocated.
424
425         2. Instead of Structure pointers, the StructureIDTable will now contain
426            encodedStructureBits, which is encoded as such:
427
428             ----------------------------------------------------------------
429             | 7 entropy bits |                   57 structure pointer bits |
430             ----------------------------------------------------------------
431
432            The entropy bits here are the same 7 bits used in the encoding of the
433            StructureID for this structure entry in the StructureIDTable.
434
435         3. Retrieval of the structure pointer given a StructureID is now computed as
436            follows:
437
438                 index = structureID >> 7; // with arithmetic shift.
439                 encodedStructureBits = structureIDTable[index];
440                 structure = encodedStructureBits ^ (structureID << 57);
441
442             We use an arithmetic shift for the right shift because that will preserve
443             the nuke bit in the high bit of the index if the StructureID was not
444             decontaminated before use as expected.
445
446         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
447
448         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
449            instead of always being the same as m_capacity.
450
451         6. Change StructureIDTable::s_unusedID's value to 0.
452
453            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
454            StructureID on 64-bit.  Also, there was never any code that initializes unused
455            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
456            is the ID we'll get when the freelist is empty, prompting a resize of the
457            structureIDTable.
458
459         This patch appears to be perf neutral on JetStream 2 run via the cli on a
460         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
461
462         * ftl/FTLLowerDFGToB3.cpp:
463         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
464         * heap/SlotVisitor.cpp:
465         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
466         * jit/AssemblyHelpers.cpp:
467         (JSC::AssemblyHelpers::emitLoadStructure):
468         * jit/AssemblyHelpers.h:
469         * jit/SpecializedThunkJIT.h:
470         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
471         * llint/LowLevelInterpreter.asm:
472         * llint/LowLevelInterpreter64.asm:
473         * runtime/StructureIDTable.cpp:
474         (JSC::StructureIDTable::StructureIDTable):
475         (JSC::StructureIDTable::makeFreeListFromRange):
476         (JSC::StructureIDTable::resize):
477         (JSC::StructureIDTable::allocateID):
478         (JSC::StructureIDTable::deallocateID):
479         * runtime/StructureIDTable.h:
480         (JSC::StructureIDTable::decode):
481         (JSC::StructureIDTable::encode):
482         (JSC::StructureIDTable::get):
483         (JSC::StructureIDTable::isValid):
484
485 2019-02-26  Ryan Haddad  <ryanhaddad@apple.com>
486
487         Unreviewed, rolling out r242071.
488
489         Breaks internal builds.
490
491         Reverted changeset:
492
493         "Add some randomness into the StructureID."
494         https://bugs.webkit.org/show_bug.cgi?id=194989
495         https://trac.webkit.org/changeset/242071
496
497 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
498
499         [JSC] Fix compilation on 32-bit platforms after r242071
500         https://bugs.webkit.org/show_bug.cgi?id=195042
501
502         Reviewed by Carlos Garcia Campos.
503
504         * jit/AssemblyHelpers.cpp:
505         (JSC::AssemblyHelpers::emitLoadStructure):
506
507 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
508
509         [JSC] Repeat string created from Array.prototype.join() take too much memory
510         https://bugs.webkit.org/show_bug.cgi?id=193912
511
512         Reviewed by Saam Barati.
513
514         Added a fast case in Array.prototype.join when the array is
515         uninitialized.
516
517         * runtime/ArrayPrototype.cpp:
518         (JSC::canUseFastJoin):
519         (JSC::fastJoin):
520         * runtime/JSStringInlines.h:
521         (JSC::repeatCharacter): moved from StringPrototype.cpp
522         * runtime/StringPrototype.cpp:
523
524 2019-02-25  Mark Lam  <mark.lam@apple.com>
525
526         Add some randomness into the StructureID.
527         https://bugs.webkit.org/show_bug.cgi?id=194989
528         <rdar://problem/47975563>
529
530         Reviewed by Yusuke Suzuki.
531
532         1. On 64-bit, the StructureID will now be encoded as:
533
534             ----------------------------------------------------------------
535             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
536             ----------------------------------------------------------------
537
538            The entropy bits are chosen at random and assigned when a StructureID is
539            allocated.
540
541         2. Instead of Structure pointers, the StructureIDTable will now contain
542            encodedStructureBits, which is encoded as such:
543
544             ----------------------------------------------------------------
545             | 7 entropy bits |                   57 structure pointer bits |
546             ----------------------------------------------------------------
547
548            The entropy bits here are the same 7 bits used in the encoding of the
549            StructureID for this structure entry in the StructureIDTable.
550
551         3. Retrieval of the structure pointer given a StructureID is now computed as
552            follows:
553
554                 index = structureID >> 7; // with arithmetic shift.
555                 encodedStructureBits = structureIDTable[index];
556                 structure = encodedStructureBits ^ (structureID << 57);
557
558             We use an arithmetic shift for the right shift because that will preserve
559             the nuke bit in the high bit of the index if the StructureID was not
560             decontaminated before use as expected.
561
562         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
563
564         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
565            instead of always being the same as m_capacity.
566
567         6. Change StructureIDTable::s_unusedID's value to 0.
568
569            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
570            StructureID on 64-bit.  Also, there was never any code that initializes unused
571            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
572            is the ID we'll get when the freelist is empty, prompting a resize of the
573            structureIDTable.
574
575         This patch appears to be perf neutral on JetStream 2 run via the cli on a
576         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
577
578         * ftl/FTLLowerDFGToB3.cpp:
579         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
580         * heap/SlotVisitor.cpp:
581         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
582         * jit/AssemblyHelpers.cpp:
583         (JSC::AssemblyHelpers::emitLoadStructure):
584         * jit/AssemblyHelpers.h:
585         * jit/SpecializedThunkJIT.h:
586         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
587         * llint/LowLevelInterpreter.asm:
588         * llint/LowLevelInterpreter64.asm:
589         * runtime/StructureIDTable.cpp:
590         (JSC::StructureIDTable::StructureIDTable):
591         (JSC::StructureIDTable::makeFreeListFromRange):
592         (JSC::StructureIDTable::resize):
593         (JSC::StructureIDTable::allocateID):
594         (JSC::StructureIDTable::deallocateID):
595         * runtime/StructureIDTable.h:
596         (JSC::StructureIDTable::decode):
597         (JSC::StructureIDTable::encode):
598         (JSC::StructureIDTable::get):
599         (JSC::StructureIDTable::isValid):
600
601 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
602
603         [JSC] Revert r226885 to make SlotVisitor creation lazy
604         https://bugs.webkit.org/show_bug.cgi?id=195013
605
606         Reviewed by Saam Barati.
607
608         We once changed SlotVisitor creation apriori to drop the lock. Also, it turns out that SlotVisitor is memory-consuming.
609         We should defer SlotVisitor creation until it is actually required. This patch reverts r226885. Even with this patch,
610         we still hold many SlotVisitors after we execute many parallel markers at least once. But recovering the feature of
611         dynamically allocating SlotVisitors helps further memory optimizations in this area.
612
613         * heap/Heap.cpp:
614         (JSC::Heap::Heap):
615         (JSC::Heap::runBeginPhase):
616         * heap/Heap.h:
617         * heap/HeapInlines.h:
618         (JSC::Heap::forEachSlotVisitor):
619         (JSC::Heap::numberOfSlotVisitors):
620         * heap/MarkingConstraintSolver.cpp:
621         (JSC::MarkingConstraintSolver::didVisitSomething const):
622         * heap/SlotVisitor.h:
623
624 2019-02-25  Saam Barati  <sbarati@apple.com>
625
626         testb3 and testair should test O0/O1/O2
627         https://bugs.webkit.org/show_bug.cgi?id=194637
628
629         Reviewed by Mark Lam.
630
631         This patch makes it so that we run all tests in testair and testb3
632         in O0, O1, and O2. However, some tests are invalid for O0 and O1.
633         This patch makes it so we only run those tests in O2. These are
634         often tests that assert certain optimizations have occurred. There
635         are also a class of tests that rely on using patchpoints to stress 
636         the register allocator into only a single valid allocation. The
637         O0, and sometimes O1, register allocators are not always good enough
638         to allocate such programs. To make these valid allocators to use, we rely
639         on the FTL and Wasm to not emit such patchpoints.
640
641         * b3/air/testair.cpp:
642         (main):
643         * b3/testb3.cpp:
644         (JSC::B3::compileProc):
645         (JSC::B3::testAddLoadTwice):
646         (JSC::B3::testMulLoadTwice):
647         (JSC::B3::testSimplePatchpointWithOuputClobbersGPArgs):
648         (JSC::B3::testSimplePatchpointWithOuputClobbersFPArgs):
649         (JSC::B3::testPatchpointWithEarlyClobber):
650         (JSC::B3::testSimpleCheck):
651         (JSC::B3::testCheckFalse):
652         (JSC::B3::testCheckTrue):
653         (JSC::B3::testCheckLessThan):
654         (JSC::B3::testCheckMegaCombo):
655         (JSC::B3::testCheckTrickyMegaCombo):
656         (JSC::B3::testCheckTwoMegaCombos):
657         (JSC::B3::testCheckTwoNonRedundantMegaCombos):
658         (JSC::B3::testCheckAddImm):
659         (JSC::B3::testCheckAddImmCommute):
660         (JSC::B3::testCheckAddImmSomeRegister):
661         (JSC::B3::testCheckAdd):
662         (JSC::B3::testCheckAdd64):
663         (JSC::B3::testCheckAddFold):
664         (JSC::B3::testCheckAddFoldFail):
665         (JSC::B3::testCheckAddSelfOverflow64):
666         (JSC::B3::testCheckAddSelfOverflow32):
667         (JSC::B3::testCheckSubImm):
668         (JSC::B3::testCheckSubBadImm):
669         (JSC::B3::testCheckSub):
670         (JSC::B3::testCheckSub64):
671         (JSC::B3::testCheckSubFold):
672         (JSC::B3::testCheckSubFoldFail):
673         (JSC::B3::testCheckNeg):
674         (JSC::B3::testCheckNeg64):
675         (JSC::B3::testCheckMul):
676         (JSC::B3::testCheckMulMemory):
677         (JSC::B3::testCheckMul2):
678         (JSC::B3::testCheckMul64):
679         (JSC::B3::testCheckMulFold):
680         (JSC::B3::testCheckMulFoldFail):
681         (JSC::B3::testCheckMul64SShr):
682         (JSC::B3::testLinearScanWithCalleeOnStack):
683         (JSC::B3::testCheckSelect):
684         (JSC::B3::testCheckSelectCheckSelect):
685         (JSC::B3::testCheckSelectAndCSE):
686         (JSC::B3::testLateRegister):
687         (JSC::B3::testReduceStrengthCheckBottomUseInAnotherBlock):
688         (JSC::B3::testSomeEarlyRegister):
689         (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled2):
690         (JSC::B3::testPinRegisters):
691         (JSC::B3::testX86LeaAddAddShlLeft):
692         (JSC::B3::testX86LeaAddAddShlRight):
693         (JSC::B3::testX86LeaAddAdd):
694         (JSC::B3::testX86LeaAddShlRight):
695         (JSC::B3::testX86LeaAddShlLeftScale1):
696         (JSC::B3::testX86LeaAddShlLeftScale2):
697         (JSC::B3::testX86LeaAddShlLeftScale4):
698         (JSC::B3::testX86LeaAddShlLeftScale8):
699         (JSC::B3::testLoadBaseIndexShift2):
700         (JSC::B3::testOptimizeMaterialization):
701         (JSC::B3::testLICMPure):
702         (JSC::B3::testLICMPureSideExits):
703         (JSC::B3::testLICMPureWritesPinned):
704         (JSC::B3::testLICMPureWrites):
705         (JSC::B3::testLICMReadsPinned):
706         (JSC::B3::testLICMReads):
707         (JSC::B3::testLICMPureNotBackwardsDominant):
708         (JSC::B3::testLICMPureNotBackwardsDominantFoiledByChild):
709         (JSC::B3::testLICMControlDependent):
710         (JSC::B3::testLICMControlDependentNotBackwardsDominant):
711         (JSC::B3::testLICMReadsWritesDifferentHeaps):
712         (JSC::B3::testWasmBoundsCheck):
713         (JSC::B3::run):
714         (main):
715
716 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
717
718         [JSC] stress/function-constructor-reading-from-global-lexical-environment.js fails in 32bit arch
719         https://bugs.webkit.org/show_bug.cgi?id=195030
720         <rdar://problem/48385088>
721
722         Reviewed by Saam Barati.
723
724         While LLInt64 has checkTDZInGlobalPutToScopeIfNecessary for op_put_to_scope GlobalLexicalVar to check the value in the variable slot is not empty,
725         this check is missing in LLInt32_64. Previously, this check was subsumed accidentally by the WatchpointSet check in GlobalLexicalVar in `notifyWrite`:
726         because no "put" attempt succeeds here, the status WatchpointSet was ClearWatchpoint, we always go to the slow path, and we always throw the TDZ error
727         before configuring the WatchpointSet in the slow path. But after r241862, WatchpointSet is not used under non-JIT configuration. This skips WatchpointSet
728         check and LLInt32_64 starts failing tests because of lack of checkTDZInGlobalPutToScopeIfNecessary. This patch adds checkTDZInGlobalPutToScopeIfNecessary
729         in LLInt32_64 too. This patch fixes the following four failing tests.
730
731             stress/function-constructor-reading-from-global-lexical-environment.js.bytecode-cache
732             stress/function-constructor-reading-from-global-lexical-environment.js.default
733             stress/global-lexical-variable-tdz.js.bytecode-cache
734             stress/global-lexical-variable-tdz.js.default
735
736         * llint/LowLevelInterpreter32_64.asm:
737
738 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
739
740         [JSC] Make Intl fields lazily-allocated
741         https://bugs.webkit.org/show_bug.cgi?id=195022
742
743         Reviewed by Mark Lam.
744
745         This patch makes the following memory footprint optimization in IntlObject.
746
747         1. Make IntlObject fields including Intl.Collator lazily-allocated because we already removed direct references from JS builtins to these constructors (@Collator etc.).
748
749         2. Move LazyProperty<IntlObject, Structure> structures from IntlObject to JSGlobalObject. This makes sizeof(IntlObject) the same to the other ones of usual runtime Objects,
750            and drop one MarkedBlock.
751
752         * runtime/IntlCollatorConstructor.h:
753         * runtime/IntlDateTimeFormatConstructor.h:
754         * runtime/IntlNumberFormatConstructor.h:
755         * runtime/IntlObject.cpp:
756         (JSC::createCollatorConstructor):
757         (JSC::createNumberFormatConstructor):
758         (JSC::createDateTimeFormatConstructor):
759         (JSC::createPluralRulesConstructor):
760         (JSC::IntlObject::finishCreation):
761         (JSC::IntlObject::visitChildren): Deleted.
762         * runtime/IntlObject.h:
763         * runtime/IntlPluralRulesConstructor.h:
764         * runtime/JSGlobalObject.cpp:
765         (JSC::JSGlobalObject::init):
766         (JSC::JSGlobalObject::visitChildren):
767         (JSC::JSGlobalObject::defaultCollator):
768         * runtime/JSGlobalObject.h:
769         (JSC::JSGlobalObject::collatorStructure):
770         (JSC::JSGlobalObject::numberFormatStructure):
771         (JSC::JSGlobalObject::dateTimeFormatStructure):
772         (JSC::JSGlobalObject::pluralRulesStructure):
773         (JSC::JSGlobalObject::intlObject const): Deleted.
774         * runtime/JSGlobalObjectFunctions.cpp:
775         (JSC::globalFuncDateTimeFormat):
776         * runtime/NumberPrototype.cpp:
777         (JSC::numberProtoFuncToLocaleString):
778         * runtime/StringPrototype.cpp:
779         (JSC::stringProtoFuncLocaleCompare):
780
781 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
782
783         Avoid hashing CompactVariableEnvironment when decoding CompactVariableMap::Handle
784         https://bugs.webkit.org/show_bug.cgi?id=194937
785
786         Reviewed by Saam Barati.
787
788         Hashing the CompactVariableEnvironment is expensive and we could avoid it
789         when decoding multiple handles to the same environment. This is sound because
790         a pointer to the same CompactVariableEnvironment will hash the same.
791
792         * runtime/CachedTypes.cpp:
793         (JSC::Decoder::handleForEnvironment const):
794         (JSC::Decoder::setHandleForEnvironment):
795         (JSC::CachedCompactVariableMapHandle::decode const):
796
797 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
798
799         Remove unnecessary WTF:: prefixes in CachedTypes
800         https://bugs.webkit.org/show_bug.cgi?id=194936
801
802         Reviewed by Saam Barati.
803
804         Cleanup unnecessary prefixes from Optional, roundUpToMultipleOf and
805         pageSize.
806
807         * runtime/CachedTypes.cpp:
808         (JSC::Encoder::cachedOffsetForPtr):
809         (JSC::Encoder::Page::malloc):
810         (JSC::Encoder::allocateNewPage):
811         (JSC::CachedPtr::encode):
812         (JSC::CachedPtr::decode const):
813         (JSC::CachedOptional::encode):
814         (JSC::CachedOptional::decode const):
815
816 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
817
818         [JSC] Drop direct references to Intl constructors by rewriting Intl JS builtins in C++
819         https://bugs.webkit.org/show_bug.cgi?id=194976
820
821         Reviewed by Michael Saboff.
822
823         This patch paves the way to making IntlObject allocation lazy by removing direct references
824         to Intl constructors (Intl.Collator etc.) from builtin JS. To achieve that,
825
826         1. We implement String.prototype.toLocaleCompare and Number.prototype.toLocaleString in C++
827            instead of JS builtins. Since these functions end up calling ICU C++ runtime, writing them in
828            JS does not offer performance improvement.
829
830         2. We remove @DateTimeFormat constructor reference, and instead, exposing @dateTimeFormat function,
831            which returns formatted string directly. We still have JS builtins for DateTimeFormat things
832            because the initialization of its "options" JSObject involves many get_by_id / put_by_id things,
833            which are efficient in JS. But we avoid exposing @DateTimeFormat directly, so that Intl constructors
834            can be lazily allocated.
835
836         * CMakeLists.txt:
837         * DerivedSources-input.xcfilelist:
838         * DerivedSources.make:
839         * JavaScriptCore.xcodeproj/project.pbxproj:
840         * builtins/BuiltinNames.h:
841         * builtins/DatePrototype.js:
842         (toLocaleString):
843         (toLocaleDateString):
844         (toLocaleTimeString):
845         * builtins/NumberPrototype.js: Removed.
846         * builtins/StringPrototype.js:
847         (intrinsic.StringPrototypeReplaceIntrinsic.replace):
848         (globalPrivate.getDefaultCollator): Deleted.
849         * runtime/JSGlobalObject.cpp:
850         (JSC::JSGlobalObject::init):
851         (JSC::JSGlobalObject::visitChildren):
852         (JSC::JSGlobalObject::defaultCollator):
853         * runtime/JSGlobalObject.h:
854         * runtime/JSGlobalObjectFunctions.cpp:
855         (JSC::globalFuncDateTimeFormat):
856         * runtime/JSGlobalObjectFunctions.h:
857         * runtime/NumberPrototype.cpp:
858         (JSC::NumberPrototype::finishCreation):
859         (JSC::throwVMToThisNumberError):
860         (JSC::numberProtoFuncToExponential):
861         (JSC::numberProtoFuncToFixed):
862         (JSC::numberProtoFuncToPrecision):
863         (JSC::numberProtoFuncToString):
864         (JSC::numberProtoFuncToLocaleString):
865         (JSC::numberProtoFuncValueOf):
866         * runtime/StringPrototype.cpp:
867         (JSC::StringPrototype::finishCreation):
868         (JSC::stringProtoFuncLocaleCompare):
869
870 2019-02-24  Devin Rousso  <drousso@apple.com>
871
872         Web Inspector: Change the InspectorOverlay to use native rather than canvas
873         https://bugs.webkit.org/show_bug.cgi?id=105023
874         <rdar://problem/13443692>
875
876         Reviewed by Brian Burg.
877
878         * inspector/protocol/OverlayTypes.json: Removed.
879         Now that the overlay is entirely generated in C++, we no longer need the special prototol
880         types for transferring data to a JavaScript context.
881
882         * inspector/protocol/Debugger.json:
883         * inspector/agents/InspectorDebuggerAgent.h:
884         * inspector/agents/InspectorDebuggerAgent.cpp:
885         (Inspector::InspectorDebuggerAgent::setOverlayMessage): Deleted.
886         Remove `Debugger.setOverlayMessage` command as it hasn't been used and is no longer supported.
887
888         * CMakeLists.txt:
889         * DerivedSources-input.xcfilelist:
890         * DerivedSources.make:
891
892 2019-02-24  Yusuke Suzuki  <ysuzuki@apple.com>
893
894         [JSC] Lazily create sentinel Map and Set buckets
895         https://bugs.webkit.org/show_bug.cgi?id=194975
896
897         Reviewed by Saam Barati.
898
899         If VM::canUseJIT() returns false, we can lazily initialize sentinel Map and Set buckets.
900         This patch adds getters to VM which lazily allocate these buckets. We eagerly initialize
901         them if VM::canUseJIT() returns true since they can be touched from DFG and FTL.
902
903         * bytecode/BytecodeIntrinsicRegistry.cpp:
904         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
905         (JSC::BytecodeIntrinsicRegistry::sentinelMapBucketValue):
906         (JSC::BytecodeIntrinsicRegistry::sentinelSetBucketValue):
907         * bytecode/BytecodeIntrinsicRegistry.h:
908         * dfg/DFGByteCodeParser.cpp:
909         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
910         * dfg/DFGOperations.cpp:
911         * dfg/DFGSpeculativeJIT.cpp:
912         (JSC::DFG::SpeculativeJIT::compileGetMapBucketNext):
913         * dfg/DFGSpeculativeJIT64.cpp:
914         (JSC::DFG::SpeculativeJIT::compile):
915         * ftl/FTLLowerDFGToB3.cpp:
916         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucket):
917         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucketNext):
918         * runtime/MapConstructor.cpp:
919         (JSC::mapPrivateFuncMapBucketNext):
920         * runtime/SetConstructor.cpp:
921         (JSC::setPrivateFuncSetBucketNext):
922         * runtime/VM.cpp:
923         (JSC::VM::VM):
924         (JSC::VM::sentinelSetBucketSlow):
925         (JSC::VM::sentinelMapBucketSlow):
926         * runtime/VM.h:
927         (JSC::VM::sentinelSetBucket):
928         (JSC::VM::sentinelMapBucket):
929
930 2019-02-20  Darin Adler  <darin@apple.com>
931
932         Finish removing String::format
933         https://bugs.webkit.org/show_bug.cgi?id=194893
934
935         Reviewed by Daniel Bates.
936
937         * bytecode/CodeBlock.cpp:
938         (JSC::CodeBlock::nameForRegister): Use makeString instead of String::format,
939         using the new "pad" function.
940
941 2019-02-23  Robin Morisset  <rmorisset@apple.com>
942
943         Remove dead code: AdjacencyList::justOneChild()
944         https://bugs.webkit.org/show_bug.cgi?id=194965
945
946         Reviewed by Sam Weinig.
947
948         * dfg/DFGAdjacencyList.h:
949         (JSC::DFG::AdjacencyList::justOneChild const): Deleted.
950
951 2019-02-23  Michael Catanzaro  <mcatanzaro@igalia.com>
952
953         Unreviewed, fix -Wunused-param warning
954
955         * jsc.cpp:
956
957 2019-02-23  Mark Lam  <mark.lam@apple.com>
958
959         Add an exception check and some assertions in StringPrototype.cpp.
960         https://bugs.webkit.org/show_bug.cgi?id=194962
961         <rdar://problem/48013416>
962
963         Reviewed by Yusuke Suzuki and Saam Barati.
964
965         * runtime/StringPrototype.cpp:
966         (JSC::jsSpliceSubstrings):
967         (JSC::jsSpliceSubstringsWithSeparators):
968         (JSC::operationStringProtoFuncReplaceRegExpEmptyStr):
969
970 2019-02-23  Keith Miller  <keith_miller@apple.com>
971
972         Add new mac target numbers
973         https://bugs.webkit.org/show_bug.cgi?id=194955
974
975         Reviewed by Tim Horton.
976
977         * Configurations/Base.xcconfig:
978         * Configurations/DebugRelease.xcconfig:
979
980 2019-02-22  Robin Morisset  <rmorisset@apple.com>
981
982         DFGBytecodeParser should not declare that a node won't clobberExit if DFGFixupPhase can later declare it does clobberExit
983         https://bugs.webkit.org/show_bug.cgi?id=194953
984         <rdar://problem/47595253>
985
986         Reviewed by Saam Barati.
987
988         For each node that
989         (a) may or may not clobberExit depending on their arrayMode
990         (b) and get their arrayMode from profiling information in DFGBytecodeParser
991         (c) and can have their arrayMode refined by DFGFixupPhase,
992         We must make sure to be conservative in the DFGBytecodeParser and treat it as if it unconditionnally clobbered the exit.
993         Otherwise we will hit a validation failure after fixup if the next node was marked ExitValid and exits to the same semantic origin.
994
995         The list of nodes that fit (a) is:
996         - StringCharAt
997         - HasIndexProperty
998         - GetByVal
999         - PutByValDirect
1000         - PutByVal
1001         - PutByValAlias
1002         - GetIndexedPropertyStorage
1003
1004         Out of these, the following also fit (b) and (c):
1005         - HasIndexedProperty
1006         - GetByVal
1007         - PutByValDirect
1008         - PutByVal
1009
1010         GetByVal already had "m_exitOK = false; // GetByVal must be treated as if it clobbers exit state, since FixupPhase may make it generic."
1011         So we just have to fix the other three the same way.
1012
1013         * dfg/DFGByteCodeParser.cpp:
1014         (JSC::DFG::ByteCodeParser::parseBlock):
1015         (JSC::DFG::ByteCodeParser::handlePutByVal):
1016
1017 2019-02-22  Robin Morisset  <rmorisset@apple.com>
1018
1019         B3ReduceStrength: missing peephole optimizations for binary operations
1020         https://bugs.webkit.org/show_bug.cgi?id=194252
1021
1022         Reviewed by Saam Barati.
1023
1024         Adds several sets of optimizations for BitAnd, BitOr and BitXor.
1025         Using BitAnd distributivity over BitOr and BitXor:
1026           Turn any of these (for Op == BitOr || Op == BitXor):
1027                 Op(BitAnd(x1, x2), BitAnd(x1, x3))
1028                 Op(BitAnd(x2, x1), BitAnd(x1, x3))
1029                 Op(BitAnd(x1, x2), BitAnd(x3, x1))
1030                 Op(BitAnd(x2, x1), BitAnd(x3, x1))
1031            Into this: BitAnd(Op(x2, x3), x1)
1032            And any of these:
1033                 Op(BitAnd(x1, x2), x1)
1034                 Op(BitAnd(x2, x1), x1)
1035                 Op(x1, BitAnd(x1, x2))
1036                 Op(x1, BitAnd(x2, x1))
1037            Into this: BitAnd(Op(x2, x1), x1)
1038            This second set is equivalent to doing x1 => BitAnd(x1, x1), and then applying the first set.
1039         Using de Morgan laws (we represent not as BitXor with allOnes):
1040           BitAnd(BitXor(x1, allOnes), BitXor(x2, allOnes)) => BitXor(BitOr(x1, x2), allOnes)
1041           BitOr(BitXor(x1, allOnes), BitXor(x2, allOnes) => BitXor(BitAnd(x1, x2), allOnes)
1042           BitOr(BitXor(x, allOnes), c) => BitXor(BitAnd(x, ~c), allOnes)
1043           BitAnd(BitXor(x, allOnes), c) => BitXor(BitOr(x, ~c), allOnes)
1044         The latter two are equivalent to doing c => BitXor(~c, allOnes), and then applying the former two.
1045
1046         All of these transformations either reduce the number of operations (which we always do when possible), or bring the expression closer to having:
1047           - BitXor with all ones at the outermost
1048           - then BitAnd
1049           - then other BitXor
1050           - then BitOr at the innermost.
1051         These transformations that don't directly reduce the number of operations are still useful for normalization (helping things like CSE), and also can enable
1052         more optimizations (for example BitXor with all ones can easily cancel each other once they are all at the outermost level).
1053
1054         * b3/B3ReduceStrength.cpp:
1055         * b3/testb3.cpp:
1056         (JSC::B3::testBitAndNotNot):
1057         (JSC::B3::testBitAndNotImm):
1058         (JSC::B3::testBitOrAndAndArgs):
1059         (JSC::B3::testBitOrAndSameArgs):
1060         (JSC::B3::testBitOrNotNot):
1061         (JSC::B3::testBitOrNotImm):
1062         (JSC::B3::testBitXorAndAndArgs):
1063         (JSC::B3::testBitXorAndSameArgs):
1064         (JSC::B3::run):
1065
1066 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
1067
1068         [JSC] putNonEnumerable in JSWrapperMap is too costly
1069         https://bugs.webkit.org/show_bug.cgi?id=194935
1070
1071         Reviewed by Mark Lam.
1072
1073         When we convert Objective-C blocks to JS objects, we need to set up a corresponding function object correctly.
1074         During this allocation, we call [JSValue defineProperty:descriptor] to connect a "prototype" object and "constructor" object.
1075         The problem is that this API has a particularly costly implementation:
1076
1077             [[_context globalObject][@"Object"] invokeMethod:@"defineProperty" withArguments:@[ self, key, descriptor ]];
1078
1079         This wraps each JS objects appear in this code with Objective-C wrapper. And we convert a NSDictionary to JSObject, which
1080         has "writable", "enumerable", "configurable", "value" fields, and call the "defineProperty" JS function through Objective-C wrapper.
1081         This allocates many Objective-C wrappers and JS objects for descriptors. Since JSC has a direct C++ API "defineOwnProperty", we should
1082         bypass these Objective-C APIs and call JSC's code directly.
1083
1084         This patch changes `putNonEnumerable` implementation, from calling [JSValue defineProperty:descriptor] to calling JSC C++ code directly.
1085         We do not change [JSValue defineProperty:descriptor] implementation for now because of two reasons. (1) This is not used in our benchmarks
1086         except for this (converting an Objective-C block to a JS object) one path. And (2) even if we were to re-write [JSValue defineProperty:descriptor]
1087         to be more optimized, we would still want to call the JSC C++ version of defineProperty directly here to avoid NSDictionary allocation for a descriptor.
1088
1089         * API/APIUtils.h:
1090         (setException):
1091         * API/JSWrapperMap.mm:
1092         (putNonEnumerable):
1093         (copyMethodsToObject):
1094         (-[JSObjCClassInfo allocateConstructorAndPrototypeInContext:]):
1095         (-[JSObjCClassInfo wrapperForObject:inContext:]):
1096
1097 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
1098
1099         Unreviewed, build fix after r241954
1100         https://bugs.webkit.org/show_bug.cgi?id=194939
1101
1102         Renaming setCanAccessHeap was incomplete.
1103
1104         * runtime/SmallStrings.cpp:
1105         (JSC::SmallStrings::initializeCommonStrings):
1106         * runtime/VM.cpp:
1107         (JSC::VM::~VM):
1108
1109 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
1110
1111         [JSC] SmallStringsStorage is unnecessary
1112         https://bugs.webkit.org/show_bug.cgi?id=194939
1113
1114         Reviewed by Mark Lam.
1115
1116         SmallStrings hold common small JSStrings. Their underlying StringImpl is also held by SmallStringsStorage.
1117         But it is duplicate since we can get StringImpl from small JSStrings. This patch removes SmallStringsStorage,
1118         and get StringImpls from JSStrings if necessary.
1119
1120         We also add m_canAccessHeap flag to SmallStrings. At the time of VM destruction, JSStrings are destroyed when
1121         VM's Heap is finalized. We must not touch JSStrings before VM's heap (and JSStrings in SmallStrings) is initialized,
1122         and after VM's Heap is destroyed. We add this m_canAccessHeap flag to allow users to get StringImpl during the
1123         this sensitive period. If m_canAccessHeap is false, we get StringImpl from AtomicStringImpl::add.
1124
1125         * runtime/SmallStrings.cpp:
1126         (JSC::SmallStrings::initializeCommonStrings):
1127         (JSC::SmallStrings::singleCharacterStringRep):
1128         (JSC::SmallStringsStorage::rep): Deleted.
1129         (JSC::SmallStringsStorage::SmallStringsStorage): Deleted.
1130         (JSC::SmallStrings::createSingleCharacterString): Deleted.
1131         * runtime/SmallStrings.h:
1132         (JSC::SmallStrings::setCanAccessHeap):
1133         * runtime/VM.cpp:
1134         (JSC::VM::VM):
1135         (JSC::VM::~VM):
1136
1137 2019-02-22  Tadeu Zagallo  <tzagallo@apple.com>
1138
1139         Cache CompactVariableMap::Handle instead of VariableEnvironment for UnlinkedFunctionExecutable
1140         https://bugs.webkit.org/show_bug.cgi?id=194706
1141
1142         Reviewed by Saam Barati.
1143
1144         In https://bugs.webkit.org/show_bug.cgi?id=194583 we started using a
1145         CompactVariableMap::Handle instead of VariableEnvironment for
1146         UnlinkedFunctionExecutables, but we were creating the full environment
1147         to encode the executable in the bytecode cache. This patch changes it so
1148         that we cache the handle instead of the environment. This avoids duplicating
1149         the VariableEnvironment whenever we have to cache two handles that point
1150         to the environment.
1151
1152         * bytecode/UnlinkedFunctionExecutable.h:
1153         * parser/VariableEnvironment.cpp:
1154         (JSC::CompactVariableMap::get):
1155         * parser/VariableEnvironment.h:
1156         * runtime/CachedTypes.cpp:
1157         (JSC::CachedCompactVariableEnvironment::encode):
1158         (JSC::CachedCompactVariableEnvironment::decode const):
1159         (JSC::CachedCompactVariableMapHandle::encode):
1160         (JSC::CachedCompactVariableMapHandle::decode const):
1161         (JSC::CachedFunctionExecutable::encode):
1162         (JSC::CachedFunctionExecutable::decode const):
1163         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1164
1165 2019-02-21  Saam Barati  <sbarati@apple.com>
1166
1167         Update JSScript SPI based on feedback
1168         https://bugs.webkit.org/show_bug.cgi?id=194517
1169
1170         Reviewed by Keith Miller.
1171
1172         This patch updates the JSScript SPI in the following ways:
1173         - JSScript can now represent both modules and programs. This is a property
1174         of the script determined during creation.
1175         - JSScript now takes a sourceURL during construction. For modules, this acts
1176         as the module identifier.
1177         - JSScript now has SPI for writing the cache out to disk. We don't do this
1178         automatically.
1179         - JSScript will load the bytecode cache on creation if it exists.
1180         - We retrofit these new requirements on the prior JSScript SPI that
1181         we're going to remove as soon as we can: https://bugs.webkit.org/show_bug.cgi?id=194909.
1182         Previous SPI assumes all JSScripts are modules. Previous SPI also assigns
1183         a sourceURL to the JSScript based on what the module loader decided the
1184         identifier should be. We'll remove this once we remove the old SPI.
1185         
1186         This patch also adds SPI to JSContext to evaluate a JSScript. For modules,
1187         this is like returning the result of doing dynamic import. For programs,
1188         this does normal program evaluation.
1189         
1190         This patch also fixes a bug in generateBytecode/generateModuleBytecode where
1191         we would try to cache the bytecode even if recursivelyGenerateUnlinkedCodeBlock
1192         returned null. E.g, if the script had a syntax error.
1193         
1194         When writing tests, I also discovered that someone previously broke
1195         testapi. This patch also fixes those failures. They were broken when
1196         we switched to using a testapiScripts directory to hold our test .js
1197         scripts. 
1198
1199         * API/JSAPIGlobalObject.h:
1200         * API/JSAPIGlobalObject.mm:
1201         (JSC::JSAPIGlobalObject::moduleLoaderResolve):
1202         (JSC::JSAPIGlobalObject::moduleLoaderFetch):
1203         (JSC::JSAPIGlobalObject::loadAndEvaluateJSScriptModule):
1204         * API/JSBase.cpp:
1205         (JSEvaluateScriptInternal):
1206         (JSEvaluateScript):
1207         * API/JSBaseInternal.h: Added.
1208         * API/JSContext.mm:
1209         (-[JSContext evaluateScript:withSourceURL:]):
1210         (-[JSContext evaluateJSScript:]):
1211         * API/JSContextPrivate.h:
1212         * API/JSScript.h:
1213         * API/JSScript.mm:
1214         (+[JSScript scriptWithSource:inVirtualMachine:]):
1215         (+[JSScript scriptFromASCIIFile:inVirtualMachine:withCodeSigning:andBytecodeCache:]):
1216         (createError):
1217         (+[JSScript scriptOfType:inVirtualMachine:withSourceURL:andSource:andBytecodeCache:error:]):
1218         (+[JSScript scriptOfType:inVirtualMachine:memoryMappedFromASCIIFile:withSourceURL:andBytecodeCache:error:]):
1219         (-[JSScript cacheBytecodeWithError:]):
1220         (-[JSScript sourceURL]):
1221         (-[JSScript type]):
1222         (-[JSScript jsSourceCode]):
1223         (-[JSScript writeCache:]):
1224         (-[JSScript setSourceURL:]):
1225         (-[JSScript forceRecreateJSSourceCode]):
1226         (-[JSScript writeCache]): Deleted.
1227         (-[JSScript jsSourceCode:]): Deleted.
1228         * API/JSScriptInternal.h:
1229         * API/tests/FunctionOverridesTest.cpp:
1230         (testFunctionOverrides):
1231         * API/tests/testapi.c:
1232         (main):
1233         * API/tests/testapi.mm:
1234         (tempFile):
1235         (testModuleBytecodeCache):
1236         (testProgramBytecodeCache):
1237         (testBytecodeCacheWithSyntaxError):
1238         (testProgramJSScriptException):
1239         (testLoadBasicFileLegacySPI):
1240         (+[JSContextMemoryMappedLoaderDelegate newContext]):
1241         (-[JSContextMemoryMappedLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
1242         (testLoadBasicFile):
1243         (+[JSContextAugmentedLoaderDelegate newContext]):
1244         (-[JSContextAugmentedLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
1245         (testJSScriptURL):
1246         (testObjectiveCAPI):
1247         (testBytecodeCache): Deleted.
1248         * API/tests/testapiScripts/foo.js: Added.
1249         * JavaScriptCore.xcodeproj/project.pbxproj:
1250         * runtime/Completion.cpp:
1251         (JSC::generateBytecode):
1252         (JSC::generateModuleBytecode):
1253
1254 2019-02-21  Mark Lam  <mark.lam@apple.com>
1255
1256         Add more doesGC() assertions.
1257         https://bugs.webkit.org/show_bug.cgi?id=194911
1258         <rdar://problem/48285723>
1259
1260         Reviewed by Saam Barati and Yusuke Suzuki.
1261
1262         * dfg/DFGOSRExit.cpp:
1263         (JSC::DFG::OSRExit::compileOSRExit):
1264         - Set expectDoesGC here because we no longer have to worry about missing store
1265           barriers in optimized code after this point.  This will prevent false positive
1266           assertion failures arising from functions called beneath compileOSRExit().
1267
1268         (JSC::DFG::OSRExit::compileExit):
1269         - Add a comment to explain why the generated ramp needs to set expectDoesGC even
1270           though compileOSRExit() also sets it.  Reason: compileOSRExit() is only called
1271           for the first OSR from this code origin, the generated ramp is called for many
1272           subsequents OSR exits from this code origin.
1273
1274         * ftl/FTLOSRExitCompiler.cpp:
1275         (JSC::FTL::compileStub):
1276         - Added a comment for the equivalent reason to the one above.
1277
1278         (JSC::FTL::compileFTLOSRExit):
1279         - Set expectDoesGC here because we no longer have to worry about missing store
1280           barriers in optimized code after this point.  This will prevent false positive
1281           assertion failures arising from functions called beneath compileFTLOSRExit().
1282
1283         * heap/CompleteSubspace.cpp:
1284         (JSC::CompleteSubspace::tryAllocateSlow):
1285         * heap/CompleteSubspaceInlines.h:
1286         (JSC::CompleteSubspace::allocateNonVirtual):
1287         - assert expectDoesGC.
1288
1289         * heap/DeferGC.h:
1290         (JSC::DeferGC::~DeferGC):
1291         - assert expectDoesGC.
1292         - Also added WTF_FORBID_HEAP_ALLOCATION to DeferGC, DeferGCForAWhile, and DisallowGC
1293           because all 3 should be stack allocated RAII objects.
1294
1295         * heap/GCDeferralContext.h:
1296         * heap/GCDeferralContextInlines.h:
1297         (JSC::GCDeferralContext::~GCDeferralContext):
1298         - Added WTF_FORBID_HEAP_ALLOCATION.
1299         - assert expectDoesGC.
1300
1301         * heap/Heap.cpp:
1302         (JSC::Heap::collectNow):
1303         (JSC::Heap::collectAsync):
1304         (JSC::Heap::collectSync):
1305         (JSC::Heap::stopIfNecessarySlow):
1306         (JSC::Heap::collectIfNecessaryOrDefer):
1307         * heap/HeapInlines.h:
1308         (JSC::Heap::acquireAccess):
1309         (JSC::Heap::stopIfNecessary):
1310         * heap/LargeAllocation.cpp:
1311         (JSC::LargeAllocation::tryCreate):
1312         * heap/LocalAllocatorInlines.h:
1313         (JSC::LocalAllocator::allocate):
1314         - conservatively assert expectDoesGC on these functions that may trigger a GC
1315           though they don't always do.
1316
1317         * runtime/DisallowScope.h:
1318         - DisallowScope should be stack allocated because it's an RAII object.
1319
1320         * runtime/JSCellInlines.h:
1321         (JSC::tryAllocateCellHelper):
1322         - Remove the expectDoesGC assertion because it is now covered by assertions in
1323           CompleteSubspace, LargeAllocation, and LocalAllocator.
1324
1325         * runtime/RegExpMatchesArray.h:
1326         (JSC::createRegExpMatchesArray):
1327         - assert expectDoesGC.
1328
1329 2019-02-21  Yusuke Suzuki  <ysuzuki@apple.com>
1330
1331         [JSC] Use Fast Malloc as much as possible
1332         https://bugs.webkit.org/show_bug.cgi?id=194316
1333
1334         Reviewed by Mark Lam.
1335
1336         We should use Fast Malloc as much as possible to offer the whole memory view to bmalloc.
1337
1338         * inspector/scripts/codegen/cpp_generator_templates.py:
1339         * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
1340         * inspector/scripts/tests/generic/expected/enum-values.json-result:
1341         * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
1342         * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
1343         * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
1344         * jit/ExecutableAllocator.h:
1345         * jsc.cpp:
1346         * runtime/JSRunLoopTimer.h:
1347         * tools/VMInspector.h:
1348         * wasm/WasmThunks.h:
1349
1350 2019-02-20  Yusuke Suzuki  <ysuzuki@apple.com>
1351
1352         [JSC] Remove WatchpointSet creation for SymbolTable entries if VM::canUseJIT() returns false
1353         https://bugs.webkit.org/show_bug.cgi?id=194891
1354
1355         Reviewed by Geoffrey Garen.
1356
1357         WatchpointSet in SymbolTable is used to fold the value into a constant in JIT tiers. And it is
1358         not useful under the non-JIT mode. This patch avoids creation of WatchpointSet in SymbolTable
1359         if VM::canUseJIT() returns false.
1360
1361         * llint/LowLevelInterpreter32_64.asm:
1362         * llint/LowLevelInterpreter64.asm:
1363         * runtime/SymbolTable.cpp:
1364         (JSC::SymbolTableEntry::addWatchpoint): Deleted.
1365         * runtime/SymbolTable.h:
1366         (JSC::SymbolTableEntry::isWatchable const):
1367         (JSC::SymbolTableEntry::watchpointSet):
1368
1369 2019-02-20  Mark Lam  <mark.lam@apple.com>
1370
1371         Add code to validate expected GC activity modelled by doesGC() against what the runtime encounters.
1372         https://bugs.webkit.org/show_bug.cgi?id=193938
1373         <rdar://problem/47616277>
1374
1375         Reviewed by Michael Saboff, Saam Barati, and Robin Morisset.
1376
1377         In DFG::SpeculativeJIT::compile() and FTL::LowerDFGToB3::compileNode(), before
1378         emitting code / B3IR for each DFG node, we emit a write to set Heap::m_expectDoesGC
1379         to the value returned by doesGC() for that node.  In the runtime (i.e. in allocateCell()
1380         and functions that can resolve a rope), we assert that Heap::m_expectDoesGC is
1381         true.
1382
1383         This validation code is currently only enabled for debug builds.  It is disabled
1384         for release builds by default, but it can easily be made to run on release builds
1385         as well by forcing ENABLE_DFG_DOES_GC_VALIDATION to 1 in Heap.h.
1386
1387         To allow this validation code to run on release builds as well, the validation uses
1388         RELEASE_ASSERT instead of ASSERT.
1389
1390         To ensure that Heap.h is #include'd for all files that needs to do this validation
1391         (so that the validation code is accidentally disabled), we guard the validation
1392         code with an if conditional on constexpr bool validateDFGDoesGC (instead of using
1393         a #if ENABLE(DFG_DOES_GC_VALIDATION)).  This way, if Heap.h isn't #include'd, the
1394         validation code will fail to build (no silent failures).
1395
1396         Currently, all JSC tests and Layout tests should pass with this validation enabled
1397         in debug builds.  We'll only see new failures if there's a regression or if new
1398         tests reveal a previously untested code path that has an undetected issue.
1399
1400         * dfg/DFGOSRExit.cpp:
1401         (JSC::DFG::OSRExit::executeOSRExit):
1402         (JSC::DFG::OSRExit::compileExit):
1403         * dfg/DFGSpeculativeJIT64.cpp:
1404         (JSC::DFG::SpeculativeJIT::compile):
1405         * ftl/FTLLowerDFGToB3.cpp:
1406         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
1407         * ftl/FTLOSRExitCompiler.cpp:
1408         (JSC::FTL::compileStub):
1409         * heap/Heap.h:
1410         (JSC::Heap::expectDoesGC const):
1411         (JSC::Heap::setExpectDoesGC):
1412         (JSC::Heap::addressOfExpectDoesGC):
1413         * jit/JITArithmetic.cpp:
1414         (JSC::JIT::emit_compareAndJump):
1415         * runtime/JSCellInlines.h:
1416         (JSC::tryAllocateCellHelper):
1417         * runtime/JSString.h:
1418         (JSC::jsSingleCharacterString):
1419         (JSC::JSString::toAtomicString const):
1420         (JSC::JSString::toExistingAtomicString const):
1421         (JSC::JSString::value const):
1422         (JSC::JSString::tryGetValue const):
1423         (JSC::JSRopeString::unsafeView const):
1424         (JSC::JSRopeString::viewWithUnderlyingString const):
1425         (JSC::JSString::unsafeView const):
1426
1427 2019-02-20  Andy Estes  <aestes@apple.com>
1428
1429         [Xcode] Add SDKVariant.xcconfig to various Xcode projects
1430         https://bugs.webkit.org/show_bug.cgi?id=194869
1431
1432         Rubber-stamped by Jer Noble.
1433
1434         * JavaScriptCore.xcodeproj/project.pbxproj:
1435
1436 2019-02-19  Joseph Pecoraro  <pecoraro@apple.com>
1437
1438         Web Inspector: Improve ES6 Class instances in Heap Snapshot instances view
1439         https://bugs.webkit.org/show_bug.cgi?id=172848
1440         <rdar://problem/25709212>
1441
1442         Reviewed by Mark Lam.
1443
1444         * heap/HeapSnapshotBuilder.h:
1445         * heap/HeapSnapshotBuilder.cpp:
1446         Update the snapshot version. Change the node's 0 | 1 internal value
1447         to be a 32bit bit flag. This is nice in that it is both compatible
1448         with the previous snapshot version and the same size. We can use more
1449         flags in the future.
1450
1451         (JSC::HeapSnapshotBuilder::json):
1452         In cases where the classInfo gives us "Object" check for a better
1453         class name by checking (o).__proto__.constructor.name. We avoid this
1454         check in cases where (o).hasOwnProperty("constructor") which is the
1455         case for most Foo.prototype objects. Otherwise this would get the
1456         name of the Foo superclass for the Foo.prototype object.
1457
1458         * runtime/JSObject.cpp:
1459         (JSC::JSObject::calculatedClassName):
1460         Handle some possible edge cases that were not handled before, such as
1461         a JSObject without a GlobalObject or an object which doesn't
1462         have a default getPrototype. Try to make the code a little clearer.
1463
1464 2019-02-19  Truitt Savell  <tsavell@apple.com>
1465
1466         Unreviewed, rolling out r241784.
1467
1468         Broke all OpenSource builds.
1469
1470         Reverted changeset:
1471
1472         "Web Inspector: Improve ES6 Class instances in Heap Snapshot
1473         instances view"
1474         https://bugs.webkit.org/show_bug.cgi?id=172848
1475         https://trac.webkit.org/changeset/241784
1476
1477 2019-02-19  Joseph Pecoraro  <pecoraro@apple.com>
1478
1479         Web Inspector: Improve ES6 Class instances in Heap Snapshot instances view
1480         https://bugs.webkit.org/show_bug.cgi?id=172848
1481         <rdar://problem/25709212>
1482
1483         Reviewed by Mark Lam.
1484
1485         * heap/HeapSnapshotBuilder.h:
1486         * heap/HeapSnapshotBuilder.cpp:
1487         Update the snapshot version. Change the node's 0 | 1 internal value
1488         to be a 32bit bit flag. This is nice in that it is both compatible
1489         with the previous snapshot version and the same size. We can use more
1490         flags in the future.
1491
1492         (JSC::HeapSnapshotBuilder::json):
1493         In cases where the classInfo gives us "Object" check for a better
1494         class name by checking (o).__proto__.constructor.name. We avoid this
1495         check in cases where (o).hasOwnProperty("constructor") which is the
1496         case for most Foo.prototype objects. Otherwise this would get the
1497         name of the Foo superclass for the Foo.prototype object.
1498
1499         * runtime/JSObject.cpp:
1500         (JSC::JSObject::calculatedClassName):
1501         Handle some possible edge cases that were not handled before, such as
1502         a JSObject without a GlobalObject or an object which doesn't
1503         have a default getPrototype. Try to make the code a little clearer.
1504
1505 2019-02-19  Robin Morisset  <rmorisset@apple.com>
1506
1507         B3-O2 incorrectly optimizes this subtest
1508         https://bugs.webkit.org/show_bug.cgi?id=194625
1509
1510         Reviewed by Saam Barati.
1511
1512         Trivial fix. Instead of doing
1513             if (!cond) foo else bar => if (cond) bar else foo
1514         B3LowerToAir was doing
1515             if (x^C) foo else bar => if (cond) bar else foo whenever C&1, even if C was for example 3.
1516
1517         * b3/B3LowerToAir.cpp:
1518         * b3/testb3.cpp:
1519         (JSC::B3::testBitNotOnBooleanAndBranch32):
1520         (JSC::B3::testNotOnBooleanAndBranch32): Added.
1521
1522 2019-02-19  Robin Morisset  <rmorisset@apple.com>
1523
1524         CachedCall should not consider it UNLIKELY that it will not stack overflow
1525         https://bugs.webkit.org/show_bug.cgi?id=194831
1526
1527         Reviewed by Mark Lam.
1528
1529         * interpreter/CachedCall.h:
1530         (JSC::CachedCall::CachedCall):
1531
1532 2019-02-19  Mark Lam  <mark.lam@apple.com>
1533
1534         Fix DFG doesGC() for TryGetById and ProfileType nodes.
1535         https://bugs.webkit.org/show_bug.cgi?id=194821
1536         <rdar://problem/48206690>
1537
1538         Reviewed by Saam Barati.
1539
1540         Fix doesGC() for the following nodes:
1541
1542             ProfileType:
1543                 calls operationProcessTypeProfilerLogDFG(), which can calculatedClassName(),
1544                 which can call JSString::tryGetValue(), which can resolve a rope.
1545
1546             TryGetById:
1547                 calls operationTryGetByIdOptimize(), which can startWatchingPropertyForReplacements()
1548                 on a structure, which can allocate StructureRareData.
1549
1550         * dfg/DFGDoesGC.cpp:
1551         (JSC::DFG::doesGC):
1552
1553 2019-02-18  Yusuke Suzuki  <ysuzuki@apple.com>
1554
1555         [JSC] Introduce JSNonDestructibleProxy for JavaScriptCore.framework's GlobalThis
1556         https://bugs.webkit.org/show_bug.cgi?id=194799
1557
1558         Reviewed by Saam Barati.
1559
1560         JSProxy is destructible one because we have JSWindowProxy which has ref counted object.
1561         However, JavaScriptCore.framework's JSProxy for GlobalThis does not need to be destructible.
1562         This is important since we need to separate Heap subspaces between destructible and non-destructible objects.
1563         If we can put more and more objects in non-destructible status, we can get rid of low-usage MarkedBlock.
1564         This patch adds JSNonDestructibleProxy, which is not destructible JSProxy. While it inherits JSDestructibleObject,
1565         we can make the subclass still non-destructible thanks to Subspace mechanism. This drops one more low-usage MarkedBlock.
1566
1567         * CMakeLists.txt:
1568         * JavaScriptCore.xcodeproj/project.pbxproj:
1569         * Sources.txt:
1570         * runtime/JSGlobalObject.cpp:
1571         (JSC::JSGlobalObject::resetPrototype):
1572         (JSC::JSGlobalObject::finishCreation):
1573         * runtime/JSNonDestructibleProxy.cpp: Added.
1574         * runtime/JSNonDestructibleProxy.h: Added.
1575         (JSC::JSNonDestructibleProxy::subspaceFor):
1576         (JSC::JSNonDestructibleProxy::create):
1577         (JSC::JSNonDestructibleProxy::createStructure):
1578         (JSC::JSNonDestructibleProxy::JSNonDestructibleProxy):
1579         * runtime/JSProxy.h:
1580         (JSC::JSProxy::JSProxy):
1581
1582 2019-02-19  Robin Morisset  <rmorisset@apple.com>
1583
1584         B3ReduceStrength::simplifyCFG() could do a lot more on each iteration
1585         https://bugs.webkit.org/show_bug.cgi?id=194475
1586
1587         Reviewed by Saam Barati.
1588
1589         B3ReduceStrength::simplifyCFG() does three optimizations (which I will call A, B and C):
1590         - A makes any terminal that points to a block that is empty except for a jump point to that jump's target instead.
1591         - B transforms any branch or switch that points to a single block into a jump
1592         - C finds blocks ending with jumps, whose successor has a single predecessor, and inline that successor block in place of the jump
1593
1594         It currently is limited in the following way:
1595         - A and C can only fire once per block per iteration
1596         - B can create jumps that would trigger A, but they may not be seen until the next iteration
1597
1598         Both problems are mitigated by going through the blocks in post-order, so that when a block is optimized most of its successors have already been optimized.
1599         In a sense it is the symmetric of the peephole optimizer that goes in pre-order so that when an instruction is optimized most of its children have already been optimized.
1600
1601         On JetStream2 it reduces the average number of iterations from 3.35 to 3.24.
1602
1603         * b3/B3ReduceStrength.cpp:
1604
1605 2019-02-19  Tadeu Zagallo  <tzagallo@apple.com>
1606
1607         Move bytecode cache-related filesystem code out of CodeCache
1608         https://bugs.webkit.org/show_bug.cgi?id=194675
1609
1610         Reviewed by Saam Barati.
1611
1612         The code is only used for the bytecode-cache tests, so it should live in
1613         jsc.cpp rather than in the CodeCache. The logic now lives in ShellSourceProvider,
1614         which overrides the a virtual method in SourceProvider, `cacheBytecode`,
1615         in order to write the cache to disk.
1616
1617         * jsc.cpp:
1618         (ShellSourceProvider::create):
1619         (ShellSourceProvider::~ShellSourceProvider):
1620         (ShellSourceProvider::cachePath const):
1621         (ShellSourceProvider::loadBytecode):
1622         (ShellSourceProvider::ShellSourceProvider):
1623         (jscSource):
1624         (GlobalObject::moduleLoaderFetch):
1625         (functionDollarEvalScript):
1626         (runWithOptions):
1627         * parser/SourceProvider.h:
1628         (JSC::SourceProvider::cacheBytecode const):
1629         * runtime/CodeCache.cpp:
1630         (JSC::writeCodeBlock):
1631         * runtime/CodeCache.h:
1632         (JSC::CodeCacheMap::fetchFromDiskImpl):
1633
1634 2019-02-18  Dominik Infuehr  <dinfuehr@igalia.com>
1635
1636         [ARM] Fix crash with sampling profiler
1637         https://bugs.webkit.org/show_bug.cgi?id=194772
1638
1639         Reviewed by Mark Lam.
1640
1641         sampling-profiler-richards.js was crashing with an enabled sampling profiler. add32
1642         did not update the stack pointer in a single instruction. The src register was first
1643         moved into the stack pointer, the immediate imm was added in a subsequent instruction.
1644
1645         This was problematic when a signal handler was invoked before applying the immediate,
1646         when the stack pointer is still set to the temporary value. Avoid this by calculating src+imm in
1647         a temporary register and then move it in one go into the stack pointer.
1648
1649         * assembler/MacroAssemblerARMv7.h:
1650         (JSC::MacroAssemblerARMv7::add32):
1651
1652 2019-02-18  Mark Lam  <mark.lam@apple.com>
1653
1654         Fix DFG doesGC() for CompareEq/Less/LessEq/Greater/GreaterEq and CompareStrictEq nodes.
1655         https://bugs.webkit.org/show_bug.cgi?id=194800
1656         <rdar://problem/48183773>
1657
1658         Reviewed by Yusuke Suzuki.
1659
1660         Fix doesGC() for the following nodes:
1661
1662             CompareEq:
1663             CompareLess:
1664             CompareLessEq:
1665             CompareGreater:
1666             CompareGreaterEq:
1667             CompareStrictEq:
1668                 Only return false (i.e. does not GC) for child node use kinds that have
1669                 been vetted to not do anything that can GC.  For all other use kinds
1670                 (including StringUse and BigIntUse), we return true (i.e. does GC).
1671
1672         * dfg/DFGDoesGC.cpp:
1673         (JSC::DFG::doesGC):
1674
1675 2019-02-16  Darin Adler  <darin@apple.com>
1676
1677         Continue reducing use of String::format, now focusing on hex: "%p", "%x", etc.
1678         https://bugs.webkit.org/show_bug.cgi?id=194752
1679
1680         Reviewed by Daniel Bates.
1681
1682         * heap/HeapSnapshotBuilder.cpp:
1683         (JSC::HeapSnapshotBuilder::json): Added back the "0x" that was removed when changing
1684         this file to use appendUnsignedAsHex instead of "%p". The intent at that time was to
1685         keep behavior the same, so let's do that.
1686
1687         * parser/Lexer.cpp:
1688         (JSC::Lexer<T>::invalidCharacterMessage const): Use makeString and hex instead of
1689         String::format and "%04x".
1690
1691 2019-02-18  Yusuke Suzuki  <ysuzuki@apple.com>
1692
1693         [JSC] Add LazyClassStructure::getInitializedOnMainThread
1694         https://bugs.webkit.org/show_bug.cgi?id=194784
1695         <rdar://problem/48154820>
1696
1697         Reviewed by Mark Lam.
1698
1699         LazyClassStructure::get and LazyProperty::get functions do not allow compiler threads to call them. But for booleanPrototype, numberPrototype and symbolPrototype cases,
1700         we would like to call them from compiler threads. We eagerly initialize them if VM::canUseJIT() is true, so that compiler threads can safely call LazyClassStructure::get
1701         and LazyProperty::get for booleanPrototype, numberPrototype and symbolPrototype. But still assertion hits because the assertion requires that these functions need to be
1702         called in non compiler threads. Calling `getConcurrently()` is not possible since symbolPrototype() function is called from both the main thread and compiler threads,
1703         and we would like to lazily initialize SymbolPrototype object if it is called from the main thread, which can happen with non-JIT configuration.
1704
1705         This patch adds `getInitializedOnMainThread()`. Compiler threads can call it only when we know that the value is already initialized on the main thread. The main thread
1706         can call it at anytime and this function lazily initializes the value. This is useful to make some of prototypes lazy with non-JIT configuration: With non-JIT configuration,
1707         this function is always called from the main thread and it initializes the value lazily. Non-JIT configuration does not care about compiler threads since they do not exist.
1708         With JIT configuration, we eagerly initialize them in JSGlobalObject::init so that `getInitializedOnMainThread()` always succeeds.
1709
1710         Basically, `getInitializedOnMainThread()` is `get` with different assertion location: While `get` always crashes if it is called from compiler threads, `getInitializedOnMainThread()`
1711         crashes only when actual initialization happens on compiler threads. We do not merge them since `get` is still useful to find accidental initialization from compiler threads.
1712
1713         * runtime/JSGlobalObject.h:
1714         (JSC::JSGlobalObject::booleanPrototype const):
1715         (JSC::JSGlobalObject::numberPrototype const):
1716         (JSC::JSGlobalObject::symbolPrototype const):
1717         * runtime/LazyClassStructure.h:
1718         (JSC::LazyClassStructure::getInitializedOnMainThread const):
1719         (JSC::LazyClassStructure::prototypeInitializedOnMainThread const):
1720         (JSC::LazyClassStructure::constructorInitializedOnMainThread const):
1721         * runtime/LazyProperty.h:
1722         (JSC::LazyProperty::get const):
1723         (JSC::LazyProperty::getInitializedOnMainThread const):
1724
1725 2019-02-18  Joseph Pecoraro  <pecoraro@apple.com>
1726
1727         Web Inspector: Better categorize CPU usage per-thread / worker
1728         https://bugs.webkit.org/show_bug.cgi?id=194564
1729
1730         Reviewed by Devin Rousso.
1731
1732         * inspector/protocol/CPUProfiler.json:
1733         Add additional properties per-Event, and new per-Thread object info.
1734
1735 2019-02-18  Tadeu Zagallo  <tzagallo@apple.com>
1736
1737         Bytecode cache should a have a boot-specific validation
1738         https://bugs.webkit.org/show_bug.cgi?id=194769
1739         <rdar://problem/48149509>
1740
1741         Reviewed by Keith Miller.
1742
1743         Add the boot UUID to the cached bytecode to enforce that it is not reused
1744         across reboots.
1745
1746         * runtime/CachedTypes.cpp:
1747         (JSC::Encoder::malloc):
1748         (JSC::GenericCacheEntry::GenericCacheEntry):
1749         (JSC::GenericCacheEntry::tag const):
1750         (JSC::CacheEntry::CacheEntry):
1751         (JSC::CacheEntry::decode const):
1752         (JSC::GenericCacheEntry::decode const):
1753         (JSC::encodeCodeBlock):
1754
1755 2019-02-18  Eric Carlson  <eric.carlson@apple.com>
1756
1757         Add MSE logging configuration
1758         https://bugs.webkit.org/show_bug.cgi?id=194719
1759         <rdar://problem/48122151>
1760
1761         Reviewed by Joseph Pecoraro.
1762
1763         * inspector/ConsoleMessage.cpp:
1764         (Inspector::messageSourceValue):
1765         * inspector/protocol/Console.json:
1766         * inspector/scripts/codegen/generator.py:
1767         * runtime/ConsoleTypes.h:
1768
1769 2019-02-18  Tadeu Zagallo  <tzagallo@apple.com>
1770
1771         Add version number to cached bytecode
1772         https://bugs.webkit.org/show_bug.cgi?id=194768
1773         <rdar://problem/48147968>
1774
1775         Reviewed by Saam Barati.
1776
1777         Add a version number to the bytecode cache that should be unique per build.
1778
1779         * CMakeLists.txt:
1780         * DerivedSources-output.xcfilelist:
1781         * DerivedSources.make:
1782         * runtime/CachedTypes.cpp:
1783         (JSC::Encoder::malloc):
1784         (JSC::GenericCacheEntry::GenericCacheEntry):
1785         (JSC::CacheEntry::CacheEntry):
1786         (JSC::CacheEntry::encode):
1787         (JSC::CacheEntry::decode const):
1788         (JSC::GenericCacheEntry::decode const):
1789         (JSC::decodeCodeBlockImpl):
1790         * runtime/CodeCache.h:
1791         (JSC::CodeCacheMap::fetchFromDiskImpl):
1792
1793 2019-02-17  Saam Barati  <sbarati@apple.com>
1794
1795         WasmB3IRGenerator models some effects incorrectly
1796         https://bugs.webkit.org/show_bug.cgi?id=194038
1797
1798         Reviewed by Keith Miller.
1799
1800         * wasm/WasmB3IRGenerator.cpp:
1801         (JSC::Wasm::B3IRGenerator::restoreWasmContextInstance):
1802         (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState):
1803         These two functions were using global state instead of the
1804         arguments passed into the function.
1805
1806         (JSC::Wasm::B3IRGenerator::addOp<F64ConvertUI64>):
1807         (JSC::Wasm::B3IRGenerator::addOp<OpType::F32ConvertUI64>):
1808         (JSC::Wasm::B3IRGenerator::addOp<OpType::I64TruncUF64>):
1809         (JSC::Wasm::B3IRGenerator::addOp<OpType::I64TruncUF32>):
1810         Any patchpoint that allows scratch register usage must
1811         also say that it clobbers the scratch registers.
1812
1813 2019-02-17  Saam Barati  <sbarati@apple.com>
1814
1815         Deadlock when adding a Structure property transition and then doing incremental marking
1816         https://bugs.webkit.org/show_bug.cgi?id=194767
1817
1818         Reviewed by Mark Lam.
1819
1820         This can happen in the following scenario:
1821         
1822         You have a Structure S. S is on the mark stack. Then:
1823         1. S grabs its lock
1824         2. S adds a new property transition
1825         3. We find out we need to do some incremental marking
1826         4. We mark S
1827         5. visitChildren on S will try to grab its lock
1828         6. We are now in a deadlock
1829
1830         * heap/Heap.cpp:
1831         (JSC::Heap::performIncrement):
1832         * runtime/Structure.cpp:
1833         (JSC::Structure::addNewPropertyTransition):
1834
1835 2019-02-17  David Kilzer  <ddkilzer@apple.com>
1836
1837         Unreviewed, rolling out r241620.
1838
1839         "Causes use-after-free crashes running layout tests with ASan and GuardMalloc."
1840         (Requested by ddkilzer on #webkit.)
1841
1842         Reverted changeset:
1843
1844         "[WTF] Add environment variable helpers"
1845         https://bugs.webkit.org/show_bug.cgi?id=192405
1846         https://trac.webkit.org/changeset/241620
1847
1848 2019-02-17  Commit Queue  <commit-queue@webkit.org>
1849
1850         Unreviewed, rolling out r241612.
1851         https://bugs.webkit.org/show_bug.cgi?id=194762
1852
1853         "It regressed JetStream2 parsing tests by ~40%" (Requested by
1854         saamyjoon on #webkit).
1855
1856         Reverted changeset:
1857
1858         "Move bytecode cache-related filesystem code out of CodeCache"
1859         https://bugs.webkit.org/show_bug.cgi?id=194675
1860         https://trac.webkit.org/changeset/241612
1861
1862 2019-02-16  Yusuke Suzuki  <ysuzuki@apple.com>
1863
1864         [JSC] JSWrapperObject should not be destructible
1865         https://bugs.webkit.org/show_bug.cgi?id=194743
1866
1867         Reviewed by Saam Barati.
1868
1869         JSWrapperObject should be just a wrapper object for JSValue, thus, it should not be a JSDestructibleObject.
1870         Currently it is destructible object because DateInstance uses it. This patch changes Base of DateInstance from
1871         JSWrapperObject to JSDestructibleObject, and makes JSWrapperObject non-destructible.
1872
1873         * runtime/BigIntObject.cpp:
1874         (JSC::BigIntObject::BigIntObject):
1875         * runtime/BooleanConstructor.cpp:
1876         (JSC::BooleanConstructor::finishCreation):
1877         * runtime/BooleanObject.cpp:
1878         (JSC::BooleanObject::BooleanObject):
1879         * runtime/BooleanObject.h:
1880         * runtime/DateInstance.cpp:
1881         (JSC::DateInstance::DateInstance):
1882         (JSC::DateInstance::finishCreation):
1883         * runtime/DateInstance.h:
1884         * runtime/DatePrototype.cpp:
1885         (JSC::dateProtoFuncGetTime):
1886         (JSC::dateProtoFuncSetTime):
1887         (JSC::setNewValueFromTimeArgs):
1888         (JSC::setNewValueFromDateArgs):
1889         (JSC::dateProtoFuncSetYear):
1890         * runtime/JSCPoison.h:
1891         * runtime/JSWrapperObject.h:
1892         (JSC::JSWrapperObject::JSWrapperObject):
1893         * runtime/NumberObject.cpp:
1894         (JSC::NumberObject::NumberObject):
1895         * runtime/NumberObject.h:
1896         * runtime/StringConstructor.cpp:
1897         (JSC::StringConstructor::finishCreation):
1898         * runtime/StringObject.cpp:
1899         (JSC::StringObject::StringObject):
1900         * runtime/StringObject.h:
1901         (JSC::StringObject::internalValue const):
1902         * runtime/SymbolObject.cpp:
1903         (JSC::SymbolObject::SymbolObject):
1904         * runtime/SymbolObject.h:
1905
1906 2019-02-16  Yusuke Suzuki  <ysuzuki@apple.com>
1907
1908         [JSC] Shrink UnlinkedFunctionExecutable
1909         https://bugs.webkit.org/show_bug.cgi?id=194733
1910
1911         Reviewed by Mark Lam.
1912
1913         UnlinkedFunctionExecutable has sourceURLDirective and sourceMappingURLDirective. These
1914         directives can be found in the comment of non typical function's source code (Program,
1915         Eval code, and Global function from function constructor etc.), and tricky thing is that
1916         SourceProvider's directives are updated by Parser. The reason why we have these fields in
1917         UnlinkedFunctionExecutable is that we need to update the SourceProvider's directives even
1918         if we skip parsing by using CodeCache. These fields are effective only if (1)
1919         UnlinkedFunctionExecutable is for non typical function things, and (2) it has sourceURLDirective
1920         or sourceMappingURLDirective. This is rare enough to purge them to a separated
1921         UnlinkedFunctionExecutable::RareData to make UnlinkedFunctionExecutable small.
1922         sizeof(UnlinkedFunctionExecutable) is very important since it is super frequently allocated
1923         cell. Furthermore, the current JSC allocates two MarkedBlocks for UnlinkedFunctionExecutable
1924         in JSGlobalObject initialization, but the usage of the second MarkedBlock is quite low (8%).
1925         If we can reduce the size of UnlinkedFunctionExecutable, we can make them one MarkedBlock.
1926         Since UnlinkedFunctionExecutable is allocated from IsoSubspace, we do not need to fit it to
1927         one of size class.
1928
1929         This patch adds RareData to UnlinkedFunctionExecutable and move some rare datas into RareData.
1930         And kill one MarkedBlock allocation in JSC initialization phase.
1931
1932         * bytecode/UnlinkedFunctionExecutable.cpp:
1933         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1934         (JSC::UnlinkedFunctionExecutable::ensureRareDataSlow):
1935         * bytecode/UnlinkedFunctionExecutable.h:
1936         * debugger/DebuggerLocation.cpp:
1937         (JSC::DebuggerLocation::DebuggerLocation):
1938         * inspector/ScriptDebugServer.cpp:
1939         (Inspector::ScriptDebugServer::dispatchDidParseSource):
1940         * parser/Lexer.h:
1941         (JSC::Lexer::sourceURLDirective const):
1942         (JSC::Lexer::sourceMappingURLDirective const):
1943         (JSC::Lexer::sourceURL const): Deleted.
1944         (JSC::Lexer::sourceMappingURL const): Deleted.
1945         * parser/Parser.h:
1946         (JSC::Parser<LexerType>::parse):
1947         * parser/SourceProvider.h:
1948         (JSC::SourceProvider::sourceURLDirective const):
1949         (JSC::SourceProvider::sourceMappingURLDirective const):
1950         (JSC::SourceProvider::setSourceURLDirective):
1951         (JSC::SourceProvider::setSourceMappingURLDirective):
1952         (JSC::SourceProvider::sourceURL const): Deleted. We rename it from sourceURL to sourceURLDirective
1953         since it is the correct name.
1954         (JSC::SourceProvider::sourceMappingURL const): Deleted. We rename it from sourceMappingURL to
1955         sourceMappingURLDirective since it is the correct name.
1956         * runtime/CachedTypes.cpp:
1957         (JSC::CachedSourceProviderShape::encode):
1958         (JSC::CachedFunctionExecutableRareData::encode):
1959         (JSC::CachedFunctionExecutableRareData::decode const): CachedFunctionExecutable did not have
1960         sourceMappingURL to sourceMappingURLDirective. So this patch keeps the same logic.
1961         (JSC::CachedFunctionExecutable::rareData const):
1962         (JSC::CachedFunctionExecutable::encode):
1963         (JSC::CachedFunctionExecutable::decode const):
1964         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1965         * runtime/CodeCache.cpp:
1966         (JSC::CodeCache::getUnlinkedGlobalCodeBlock):
1967         (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
1968         * runtime/CodeCache.h:
1969         (JSC::generateUnlinkedCodeBlockImpl):
1970         * runtime/FunctionExecutable.h:
1971         * runtime/SamplingProfiler.cpp:
1972         (JSC::SamplingProfiler::StackFrame::url):
1973
1974 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
1975
1976         [JSC] Remove unused global private variables
1977         https://bugs.webkit.org/show_bug.cgi?id=194741
1978
1979         Reviewed by Joseph Pecoraro.
1980
1981         There are some private functions and constants that are no longer referenced from builtin JS code.
1982         This patch cleans up them.
1983
1984         * builtins/BuiltinNames.h:
1985         * builtins/ObjectConstructor.js:
1986         (entries):
1987         * runtime/JSGlobalObject.cpp:
1988         (JSC::JSGlobalObject::init):
1989
1990 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
1991
1992         [JSC] Lazily create empty RegExp
1993         https://bugs.webkit.org/show_bug.cgi?id=194735
1994
1995         Reviewed by Keith Miller.
1996
1997         Some scripts do not have any RegExp. In that case, allocating MarkedBlock for RegExp is costly.
1998         Previously, there was always one RegExp, "empty RegExp". This patch lazily creates it and drop
1999         one MarkedBlock.
2000
2001         * runtime/JSGlobalObject.cpp:
2002         (JSC::JSGlobalObject::init):
2003         * runtime/RegExpCache.cpp:
2004         (JSC::RegExpCache::ensureEmptyRegExpSlow):
2005         (JSC::RegExpCache::initialize): Deleted.
2006         * runtime/RegExpCache.h:
2007         (JSC::RegExpCache::ensureEmptyRegExp):
2008         (JSC::RegExpCache::emptyRegExp const): Deleted.
2009         * runtime/RegExpCachedResult.cpp:
2010         (JSC::RegExpCachedResult::lastResult):
2011         * runtime/RegExpCachedResult.h:
2012         * runtime/VM.cpp:
2013         (JSC::VM::VM):
2014
2015 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2016
2017         [JSC] Make builtin objects more lazily initialized under non-JIT mode
2018         https://bugs.webkit.org/show_bug.cgi?id=194727
2019
2020         Reviewed by Saam Barati.
2021
2022         Boolean, Symbol, and Number constructors and prototypes are initialized eagerly, but this is largely
2023         because concurrent compiler can touch NumberPrototype etc. when traversing object's prototypes. This
2024         means that eager initialization is not necessary under non-JIT mode. While we can investigate all the
2025         accesses to these prototypes from the concurrent compiler threads, this "lazily initialize under non-JIT"
2026         is safe and beneficial to non-JIT mode. This patch lazily initializes them under non-JIT mode, and
2027         drop some @Number references to avoid eager initialization. This removes some object allocations and 1
2028         MarkedBlock allocation just for Symbols.
2029
2030         * runtime/JSGlobalObject.cpp:
2031         (JSC::JSGlobalObject::init):
2032         (JSC::JSGlobalObject::visitChildren):
2033         * runtime/JSGlobalObject.h:
2034         (JSC::JSGlobalObject::numberToStringWatchpoint):
2035         (JSC::JSGlobalObject::booleanPrototype const):
2036         (JSC::JSGlobalObject::numberPrototype const):
2037         (JSC::JSGlobalObject::symbolPrototype const):
2038         (JSC::JSGlobalObject::booleanObjectStructure const):
2039         (JSC::JSGlobalObject::symbolObjectStructure const):
2040         (JSC::JSGlobalObject::numberObjectStructure const):
2041         (JSC::JSGlobalObject::stringObjectStructure const):
2042
2043 2019-02-15  Michael Saboff  <msaboff@apple.com>
2044
2045         RELEASE_ASSERT at com.apple.JavaScriptCore: JSC::jsSubstringOfResolved
2046         https://bugs.webkit.org/show_bug.cgi?id=194558
2047
2048         Reviewed by Saam Barati.
2049
2050         Added an in bounds check before the read of the next character for Unicode regular expressions
2051         for pattern generation that didn't already have such checks.
2052
2053         * yarr/YarrJIT.cpp:
2054         (JSC::Yarr::YarrGenerator::generatePatternCharacterOnce):
2055         (JSC::Yarr::YarrGenerator::generatePatternCharacterFixed):
2056         (JSC::Yarr::YarrGenerator::generateCharacterClassOnce):
2057         (JSC::Yarr::YarrGenerator::generateCharacterClassFixed):
2058
2059 2019-02-15  Dean Jackson  <dino@apple.com>
2060
2061         Allow emulation of user gestures from Web Inspector console
2062         https://bugs.webkit.org/show_bug.cgi?id=194725
2063         <rdar://problem/48126604>
2064
2065         Reviewed by Joseph Pecoraro and Devin Rousso.
2066
2067         * inspector/agents/InspectorRuntimeAgent.cpp: Add a new optional parameter, emulateUserGesture,
2068         to the evaluate function, and mark the function as override so that PageRuntimeAgent
2069         can change the behaviour.
2070         (Inspector::InspectorRuntimeAgent::evaluate):
2071         * inspector/agents/InspectorRuntimeAgent.h:
2072         * inspector/protocol/Runtime.json:
2073
2074 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2075
2076         [JSC] Do not initialize Wasm related data if Wasm is not enabled
2077         https://bugs.webkit.org/show_bug.cgi?id=194728
2078
2079         Reviewed by Mark Lam.
2080
2081         Under non-JIT mode, these data structures are unnecessary. Should not allocate extra memory for that.
2082
2083         * runtime/InitializeThreading.cpp:
2084         (JSC::initializeThreading):
2085         * runtime/JSLock.cpp:
2086         (JSC::JSLock::didAcquireLock):
2087
2088 2019-02-15  Ross Kirsling  <ross.kirsling@sony.com>
2089
2090         [WTF] Add environment variable helpers
2091         https://bugs.webkit.org/show_bug.cgi?id=192405
2092
2093         Reviewed by Michael Catanzaro.
2094
2095         * inspector/remote/glib/RemoteInspectorGlib.cpp:
2096         (Inspector::RemoteInspector::RemoteInspector):
2097         (Inspector::RemoteInspector::start):
2098         * jsc.cpp:
2099         (startTimeoutThreadIfNeeded):
2100         * runtime/Options.cpp:
2101         (JSC::overrideOptionWithHeuristic):
2102         (JSC::Options::overrideAliasedOptionWithHeuristic):
2103         (JSC::Options::initialize):
2104         * runtime/VM.cpp:
2105         (JSC::enableAssembler):
2106         (JSC::VM::VM):
2107         * tools/CodeProfiling.cpp:
2108         (JSC::CodeProfiling::notifyAllocator):
2109         Utilize WTF::Environment where possible.
2110
2111 2019-02-15  Mark Lam  <mark.lam@apple.com>
2112
2113         SamplingProfiler::stackTracesAsJSON() should escape strings.
2114         https://bugs.webkit.org/show_bug.cgi?id=194649
2115         <rdar://problem/48072386>
2116
2117         Reviewed by Saam Barati.
2118
2119         Ditto for TypeSet::toJSONString() and TypeSet::toJSONString().
2120
2121         * runtime/SamplingProfiler.cpp:
2122         (JSC::SamplingProfiler::stackTracesAsJSON):
2123         * runtime/TypeSet.cpp:
2124         (JSC::TypeSet::toJSONString const):
2125         (JSC::StructureShape::toJSONString const):
2126
2127 2019-02-15  Robin Morisset  <rmorisset@apple.com>
2128
2129         CodeBlock::jettison should clear related watchpoints
2130         https://bugs.webkit.org/show_bug.cgi?id=194544
2131
2132         Reviewed by Mark Lam.
2133
2134         * bytecode/CodeBlock.cpp:
2135         (JSC::CodeBlock::jettison):
2136         * dfg/DFGCommonData.h:
2137         (JSC::DFG::CommonData::clearWatchpoints): Added.
2138         * dfg/CommonData.cpp:
2139         (JSC::DFG::CommonData::clearWatchpoints): Added.
2140
2141 2019-02-15  Tadeu Zagallo  <tzagallo@apple.com>
2142
2143         Move bytecode cache-related filesystem code out of CodeCache
2144         https://bugs.webkit.org/show_bug.cgi?id=194675
2145
2146         Reviewed by Saam Barati.
2147
2148         That code is only used for the bytecode-cache tests, so it should live in
2149         jsc.cpp rather than in the CodeCache.
2150
2151         * jsc.cpp:
2152         (CliSourceProvider::create):
2153         (CliSourceProvider::~CliSourceProvider):
2154         (CliSourceProvider::cachePath const):
2155         (CliSourceProvider::loadBytecode):
2156         (CliSourceProvider::CliSourceProvider):
2157         (jscSource):
2158         (GlobalObject::moduleLoaderFetch):
2159         (functionDollarEvalScript):
2160         (runWithOptions):
2161         * parser/SourceProvider.h:
2162         (JSC::SourceProvider::cacheBytecode const):
2163         * runtime/CodeCache.cpp:
2164         (JSC::writeCodeBlock):
2165         * runtime/CodeCache.h:
2166         (JSC::CodeCacheMap::fetchFromDiskImpl):
2167
2168 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2169
2170         [JSC] DFG, FTL, and Wasm worklist creation should be fenced
2171         https://bugs.webkit.org/show_bug.cgi?id=194714
2172
2173         Reviewed by Mark Lam.
2174
2175         Let's consider about the following extreme case.
2176
2177         1. VM (A) is created.
2178         2. Another VM (B) is created on a different thread.
2179         3. (A) is being destroyed. It calls DFG::existingWorklistForIndexOrNull in a destructor.
2180         4. At the same time, (B) starts using DFG Worklist and it is instantiated in call_once.
2181         5. But (A) reads the pointer directly through DFG::existingWorklistForIndexOrNull.
2182         6. (A) sees the half-baked worklist, which may be in the middle of creation.
2183
2184         This patch puts store-store fence just before putting a pointer to a global variable.
2185         This fence is executed only three times at most, for DFG, FTL, and Wasm worklist initializations.
2186
2187         * dfg/DFGWorklist.cpp:
2188         (JSC::DFG::ensureGlobalDFGWorklist):
2189         (JSC::DFG::ensureGlobalFTLWorklist):
2190         * wasm/WasmWorklist.cpp:
2191         (JSC::Wasm::ensureWorklist):
2192
2193 2019-02-15  Commit Queue  <commit-queue@webkit.org>
2194
2195         Unreviewed, rolling out r241559 and r241566.
2196         https://bugs.webkit.org/show_bug.cgi?id=194710
2197
2198         Causes layout test crashes under GuardMalloc (Requested by
2199         ryanhaddad on #webkit).
2200
2201         Reverted changesets:
2202
2203         "[WTF] Add environment variable helpers"
2204         https://bugs.webkit.org/show_bug.cgi?id=192405
2205         https://trac.webkit.org/changeset/241559
2206
2207         "Unreviewed build fix for WinCairo Debug after r241559."
2208         https://trac.webkit.org/changeset/241566
2209
2210 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2211
2212         [JSC] Do not even allocate JIT worklists in non-JIT mode
2213         https://bugs.webkit.org/show_bug.cgi?id=194693
2214
2215         Reviewed by Mark Lam.
2216
2217         Heap always allocates JIT worklists for Baseline, DFG, and FTL. While they do not have actual threads, Worklist itself already allocates some memory.
2218         And we do not perform any GC operations that are only meaningful in JIT environment.
2219
2220         1. We add VM::canUseJIT() check in Heap's ensureXXXWorklist things to prevent them from being allocated.
2221         2. We remove DFG marking constraint in non-JIT mode.
2222         3. We do not gather conservative roots from scratch buffers under the non-JIT mode (BTW, # of scratch buffers are always zero in non-JIT mode)
2223         4. We do not visit JITStubRoutineSet.
2224         5. Align JITWorklist function names to the other worklists.
2225
2226         * dfg/DFGOSRExitPreparation.cpp:
2227         (JSC::DFG::prepareCodeOriginForOSRExit):
2228         * dfg/DFGPlan.h:
2229         * dfg/DFGWorklist.cpp:
2230         (JSC::DFG::markCodeBlocks): Deleted.
2231         * dfg/DFGWorklist.h:
2232         * heap/Heap.cpp:
2233         (JSC::Heap::completeAllJITPlans):
2234         (JSC::Heap::iterateExecutingAndCompilingCodeBlocks):
2235         (JSC::Heap::gatherScratchBufferRoots):
2236         (JSC::Heap::removeDeadCompilerWorklistEntries):
2237         (JSC::Heap::stopThePeriphery):
2238         (JSC::Heap::suspendCompilerThreads):
2239         (JSC::Heap::resumeCompilerThreads):
2240         (JSC::Heap::addCoreConstraints):
2241         * jit/JITWorklist.cpp:
2242         (JSC::JITWorklist::existingGlobalWorklistOrNull):
2243         (JSC::JITWorklist::ensureGlobalWorklist):
2244         (JSC::JITWorklist::instance): Deleted.
2245         * jit/JITWorklist.h:
2246         * llint/LLIntSlowPaths.cpp:
2247         (JSC::LLInt::jitCompileAndSetHeuristics):
2248         * runtime/VM.cpp:
2249         (JSC::VM::~VM):
2250         (JSC::VM::gatherScratchBufferRoots):
2251         (JSC::VM::gatherConservativeRoots): Deleted.
2252         * runtime/VM.h:
2253
2254 2019-02-15  Saam barati  <sbarati@apple.com>
2255
2256         [WebAssembly] Write a new register allocator for Air O0 and make BBQ use it
2257         https://bugs.webkit.org/show_bug.cgi?id=194036
2258
2259         Reviewed by Yusuke Suzuki.
2260
2261         This patch adds a new Air-O0 backend. Air-O0 runs fewer passes and doesn't
2262         use linear scan for register allocation. Instead of linear scan, Air-O0 does
2263         mostly block-local register allocation, and it does this as it's emitting
2264         code directly. The register allocator uses liveness analysis to reduce
2265         the number of spills. Doing register allocation as we're emitting code
2266         allows us to skip editing the IR to insert spills, which saves a non trivial
2267         amount of compile time. For stack allocation, we give each Tmp its own slot.
2268         This is less than ideal. We probably want to do some trivial live range analysis
2269         in the future. The reason this isn't a deal breaker for Wasm is that this patch
2270         makes it so that we reuse Tmps as we're generating Air IR in the AirIRGenerator.
2271         Because Wasm is a stack machine, we trivially know when we kill a stack value (its last use).
2272         
2273         This patch is another 25% Wasm startup time speedup. It seems to be worth
2274         another 1% on JetStream2.
2275
2276         * JavaScriptCore.xcodeproj/project.pbxproj:
2277         * Sources.txt:
2278         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp: Added.
2279         (JSC::B3::Air::GenerateAndAllocateRegisters::GenerateAndAllocateRegisters):
2280         (JSC::B3::Air::GenerateAndAllocateRegisters::buildLiveRanges):
2281         (JSC::B3::Air::GenerateAndAllocateRegisters::insertBlocksForFlushAfterTerminalPatchpoints):
2282         (JSC::B3::Air::callFrameAddr):
2283         (JSC::B3::Air::GenerateAndAllocateRegisters::flush):
2284         (JSC::B3::Air::GenerateAndAllocateRegisters::spill):
2285         (JSC::B3::Air::GenerateAndAllocateRegisters::alloc):
2286         (JSC::B3::Air::GenerateAndAllocateRegisters::freeDeadTmpsIfNeeded):
2287         (JSC::B3::Air::GenerateAndAllocateRegisters::assignTmp):
2288         (JSC::B3::Air::GenerateAndAllocateRegisters::isDisallowedRegister):
2289         (JSC::B3::Air::GenerateAndAllocateRegisters::prepareForGeneration):
2290         (JSC::B3::Air::GenerateAndAllocateRegisters::generate):
2291         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.h: Added.
2292         * b3/air/AirCode.cpp:
2293         * b3/air/AirCode.h:
2294         * b3/air/AirGenerate.cpp:
2295         (JSC::B3::Air::prepareForGeneration):
2296         (JSC::B3::Air::generateWithAlreadyAllocatedRegisters):
2297         (JSC::B3::Air::generate):
2298         * b3/air/AirHandleCalleeSaves.cpp:
2299         (JSC::B3::Air::handleCalleeSaves):
2300         * b3/air/AirHandleCalleeSaves.h:
2301         * b3/air/AirTmpMap.h:
2302         * runtime/Options.h:
2303         * wasm/WasmAirIRGenerator.cpp:
2304         (JSC::Wasm::AirIRGenerator::didKill):
2305         (JSC::Wasm::AirIRGenerator::newTmp):
2306         (JSC::Wasm::AirIRGenerator::AirIRGenerator):
2307         (JSC::Wasm::parseAndCompileAir):
2308         (JSC::Wasm::AirIRGenerator::addOp<OpType::I64TruncUF64>):
2309         (JSC::Wasm::AirIRGenerator::addOp<OpType::I64TruncUF32>):
2310         * wasm/WasmAirIRGenerator.h:
2311         * wasm/WasmB3IRGenerator.cpp:
2312         (JSC::Wasm::B3IRGenerator::didKill):
2313         * wasm/WasmBBQPlan.cpp:
2314         (JSC::Wasm::BBQPlan::compileFunctions):
2315         * wasm/WasmFunctionParser.h:
2316         (JSC::Wasm::FunctionParser<Context>::parseBody):
2317         (JSC::Wasm::FunctionParser<Context>::parseExpression):
2318         * wasm/WasmValidate.cpp:
2319         (JSC::Wasm::Validate::didKill):
2320
2321 2019-02-14  Saam barati  <sbarati@apple.com>
2322
2323         lowerStackArgs should lower Lea32/64 on ARM64 to Add
2324         https://bugs.webkit.org/show_bug.cgi?id=194656
2325
2326         Reviewed by Yusuke Suzuki.
2327
2328         On arm64, Lea is just implemented as an add. However, Air treats it as an
2329         address with a given width. Because of this width, we were incorrectly
2330         computing whether or not this immediate could fit into the instruction itself
2331         or it needed to be explicitly put into a register. This patch makes
2332         AirLowerStackArgs lower Lea to Add on arm64.
2333
2334         * b3/air/AirLowerStackArgs.cpp:
2335         (JSC::B3::Air::lowerStackArgs):
2336         * b3/air/AirOpcode.opcodes:
2337         * b3/air/testair.cpp:
2338
2339 2019-02-14  Saam Barati  <sbarati@apple.com>
2340
2341         Cache the results of BytecodeGenerator::getVariablesUnderTDZ
2342         https://bugs.webkit.org/show_bug.cgi?id=194583
2343         <rdar://problem/48028140>
2344
2345         Reviewed by Yusuke Suzuki.
2346
2347         This patch makes it so that getVariablesUnderTDZ caches a result of
2348         CompactVariableMap::Handle. getVariablesUnderTDZ is costly when
2349         it's called in an environment where there are a lot of variables.
2350         This patch makes it so we cache its results. This is profitable when
2351         getVariablesUnderTDZ is called repeatedly with the same environment
2352         state. This is common since we call this every time we encounter a
2353         function definition/expression node.
2354
2355         * builtins/BuiltinExecutables.cpp:
2356         (JSC::BuiltinExecutables::createExecutable):
2357         * bytecode/UnlinkedFunctionExecutable.cpp:
2358         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2359         * bytecode/UnlinkedFunctionExecutable.h:
2360         * bytecompiler/BytecodeGenerator.cpp:
2361         (JSC::BytecodeGenerator::popLexicalScopeInternal):
2362         (JSC::BytecodeGenerator::liftTDZCheckIfPossible):
2363         (JSC::BytecodeGenerator::pushTDZVariables):
2364         (JSC::BytecodeGenerator::getVariablesUnderTDZ):
2365         (JSC::BytecodeGenerator::restoreTDZStack):
2366         * bytecompiler/BytecodeGenerator.h:
2367         (JSC::BytecodeGenerator::makeFunction):
2368         * parser/VariableEnvironment.cpp:
2369         (JSC::CompactVariableMap::Handle::Handle):
2370         (JSC::CompactVariableMap::Handle::operator=):
2371         * parser/VariableEnvironment.h:
2372         (JSC::CompactVariableMap::Handle::operator bool const):
2373         * runtime/CodeCache.cpp:
2374         (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
2375
2376 2019-02-14  Yusuke Suzuki  <ysuzuki@apple.com>
2377
2378         [JSC] Non-JIT entrypoints should share NativeJITCode per entrypoint type
2379         https://bugs.webkit.org/show_bug.cgi?id=194659
2380
2381         Reviewed by Mark Lam.
2382
2383         Non-JIT entrypoints create NativeJITCode every time it is called. But it is meaningless since these entry point code are identical.
2384         We should create one per entrypoint type (for function, we should have CodeForCall and CodeForConstruct) and continue to use them.
2385         And we use NativeJITCode instead of DirectJITCode if it does not have difference between usual entrypoint and arity check entrypoint.
2386
2387         * dfg/DFGJITCode.h:
2388         * dfg/DFGJITFinalizer.cpp:
2389         (JSC::DFG::JITFinalizer::finalize):
2390         (JSC::DFG::JITFinalizer::finalizeFunction):
2391         * jit/JITCode.cpp:
2392         (JSC::DirectJITCode::initializeCodeRefForDFG):
2393         (JSC::DirectJITCode::initializeCodeRef): Deleted.
2394         (JSC::NativeJITCode::initializeCodeRef): Deleted.
2395         * jit/JITCode.h:
2396         * llint/LLIntEntrypoint.cpp:
2397         (JSC::LLInt::setFunctionEntrypoint):
2398         (JSC::LLInt::setEvalEntrypoint):
2399         (JSC::LLInt::setProgramEntrypoint):
2400         (JSC::LLInt::setModuleProgramEntrypoint): Retagged is removed since the tag is the same.
2401
2402 2019-02-14  Ross Kirsling  <ross.kirsling@sony.com>
2403
2404         [WTF] Add environment variable helpers
2405         https://bugs.webkit.org/show_bug.cgi?id=192405
2406
2407         Reviewed by Michael Catanzaro.
2408
2409         * inspector/remote/glib/RemoteInspectorGlib.cpp:
2410         (Inspector::RemoteInspector::RemoteInspector):
2411         (Inspector::RemoteInspector::start):
2412         * jsc.cpp:
2413         (startTimeoutThreadIfNeeded):
2414         * runtime/Options.cpp:
2415         (JSC::overrideOptionWithHeuristic):
2416         (JSC::Options::overrideAliasedOptionWithHeuristic):
2417         (JSC::Options::initialize):
2418         * runtime/VM.cpp:
2419         (JSC::enableAssembler):
2420         (JSC::VM::VM):
2421         * tools/CodeProfiling.cpp:
2422         (JSC::CodeProfiling::notifyAllocator):
2423         Utilize WTF::Environment where possible.
2424
2425 2019-02-14  Yusuke Suzuki  <ysuzuki@apple.com>
2426
2427         [JSC] Should have default NativeJITCode
2428         https://bugs.webkit.org/show_bug.cgi?id=194634
2429
2430         Reviewed by Mark Lam.
2431
2432         In JSC_useJIT=false mode, we always create identical NativeJITCode for call and construct when we create NativeExecutable.
2433         This is meaningless since we do not modify NativeJITCode after the creation. This patch adds singleton used as a default one.
2434         Since NativeJITCode (& JITCode) is ThreadSafeRefCounted, we can just share it in a whole process level. This removes 446 NativeJITCode
2435         allocations, which takes 14KB.
2436
2437         * runtime/VM.cpp:
2438         (JSC::jitCodeForCallTrampoline):
2439         (JSC::jitCodeForConstructTrampoline):
2440         (JSC::VM::getHostFunction):
2441
2442 2019-02-14  Tadeu Zagallo  <tzagallo@apple.com>
2443
2444         generateUnlinkedCodeBlockForFunctions shouldn't need to create a FunctionExecutable just to get its source code
2445         https://bugs.webkit.org/show_bug.cgi?id=194576
2446
2447         Reviewed by Saam Barati.
2448
2449         Extract a new function, `linkedSourceCode` from UnlinkedFunctionExecutable::link
2450         and use it in `generateUnlinkedCodeBlockForFunctions` instead.
2451
2452         * bytecode/UnlinkedFunctionExecutable.cpp:
2453         (JSC::UnlinkedFunctionExecutable::linkedSourceCode const):
2454         (JSC::UnlinkedFunctionExecutable::link):
2455         * bytecode/UnlinkedFunctionExecutable.h:
2456         * runtime/CodeCache.cpp:
2457         (JSC::generateUnlinkedCodeBlockForFunctions):
2458
2459 2019-02-14  Tadeu Zagallo  <tzagallo@apple.com>
2460
2461         CachedBitVector's size must be converted from bits to bytes
2462         https://bugs.webkit.org/show_bug.cgi?id=194441
2463
2464         Reviewed by Saam Barati.
2465
2466         CachedBitVector used its size in bits for memcpy. That didn't cause any
2467         issues when encoding, since the size in bits was also used in the allocation,
2468         but would overflow the actual BitVector buffer when decoding.
2469
2470         * runtime/CachedTypes.cpp:
2471         (JSC::CachedBitVector::encode):
2472         (JSC::CachedBitVector::decode const):
2473
2474 2019-02-13  Brian Burg  <bburg@apple.com>
2475
2476         Web Inspector: don't include accessibility role in DOM.Node object payloads
2477         https://bugs.webkit.org/show_bug.cgi?id=194623
2478         <rdar://problem/36384037>
2479
2480         Reviewed by Devin Rousso.
2481
2482         Remove property of DOM.Node that is no longer being sent.
2483
2484         * inspector/protocol/DOM.json:
2485
2486 2019-02-13  Keith Miller  <keith_miller@apple.com> and Yusuke Suzuki  <ysuzuki@apple.com>
2487
2488         We should only make rope strings when concatenating strings long enough.
2489         https://bugs.webkit.org/show_bug.cgi?id=194465
2490
2491         Reviewed by Mark Lam.
2492
2493         This patch stops us from allocating a rope string if the resulting
2494         rope would be smaller than the size of the JSRopeString object we
2495         would need to allocate.
2496
2497         This patch also adds paths so that we don't unnecessarily allocate
2498         JSString cells for primitives we are going to concatenate with a
2499         string anyway.
2500
2501         The important change from the previous one is that we do not apply
2502         the above rule to JSRopeStrings generated by JSStrings. If we convert
2503         it to JSString, comparison of memory consumption becomes the following,
2504         because JSRopeString does not have StringImpl until it is resolved.
2505
2506             sizeof(JSRopeString) v.s. sizeof(JSString) + sizeof(StringImpl) + content
2507
2508         Since sizeof(JSString) + sizeof(StringImpl) is larger than sizeof(JSRopeString),
2509         resolving eagerly increases memory footprint. The point is that we need to
2510         account newly created JSString and JSRopeString from the operands. This is the
2511         reason why this patch adds different thresholds for each jsString functions.
2512
2513         This patch also avoids concatenation for ropes conservatively. Many ropes are
2514         temporary cells. So we do not resolve eagerly if one of operands is already a
2515         rope.
2516
2517         In CLI execution, this change is performance neutral in JetStream2 (run 6 times, 1 for warming up and average in latter 5.).
2518
2519             Before: 159.3778
2520             After:  160.72340000000003
2521
2522         * dfg/DFGOperations.cpp:
2523         * runtime/CommonSlowPaths.cpp:
2524         (JSC::SLOW_PATH_DECL):
2525         * runtime/JSString.h:
2526         (JSC::JSString::isRope const):
2527         * runtime/Operations.cpp:
2528         (JSC::jsAddSlowCase):
2529         * runtime/Operations.h:
2530         (JSC::jsString):
2531         (JSC::jsAddNonNumber):
2532         (JSC::jsAdd):
2533
2534 2019-02-13  Saam Barati  <sbarati@apple.com>
2535
2536         AirIRGenerator::addSwitch switch patchpoint needs to model clobbering the scratch register
2537         https://bugs.webkit.org/show_bug.cgi?id=194610
2538
2539         Reviewed by Michael Saboff.
2540
2541         BinarySwitch might use the scratch register. We must model the
2542         effects of that properly. This is already caught by our br-table
2543         tests on arm64.
2544
2545         * wasm/WasmAirIRGenerator.cpp:
2546         (JSC::Wasm::AirIRGenerator::addSwitch):
2547
2548 2019-02-13  Mark Lam  <mark.lam@apple.com>
2549
2550         Create a randomized free list for new StructureIDs on StructureIDTable resize.
2551         https://bugs.webkit.org/show_bug.cgi?id=194566
2552         <rdar://problem/47975502>
2553
2554         Reviewed by Michael Saboff.
2555
2556         Also isolate 32-bit implementation of StructureIDTable out more so the 64-bit
2557         implementation is a little easier to read.
2558
2559         This patch appears to be perf neutral on JetStream2 (as run from the command line).
2560
2561         * runtime/StructureIDTable.cpp:
2562         (JSC::StructureIDTable::StructureIDTable):
2563         (JSC::StructureIDTable::makeFreeListFromRange):
2564         (JSC::StructureIDTable::resize):
2565         (JSC::StructureIDTable::allocateID):
2566         (JSC::StructureIDTable::deallocateID):
2567         * runtime/StructureIDTable.h:
2568         (JSC::StructureIDTable::get):
2569         (JSC::StructureIDTable::deallocateID):
2570         (JSC::StructureIDTable::allocateID):
2571         (JSC::StructureIDTable::flushOldTables):
2572
2573 2019-02-13  Tadeu Zagallo  <tzagallo@apple.com>
2574
2575         VariableLengthObject::allocate<T> should initialize objects
2576         https://bugs.webkit.org/show_bug.cgi?id=194534
2577
2578         Reviewed by Michael Saboff.
2579
2580         `buffer()` should not be called for empty VariableLengthObjects, but
2581         these cases were not being caught due to the objects not being properly
2582         initialized. Fix it so that allocate calls the constructor and fix the
2583         assertion failues.
2584
2585         * runtime/CachedTypes.cpp:
2586         (JSC::CachedObject::operator new):
2587         (JSC::VariableLengthObject::allocate):
2588         (JSC::CachedVector::encode):
2589         (JSC::CachedVector::decode const):
2590         (JSC::CachedUniquedStringImpl::decode const):
2591         (JSC::CachedBitVector::encode):
2592         (JSC::CachedBitVector::decode const):
2593         (JSC::CachedArray::encode):
2594         (JSC::CachedArray::decode const):
2595         (JSC::CachedImmutableButterfly::CachedImmutableButterfly):
2596         (JSC::CachedBigInt::decode const):
2597
2598 2019-02-13  Tadeu Zagallo  <tzagallo@apple.com>
2599
2600         CodeBlocks read from disk should not be re-written
2601         https://bugs.webkit.org/show_bug.cgi?id=194535
2602
2603         Reviewed by Michael Saboff.
2604
2605         Keep track of which CodeBlocks have been read from disk or have already
2606         been serialized in CodeCache.
2607
2608         * runtime/CodeCache.cpp:
2609         (JSC::CodeCache::write):
2610         * runtime/CodeCache.h:
2611         (JSC::SourceCodeValue::SourceCodeValue):
2612         (JSC::CodeCacheMap::fetchFromDiskImpl):
2613
2614 2019-02-13  Tadeu Zagallo  <tzagallo@apple.com>
2615
2616         SourceCode should be copied when generating bytecode for functions
2617         https://bugs.webkit.org/show_bug.cgi?id=194536
2618
2619         Reviewed by Saam Barati.
2620
2621         The FunctionExecutable might be collected while generating the bytecode
2622         for nested functions, in which case the SourceCode reference would no
2623         longer be valid.
2624
2625         * runtime/CodeCache.cpp:
2626         (JSC::generateUnlinkedCodeBlockForFunctions):
2627
2628 2019-02-12  Saam barati  <sbarati@apple.com>
2629
2630         JSScript needs to retain its cache path NSURL*
2631         https://bugs.webkit.org/show_bug.cgi?id=194577
2632
2633         Reviewed by Tim Horton.
2634
2635         * API/JSScript.mm:
2636         (+[JSScript scriptFromASCIIFile:inVirtualMachine:withCodeSigning:andBytecodeCache:]):
2637         (-[JSScript dealloc]):
2638
2639 2019-02-12  Robin Morisset  <rmorisset@apple.com>
2640
2641         Make B3Value::returnsBool() more precise
2642         https://bugs.webkit.org/show_bug.cgi?id=194457
2643
2644         Reviewed by Saam Barati.
2645
2646         It is currently used repeatedly in B3ReduceStrength, as well as once in B3LowerToAir.
2647         It has a needlessly complex rule for BitAnd, and has no rule for other easy cases such as BitOr or Select.
2648         No new tests added as this should be indirectly tested by the already existing tests.
2649
2650         * b3/B3Value.cpp:
2651         (JSC::B3::Value::returnsBool const):
2652
2653 2019-02-12  Michael Catanzaro  <mcatanzaro@igalia.com>
2654
2655         Unreviewed, fix -Wimplicit-fallthrough warning after r241140
2656         https://bugs.webkit.org/show_bug.cgi?id=194399
2657         <rdar://problem/47889777>
2658
2659         * dfg/DFGDoesGC.cpp:
2660         (JSC::DFG::doesGC):
2661
2662 2019-02-12  Michael Catanzaro  <mcatanzaro@igalia.com>
2663
2664         [WPE][GTK] Unsafe g_unsetenv() use in WebProcessPool::platformInitialize
2665         https://bugs.webkit.org/show_bug.cgi?id=194370
2666
2667         Reviewed by Darin Adler.
2668
2669         Change a couple WTFLogAlways to use g_warning, for good measure. Of course this isn't
2670         necessary, but it will make errors more visible.
2671
2672         * inspector/remote/glib/RemoteInspectorGlib.cpp:
2673         (Inspector::RemoteInspector::start):
2674         (Inspector::dbusConnectionCallAsyncReadyCallback):
2675         * inspector/remote/glib/RemoteInspectorServer.cpp:
2676         (Inspector::RemoteInspectorServer::start):
2677
2678 2019-02-12  Andy Estes  <aestes@apple.com>
2679
2680         [iOSMac] Enable Parental Controls Content Filtering
2681         https://bugs.webkit.org/show_bug.cgi?id=194521
2682         <rdar://39732376>
2683
2684         Reviewed by Tim Horton.
2685
2686         * Configurations/FeatureDefines.xcconfig:
2687
2688 2019-02-11  Mark Lam  <mark.lam@apple.com>
2689
2690         Randomize insertion of deallocated StructureIDs into the StructureIDTable's free list.
2691         https://bugs.webkit.org/show_bug.cgi?id=194512
2692         <rdar://problem/47975465>
2693
2694         Reviewed by Yusuke Suzuki.
2695
2696         * runtime/StructureIDTable.cpp:
2697         (JSC::StructureIDTable::StructureIDTable):
2698         (JSC::StructureIDTable::allocateID):
2699         (JSC::StructureIDTable::deallocateID):
2700         * runtime/StructureIDTable.h:
2701
2702 2019-02-10  Mark Lam  <mark.lam@apple.com>
2703
2704         Remove the RELEASE_ASSERT check for duplicate cases in the BinarySwitch constructor.
2705         https://bugs.webkit.org/show_bug.cgi?id=194493
2706         <rdar://problem/36380852>
2707
2708         Reviewed by Yusuke Suzuki.
2709
2710         Having duplicate cases in the BinarySwitch is not a correctness issue.  It is
2711         however not good for performance and memory usage.  As such, a debug ASSERT will
2712         do.  We'll also do an audit of the clients of BinarySwitch to see if it's
2713         possible to be instantiated with duplicate cases in
2714         https://bugs.webkit.org/show_bug.cgi?id=194492 later.
2715
2716         Also added some value dumps to the RELEASE_ASSERT to help debug the issue when we
2717         see duplicate cases.
2718
2719         * jit/BinarySwitch.cpp:
2720         (JSC::BinarySwitch::BinarySwitch):
2721
2722 2019-02-10  Darin Adler  <darin@apple.com>
2723
2724         Switch uses of StringBuilder with String::format for hex numbers to use HexNumber.h instead
2725         https://bugs.webkit.org/show_bug.cgi?id=194485
2726
2727         Reviewed by Daniel Bates.
2728
2729         * heap/HeapSnapshotBuilder.cpp:
2730         (JSC::HeapSnapshotBuilder::json): Use appendUnsignedAsHex along with
2731         reinterpret_cast<uintptr_t> to replace uses of String::format with "%p".
2732
2733         * runtime/JSGlobalObjectFunctions.cpp:
2734         (JSC::encode): Removed some unneeded casts in StringBuilder code,
2735         including one in a call to appendByteAsHex.
2736         (JSC::globalFuncEscape): Ditto.
2737
2738 2019-02-10  Commit Queue  <commit-queue@webkit.org>
2739
2740         Unreviewed, rolling out r241230.
2741         https://bugs.webkit.org/show_bug.cgi?id=194488
2742
2743         "It regressed JetStream2 by ~6%" (Requested by saamyjoon on
2744         #webkit).
2745
2746         Reverted changeset:
2747
2748         "We should only make rope strings when concatenating strings
2749         long enough."
2750         https://bugs.webkit.org/show_bug.cgi?id=194465
2751         https://trac.webkit.org/changeset/241230
2752
2753 2019-02-10  Saam barati  <sbarati@apple.com>
2754
2755         BBQ-Air: Emit better code for switch
2756         https://bugs.webkit.org/show_bug.cgi?id=194053
2757
2758         Reviewed by Yusuke Suzuki.
2759
2760         Instead of emitting a linear set of jumps for Switch, this patch
2761         makes the BBQ-Air backend emit a binary switch.
2762
2763         * wasm/WasmAirIRGenerator.cpp:
2764         (JSC::Wasm::AirIRGenerator::addSwitch):
2765
2766 2019-02-09  Yusuke Suzuki  <ysuzuki@apple.com>
2767
2768         Unreviewed, Lexer should use isLatin1 implementation in WTF
2769         https://bugs.webkit.org/show_bug.cgi?id=194466
2770
2771         Follow-up after r241233 pointed by Darin.
2772
2773         * parser/Lexer.cpp:
2774         (JSC::isLatin1): Deleted.
2775
2776 2019-02-09  Darin Adler  <darin@apple.com>
2777
2778         Eliminate unnecessary String temporaries by using StringConcatenateNumbers
2779         https://bugs.webkit.org/show_bug.cgi?id=194021
2780
2781         Reviewed by Geoffrey Garen.
2782
2783         * inspector/agents/InspectorConsoleAgent.cpp:
2784         (Inspector::InspectorConsoleAgent::count): Remove String::number and let
2785         makeString do the conversion without allocating/destroying a String.
2786         * inspector/agents/InspectorDebuggerAgent.cpp:
2787         (Inspector::objectGroupForBreakpointAction): Ditto.
2788         (Inspector::InspectorDebuggerAgent::setBreakpointByUrl): Ditto.
2789         (Inspector::InspectorDebuggerAgent::setBreakpoint): Ditto.
2790         * runtime/JSGenericTypedArrayViewInlines.h:
2791         (JSC::JSGenericTypedArrayView<Adaptor>::defineOwnProperty): Ditto.
2792         * runtime/NumberPrototype.cpp:
2793         (JSC::numberProtoFuncToFixed): Use String::numberToStringFixedWidth instead
2794         of calling numberToFixedWidthString to do the same thing.
2795         (JSC::numberProtoFuncToPrecision): Use String::number instead of calling
2796         numberToFixedPrecisionString to do the same thing.
2797         * runtime/SamplingProfiler.cpp:
2798         (JSC::SamplingProfiler::reportTopFunctions): Ditto.
2799
2800 2019-02-09  Yusuke Suzuki  <ysuzuki@apple.com>
2801
2802         Unreviewed, rolling in r241237 again
2803         https://bugs.webkit.org/show_bug.cgi?id=194469
2804
2805         * runtime/JSString.h:
2806         (JSC::jsSubstring):
2807
2808 2019-02-09  Commit Queue  <commit-queue@webkit.org>
2809
2810         Unreviewed, rolling out r241237.
2811         https://bugs.webkit.org/show_bug.cgi?id=194474
2812
2813         Shows significant memory increase in WSL (Requested by
2814         yusukesuzuki on #webkit).
2815
2816         Reverted changeset:
2817
2818         "[WTF] Use BufferInternal StringImpl if substring StringImpl
2819         takes more memory"
2820         https://bugs.webkit.org/show_bug.cgi?id=194469
2821         https://trac.webkit.org/changeset/241237
2822
2823 2019-02-08  Yusuke Suzuki  <ysuzuki@apple.com>
2824
2825         [WTF] Use BufferInternal StringImpl if substring StringImpl takes more memory
2826         https://bugs.webkit.org/show_bug.cgi?id=194469
2827
2828         Reviewed by Geoffrey Garen.
2829
2830         * runtime/JSString.h:
2831         (JSC::jsSubstring):
2832
2833 2019-02-08  Yusuke Suzuki  <ysuzuki@apple.com>
2834
2835         [JSC] CachedTypes should use jsString instead of JSString::create
2836         https://bugs.webkit.org/show_bug.cgi?id=194471
2837
2838         Reviewed by Mark Lam.
2839
2840         Use jsString() here because JSString::create is a bit low-level API and it requires some invariant like "length is not zero".
2841
2842         * runtime/CachedTypes.cpp:
2843         (JSC::CachedJSValue::decode const):
2844
2845 2019-02-08  Yusuke Suzuki  <ysuzuki@apple.com>
2846
2847         [JSC] Increase StructureIDTable initial capacity
2848         https://bugs.webkit.org/show_bug.cgi?id=194468
2849
2850         Reviewed by Mark Lam.
2851
2852         Currently, # of structures just after initializing JSGlobalObject (precisely, initializing GlobalObject in
2853         JSC shell), 281, already exceeds the current initial value 256. We should increase the capacity since
2854         unnecessary resizing requires more operations, keeps old StructureID array until GC happens, and makes
2855         more memory dirty. We also remove some structures that are no longer used.
2856
2857         * runtime/JSGlobalObject.h:
2858         (JSC::JSGlobalObject::callbackObjectStructure const):
2859         (JSC::JSGlobalObject::propertyNameIteratorStructure const): Deleted.
2860         * runtime/StructureIDTable.h:
2861         * runtime/VM.h:
2862
2863 2019-02-08  Yusuke Suzuki  <ysuzuki@apple.com>
2864
2865         [JSC] String.fromCharCode's slow path always generates 16bit string
2866         https://bugs.webkit.org/show_bug.cgi?id=194466
2867
2868         Reviewed by Keith Miller.
2869
2870         String.fromCharCode(a1) has a fast path and the most frequently used. And String.fromCharCode(a1, a2, ...)
2871         goes to the slow path. However, in the slow path, we always create 16bit string. 16bit string takes 2x memory,
2872         and even worse, taints ropes 16bit if 16bit string is included in the given rope. We find that acorn-wtb
2873         creates very large strings multiple times with String.fromCharCode, and String.fromCharCode always produces
2874         16bit string. However, only few strings are actually 16bit strings. This patch attempts to make 8bit string
2875         as much as possible.
2876
2877         It improves non JIT acorn-wtb's peak and current memory footprint by 6% and 3% respectively.
2878
2879         * runtime/StringConstructor.cpp:
2880         (JSC::stringFromCharCode):
2881
2882 2019-02-08  Keith Miller  <keith_miller@apple.com>
2883
2884         We should only make rope strings when concatenating strings long enough.
2885         https://bugs.webkit.org/show_bug.cgi?id=194465
2886
2887         Reviewed by Saam Barati.
2888
2889         This patch stops us from allocating a rope string if the resulting
2890         rope would be smaller than the size of the JSRopeString object we
2891         would need to allocate.
2892
2893         This patch also adds paths so that we don't unnecessarily allocate
2894         JSString cells for primitives we are going to concatenate with a
2895         string anyway.
2896
2897         * dfg/DFGOperations.cpp:
2898         * runtime/CommonSlowPaths.cpp:
2899         (JSC::SLOW_PATH_DECL):
2900         * runtime/JSString.h:
2901         * runtime/Operations.cpp:
2902         (JSC::jsAddSlowCase):
2903         * runtime/Operations.h:
2904         (JSC::jsString):
2905         (JSC::jsAdd):
2906
2907 2019-02-08  Saam barati  <sbarati@apple.com>
2908
2909         Nodes that rely on being dominated by CheckInBounds should have a child edge to it
2910         https://bugs.webkit.org/show_bug.cgi?id=194334
2911         <rdar://problem/47844327>
2912
2913         Reviewed by Mark Lam.
2914
2915         * dfg/DFGAbstractInterpreterInlines.h:
2916         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2917         * dfg/DFGArgumentsEliminationPhase.cpp:
2918         * dfg/DFGByteCodeParser.cpp:
2919         (JSC::DFG::ByteCodeParser::parseBlock):
2920         * dfg/DFGClobberize.h:
2921         (JSC::DFG::clobberize):
2922         * dfg/DFGConstantFoldingPhase.cpp:
2923         (JSC::DFG::ConstantFoldingPhase::foldConstants):
2924         * dfg/DFGFixupPhase.cpp:
2925         (JSC::DFG::FixupPhase::fixupNode):
2926         (JSC::DFG::FixupPhase::convertToHasIndexedProperty):
2927         * dfg/DFGIntegerCheckCombiningPhase.cpp:
2928         (JSC::DFG::IntegerCheckCombiningPhase::handleBlock):
2929         * dfg/DFGIntegerRangeOptimizationPhase.cpp:
2930         * dfg/DFGNodeType.h:
2931         * dfg/DFGSSALoweringPhase.cpp:
2932         (JSC::DFG::SSALoweringPhase::lowerBoundsCheck):
2933         * dfg/DFGSpeculativeJIT.cpp:
2934         (JSC::DFG::SpeculativeJIT::compileHasIndexedProperty):
2935         * ftl/FTLLowerDFGToB3.cpp:
2936         (JSC::FTL::DFG::LowerDFGToB3::compileCheckInBounds):
2937         (JSC::FTL::DFG::LowerDFGToB3::compileHasIndexedProperty):
2938
2939 2019-02-08  Yusuke Suzuki  <ysuzuki@apple.com>
2940
2941         [JSC] Shrink sizeof(CodeBlock) more
2942         https://bugs.webkit.org/show_bug.cgi?id=194419
2943
2944         Reviewed by Mark Lam.
2945
2946         This patch further shrinks the size of CodeBlock, from 352 to 296 (304).
2947
2948         1. CodeBlock copies so many data from ScriptExecutable even if ScriptExecutable
2949         has the same information. These data is not touched in CodeBlock::~CodeBlock,
2950         so we can just use the data in ScriptExecutable instead of holding it in CodeBlock.
2951
2952         2. We remove m_instructions pointer since the ownership is managed by UnlinkedCodeBlock.
2953         And we do not touch it in CodeBlock::~CodeBlock.
2954
2955         3. We move m_calleeSaveRegisters from CodeBlock to CodeBlock::JITData. For baseline and LLInt
2956         cases, this patch offers RegisterAtOffsetList::llintBaselineCalleeSaveRegisters() which returns
2957         singleton to `const RegisterAtOffsetList*` usable for LLInt and Baseline JIT CodeBlocks.
2958
2959         4. Move m_catchProfiles to RareData and materialize only when op_catch's slow path is called.
2960
2961         5. Drop ownerScriptExecutable. ownerExecutable() returns ScriptExecutable*.
2962
2963         * bytecode/CodeBlock.cpp:
2964         (JSC::CodeBlock::hash const):
2965         (JSC::CodeBlock::sourceCodeForTools const):
2966         (JSC::CodeBlock::dumpAssumingJITType const):
2967         (JSC::CodeBlock::dumpSource):
2968         (JSC::CodeBlock::CodeBlock):
2969         (JSC::CodeBlock::finishCreation):
2970         (JSC::CodeBlock::propagateTransitions):
2971         (JSC::CodeBlock::finalizeLLIntInlineCaches):
2972         (JSC::CodeBlock::setCalleeSaveRegisters):
2973         (JSC::CodeBlock::ensureCatchLivenessIsComputedForBytecodeOffset):
2974         (JSC::CodeBlock::ensureCatchLivenessIsComputedForBytecodeOffsetSlow):
2975         (JSC::CodeBlock::lineNumberForBytecodeOffset):
2976         (JSC::CodeBlock::expressionRangeForBytecodeOffset const):
2977         (JSC::CodeBlock::hasOpDebugForLineAndColumn):
2978         (JSC::CodeBlock::newReplacement):
2979         (JSC::CodeBlock::replacement):
2980         (JSC::CodeBlock::computeCapabilityLevel):
2981         (JSC::CodeBlock::jettison):
2982         (JSC::CodeBlock::calleeSaveRegisters const):
2983         (JSC::CodeBlock::calleeSaveSpaceAsVirtualRegisters):
2984         (JSC::CodeBlock::updateOSRExitCounterAndCheckIfNeedToReoptimize):
2985         (JSC::CodeBlock::getArrayProfile):
2986         (JSC::CodeBlock::updateAllPredictionsAndCountLiveness):
2987         (JSC::CodeBlock::notifyLexicalBindingUpdate):
2988         (JSC::CodeBlock::tryGetValueProfileForBytecodeOffset):
2989         (JSC::CodeBlock::validate):
2990         (JSC::CodeBlock::outOfLineJumpTarget):
2991         (JSC::CodeBlock::arithProfileForBytecodeOffset):
2992         (JSC::CodeBlock::insertBasicBlockBoundariesForControlFlowProfiler):
2993         * bytecode/CodeBlock.h:
2994         (JSC::CodeBlock::specializationKind const):
2995         (JSC::CodeBlock::isStrictMode const):
2996         (JSC::CodeBlock::isConstructor const):
2997         (JSC::CodeBlock::codeType const):
2998         (JSC::CodeBlock::isKnownNotImmediate):
2999         (JSC::CodeBlock::instructions const):
3000         (JSC::CodeBlock::ownerExecutable const):
3001         (JSC::CodeBlock::thisRegister const):
3002         (JSC::CodeBlock::source const):
3003         (JSC::CodeBlock::sourceOffset const):
3004         (JSC::CodeBlock::firstLineColumnOffset const):
3005         (JSC::CodeBlock::createRareDataIfNecessary):
3006         (JSC::CodeBlock::ownerScriptExecutable const): Deleted.
3007         (JSC::CodeBlock::setThisRegister): Deleted.
3008         (JSC::CodeBlock::calleeSaveRegisters const): Deleted.
3009         * bytecode/EvalCodeBlock.h:
3010         * bytecode/FunctionCodeBlock.h:
3011         * bytecode/GlobalCodeBlock.h:
3012         (JSC::GlobalCodeBlock::GlobalCodeBlock):
3013         * bytecode/ModuleProgramCodeBlock.h:
3014         * bytecode/ProgramCodeBlock.h:
3015         * debugger/Debugger.cpp:
3016         (JSC::Debugger::toggleBreakpoint):
3017         * debugger/DebuggerCallFrame.cpp:
3018         (JSC::DebuggerCallFrame::sourceID const):
3019         (JSC::DebuggerCallFrame::sourceIDForCallFrame):
3020         * debugger/DebuggerScope.cpp:
3021         (JSC::DebuggerScope::location const):
3022         * dfg/DFGByteCodeParser.cpp:
3023         (JSC::DFG::ByteCodeParser::InlineStackEntry::executable):
3024         (JSC::DFG::ByteCodeParser::inliningCost):
3025         (JSC::DFG::ByteCodeParser::parseCodeBlock):
3026         * dfg/DFGCapabilities.cpp:
3027         (JSC::DFG::isSupportedForInlining):
3028         (JSC::DFG::mightCompileEval):
3029         (JSC::DFG::mightCompileProgram):
3030         (JSC::DFG::mightCompileFunctionForCall):
3031         (JSC::DFG::mightCompileFunctionForConstruct):
3032         (JSC::DFG::canUseOSRExitFuzzing):
3033         * dfg/DFGGraph.h:
3034         (JSC::DFG::Graph::executableFor):
3035         * dfg/DFGJITCompiler.cpp:
3036         (JSC::DFG::JITCompiler::compileFunction):
3037         * dfg/DFGOSREntry.cpp:
3038         (JSC::DFG::prepareOSREntry):
3039         * dfg/DFGOSRExit.cpp:
3040         (JSC::DFG::restoreCalleeSavesFor):
3041         (JSC::DFG::saveCalleeSavesFor):
3042         (JSC::DFG::saveOrCopyCalleeSavesFor):
3043         * dfg/DFGOSRExitCompilerCommon.cpp:
3044         (JSC::DFG::handleExitCounts):
3045         * dfg/DFGOperations.cpp:
3046         * dfg/DFGToFTLDeferredCompilationCallback.cpp:
3047         (JSC::DFG::ToFTLDeferredCompilationCallback::compilationDidComplete):
3048         * ftl/FTLCapabilities.cpp:
3049         (JSC::FTL::canCompile):
3050         * ftl/FTLLink.cpp:
3051         (JSC::FTL::link):
3052         * ftl/FTLOSRExitCompiler.cpp:
3053         (JSC::FTL::compileStub):
3054         * interpreter/CallFrame.cpp:
3055         (JSC::CallFrame::callerSourceOrigin):
3056         * interpreter/Interpreter.cpp:
3057         (JSC::eval):
3058         (JSC::UnwindFunctor::copyCalleeSavesToEntryFrameCalleeSavesBuffer const):
3059         * interpreter/StackVisitor.cpp:
3060         (JSC::StackVisitor::Frame::calleeSaveRegisters):
3061         (JSC::StackVisitor::Frame::sourceURL const):
3062         (JSC::StackVisitor::Frame::sourceID):
3063         (JSC::StackVisitor::Frame::computeLineAndColumn const):
3064         * interpreter/StackVisitor.h:
3065         * jit/AssemblyHelpers.h:
3066         (JSC::AssemblyHelpers::emitSaveCalleeSavesFor):
3067         (JSC::AssemblyHelpers::emitSaveOrCopyCalleeSavesFor):
3068         (JSC::AssemblyHelpers::emitRestoreCalleeSavesFor):
3069         * jit/CallFrameShuffleData.cpp:
3070         (JSC::CallFrameShuffleData::setupCalleeSaveRegisters):
3071         * jit/JIT.cpp:
3072         (JSC::JIT::compileWithoutLinking):
3073         * jit/JITToDFGDeferredCompilationCallback.cpp:
3074         (JSC::JITToDFGDeferredCompilationCallback::compilationDidComplete):
3075         * jit/JITWorklist.cpp:
3076         (JSC::JITWorklist::Plan::finalize):
3077         (JSC::JITWorklist::compileNow):
3078         * jit/RegisterAtOffsetList.cpp:
3079         (JSC::RegisterAtOffsetList::llintBaselineCalleeSaveRegisters):
3080         * jit/RegisterAtOffsetList.h:
3081         (JSC::RegisterAtOffsetList::at const):
3082         * runtime/ErrorInstance.cpp:
3083         (JSC::appendSourceToError):
3084         * runtime/ScriptExecutable.cpp:
3085         (JSC::ScriptExecutable::newCodeBlockFor):
3086         * runtime/StackFrame.cpp:
3087         (JSC::StackFrame::sourceID const):
3088         (JSC::StackFrame::sourceURL const):
3089         (JSC::StackFrame::computeLineAndColumn const):
3090
3091 2019-02-08  Robin Morisset  <rmorisset@apple.com>
3092
3093         B3LowerMacros wrongly sets m_changed to true in the case of AtomicWeakCAS on x86
3094         https://bugs.webkit.org/show_bug.cgi?id=194460
3095
3096         Reviewed by Mark Lam.
3097
3098         Trivial fix, should already be covered by testAtomicWeakCAS in testb3.cpp.
3099
3100         * b3/B3LowerMacros.cpp:
3101
3102 2019-02-08  Mark Lam  <mark.lam@apple.com>
3103
3104         Use maxSingleCharacterString in comparisons instead of literal constants.
3105         https://bugs.webkit.org/show_bug.cgi?id=194452
3106
3107         Reviewed by Yusuke Suzuki.
3108
3109         This way, if we ever change maxSingleCharacterString, it won't break all this code
3110         that relies on it being 0xff implicitly.
3111
3112         * dfg/DFGSpeculativeJIT.cpp:
3113         (JSC::DFG::SpeculativeJIT::compileStringSlice):
3114         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
3115         * ftl/FTLLowerDFGToB3.cpp:
3116         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharAt):
3117         (JSC::FTL::DFG::LowerDFGToB3::compileStringSlice):
3118         * jit/ThunkGenerators.cpp:
3119         (JSC::stringGetByValGenerator):
3120         (JSC::charToString):
3121
3122 2019-02-08  Mark Lam  <mark.lam@apple.com>
3123
3124         Fix DFG's doesGC() for CheckTierUp*, GetByVal, PutByVal*, and StringCharAt nodes.
3125         https://bugs.webkit.org/show_bug.cgi?id=194446
3126         <rdar://problem/47926792>
3127
3128         Reviewed by Saam Barati.
3129
3130         Fix doesGC() for the following nodes:
3131
3132             CheckTierUpAtReturn:
3133                 Calls triggerTierUpNow(), which calls triggerFTLReplacementCompile(),
3134                 which calls Worklist::completeAllReadyPlansForVM(), which uses DeferGC.
3135
3136             CheckTierUpInLoop:
3137                 Calls triggerTierUpNowInLoop(), which calls tierUpCommon(), which calls
3138                 Worklist::completeAllReadyPlansForVM(), which uses DeferGC.
3139
3140             CheckTierUpAndOSREnter:
3141                 Calls triggerOSREntryNow(), which calls tierUpCommon(), which calls
3142                 Worklist::completeAllReadyPlansForVM(), which uses DeferGC.
3143
3144             GetByVal:
3145                 case Array::String calls operationSingleCharacterString(), which calls
3146                 jsSingleCharacterString(), which can allocate a string.
3147
3148             PutByValDirect:
3149             PutByVal:
3150             PutByValAlias:
3151                 For the DFG only, the integer TypeArrays calls compilePutByValForIntTypedArray(),
3152                 which may call slow paths operationPutByValDirectStrict(), operationPutByValDirectNonStrict(),
3153                 operationPutByValStrict(), or operationPutByValNonStrict().  All of these
3154                 slow paths call putByValInternal(), which may create exception objects, or
3155                 call the generic JSValue::put() which may execute arbitrary code.
3156
3157             StringCharAt:
3158                 Can call operationSingleCharacterString(), which calls jsSingleCharacterString(),
3159                 which can allocate a string.
3160
3161         Also fix DFG::SpeculativeJIT::compileGetByValOnString() and FTL's compileStringCharAt()
3162         to use the maxSingleCharacterString constant instead of a literal constant.
3163
3164         * dfg/DFGDoesGC.cpp:
3165         (JSC::DFG::doesGC):
3166         * dfg/DFGSpeculativeJIT.cpp:
3167         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
3168         * dfg/DFGSpeculativeJIT64.cpp:
3169         (JSC::DFG::SpeculativeJIT::compile):
3170         * ftl/FTLLowerDFGToB3.cpp:
3171         (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal):
3172         (JSC::FTL::DFG::LowerDFGToB3::compilePutByVal):
3173         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharAt):
3174
3175 2019-02-08  Yusuke Suzuki  <ysuzuki@apple.com>
3176
3177         [JSC] SourceProviderCacheItem should be small
3178         https://bugs.webkit.org/show_bug.cgi?id=194432
3179
3180         Reviewed by Saam Barati.
3181
3182         Some JetStream2 tests stress the JS parser. At that time, so many SourceProviderCacheItems are created.
3183         While they are removed when full-GC happens, it significantly increases the peak memory usage.
3184         This patch reduces the size of SourceProviderCacheItem from 56 to 32.
3185
3186         * parser/Parser.cpp:
3187         (JSC::Parser<LexerType>::parseFunctionInfo):
3188         * parser/ParserModes.h:
3189         * parser/ParserTokens.h:
3190         * parser/SourceProviderCacheItem.h:
3191         (JSC::SourceProviderCacheItem::endFunctionToken const):
3192         (JSC::SourceProviderCacheItem::SourceProviderCacheItem):
3193
3194 2019-02-07  Robin Morisset  <rmorisset@apple.com>
3195
3196         Fix Abs(Neg(x)) -> Abs(x) optimization in B3ReduceStrength
3197         https://bugs.webkit.org/show_bug.cgi?id=194420
3198
3199         Reviewed by Saam Barati.
3200
3201         In https://bugs.webkit.org/show_bug.cgi?id=194250, I added an optimization: Abs(Neg(x)) -> Abs(x).
3202         But I introduced two bugs, one is that I actually implemented Abs(Neg(x)) -> x, and the other is that the test is looking at Abs(Abs(x)) instead (both were stupid copy-paste mistakes).
3203         This trivial patch fixes both.
3204
3205         * b3/B3ReduceStrength.cpp:
3206         * b3/testb3.cpp:
3207         (JSC::B3::testAbsNegArg):
3208
3209 2019-02-07  Keith Miller  <keith_miller@apple.com>
3210
3211         Better error messages for module loader SPI
3212         https://bugs.webkit.org/show_bug.cgi?id=194421
3213
3214         Reviewed by Saam Barati.
3215
3216         * API/JSAPIGlobalObject.mm:
3217         (JSC::JSAPIGlobalObject::moduleLoaderImportModule):
3218
3219 2019-02-07  Mark Lam  <mark.lam@apple.com>
3220
3221         Fix more doesGC() for CheckTraps, GetMapBucket, and Switch nodes.
3222         https://bugs.webkit.org/show_bug.cgi?id=194399
3223         <rdar://problem/47889777>
3224
3225         Reviewed by Yusuke Suzuki.
3226
3227         Fix doesGC() for the following nodes:
3228
3229             CheckTraps:
3230                 We normally will not emit this node because Options::usePollingTraps() is
3231                 false by default.  However, as it is implemented now, CheckTraps can GC
3232                 because it can allocate a TerminatedExecutionException.  If we make the
3233                 TerminatedExecutionException a singleton allocated at initialization time,
3234                 doesGC() can return false for CheckTraps.
3235                 https://bugs.webkit.org/show_bug.cgi?id=194323
3236
3237             GetMapBucket:
3238                 Can call operationJSMapFindBucket() or operationJSSetFindBucket(),
3239                 which calls HashMapImpl::findBucket(), which calls jsMapHash(), which
3240                 can resolve a rope.
3241
3242             Switch:
3243                 If switchData kind is SwitchChar, can call operationResolveRope() .
3244                 If switchData kind is SwitchString and the child use kind is not StringIdentUse,
3245                     can call operationSwitchString() which resolves ropes.
3246
3247             DirectTailCall:
3248             ForceOSRExit:
3249             Return:
3250             TailCallForwardVarargs:
3251             TailCallVarargs:
3252             Throw:
3253                 These are terminal nodes.  It shouldn't really matter what doesGC() returns
3254                 for them, but following our conservative practice, unless we have a good
3255                 reason for doesGC() to return false, we should just return true.
3256
3257         * dfg/DFGDoesGC.cpp:
3258         (JSC::DFG::doesGC):
3259
3260 2019-02-07  Robin Morisset  <rmorisset@apple.com>
3261
3262         B3ReduceStrength: missing peephole optimizations for Neg and Sub
3263         https://bugs.webkit.org/show_bug.cgi?id=194250
3264
3265         Reviewed by Saam Barati.
3266
3267         Adds the following optimizations for integers:
3268         - Sub(x, x) => 0
3269             Already covered by the test testSubArg
3270         - Sub(x1, Neg(x2)) => Add (x1, x2)
3271             Added test: testSubNeg
3272         - Neg(Sub(x1, x2)) => Sub(x2, x1)
3273             Added test: testNegSub
3274         - Add(Neg(x1), x2) => Sub(x2, x1)
3275             Added test: testAddNeg1
3276         - Add(x1, Neg(x2)) => Sub(x1, x2)
3277             Added test: testAddNeg2
3278         Adds the following optimization for floating point values:
3279         - Abs(Neg(x)) => Abs(x)
3280             Added test: testAbsNegArg
3281             Adds the following optimization:
3282
3283         Also did some trivial refactoring, using m_value->isInteger() everywhere instead of isInt(m_value->type()), and using replaceWithNew<Value> instead of replaceWithNewValue(m_proc.add<Value(..))
3284
3285         * b3/B3ReduceStrength.cpp:
3286         * b3/testb3.cpp:
3287         (JSC::B3::testAddNeg1):
3288         (JSC::B3::testAddNeg2):
3289         (JSC::B3::testSubNeg):
3290         (JSC::B3::testNegSub):
3291         (JSC::B3::testAbsAbsArg):
3292         (JSC::B3::testAbsNegArg):
3293         (JSC::B3::run):
3294
3295 2019-02-06  Yusuke Suzuki  <ysuzuki@apple.com>
3296
3297         [JSC] Use BufferInternal single character StringImpl for SmallStrings
3298         https://bugs.webkit.org/show_bug.cgi?id=194374
3299
3300         Reviewed by Geoffrey Garen.
3301
3302         Currently, we first create a large StringImpl, and create bunch of substrings with length = 1.
3303         But pointer is larger than single character. BufferInternal StringImpl with single character
3304         is more memory efficient.
3305
3306         * runtime/SmallStrings.cpp:
3307         (JSC::SmallStringsStorage::SmallStringsStorage):
3308         (JSC::SmallStrings::SmallStrings):
3309         * runtime/SmallStrings.h:
3310
3311 2019-02-06  Yusuke Suzuki  <ysuzuki@apple.com>
3312
3313         [JSC] InitializeEntrypointArguments should produce SpecCellCheck if FlushFormat is FlushedCell
3314         https://bugs.webkit.org/show_bug.cgi?id=194369
3315         <rdar://problem/47813087>
3316
3317         Reviewed by Saam Barati.
3318
3319         InitializeEntrypointArguments says SpecCell if the FlushFormat is FlushedCell. But this actually has
3320         JSEmpty if it is TDZ. This incorrectly proved type information removes necessary CheckNotEmpty in
3321         constant folding phase.
3322
3323         * dfg/DFGAbstractInterpreterInlines.h:
3324         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3325
3326 2019-02-06  Devin Rousso  <drousso@apple.com>
3327
3328         Web Inspector: DOM: don't send the entire function string with each event listener
3329         https://bugs.webkit.org/show_bug.cgi?id=194293
3330         <rdar://problem/47822809>
3331
3332         Reviewed by Joseph Pecoraro.
3333
3334         * inspector/protocol/DOM.json:
3335
3336         * runtime/JSFunction.h:
3337         Export `calculatedDisplayName`.
3338
3339 2019-02-06  Yusuke Suzuki  <ysuzuki@apple.com>
3340
3341         [JSC] PrivateName to PublicName hash table is wasteful
3342         https://bugs.webkit.org/show_bug.cgi?id=194277
3343
3344         Reviewed by Michael Saboff.
3345
3346         PrivateNames account for a lot of memory in the initial JSC footprint. BuiltinNames have Identifier fields corresponding to these PrivateNames
3347         which makes the sizeof(BuiltinNames) about 6KB. It also maintains hash tables for "PublicName to PrivateName" and "PrivateName to PublicName",
3348         each of which takes 16KB memory. While "PublicName to PrivateName" functionality is used in builtin JS (parsing "@xxx" and get a private
3349         name for "xxx"), "PrivateName to PublicName" is rarely used. Holding 16KB hash table for rarely used feature is costly.
3350
3351         In this patch, we add some rules to remove "PrivateName to PublicName" hash table.
3352
3353         1. PrivateName's content should be the same to PublicName.
3354         2. If PrivateName is not actually a private name (we introduced hacky mapping like "@iteratorSymbol" => Symbol.iterator),
3355            the public name should be easily crafted from the given PrivateName.
3356
3357         We modify the content of private names to ensure (1). And for (2), we can meet this requirement by ensuring that the "@xxxSymbol"
3358         is converted to "Symbol.xxx". (1) and (2) allow us to convert a private name to a public name without a large hash table.
3359
3360         We also remove unused identifiers in CommonIdentifiers. And we also move some of them to WebCore's WebCoreBuiltinNames if it is only used in
3361         WebCore.
3362
3363         * builtins/BuiltinNames.cpp:
3364         (JSC::BuiltinNames::BuiltinNames):
3365         * builtins/BuiltinNames.h:
3366         (JSC::BuiltinNames::lookUpPrivateName const):
3367         (JSC::BuiltinNames::getPublicName const):
3368         (JSC::BuiltinNames::checkPublicToPrivateMapConsistency):
3369         (JSC::BuiltinNames::appendExternalName):
3370         (JSC::BuiltinNames::lookUpPublicName const): Deleted.
3371         * builtins/BuiltinUtils.h:
3372         * bytecode/BytecodeDumper.cpp:
3373         (JSC::BytecodeDumper<Block>::dumpIdentifiers):
3374         * bytecompiler/NodesCodegen.cpp:
3375         (JSC::BytecodeIntrinsicNode::emit_intrinsic_getByIdDirectPrivate):
3376         (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByIdDirectPrivate):
3377         * parser/Lexer.cpp:
3378         (JSC::Lexer<LChar>::parseIdentifier):
3379         (JSC::Lexer<UChar>::parseIdentifier):
3380         * parser/Parser.cpp:
3381         (JSC::Parser<LexerType>::createGeneratorParameters):
3382         (JSC::Parser<LexerType>::parseFunctionDeclaration):
3383         (JSC::Parser<LexerType>::parseAsyncFunctionDeclaration):
3384         (JSC::Parser<LexerType>::parseClassDeclaration):
3385         (JSC::Parser<LexerType>::parseExportDeclaration):
3386         (JSC::Parser<LexerType>::parseMemberExpression):
3387         * parser/ParserArena.h:
3388         (JSC::IdentifierArena::makeIdentifier):
3389         * runtime/CachedTypes.cpp:
3390         (JSC::CachedUniquedStringImpl::encode):
3391         (JSC::CachedUniquedStringImpl::decode const):
3392         * runtime/CommonIdentifiers.cpp:
3393         (JSC::CommonIdentifiers::CommonIdentifiers):
3394         (JSC::CommonIdentifiers::lookUpPrivateName const):
3395         (JSC::CommonIdentifiers::getPublicName const):
3396         (JSC::CommonIdentifiers::lookUpPublicName const): Deleted.
3397         * runtime/CommonIdentifiers.h:
3398         * runtime/ExceptionHelpers.cpp:
3399         (JSC::createUndefinedVariableError):
3400         * runtime/Identifier.cpp:
3401         (JSC::Identifier::dump const):
3402         * runtime/Identifier.h:
3403         * runtime/IdentifierInlines.h:
3404         (JSC::Identifier::fromUid):
3405         * runtime/JSTypedArrayViewPrototype.cpp:
3406         (JSC::JSTypedArrayViewPrototype::finishCreation):
3407         * tools/JSDollarVM.cpp:
3408         (JSC::functionGetPrivateProperty):
3409
3410 2019-02-06  Keith Rollin  <krollin@apple.com>
3411
3412         Really enable the automatic checking and regenerations of .xcfilelists during builds
3413         https://bugs.webkit.org/show_bug.cgi?id=194357
3414         <rdar://problem/47861231>
3415
3416         Reviewed by Chris Dumez.
3417
3418         Bug 194124 was supposed to enable the automatic checking and
3419         regenerating of .xcfilelist files during the build. While related
3420         changes were included in that patch, the change to actually enable the
3421         operation somehow was omitted. This patch actually enables the
3422         operation. The check-xcfilelist.sh scripts now check
3423         WK_DISABLE_CHECK_XCFILELISTS, and if it's "1", opts-out the developer
3424         from the checking.
3425
3426         * Scripts/check-xcfilelists.sh:
3427
3428 2019-02-06  Yusuke Suzuki  <ysuzuki@apple.com>
3429
3430         [JSC] Unify indirectEvalExecutableSpace and directEvalExecutableSpace
3431         https://bugs.webkit.org/show_bug.cgi?id=194339
3432
3433         Reviewed by Michael Saboff.
3434
3435         DirectEvalExecutable and IndirectEvalExecutable have completely same memory layout.
3436         They have even the same structure. This patch unifies the subspaces for them.
3437
3438         * runtime/DirectEvalExecutable.h:
3439         * runtime/EvalExecutable.h:
3440         (JSC::EvalExecutable::subspaceFor):
3441         * runtime/IndirectEvalExecutable.h:
3442         * runtime/VM.cpp:
3443         * runtime/VM.h:
3444         (JSC::VM::forEachScriptExecutableSpace):
3445
3446 2019-02-06  Yusuke Suzuki  <ysuzuki@apple.com>
3447
3448         [JSC] NativeExecutable should be smaller
3449         https://bugs.webkit.org/show_bug.cgi?id=194331
3450
3451         Reviewed by Michael Saboff.
3452
3453         NativeExecutable takes 88 bytes now. Since our GC rounds the size with 16, it actually takes 96 bytes in IsoSubspaces.
3454         Since a lot of NativeExecutable are allocated, we already has two MarkedBlocks even just after JSGlobalObject initialization.
3455         This patch makes sizeof(NativeExecutable) 64 bytes, which is 32 bytes smaller than 96 bytes. Now our JSGlobalObject initialization
3456         only takes one MarkedBlock for NativeExecutable.
3457
3458         To make NativeExecutable smaller,
3459
3460         1. m_numParametersForCall and m_numParametersForConstruct in ExecutableBase are only meaningful in ScriptExecutable subclasses. Since
3461            they are not touched from JIT, we can remove them from ExecutableBase and move them to ScriptExecutable.
3462
3463         2. DOMJIT::Signature* is rarely used. Rather than having it in NativeExecutable, we should put it in NativeJITCode. Since NativeExecutable
3464            always has JITCode, we can safely query the value from NativeExecutable. This patch creates NativeDOMJITCode, which is a subclass of
3465            NativeJITCode, and instantiated only when DOMJIT::Signature* is given.
3466
3467         3. Move Intrinsic to a member of ScriptExecutable or JITCode. Since JITCode has some paddings to put things, we can leverage this to put
3468            Intrinsic for NativeExecutable.
3469
3470         We also move "clearCode" code from ExecutableBase to ScriptExecutable since it is only valid for ScriptExecutable subclasses.
3471
3472         * CMakeLists.txt:
3473         * JavaScriptCore.xcodeproj/project.pbxproj:
3474         * bytecode/CallVariant.h:
3475         * interpreter/Interpreter.cpp:
3476         * jit/JITCode.cpp:
3477         (JSC::DirectJITCode::DirectJITCode):
3478         (JSC::NativeJITCode::NativeJITCode):
3479         (JSC::NativeDOMJITCode::NativeDOMJITCode):
3480         * jit/JITCode.h:
3481         (JSC::JITCode::signature const):
3482         (JSC::JITCode::intrinsic):
3483         * jit/JITOperations.cpp:
3484         * jit/JITThunks.cpp:
3485         (JSC::JITThunks::hostFunctionStub):
3486         * jit/Repatch.cpp:
3487         * llint/LLIntSlowPaths.cpp:
3488         * runtime/ExecutableBase.cpp:
3489         (JSC::ExecutableBase::dump const):
3490         (JSC::ExecutableBase::hashFor const):
3491         (JSC::ExecutableBase::hasClearableCode const): Deleted.
3492         (JSC::ExecutableBase::clearCode): Deleted.
3493         * runtime/ExecutableBase.h:
3494         (JSC::ExecutableBase::ExecutableBase):
3495         (JSC::ExecutableBase::isModuleProgramExecutable):
3496         (JSC::ExecutableBase::isHostFunction const):
3497         (JSC::ExecutableBase::generatedJITCodeForCall const):
3498         (JSC::ExecutableBase::generatedJITCodeForConstruct const):
3499         (JSC::ExecutableBase::generatedJITCodeFor const):
3500         (JSC::ExecutableBase::generatedJITCodeForCall): Deleted.
3501         (JSC::ExecutableBase::generatedJITCodeForConstruct): Deleted.
3502         (JSC::ExecutableBase::generatedJITCodeFor): Deleted.
3503         (JSC::ExecutableBase::offsetOfNumParametersFor): Deleted.
3504         (JSC::ExecutableBase::hasJITCodeForCall const): Deleted.
3505         (JSC::ExecutableBase::hasJITCodeForConstruct const): Deleted.
3506         (JSC::ExecutableBase::intrinsic const): Deleted.
3507         * runtime/ExecutableBaseInlines.h: Added.
3508         (JSC::ExecutableBase::intrinsic const):
3509         (JSC::ExecutableBase::hasJITCodeForCall const):
3510         (JSC::ExecutableBase::hasJITCodeForConstruct const):
3511         * runtime/JSBoundFunction.cpp:
3512         * runtime/JSType.cpp:
3513         (WTF::printInternal):
3514         * runtime/JSType.h:
3515         * runtime/NativeExecutable.cpp:
3516         (JSC::NativeExecutable::create):
3517         (JSC::NativeExecutable::createStructure):
3518         (JSC::NativeExecutable::NativeExecutable):
3519         (JSC::NativeExecutable::signatureFor const):
3520         (JSC::NativeExecutable::intrinsic const):
3521         * runtime/NativeExecutable.h:
3522         * runtime/ScriptExecutable.cpp:
3523         (JSC::ScriptExecutable::ScriptExecutable):
3524         (JSC::ScriptExecutable::clearCode):
3525         (JSC::ScriptExecutable::installCode):
3526         (JSC::ScriptExecutable::hasClearableCode const):
3527         * runtime/ScriptExecutable.h:
3528         (JSC::ScriptExecutable::intrinsic const):
3529         (JSC::ScriptExecutable::hasJITCodeForCall const):
3530         (JSC::ScriptExecutable::hasJITCodeForConstruct const):
3531         * runtime/VM.cpp:
3532         (JSC::VM::getHostFunction):
3533
3534 2019-02-06  Pablo Saavedra  <psaavedra@igalia.com>
3535
3536         Build failure after r240431
3537         https://bugs.webkit.org/show_bug.cgi?id=194330
3538
3539         Reviewed by Žan Doberšek.
3540
3541         * API/glib/JSCOptions.cpp:
3542
3543 2019-02-05  Mark Lam  <mark.lam@apple.com>
3544
3545         Fix DFG's doesGC() for a few more nodes.
3546         https://bugs.webkit.org/show_bug.cgi?id=194307
3547         <rdar://problem/47832956>
3548
3549         Reviewed by Yusuke Suzuki.
3550
3551         Fix doesGC() for the following nodes:
3552
3553             NumberToStringWithValidRadixConstant:
3554                 Calls operationInt32ToStringWithValidRadix(), which calls int32ToString(),
3555                 which can allocate a string.
3556                 Calls operationInt52ToStringWithValidRadix(), which calls int52ToString(),
3557                 which can allocate a string.
3558                 Calls operationDoubleToStringWithValidRadix(), which calls numberToString(),
3559                 which can allocate a string.
3560
3561             RegExpExecNonGlobalOrSticky: calls createRegExpMatchesArray() which allocates
3562                 memory for all kinds of objects.
3563             RegExpMatchFast: calls operationRegExpMatchFastString(), which calls
3564                 RegExpObject::execInline() and RegExpObject::matchGlobal().  Both of
3565                 these allocates memory for the match result.
3566             RegExpMatchFastGlobal: calls operationRegExpMatchFastGlobalString(), which
3567                 calls RegExpObject's collectMatches(), which allocates an array amongst
3568                 other objects.
3569
3570             StringFromCharCode:
3571                 If the uint32 code to convert is greater than maxSingleCharacterString,
3572                 we'll call operationStringFromCharCode(), which calls jsSingleCharacterString(),
3573                 which allocates a new string if the code is greater than maxSingleCharacterString.
3574
3575         Also fix SpeculativeJIT::compileFromCharCode() and FTL's compileStringFromCharCode()
3576         to use maxSingleCharacterString instead of a literal constant.
3577
3578         * dfg/DFGDoesGC.cpp:
3579         (JSC::DFG::doesGC):
3580         * dfg/DFGSpeculativeJIT.cpp:
3581         (JSC::DFG::SpeculativeJIT::compileFromCharCode):
3582         * ftl/FTLLowerDFGToB3.cpp:
3583         (JSC::FTL::DFG::LowerDFGToB3::compileStringFromCharCode):
3584
3585 2019-02-05  Keith Rollin  <krollin@apple.com>
3586
3587         Enable the automatic checking and regenerations of .xcfilelists during builds
3588         https://bugs.webkit.org/show_bug.cgi?id=194124
3589         <rdar://problem/47721277>
3590
3591         Reviewed by Tim Horton.
3592
3593         Bug 193790 add a facility for checking -- during build time -- that
3594         any needed .xcfilelist files are up-to-date and for updating them if
3595         they are not. This facility was initially opt-in by setting
3596         WK_ENABLE_CHECK_XCFILELISTS until other pieces were in place and until
3597         the process seemed robust. Its now time to enable this facility and
3598         make it opt-out. If there is a need to disable this facility, set and
3599         export WK_DISABLE_CHECK_XCFILELISTS=1 in your environment before
3600         running `make` or `build-webkit`, or before running Xcode from the
3601         command line.
3602
3603         Additionally, remove the step that generates a list of source files
3604         going into the UnifiedSources build step. It's only necessarily to
3605         specify Sources.txt and SourcesCocoa.txt as inputs.
3606
3607         * JavaScriptCore.xcodeproj/project.pbxproj:
3608         * UnifiedSources-input.xcfilelist: Removed.
3609
3610 2019-02-05  Keith Rollin  <krollin@apple.com>
3611
3612         Update .xcfilelist files
3613         https://bugs.webkit.org/show_bug.cgi?id=194121
3614         <rdar://problem/47720863>
3615
3616         Reviewed by Tim Horton.
3617
3618         Preparatory to enabling the facility for automatically updating the
3619         .xcfilelist files, check in a freshly-updated set so that not everyone
3620         runs up against having to regenerate them themselves.
3621
3622         * DerivedSources-input.xcfilelist:
3623         * DerivedSources-output.xcfilelist:
3624
3625 2019-02-05  Andy VanWagoner  <andy@vanwagoner.family>
3626
3627         [INTL] improve efficiency of Intl.NumberFormat formatToParts
3628         https://bugs.webkit.org/show_bug.cgi?id=185557
3629
3630         Reviewed by Mark Lam.
3631
3632         Since field nesting depth is minimal, this algorithm should be effectively O(n),
3633         where n is the number of characters in the formatted string.
3634         It may be less memory efficient than the previous impl, since the intermediate Vector
3635         is the length of the string, instead of the count of the fields.
3636
3637         * runtime/IntlNumberFormat.cpp:
3638         (JSC::IntlNumberFormat::formatToParts):
3639         * runtime/IntlNumberFormat.h:
3640
3641 2019-02-05  Mark Lam  <mark.lam@apple.com>
3642
3643         Move DFG nodes that clobberize() says will write(Heap) to the doesGC() list that returns true.
3644         https://bugs.webkit.org/show_bug.cgi?id=194298
3645         <rdar://problem/47827555>
3646
3647         Reviewed by Saam Barati.
3648
3649         We do this for 3 reasons:
3650         1. It's clearer when reading doesGC()'s code that these nodes will return true.
3651         2. If things change in the future where clobberize() no longer reports these nodes
3652            as write(Heap), each node should be vetted first to make sure that it can never
3653            GC before being moved back to the doesGC() list that returns false.
3654         3. This reduces the list of nodes that we need to audit to make sure doesGC() is
3655            correct in its claims about the nodes' GCing possibility.
3656
3657         The list of nodes moved are:
3658
3659             ArrayPush
3660             ArrayPop
3661             Call
3662             CallEval
3663             CallForwardVarargs
3664             CallVarargs
3665             Construct
3666             ConstructForwardVarargs
3667             ConstructVarargs
3668             DefineDataProperty
3669             DefineAccessorProperty
3670             DeleteById
3671             DeleteByVal
3672             DirectCall
3673             DirectConstruct
3674             DirectTailCallInlinedCaller
3675             GetById
3676             GetByIdDirect
3677             GetByIdDirectFlush
3678             GetByIdFlush
3679             GetByIdWithThis
3680             GetByValWithThis
3681             GetDirectPname
3682             GetDynamicVar
3683             HasGenericProperty
3684             HasOwnProperty
3685             HasStructureProperty
3686             InById
3687             InByVal
3688             InstanceOf
3689             InstanceOfCustom
3690             LoadVarargs
3691             NumberToStringWithRadix
3692             PutById
3693             PutByIdDirect
3694             PutByIdFlush
3695             PutByIdWithThis
3696             PutByOffset
3697             PutByValWithThis
3698             PutDynamicVar
3699             PutGetterById
3700             PutGetterByVal
3701             PutGetterSetterById
3702             PutSetterById
3703             PutSetterByVal
3704             PutStack
3705             PutToArguments
3706             RegExpExec
3707             RegExpTest
3708             ResolveScope
3709             ResolveScopeForHoistingFuncDeclInEval
3710             TailCall
3711             TailCallForwardVarargsInlinedCaller
3712             TailCallInlinedCaller
3713             TailCallVarargsInlinedCaller
3714             ToNumber
3715             ToPrimitive
3716             ValueNegate
3717
3718         * dfg/DFGDoesGC.cpp:
3719         (JSC::DFG::doesGC):
3720
3721 2019-02-05  Yusuke Suzuki  <ysuzuki@apple.com>
3722
3723         [JSC] Shrink sizeof(UnlinkedCodeBlock)
3724         https://bugs.webkit.org/show_bug.cgi?id=194281
3725
3726         Reviewed by Michael Saboff.
3727
3728         This patch first attempts to reduce the size of UnlinkedCodeBlock in a relatively simpler way. Reordering members, remove unused member, and
3729         move rarely used members to RareData. This changes sizeof(UnlinkedCodeBlock) from 312 to 256.
3730
3731         Still we have several chances to reduce sizeof(UnlinkedCodeBlock). Making more Vectors to RefCountedArrays can be done with some restructuring
3732         of generatorification phase. It would be possible to remove m_sourceURLDirective and m_sourceMappingURLDirective from UnlinkedCodeBlock since
3733         they should be in SourceProvider and that should be enough. These changes require some intrusive modifications and we make them as a future work.
3734
3735         * bytecode/CodeBlock.cpp:
3736         (JSC::CodeBlock::finishCreation):
3737         * bytecode/CodeBlock.h:
3738         (JSC::CodeBlock::bitVectors const): Deleted.
3739         * bytecode/CodeType.h:
3740         * bytecode/UnlinkedCodeBlock.cpp:
3741         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
3742         (JSC::UnlinkedCodeBlock::shrinkToFit):
3743         * bytecode/UnlinkedCodeBlock.h:
3744         (JSC::UnlinkedCodeBlock::bitVector):
3745         (JSC::UnlinkedCodeBlock::addBitVector):
3746         (JSC::UnlinkedCodeBlock::addSetConstant):
3747         (JSC::UnlinkedCodeBlock::constantRegisters):
3748         (JSC::UnlinkedCodeBlock::numberOfConstantIdentifierSets const):
3749         (JSC::UnlinkedCodeBlock::constantIdentifierSets):
3750         (JSC::UnlinkedCodeBlock::codeType const):
3751         (JSC::UnlinkedCodeBlock::didOptimize const):
3752         (JSC::UnlinkedCodeBlock::setDidOptimize):
3753         (JSC::UnlinkedCodeBlock::usesGlobalObject const): Deleted.
3754         (JSC::UnlinkedCodeBlock::setGlobalObjectRegister): Deleted.
3755         (JSC::UnlinkedCodeBlock::globalObjectRegister const): Deleted.
3756         (JSC::UnlinkedCodeBlock::bitVectors const): Deleted.
3757         * bytecompiler/BytecodeGenerator.cpp:
3758         (JSC::BytecodeGenerator::emitLoad):
3759         (JSC::BytecodeGenerator::emitLoadGlobalObject): Deleted.
3760         * bytecompiler/BytecodeGenerator.h:
3761         * runtime/CachedTypes.cpp:
3762         (JSC::CachedCodeBlockRareData::encode):
3763         (JSC::CachedCodeBlockRareData::decode const):
3764         (JSC::CachedCodeBlock::scopeRegister const):
3765         (JSC::CachedCodeBlock::codeType const):
3766         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
3767         (JSC::CachedCodeBlock<CodeBlockType>::decode const):
3768         (JSC::CachedCodeBlock<CodeBlockType>::encode):
3769         (JSC::CachedCodeBlock::globalObjectRegister const): Deleted.
3770
3771 2019-02-04  Yusuke Suzuki  <ysuzuki@apple.com>
3772
3773         Unreviewed, add missing exception checks after r240637
3774         https://bugs.webkit.org/show_bug.cgi?id=193546
3775
3776         * tools/JSDollarVM.cpp:
3777         (JSC::functionShadowChickenFunctionsOnStack):
3778
3779 2019-02-04  Yusuke Suzuki  <ysuzuki@apple.com>
3780
3781         [JSC] Shrink size of VM by lazily allocating IsoSubspaces for non-common types
3782         https://bugs.webkit.org/show_bug.cgi?id=193993
3783
3784         Reviewed by Keith Miller.
3785
3786         JSC::VM has a lot of IsoSubspaces, and each takes 504B. This unnecessarily makes VM so large.
3787         And some of them are rarely used. We should allocate it lazily.
3788
3789         In this patch, we make some `IsoSubspaces` `std::unique_ptr<IsoSubspace>`. And we add ensureXXXSpace
3790         functions which allocate IsoSubspaces lazily. This function is used by subspaceFor<> in each class.
3791         And we also add subspaceForConcurrently<> function, which is called from concurrent JIT tiers. This
3792         returns nullptr if the subspace is not allocated yet. JSCell::subspaceFor now takes second template
3793         parameter which tells the function whether subspaceFor is concurrently done. If the IsoSubspace is
3794         lazily created, we may return nullptr for the concurrent access. We ensure the space's initialization
3795         by using WTF::storeStoreFence when lazily allocating it.
3796
3797         In GC's constraint solving, we may touch these lazily allocated spaces. At that time, we check the
3798         existence of the space before touching this. This is not racy because the main thread is stopped when
3799         the constraint solving is working.
3800
3801         This changes sizeof(VM) from 64736 to 56472.
3802
3803         Another interesting thing is that we removed `PreventCollectionScope preventCollectionScope(heap);` in
3804         `Subspace::initialize`. This is really dangerous API since it easily causes dead-lock between the
3805         collector and the mutator if IsoSubspace is dynamically created. We do want to make IsoSubspaces
3806         dynamically-created ones since the requirement of the pre-allocation poses a scalability problem
3807         of IsoSubspace adoption because IsoSubspace is large. Registered Subspace is only touched in the
3808         EndPhase, and the peripheries should be stopped when running EndPhase. Thus, as long as the main thread
3809         can run this IsoSubspace code, the collector is never EndPhase. So this is safe.
3810
3811         * API/JSCallbackFunction.h:
3812         * API/ObjCCallbackFunction.h:
3813         (JSC::ObjCCallbackFunction::subspaceFor):
3814         * API/glib/JSCCallbackFunction.h:
3815         * CMakeLists.txt:
3816         * JavaScriptCore.xcodeproj/project.pbxproj:
3817         * bytecode/CodeBlock.cpp:
3818         (JSC::CodeBlock::visitChildren):
3819         (JSC::CodeBlock::finalizeUnconditionally):
3820         * bytecode/CodeBlock.h:
3821         * bytecode/EvalCodeBlock.h:
3822         * bytecode/ExecutableToCodeBlockEdge.h:
3823         * bytecode/FunctionCodeBlock.h:
3824         * bytecode/ModuleProgramCodeBlock.h:
3825         * bytecode/ProgramCodeBlock.h:
3826         * bytecode/UnlinkedFunctionExecutable.cpp:
3827         (JSC::UnlinkedFunctionExecutable::unlinkedCodeBlockFor):
3828         * bytecode/UnlinkedFunctionExecutable.h:
3829         * dfg/DFGSpeculativeJIT.cpp:
3830         (JSC::DFG::SpeculativeJIT::emitAllocateRawObject):
3831         (JSC::DFG::SpeculativeJIT::compileMakeRope):
3832         (JSC::DFG::SpeculativeJIT::compileNewObject):
3833         * ftl/FTLLowerDFGToB3.cpp:
3834         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
3835         (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject):
3836         (JSC::FTL::DFG::LowerDFGToB3::allocateObject):
3837         (JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedObject):
3838         (JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedCell):
3839         * heap/Heap.cpp:
3840         (JSC::Heap::finalizeUnconditionalFinalizers):
3841         (JSC::Heap::deleteAllCodeBlocks):
3842         (JSC::Heap::deleteAllUnlinkedCodeBlocks):
3843         (JSC::Heap::addCoreConstraints):
3844         * heap/Subspace.cpp:
3845         (JSC::Subspace::initialize):
3846         * jit/AssemblyHelpers.h:
3847         (JSC::AssemblyHelpers::emitAllocateJSObjectWithKnownSize):
3848         (JSC::AssemblyHelpers::emitAllocateVariableSizedCell):
3849         * jit/JITOpcodes.cpp:
3850         (JSC::JIT::emit_op_new_object):
3851         * jit/JITOpcodes32_64.cpp:
3852         (JSC::JIT::emit_op_new_object):
3853         * runtime/DirectArguments.h:
3854         * runtime/DirectEvalExecutable.h:
3855         * runtime/ErrorInstance.h:
3856         (JSC::ErrorInstance::subspaceFor):
3857         * runtime/ExecutableBase.h:
3858         * runtime/FunctionExecutable.h:
3859         * runtime/IndirectEvalExecutable.h:
3860         * runtime/InferredValue.cpp:
3861         (JSC::InferredValue::visitChildren):
3862         * runtime/InferredValue.h:
3863         * runtime/InferredValueInlines.h:
3864         (JSC::InferredValue::finalizeUnconditionally):
3865         * runtime/InternalFunction.h:
3866         * runtime/JSAsyncFunction.h:
3867         * runtime/JSAsyncGeneratorFunction.h:
3868         * runtime/JSBoundFunction.h:
3869         * runtime/JSCell.h:
3870         (JSC::subspaceFor):
3871         (JSC::subspaceForConcurrently):
3872         * runtime/JSCellInlines.h:
3873         (JSC::allocatorForNonVirtualConcurrently):
3874         * runtime/JSCustomGetterSetterFunction.h:
3875         * runtime/JSDestructibleObject.h:
3876         * runtime/JSFunction.h:
3877         * runtime/JSGeneratorFunction.h:
3878         * runtime/JSImmutableButterfly.h:
3879         * runtime/JSLexicalEnvironment.h:
3880         (JSC::JSLexicalEnvironment::subspaceFor):
3881         * runtime/JSNativeStdFunction.h:
3882         * runtime/JSSegmentedVariableObject.h:
3883         * runtime/JSString.h:
3884         * runtime/ModuleProgramExecutable.h:
3885         * runtime/NativeExecutable.h:
3886         * runtime/ProgramExecutable.h:
3887         * runtime/PropertyMapHashTable.h:
3888         * runtime/ProxyRevoke.h:
3889         * runtime/ScopedArguments.h:
3890         * runtime/ScriptExecutable.cpp:
3891         (JSC::ScriptExecutable::clearCode):
3892         (JSC::ScriptExecutable::installCode):