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