op_check_tdz does not def its argument
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2019-03-08  Tadeu Zagallo  <tzagallo@apple.com>
2
3         op_check_tdz does not def its argument
4         https://bugs.webkit.org/show_bug.cgi?id=192880
5         <rdar://problem/46221598>
6
7         Reviewed by Saam Barati.
8
9         This prevented the for-in loop optimization in the bytecode generator, since
10         the analysis sees a redefinition of the loop variable.
11
12         * bytecode/BytecodeUseDef.h:
13         (JSC::computeDefsForBytecodeOffset):
14
15 2019-03-07  Yusuke Suzuki  <ysuzuki@apple.com>
16
17         [JSC] Make more fields lazy in JSGlobalObject
18         https://bugs.webkit.org/show_bug.cgi?id=195449
19
20         Reviewed by Mark Lam.
21
22         This patch makes more fields lazy-allocated in JSGlobalObject to save memory.
23
24         1. Some minor structures like moduleRecordStructure.
25         2. Some functions like parseInt / parseFloat. While they are eagerly created in JIT mode anyway to materialize NumberConstructor, we can lazily allocate them in non JIT mode.
26         3. ArrayBuffer constructor. While it is eagerly allocated in WebCore, we can make lazily allocated in JSC.
27
28         * interpreter/Interpreter.cpp:
29         (JSC::Interpreter::execute):
30         * runtime/JSArrayBufferPrototype.h:
31         * runtime/JSGlobalObject.cpp:
32         (JSC::JSGlobalObject::init):
33         (JSC::JSGlobalObject::visitChildren):
34         * runtime/JSGlobalObject.h:
35         (JSC::JSGlobalObject::parseIntFunction const):
36         (JSC::JSGlobalObject::parseFloatFunction const):
37         (JSC::JSGlobalObject::evalFunction const):
38         (JSC::JSGlobalObject::strictEvalActivationStructure const):
39         (JSC::JSGlobalObject::moduleRecordStructure const):
40         (JSC::JSGlobalObject::moduleNamespaceObjectStructure const):
41         (JSC::JSGlobalObject::proxyObjectStructure const):
42         (JSC::JSGlobalObject::callableProxyObjectStructure const):
43         (JSC::JSGlobalObject::proxyRevokeStructure const):
44         (JSC::JSGlobalObject::arrayBufferConstructor const):
45         (JSC::JSGlobalObject::arrayBufferPrototype const):
46         (JSC::JSGlobalObject::arrayBufferStructure const):
47         * runtime/ProxyObject.h:
48         * runtime/StrictEvalActivation.cpp:
49         (JSC::StrictEvalActivation::StrictEvalActivation):
50         * runtime/StrictEvalActivation.h:
51         * wasm/js/JSWebAssemblyMemory.cpp:
52         (JSC::JSWebAssemblyMemory::buffer):
53         * wasm/js/WebAssemblyModuleConstructor.cpp:
54         (JSC::webAssemblyModuleCustomSections):
55
56 2019-03-07  Yusuke Suzuki  <ysuzuki@apple.com>
57
58         [JSC] Remove merging must handle values into proven types in CFA
59         https://bugs.webkit.org/show_bug.cgi?id=195444
60
61         Reviewed by Saam Barati.
62
63         Previously, we are merging must handle values as a proven constant in CFA. This is OK as long as this proven AbstractValue is blurred by merging the other legit AbstractValues
64         from the successors. But let's consider the following code, this is actually generated DFG graph from the attached test in r242626.
65
66             Block #2 (loop header) succ #3, #4
67             ...
68             1: ForceOSRExit
69             ...
70             2: JSConstant(0)
71             3: SetLocal(@2, loc6)
72             ...
73             4: Branch(#3, #4)
74
75             Block #3 (This is OSR entry target) pred #2, #3, must handle value for loc6 => JSConstant(Int32, 31)
76             ...
77             5: GetLocal(loc6)
78             6: StringFromCharCode(@5)
79             ...
80
81         Block #3 is OSR entry target. So we have must handle value for loc6 and it is Int32 constant 31. Then we merge this constant as a proven value in #3's loc6 AbstractValue.
82         If the value from #2 blurs the value, it is OK. However, #2 has ForceOSRExit. So must handle value suddenly becomes the only source of loc6 in #3. Then we use this constant
83         as a proven value. But this is not expected behavior since must handle value is just a snapshot of the locals when we kick off the concurrent compilation. In the above example,
84         we assume that loop index is an constant 31, but it is wrong, and OSR entry fails. Because there is no strong assumption that the must handle value is the proven type or value,
85         we should not merge it in CFA.
86
87         Since (1) this is just an optimization, (2) type information is already propagated in prediction injection phase, and (3) the must handle value does not show the performance
88         progression in r211461 and we no longer see type misprediction in marsaglia-osr-entry.js, this patch simply removes must handle value type widening in CFA.
89
90         * dfg/DFGCFAPhase.cpp:
91         (JSC::DFG::CFAPhase::run):
92         (JSC::DFG::CFAPhase::performBlockCFA):
93         (JSC::DFG::CFAPhase::injectOSR): Deleted.
94
95 2019-03-07  Yusuke Suzuki  <ysuzuki@apple.com>
96
97         [JSC] StringFromCharCode fast path should accept 0xff in DFG and FTL
98         https://bugs.webkit.org/show_bug.cgi?id=195429
99
100         Reviewed by Saam Barati.
101
102         We can create single characters without allocation up to 0xff character code. But currently, DFGSpeculativeJIT and FTLLowerDFGToB3 go to the slow path
103         for 0xff case. On the other hand, DFG DoesGC phase says GC won't happen if the child is int32 constant and it is <= 0xff. So, if you have `String.fromCharCode(0xff)`,
104         this breaks the assumption in DFG DoesGC. The correct fix is changing the check in DFGSpeculativeJIT and FTLLowerDFGToB3 from AboveOrEqual to Above.
105         Note that ThunkGenerators's StringFromCharCode thunk was correct.
106
107         * dfg/DFGSpeculativeJIT.cpp:
108         (JSC::DFG::SpeculativeJIT::compileFromCharCode):
109         * ftl/FTLLowerDFGToB3.cpp:
110         (JSC::FTL::DFG::LowerDFGToB3::compileStringFromCharCode):
111
112 2019-03-07  Mark Lam  <mark.lam@apple.com>
113
114         Follow up refactoring in try-finally code after r242591.
115         https://bugs.webkit.org/show_bug.cgi?id=195428
116
117         Reviewed by Saam Barati.
118
119         1. Added some comments in emitFinallyCompletion() to describe each completion case.
120         2. Converted CatchEntry into a struct.
121         3. Renamed variable hasBreaksOrContinuesNotCoveredByJumps to hasBreaksOrContinuesThatEscapeCurrentFinally
122            to be more clear about its purpose.
123
124         * bytecompiler/BytecodeGenerator.cpp:
125         (JSC::BytecodeGenerator::generate):
126         (JSC::BytecodeGenerator::emitOutOfLineExceptionHandler):
127         (JSC::BytecodeGenerator::emitFinallyCompletion):
128         * bytecompiler/BytecodeGenerator.h:
129
130 2019-03-07  Saam Barati  <sbarati@apple.com>
131
132         CompactVariableMap::Handle's copy operator= leaks the previous data
133         https://bugs.webkit.org/show_bug.cgi?id=195398
134
135         Reviewed by Yusuke Suzuki.
136
137         The copy constructor was just assigning |this| to the new value,
138         forgetting to decrement the ref count of the thing pointed to by
139         the |this| handle. Based on Yusuke's suggestion, this patch refactors
140         the move constructor, move operator=, and copy operator= to use the
141         swap() primitive and the copy constructor primitive.
142
143         * parser/VariableEnvironment.cpp:
144         (JSC::CompactVariableMap::Handle::Handle):
145         (JSC::CompactVariableMap::Handle::swap):
146         (JSC::CompactVariableMap::Handle::operator=): Deleted.
147         * parser/VariableEnvironment.h:
148         (JSC::CompactVariableMap::Handle::Handle):
149         (JSC::CompactVariableMap::Handle::operator=):
150
151 2019-03-07  Tadeu Zagallo  <tzagallo@apple.com>
152
153         Lazily decode cached bytecode
154         https://bugs.webkit.org/show_bug.cgi?id=194810
155
156         Reviewed by Saam Barati.
157
158         Like lazy parsing, we should pause at code block boundaries. Instead
159         of always eagerly decoding UnlinkedFunctionExecutable's UnlinkedCodeBlocks,
160         we store their offsets in the executable and lazily decode them on the next
161         call to `unlinkedCodeBlockFor`.
162
163         * bytecode/UnlinkedFunctionExecutable.cpp:
164         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
165         (JSC::UnlinkedFunctionExecutable::~UnlinkedFunctionExecutable):
166         (JSC::UnlinkedFunctionExecutable::visitChildren):
167         (JSC::UnlinkedFunctionExecutable::unlinkedCodeBlockFor):
168         (JSC::UnlinkedFunctionExecutable::decodeCachedCodeBlocks):
169         * bytecode/UnlinkedFunctionExecutable.h:
170         * runtime/CachedTypes.cpp:
171         (JSC::Decoder::Decoder):
172         (JSC::Decoder::~Decoder):
173         (JSC::Decoder::create):
174         (JSC::Decoder::offsetOf):
175         (JSC::Decoder::cacheOffset):
176         (JSC::Decoder::ptrForOffsetFromBase):
177         (JSC::Decoder::handleForEnvironment const):
178         (JSC::Decoder::setHandleForEnvironment):
179         (JSC::Decoder::addFinalizer):
180         (JSC::VariableLengthObject::isEmpty const):
181         (JSC::CachedWriteBarrier::isEmpty const):
182         (JSC::CachedFunctionExecutable::unlinkedCodeBlockForCall const):
183         (JSC::CachedFunctionExecutable::unlinkedCodeBlockForConstruct const):
184         (JSC::CachedFunctionExecutable::decode const):
185         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
186         (JSC::decodeCodeBlockImpl):
187         (JSC::isCachedBytecodeStillValid):
188         (JSC::decodeFunctionCodeBlock):
189         * runtime/CachedTypes.h:
190         (JSC::Decoder::vm):
191
192 2019-03-06  Mark Lam  <mark.lam@apple.com>
193
194         Exception is a JSCell, not a JSObject.
195         https://bugs.webkit.org/show_bug.cgi?id=195392
196
197         Reviewed by Saam Barati.
198
199         Exception is a VM implementation construct to carry a stack trace for the point
200         where it is thrown from.  As a reminder, an Exception is needed because:
201         1. JS code can throw primitives as well that are non-cells.
202         2. Error objects capture the stack trace at the point where they are constructed,
203            which is not always the same as the point where they are thrown (if they are
204            thrown).
205
206         Hence, Exception should not be visible to JS code, and therefore should not be a
207         JSObject.  Hence, it should not inherit from JSDestructibleObject.
208
209         This patch changes the following:
210
211         1. Exception now inherits directly from JSCell instead.
212
213         2. Places where we return an Exception masquerading as a JSObject* are now
214            updated to return a nullptr when we encounter an exception.
215
216         3. We still return Exception* as JSValue or EncodedJSValue when we encounter an
217            exception in functions that return JSValue or EncodedJSValue.  This is because
218            the number that implements the following pattern is too numerous:
219
220                 return throw<Some Error>(...)
221
222            We'll leave these as is for now.
223
224         * bytecode/CodeBlock.h:
225         (JSC::ScriptExecutable::prepareForExecution):
226         * interpreter/Interpreter.cpp:
227         (JSC::Interpreter::executeProgram):
228         (JSC::Interpreter::executeCall):
229         (JSC::Interpreter::executeConstruct):
230         (JSC::Interpreter::prepareForRepeatCall):
231         (JSC::Interpreter::execute):
232         (JSC::Interpreter::executeModuleProgram):
233         * jit/JITOperations.cpp:
234         * llint/LLIntSlowPaths.cpp:
235         (JSC::LLInt::setUpCall):
236         * runtime/ConstructData.cpp:
237         (JSC::construct):
238         * runtime/Error.cpp:
239         (JSC::throwConstructorCannotBeCalledAsFunctionTypeError):
240         (JSC::throwTypeError):
241         (JSC::throwSyntaxError):
242         * runtime/Error.h:
243         (JSC::throwRangeError):
244         * runtime/Exception.cpp:
245         (JSC::Exception::createStructure):
246         * runtime/Exception.h:
247         * runtime/ExceptionHelpers.cpp:
248         (JSC::throwOutOfMemoryError):
249         (JSC::throwStackOverflowError):
250         (JSC::throwTerminatedExecutionException):
251         * runtime/ExceptionHelpers.h:
252         * runtime/FunctionConstructor.cpp:
253         (JSC::constructFunction):
254         (JSC::constructFunctionSkippingEvalEnabledCheck):
255         * runtime/IntlPluralRules.cpp:
256         (JSC::IntlPluralRules::resolvedOptions):
257         * runtime/JSGenericTypedArrayViewConstructorInlines.h:
258         (JSC::constructGenericTypedArrayViewWithArguments):
259         * runtime/JSObject.h:
260         * runtime/ObjectConstructor.cpp:
261         (JSC::objectConstructorSeal):
262         (JSC::objectConstructorFreeze):
263         * runtime/ProgramExecutable.cpp:
264         (JSC::ProgramExecutable::initializeGlobalProperties):
265         * runtime/RegExpConstructor.cpp:
266         (JSC::regExpCreate):
267         (JSC::constructRegExp):
268         * runtime/ScriptExecutable.cpp:
269         (JSC::ScriptExecutable::newCodeBlockFor):
270         (JSC::ScriptExecutable::prepareForExecutionImpl):
271         * runtime/ScriptExecutable.h:
272         * runtime/ThrowScope.cpp:
273         (JSC::ThrowScope::throwException):
274         * runtime/ThrowScope.h:
275         (JSC::ThrowScope::throwException):
276         (JSC::throwException):
277         * runtime/VM.cpp:
278         (JSC::VM::throwException):
279         * runtime/VM.h:
280
281 2019-03-06  Ross Kirsling  <ross.kirsling@sony.com>
282
283         [Win] Remove -DUCHAR_TYPE=wchar_t stopgap and learn to live with char16_t.
284         https://bugs.webkit.org/show_bug.cgi?id=195346
285
286         Reviewed by Fujii Hironori.
287
288         * jsc.cpp:
289         (currentWorkingDirectory):
290         (fetchModuleFromLocalFileSystem):
291         * runtime/DateConversion.cpp:
292         (JSC::formatDateTime):
293         Use wchar helpers as needed.
294
295 2019-03-06  Mark Lam  <mark.lam@apple.com>
296
297         Fix incorrect handling of try-finally completion values.
298         https://bugs.webkit.org/show_bug.cgi?id=195131
299         <rdar://problem/46222079>
300
301         Reviewed by Saam Barati and Yusuke Suzuki.
302
303         Consider the following:
304
305             function foo() {                        // line 1
306                 try {
307                     return 42;                      // line 3
308                 } finally {
309                     for (var j = 0; j < 1; j++) {   // line 5
310                         try {
311                             throw '';               // line 7
312                         } finally {
313                             continue;               // line 9
314                         }
315                     }
316                 }                                   // line 11
317             }
318             var result = foo();
319
320         With the current (before fix) code base, result will be the exception object thrown
321         at line 7.  The expected result should be 42, returned at line 3.
322
323         The bug is that we were previously only using one set of completion type and
324         value registers for the entire function.  This is inadequate because the outer
325         try-finally needs to preserve its own completion type and value ({ Return, 42 }
326         in this case) in order to be able to complete correctly.
327
328         One might be deceived into thinking that the above example should complete with
329         the exception thrown at line 7.  However, according to Section 13.15.8 of the
330         ECMAScript spec, the 'continue' in the finally at line 9 counts as an abrupt
331         completion.  As a result, it overrides the throw from line 7.  After the continue,
332         execution resumes at the top of the loop at line 5, followed by a normal completion
333         at line 11.
334
335         Also according to Section 13.15.8, given that the completion type of the outer
336         finally is normal, the resultant completion of the outer try-finally should be
337         the completion of the outer try block i.e. { Return, 42 }.
338
339         This patch makes the following changes:
340         
341         1. Fix handling of finally completion to use a unique set of completion
342            type and value registers for each FinallyContext.
343
344         2. Move the setting of Throw completion type to the out of line exception handler.
345            This makes the mainline code slightly less branchy.
346
347         3. Introduce emitOutOfLineCatchHandler(), emitOutOfLineFinallyHandler(), and
348            emitOutOfLineExceptionHandler() to make it clearer that these are not emitting
349            bytecode inline.  Also, these make it clearer when we're emitting a handler
350            for a catch vs a finally.
351
352         4. Allocate the FinallyContext on the stack instead of as a member of the
353            heap allocated ControlFlowScope.  This simplifies its life-cycle management
354            and reduces the amount of needed copying.
355
356         5. Update emitFinallyCompletion() to propagate the completion type and value to
357            the outer FinallyContext when needed.
358
359         6. Fix emitJumpIf() to use the right order of operands.  Previously, we were
360            only using it to do op_stricteq and op_nstricteq comparisons.  So, the order
361            wasn't important.  We now use it to also do op_beloweq comparisons.  Hence,
362            the order needs to be corrected.
363
364         7. Remove the unused CompletionType::Break and Continue.  These are encoded with
365            the jumpIDs of the jump targets instead.
366
367         Relevant specifications:
368         Section 13.15.8: https://www.ecma-international.org/ecma-262/9.0/index.html#sec-try-statement-runtime-semantics-evaluation
369         Section 6.3.2.4: https://www.ecma-international.org/ecma-262/9.0/index.html#sec-updateempty
370
371         * bytecompiler/BytecodeGenerator.cpp:
372         (JSC::FinallyContext::FinallyContext):
373         (JSC::BytecodeGenerator::generate):
374         (JSC::BytecodeGenerator::BytecodeGenerator):
375         (JSC::BytecodeGenerator::pushFinallyControlFlowScope):
376         (JSC::BytecodeGenerator::popFinallyControlFlowScope):
377         (JSC::BytecodeGenerator::emitOutOfLineCatchHandler):
378         (JSC::BytecodeGenerator::emitOutOfLineFinallyHandler):
379         (JSC::BytecodeGenerator::emitOutOfLineExceptionHandler):
380         (JSC::BytecodeGenerator::emitEnumeration):
381         (JSC::BytecodeGenerator::emitJumpViaFinallyIfNeeded):
382         (JSC::BytecodeGenerator::emitReturnViaFinallyIfNeeded):
383         (JSC::BytecodeGenerator::emitFinallyCompletion):
384         (JSC::BytecodeGenerator::emitJumpIf):
385         (JSC::BytecodeGenerator::emitCatch): Deleted.
386         (JSC::BytecodeGenerator::allocateCompletionRecordRegisters): Deleted.
387         (JSC::BytecodeGenerator::releaseCompletionRecordRegisters): Deleted.
388         * bytecompiler/BytecodeGenerator.h:
389         (JSC::FinallyContext::completionTypeRegister const):
390         (JSC::FinallyContext::completionValueRegister const):
391         (JSC::ControlFlowScope::ControlFlowScope):
392         (JSC::BytecodeGenerator::emitLoad):
393         (JSC::BytecodeGenerator::CompletionRecordScope::CompletionRecordScope): Deleted.
394         (JSC::BytecodeGenerator::CompletionRecordScope::~CompletionRecordScope): Deleted.
395         (JSC::BytecodeGenerator::completionTypeRegister const): Deleted.
396         (JSC::BytecodeGenerator::completionValueRegister const): Deleted.
397         (JSC::BytecodeGenerator::emitSetCompletionType): Deleted.
398         (JSC::BytecodeGenerator::emitSetCompletionValue): Deleted.
399         * bytecompiler/NodesCodegen.cpp:
400         (JSC::TryNode::emitBytecode):
401
402 2019-03-06  Saam Barati  <sbarati@apple.com>
403
404         JSScript should keep the cache file locked for the duration of its existence and should truncate the cache when it is out of date
405         https://bugs.webkit.org/show_bug.cgi?id=195186
406
407         Reviewed by Keith Miller.
408
409         This patch makes it so that JSScript will keep its bytecode cache file
410         locked as long as the JSScript is alive. This makes it obvious that it's
411         safe to update that file, as it will only be used in a single VM, across
412         all processes, at a single time. We may be able to extend this in the future
413         if we can atomically update it across VMs/processes. However, we're choosing
414         more restricted semantics now as it's always easier to extend these semantics
415         in the future opposed to having to support the more flexible behavior
416         up front.
417         
418         This patch also:
419         - Adds error messages if writing the cache fails. We don't expect this to
420           fail, but previously we would say we cached it even if write() fails.
421         - Removes the unused m_moduleKey field.
422         - Makes calling cacheBytecodeWithError with an already non-empty cache file fail.
423           In the future, we should extend this to just fill in the parts of the cache
424           that are not present. But we don't have the ability to do that yet, so we
425           just result in an error for now.
426
427         * API/JSScript.mm:
428         (-[JSScript dealloc]):
429         (-[JSScript readCache]):
430         (-[JSScript init]):
431         (-[JSScript writeCache:]):
432         * API/JSScriptInternal.h:
433         * API/tests/testapi.mm:
434         (testCacheFileIsExclusive):
435         (testCacheFileFailsWhenItsAlreadyCached):
436         (testObjectiveCAPI):
437
438 2019-03-06  Christopher Reid  <chris.reid@sony.com>
439
440         Followups to (r242306): Use LockHolder instead of std::lock_guard on Remote Inspector Locks
441         https://bugs.webkit.org/show_bug.cgi?id=195381
442
443         Reviewed by Mark Lam.
444
445         Replacing std::lock_guard uses in Remote Inspector with WTF::LockHolder.
446         Also using `= { }` for struct initialization instead of memeset.
447
448         * inspector/remote/RemoteConnectionToTarget.cpp:
449         * inspector/remote/RemoteInspector.cpp:
450         * inspector/remote/cocoa/RemoteConnectionToTargetCocoa.mm:
451         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
452         * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm:
453         * inspector/remote/glib/RemoteInspectorGlib.cpp:
454         * inspector/remote/playstation/RemoteInspectorPlayStation.cpp:
455         * inspector/remote/playstation/RemoteInspectorSocketClientPlayStation.cpp:
456         * inspector/remote/playstation/RemoteInspectorSocketPlayStation.cpp:
457         * inspector/remote/playstation/RemoteInspectorSocketServerPlayStation.cpp:
458
459 2019-03-06  Saam Barati  <sbarati@apple.com>
460
461         Air::reportUsedRegisters must padInterference
462         https://bugs.webkit.org/show_bug.cgi?id=195303
463         <rdar://problem/48270343>
464
465         Reviewed by Keith Miller.
466
467         reportUsedRegisters uses reg liveness to eliminate loads/moves into dead
468         registers. However, liveness can report incorrect results in certain 
469         scenarios when considering liveness at instruction boundaries. For example,
470         it can go wrong when an Inst has a LateUse of a register and the following
471         Inst has an EarlyDef of that same register. Such a scenario could lead us
472         to incorrectly say the register is not live-in to the first Inst. Pad
473         interference inserts Nops between such instruction boundaries that cause
474         this issue.
475         
476         The test with this patch fixes the issue in reportUsedRegisters. This patch
477         also conservatively makes it so that lowerAfterRegAlloc calls padInterference
478         since it also reasons about liveness.
479
480         * b3/air/AirLowerAfterRegAlloc.cpp:
481         (JSC::B3::Air::lowerAfterRegAlloc):
482         * b3/air/AirPadInterference.h:
483         * b3/air/AirReportUsedRegisters.cpp:
484         (JSC::B3::Air::reportUsedRegisters):
485         * b3/testb3.cpp:
486         (JSC::B3::testReportUsedRegistersLateUseNotDead):
487         (JSC::B3::run):
488
489 2019-03-06  Yusuke Suzuki  <ysuzuki@apple.com>
490
491         [JSC] AI should not propagate AbstractValue relying on constant folding phase
492         https://bugs.webkit.org/show_bug.cgi?id=195375
493
494         Reviewed by Saam Barati.
495
496         MakeRope rule in AI attempts to propagate the node, which will be produced after constant folding phase runs.
497         This is wrong since we do not guarantee that constant folding phase runs after AI runs (e.g. DFGSpeculativeJIT
498         and FTLLowerDFGToB3 run AI). This results in the bug that the value produced at runtime is different from the
499         proven constant value in AI. In the attached test, AI says the value is SpecStringIdent while the resulted value
500         at runtime is SpecStringVar, resulting in wrong MakeRope code. This patch removes the path propagating the node
501         relying on constant folding phase.
502
503         * dfg/DFGAbstractInterpreterInlines.h:
504         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
505
506 2019-03-05  Saam barati  <sbarati@apple.com>
507
508         op_switch_char broken for rope strings after JSRopeString layout rewrite
509         https://bugs.webkit.org/show_bug.cgi?id=195339
510         <rdar://problem/48592545>
511
512         Reviewed by Yusuke Suzuki.
513
514         When we did the JSString rewrite, we accidentally broke LLInt's switch_char
515         for rope strings. That change made it so that we always go to the slow path
516         for ropes. That's wrong. The slow path should only be taken when the rope
517         is of length 1. For lengths other than 1, we need to fall through to the
518         default case. This patch fixes this.
519
520         * llint/LowLevelInterpreter32_64.asm:
521         * llint/LowLevelInterpreter64.asm:
522         * runtime/JSString.h:
523
524 2019-03-05  Yusuke Suzuki  <ysuzuki@apple.com>
525
526         [JSC] Should check exception for JSString::toExistingAtomicString
527         https://bugs.webkit.org/show_bug.cgi?id=195337
528
529         Reviewed by Keith Miller, Saam Barati, and Mark Lam.
530
531         We missed the exception check for JSString::toExistingAtomicString while it can resolve
532         a rope and throw an OOM exception. This patch adds necessary exception checks. This patch
533         fixes test failures in debug build, reported in https://bugs.webkit.org/show_bug.cgi?id=194375#c93.
534
535         * dfg/DFGOperations.cpp:
536         * jit/JITOperations.cpp:
537         (JSC::getByVal):
538         * llint/LLIntSlowPaths.cpp:
539         (JSC::LLInt::getByVal):
540         * runtime/CommonSlowPaths.cpp:
541         (JSC::SLOW_PATH_DECL):
542
543 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
544
545         Unreviewed, build fix for debug builds after r242397
546
547         * runtime/JSString.h:
548
549 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
550
551         [JSC] Store bits for JSRopeString in 3 stores
552         https://bugs.webkit.org/show_bug.cgi?id=195234
553
554         Reviewed by Saam Barati.
555
556         This patch cleans up the initialization of JSRopeString fields in DFG and FTL.
557         Previously, we store some part of data separately. Instead, this patch calculates
558         the data first by bit operations and store calculated data with fewer stores.
559
560         This patch also cleans up is8Bit and isSubstring flags. We put them in lower bits
561         of the first fiber instead of the upper 16 bits. Since we only have 3 bit flags, (isRope, is8Bit, isSubstring),
562         we can put them into the lower 3 bits, they are always empty due to alignment.
563
564         * bytecode/AccessCase.cpp:
565         (JSC::AccessCase::generateImpl): A bit clean up of StringLength IC to give a chance of unnecessary mov removal.
566         * dfg/DFGSpeculativeJIT.cpp:
567         (JSC::DFG::SpeculativeJIT::canBeRope):
568         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
569         (JSC::DFG::SpeculativeJIT::compileMakeRope):
570         * dfg/DFGSpeculativeJIT.h:
571         * ftl/FTLAbstractHeapRepository.cpp:
572         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
573         * ftl/FTLAbstractHeapRepository.h:
574         * ftl/FTLLowerDFGToB3.cpp:
575         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
576         (JSC::FTL::DFG::LowerDFGToB3::isRopeString):
577         (JSC::FTL::DFG::LowerDFGToB3::isNotRopeString):
578         * runtime/JSString.cpp:
579         (JSC::JSString::visitChildren):
580         * runtime/JSString.h:
581         (JSC::JSString::is8Bit const):
582         (JSC::JSString::isSubstring const):
583         * tools/JSDollarVM.cpp:
584         (JSC::functionCreateNullRopeString):
585         (JSC::JSDollarVM::finishCreation):
586
587 2019-03-04  Joseph Pecoraro  <pecoraro@apple.com>
588
589         ITMLKit Inspector: Data Bindings / Associated Data for nodes
590         https://bugs.webkit.org/show_bug.cgi?id=195290
591         <rdar://problem/48304019>
592
593         Reviewed by Devin Rousso.
594
595         * inspector/protocol/DOM.json:
596
597 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
598
599         [JSC] Make Reflect lazily-allocated by dropping @Reflect references from builtin JS
600         https://bugs.webkit.org/show_bug.cgi?id=195250
601
602         Reviewed by Saam Barati.
603
604         By removing @Reflect from builtin JS, we can make Reflect object allocation lazy.
605         We move @ownKeys function from @Reflect to @Object to remove @Reflect reference.
606
607         We also remove m_intlObject field from JSGlobalObject since we no longer use it.
608
609         * builtins/BuiltinNames.h:
610         * builtins/GlobalOperations.js:
611         (globalPrivate.copyDataProperties):
612         (globalPrivate.copyDataPropertiesNoExclusions):
613         * runtime/JSGlobalObject.cpp:
614         (JSC::createReflectProperty):
615         (JSC::JSGlobalObject::init):
616         (JSC::JSGlobalObject::visitChildren):
617         * runtime/JSGlobalObject.h:
618         * runtime/ObjectConstructor.cpp:
619         (JSC::ObjectConstructor::finishCreation):
620         (JSC::objectConstructorOwnKeys):
621         * runtime/ReflectObject.cpp:
622         (JSC::ReflectObject::finishCreation):
623
624 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
625
626         [JSC] Offer @makeTypeError instead of exposing @TypeError
627         https://bugs.webkit.org/show_bug.cgi?id=193858
628
629         Reviewed by Mark Lam.
630
631         Instead of exposing @TypeError, we expose @makeTypeError function.
632         And we make TypeError and Error lazily-allocated objects in non JIT environment.
633         In JIT environment, only TypeError becomes lazily-allocated since WebAssembly errors
634         touch Error prototype anyway. But we can make them lazy in a subsequent patch.
635
636         * builtins/AsyncFromSyncIteratorPrototype.js:
637         * builtins/AsyncGeneratorPrototype.js:
638         (globalPrivate.asyncGeneratorEnqueue):
639         * builtins/BuiltinNames.h:
640         * builtins/PromiseOperations.js:
641         (globalPrivate.createResolvingFunctions.resolve):
642         * runtime/JSGlobalObject.cpp:
643         (JSC::JSGlobalObject::initializeErrorConstructor):
644         (JSC::JSGlobalObject::init):
645         (JSC::JSGlobalObject::visitChildren):
646         * runtime/JSGlobalObject.h:
647         (JSC::JSGlobalObject::errorPrototype const):
648         (JSC::JSGlobalObject::errorStructure const):
649         * runtime/JSGlobalObjectFunctions.cpp:
650         (JSC::globalFuncMakeTypeError):
651         * runtime/JSGlobalObjectFunctions.h:
652
653 2019-03-04  Carlos Garcia Campos  <cgarcia@igalia.com>
654
655         [GLib] Returning G_TYPE_OBJECT from a constructor does not work
656         https://bugs.webkit.org/show_bug.cgi?id=195206
657
658         Reviewed by Žan Doberšek.
659
660         We are freeing the newly created object before returning from the constructor.
661
662         * API/glib/JSCCallbackFunction.cpp:
663         (JSC::JSCCallbackFunction::construct):
664
665 2019-03-02  Darin Adler  <darin@apple.com>
666
667         Retire legacy dtoa function and DecimalNumber class
668         https://bugs.webkit.org/show_bug.cgi?id=195253
669
670         Reviewed by Daniel Bates.
671
672         * runtime/NumberPrototype.cpp:
673         (JSC::numberProtoFuncToExponential): Removed dependency on NumberToStringBufferLength,
674         using NumberToStringBuffer instead. Also tweaked style of implementation a bit.
675
676 2019-03-01  Darin Adler  <darin@apple.com>
677
678         Finish removing String::format
679         https://bugs.webkit.org/show_bug.cgi?id=194893
680
681         Reviewed by Daniel Bates.
682
683         * bytecode/CodeBlock.cpp:
684         (JSC::CodeBlock::nameForRegister): Use makeString instead of String::format,
685         using the new "pad" function.
686
687 2019-03-01  Christopher Reid  <chris.reid@sony.com>
688
689         [PlayStation] Upstream playstation's remote inspector server
690         https://bugs.webkit.org/show_bug.cgi?id=193806
691
692         Reviewed by Joseph Pecoraro.
693
694         Upstreaming PlayStation's Remote Inspector implementation.
695         It is using a JSON RPC protocol over TCP sockets.
696         This inspector implementation is planned to also support running on a WinCairo Client and Server.
697
698         * PlatformPlayStation.cmake:
699         * SourcesGTK.txt:
700         * SourcesWPE.txt:
701         * inspector/remote/RemoteConnectionToTarget.cpp: Renamed from Source/JavaScriptCore/inspector/remote/glib/RemoteConnectionToTargetGlib.cpp.
702         * inspector/remote/RemoteInspector.h:
703         * inspector/remote/playstation/RemoteInspectorConnectionClient.h: Added.
704         * inspector/remote/playstation/RemoteInspectorConnectionClientPlayStation.cpp: Added.
705         * inspector/remote/playstation/RemoteInspectorMessageParser.h: Added.
706         * inspector/remote/playstation/RemoteInspectorMessageParserPlayStation.cpp: Added.
707         * inspector/remote/playstation/RemoteInspectorPlayStation.cpp: Added.
708         * inspector/remote/playstation/RemoteInspectorServer.h: Added.
709         * inspector/remote/playstation/RemoteInspectorServerPlayStation.cpp: Added.
710         * inspector/remote/playstation/RemoteInspectorSocket.h: Added.
711         * inspector/remote/playstation/RemoteInspectorSocketClient.h: Added.
712         * inspector/remote/playstation/RemoteInspectorSocketClientPlayStation.cpp: Added.
713         * inspector/remote/playstation/RemoteInspectorSocketPlayStation.cpp: Added.
714         * inspector/remote/playstation/RemoteInspectorSocketServer.h: Added.
715         * inspector/remote/playstation/RemoteInspectorSocketServerPlayStation.cpp: Added.
716
717 2019-03-01  Saam Barati  <sbarati@apple.com>
718
719         Create SPI to crash if a JSC VM is created
720         https://bugs.webkit.org/show_bug.cgi?id=195231
721         <rdar://problem/47717990>
722
723         Reviewed by Mark Lam.
724
725         * API/JSVirtualMachine.mm:
726         (+[JSVirtualMachine setCrashOnVMCreation:]):
727         * API/JSVirtualMachinePrivate.h:
728         * runtime/VM.cpp:
729         (JSC::VM::VM):
730         (JSC::VM::setCrashOnVMCreation):
731         * runtime/VM.h:
732
733 2019-03-01  Yusuke Suzuki  <ysuzuki@apple.com>
734
735         [JSC] Fix FTL build on ARM32_64 by adding stubs for JSRopeString::offsetOfXXX
736         https://bugs.webkit.org/show_bug.cgi?id=195235
737
738         Reviewed by Saam Barati.
739
740         This is a workaround until https://bugs.webkit.org/show_bug.cgi?id=195234 is done.
741
742         * runtime/JSString.h:
743
744 2019-03-01  Yusuke Suzuki  <ysuzuki@apple.com>
745
746         [JSC] Use runtime calls for DFG MakeRope if !CPU(ADDRESS64)
747         https://bugs.webkit.org/show_bug.cgi?id=195221
748
749         Reviewed by Mark Lam.
750
751         ARM32_64 builds DFG 64bit, but the size of address is 32bit. Make DFG MakeRope a runtime call not only for DFG 32_64,
752         but also DFG 64 with !CPU(ADDRESS64). This patch unifies compileMakeRope again, and use a runtime call for !CPU(ADDRESS64).
753
754         * dfg/DFGSpeculativeJIT.cpp:
755         (JSC::DFG::SpeculativeJIT::compileMakeRope):
756         * dfg/DFGSpeculativeJIT32_64.cpp:
757         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
758         * dfg/DFGSpeculativeJIT64.cpp:
759         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
760
761 2019-03-01  Justin Fan  <justin_fan@apple.com>
762
763         [Web GPU] 32-bit builds broken by attempt to disable WebGPU on 32-bit
764         https://bugs.webkit.org/show_bug.cgi?id=195191
765
766         Rubber-stamped by Dean Jackson.
767
768         Dropping support for 32-bit entirely, so I'm intentionally leaving 32-bit broken.
769
770         * Configurations/FeatureDefines.xcconfig:
771
772 2019-03-01  Dominik Infuehr  <dinfuehr@igalia.com>
773
774         Fix debug builds with GCC
775         https://bugs.webkit.org/show_bug.cgi?id=195205
776
777         Unreviewed. Fix debug builds in GCC by removing
778         the constexpr-keyword for this function.
779
780         * runtime/CachedTypes.cpp:
781         (JSC::tagFromSourceCodeType):
782
783 2019-03-01  Dominik Infuehr  <dinfuehr@igalia.com>
784
785         [ARM] Fix assembler warnings in ctiMasmProbeTrampoline
786         https://bugs.webkit.org/show_bug.cgi?id=195164
787
788         Reviewed by Mark Lam.
789
790         Short branches in IT blocks are deprecated in AArch32. In addition the
791         the conditional branch was the only instruction in the IT block. Short
792         branches are able to encode the condition code themselves, the additional
793         IT instruction is not needed.
794
795         The assembler was also warning that writing into APSR without a bitmask
796         was deprecated. Therefore use APSR_nzcvq instead, this generates the same
797         instruction encoding.
798
799         * assembler/MacroAssemblerARMv7.cpp:
800
801 2019-02-28  Tadeu Zagallo  <tzagallo@apple.com>
802
803         Remove CachedPtr::m_isEmpty and CachedOptional::m_isEmpty fields
804         https://bugs.webkit.org/show_bug.cgi?id=194999
805
806         Reviewed by Saam Barati.
807
808         These fields are unnecessary, since we can just check that m_offset
809         has not been initialized (I added VariableLengthObject::isEmpty for
810         that). They also add 7-byte padding to these classes, which is pretty
811         bad given how frequently CachedPtr is used.
812
813         * runtime/CachedTypes.cpp:
814         (JSC::CachedObject::operator new[]):
815         (JSC::VariableLengthObject::allocate):
816         (JSC::VariableLengthObject::isEmpty const):
817         (JSC::CachedPtr::encode):
818         (JSC::CachedPtr::decode const):
819         (JSC::CachedPtr::get const):
820         (JSC::CachedOptional::encode):
821         (JSC::CachedOptional::decode const):
822         (JSC::CachedOptional::decodeAsPtr const):
823
824 2019-02-28  Yusuke Suzuki  <ysuzuki@apple.com>
825
826         [JSC] sizeof(JSString) should be 16
827         https://bugs.webkit.org/show_bug.cgi?id=194375
828
829         Reviewed by Saam Barati.
830
831         This patch reduces sizeof(JSString) from 24 to 16 to fit it into GC heap cell atom. And it also reduces sizeof(JSRopeString) from 48 to 32.
832         Both classes cut 16 bytes per instance in GC allocation. This new layout is used in 64bit architectures which has little endianess.
833
834         JSString no longer has length and flags directly. JSString has String, and we query information to this String instead of holding duplicate
835         information in JSString. We embed isRope bit into this String's pointer so that we can convert JSRopeString to JSString in an atomic manner.
836         We emit store-store fence before we put String pointer. This should exist even before this patch, so this patch also fixes one concurrency issue.
837
838         The old JSRopeString separately had JSString* fibers along with String. In this patch, we merge the first JSString* fiber and String pointer
839         storage into one to reduce the size of JSRopeString. JSRopeString has three pointer width storage. We pick 48bit effective address of JSString*
840         fibers to compress three fibers + length + flags into three pointer width storage.
841
842         In 64bit architecture, JSString and JSRopeString have the following memory layout to make sizeof(JSString) == 16 and sizeof(JSRopeString) == 32.
843         JSString has only one pointer. We use it for String. length() and is8Bit() queries go to StringImpl. In JSRopeString, we reuse the above pointer
844         place for the 1st fiber. JSRopeString has three fibers so its size is 48. To keep length and is8Bit flag information in JSRopeString, JSRopeString
845         encodes these information into the fiber pointers. is8Bit flag is encoded in the 1st fiber pointer. length is embedded directly, and two fibers
846         are compressed into 12bytes. isRope information is encoded in the first fiber's LSB.
847
848         Since length of JSRopeString should be frequently accessed compared to each fiber, we put length in contiguous 32byte field, and compress 2nd
849         and 3rd fibers into the following 80byte fields. One problem is that now 2nd and 3rd fibers are split. Storing and loading 2nd and 3rd fibers
850         are not one pointer load operation. To make concurrent collector work correctly, we must initialize 2nd and 3rd fibers at JSRopeString creation
851         and we must not modify these part later.
852
853                      0                        8        10               16                       32                                     48
854         JSString     [   ID      ][  header  ][   String pointer      0]
855         JSRopeString [   ID      ][  header  ][ flags ][ 1st fiber    1][  length  ][2nd lower32][2nd upper16][3rd lower16][3rd upper32]
856                                                                       ^
857                                                                    isRope bit
858
859         Since fibers in JSRopeString are not initialized in atomic pointer store manner, we must initialize all the fiber fields at JSRopeString creation.
860         To achieve this, we modify our JSRopeString::RopeBuilder implementation not to create half-baked JSRopeString.
861
862         This patch also makes an empty JSString singleton per VM. This makes evaluation of JSString in boolean context one pointer comparison. This is
863         critical in this change since this patch enlarges the code necessary to get length from JSString in JIT. Without this guarantee, our code of boolean
864         context evaluation is bloated. This patch hides all the JSString::create and JSRopeString::create in the private permission. JSString and JSRopeString
865         creation is only allowed from jsString and related helper functions and they return a singleton empty JSString if the length is zero. We also change
866         JSRopeString::RopeBuilder not to construct an empty JSRopeString.
867
868         This patch is performance neutral in Speedometer2 and JetStream2. And it improves RAMification by 2.7%.
869
870         * JavaScriptCore.xcodeproj/project.pbxproj:
871         * assembler/MacroAssemblerARM64.h:
872         (JSC::MacroAssemblerARM64::storeZero16):
873         * assembler/MacroAssemblerX86Common.h:
874         (JSC::MacroAssemblerX86Common::storeZero16):
875         (JSC::MacroAssemblerX86Common::store16):
876         * bytecode/AccessCase.cpp:
877         (JSC::AccessCase::generateImpl):
878         * bytecode/InlineAccess.cpp:
879         (JSC::InlineAccess::dumpCacheSizesAndCrash):
880         (JSC::linkCodeInline):
881         (JSC::InlineAccess::isCacheableStringLength):
882         (JSC::InlineAccess::generateStringLength):
883         * bytecode/InlineAccess.h:
884         (JSC::InlineAccess::sizeForPropertyAccess):
885         (JSC::InlineAccess::sizeForPropertyReplace):
886         (JSC::InlineAccess::sizeForLengthAccess):
887         * dfg/DFGOperations.cpp:
888         * dfg/DFGOperations.h:
889         * dfg/DFGSpeculativeJIT.cpp:
890         (JSC::DFG::SpeculativeJIT::compileStringSlice):
891         (JSC::DFG::SpeculativeJIT::compileToLowerCase):
892         (JSC::DFG::SpeculativeJIT::compileGetCharCodeAt):
893         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
894         (JSC::DFG::SpeculativeJIT::compileStringEquality):
895         (JSC::DFG::SpeculativeJIT::compileStringZeroLength):
896         (JSC::DFG::SpeculativeJIT::compileLogicalNotStringOrOther):
897         (JSC::DFG::SpeculativeJIT::emitStringBranch):
898         (JSC::DFG::SpeculativeJIT::emitStringOrOtherBranch):
899         (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage):
900         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
901         (JSC::DFG::SpeculativeJIT::emitPopulateSliceIndex):
902         (JSC::DFG::SpeculativeJIT::compileArraySlice):
903         (JSC::DFG::SpeculativeJIT::compileArrayIndexOf):
904         (JSC::DFG::SpeculativeJIT::speculateStringIdentAndLoadStorage):
905         (JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
906         (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
907         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
908         * dfg/DFGSpeculativeJIT.h:
909         * dfg/DFGSpeculativeJIT32_64.cpp:
910         (JSC::DFG::SpeculativeJIT::compile):
911         (JSC::DFG::SpeculativeJIT::compileMakeRope):
912         * dfg/DFGSpeculativeJIT64.cpp:
913         (JSC::DFG::SpeculativeJIT::compile):
914         (JSC::DFG::SpeculativeJIT::compileMakeRope):
915         * ftl/FTLAbstractHeapRepository.cpp:
916         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
917         * ftl/FTLAbstractHeapRepository.h:
918         * ftl/FTLLowerDFGToB3.cpp:
919         (JSC::FTL::DFG::LowerDFGToB3::compileGetIndexedPropertyStorage):
920         (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength):
921         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
922         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharAt):
923         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharCodeAt):
924         (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
925         (JSC::FTL::DFG::LowerDFGToB3::compileStringToUntypedStrictEquality):
926         (JSC::FTL::DFG::LowerDFGToB3::compileSwitch):
927         (JSC::FTL::DFG::LowerDFGToB3::mapHashString):
928         (JSC::FTL::DFG::LowerDFGToB3::compileMapHash):
929         (JSC::FTL::DFG::LowerDFGToB3::compileHasOwnProperty):
930         (JSC::FTL::DFG::LowerDFGToB3::compileStringSlice):
931         (JSC::FTL::DFG::LowerDFGToB3::compileToLowerCase):
932         (JSC::FTL::DFG::LowerDFGToB3::stringsEqual):
933         (JSC::FTL::DFG::LowerDFGToB3::boolify):
934         (JSC::FTL::DFG::LowerDFGToB3::switchString):
935         (JSC::FTL::DFG::LowerDFGToB3::isRopeString):
936         (JSC::FTL::DFG::LowerDFGToB3::isNotRopeString):
937         (JSC::FTL::DFG::LowerDFGToB3::speculateStringIdent):
938         * jit/AssemblyHelpers.cpp:
939         (JSC::AssemblyHelpers::emitConvertValueToBoolean):
940         (JSC::AssemblyHelpers::branchIfValue):
941         * jit/AssemblyHelpers.h:
942         (JSC::AssemblyHelpers::branchIfRopeStringImpl):
943         (JSC::AssemblyHelpers::branchIfNotRopeStringImpl):
944         * jit/JITInlines.h:
945         (JSC::JIT::emitLoadCharacterString):
946         * jit/Repatch.cpp:
947         (JSC::tryCacheGetByID):
948         * jit/ThunkGenerators.cpp:
949         (JSC::stringGetByValGenerator):
950         (JSC::stringCharLoad):
951         * llint/LowLevelInterpreter.asm:
952         * llint/LowLevelInterpreter32_64.asm:
953         * llint/LowLevelInterpreter64.asm:
954         * runtime/JSString.cpp:
955         (JSC::JSString::createEmptyString):
956         (JSC::JSRopeString::RopeBuilder<RecordOverflow>::expand):
957         (JSC::JSString::dumpToStream):
958         (JSC::JSString::estimatedSize):
959         (JSC::JSString::visitChildren):
960         (JSC::JSRopeString::resolveRopeInternal8 const):
961         (JSC::JSRopeString::resolveRopeInternal8NoSubstring const):
962         (JSC::JSRopeString::resolveRopeInternal16 const):
963         (JSC::JSRopeString::resolveRopeInternal16NoSubstring const):
964         (JSC::JSRopeString::resolveRopeToAtomicString const):
965         (JSC::JSRopeString::convertToNonRope const):
966         (JSC::JSRopeString::resolveRopeToExistingAtomicString const):
967         (JSC::JSRopeString::resolveRopeWithFunction const):
968         (JSC::JSRopeString::resolveRope const):
969         (JSC::JSRopeString::resolveRopeSlowCase8 const):
970         (JSC::JSRopeString::resolveRopeSlowCase const):
971         (JSC::JSRopeString::outOfMemory const):
972         (JSC::JSRopeString::visitFibers): Deleted.
973         (JSC::JSRopeString::clearFibers const): Deleted.
974         * runtime/JSString.h:
975         (JSC::JSString::uninitializedValueInternal const):
976         (JSC::JSString::valueInternal const):
977         (JSC::JSString::JSString):
978         (JSC::JSString::finishCreation):
979         (JSC::JSString::create):
980         (JSC::JSString::offsetOfValue):
981         (JSC::JSString::isRope const):
982         (JSC::JSString::is8Bit const):
983         (JSC::JSString::length const):
984         (JSC::JSString::tryGetValueImpl const):
985         (JSC::JSString::toAtomicString const):
986         (JSC::JSString::toExistingAtomicString const):
987         (JSC::JSString::value const):
988         (JSC::JSString::tryGetValue const):
989         (JSC::JSRopeString::unsafeView const):
990         (JSC::JSRopeString::viewWithUnderlyingString const):
991         (JSC::JSString::unsafeView const):
992         (JSC::JSString::viewWithUnderlyingString const):
993         (JSC::JSString::offsetOfLength): Deleted.
994         (JSC::JSString::offsetOfFlags): Deleted.
995         (JSC::JSString::setIs8Bit const): Deleted.
996         (JSC::JSString::setLength): Deleted.
997         (JSC::JSString::string): Deleted.
998         (JSC::jsStringBuilder): Deleted.
999         * runtime/JSStringInlines.h:
1000         (JSC::JSString::~JSString):
1001         (JSC::JSString::equal const):
1002         * runtime/ObjectPrototype.cpp:
1003         (JSC::objectProtoFuncToString):
1004         * runtime/RegExpMatchesArray.h:
1005         (JSC::createRegExpMatchesArray):
1006         * runtime/RegExpObjectInlines.h:
1007         (JSC::collectMatches):
1008         * runtime/RegExpPrototype.cpp:
1009         (JSC::regExpProtoFuncSplitFast):
1010         * runtime/SmallStrings.cpp:
1011         (JSC::SmallStrings::initializeCommonStrings):
1012         (JSC::SmallStrings::createEmptyString): Deleted.
1013         * runtime/SmallStrings.h:
1014         * runtime/StringPrototype.cpp:
1015         (JSC::stringProtoFuncSlice):
1016         * runtime/StringPrototypeInlines.h: Added.
1017         (JSC::stringSlice):
1018
1019 2019-02-28  Saam barati  <sbarati@apple.com>
1020
1021         Unreviewed. Attempt windows build fix after r242239.
1022
1023         * runtime/CachedTypes.cpp:
1024         (JSC::tagFromSourceCodeType):
1025
1026 2019-02-28  Mark Lam  <mark.lam@apple.com>
1027
1028         In cloop.rb, rename :int and :uint to :intptr and :uintptr.
1029         https://bugs.webkit.org/show_bug.cgi?id=195183
1030
1031         Reviewed by Yusuke Suzuki.
1032
1033         Also changed intMemRef and uintMemRef to intptrMemRef and uintptrMemRef respectively.
1034
1035         * offlineasm/cloop.rb:
1036
1037 2019-02-28  Saam barati  <sbarati@apple.com>
1038
1039         Make JSScript:cacheBytecodeWithError update the cache when the script changes
1040         https://bugs.webkit.org/show_bug.cgi?id=194912
1041
1042         Reviewed by Mark Lam.
1043
1044         Prior to this patch, the JSScript SPI would never check if its cached
1045         bytecode were still valid. This would lead the cacheBytecodeWithError
1046         succeeding even if the underlying cache were stale. This patch fixes
1047         that by making JSScript check if the cache is still valid. If it's not,
1048         we will cache bytecode when cacheBytecodeWithError is invoked.
1049
1050         * API/JSScript.mm:
1051         (-[JSScript readCache]):
1052         (-[JSScript writeCache:]):
1053         * API/tests/testapi.mm:
1054         (testBytecodeCacheWithSameCacheFileAndDifferentScript):
1055         (testObjectiveCAPI):
1056         * runtime/CachedTypes.cpp:
1057         (JSC::Decoder::Decoder):
1058         (JSC::VariableLengthObject::buffer const):
1059         (JSC::CachedPtr::decode const):
1060         (JSC::tagFromSourceCodeType):
1061         (JSC::GenericCacheEntry::isUpToDate const):
1062         (JSC::CacheEntry::isStillValid const):
1063         (JSC::GenericCacheEntry::decode const):
1064         (JSC::GenericCacheEntry::isStillValid const):
1065         (JSC::encodeCodeBlock):
1066         (JSC::decodeCodeBlockImpl):
1067         (JSC::isCachedBytecodeStillValid):
1068         * runtime/CachedTypes.h:
1069         * runtime/CodeCache.cpp:
1070         (JSC::sourceCodeKeyForSerializedBytecode):
1071         (JSC::sourceCodeKeyForSerializedProgram):
1072         (JSC::sourceCodeKeyForSerializedModule):
1073         (JSC::serializeBytecode):
1074         * runtime/CodeCache.h:
1075         (JSC::CodeCacheMap::fetchFromDiskImpl):
1076         * runtime/Completion.cpp:
1077         (JSC::generateProgramBytecode):
1078         (JSC::generateBytecode): Deleted.
1079         * runtime/Completion.h:
1080
1081 2019-02-28  Mark Lam  <mark.lam@apple.com>
1082
1083         cloop.rb shift mask should depend on the word size being shifted.
1084         https://bugs.webkit.org/show_bug.cgi?id=195181
1085         <rdar://problem/48484164>
1086
1087         Reviewed by Yusuke Suzuki.
1088
1089         Previously, we're always masking the shift amount with 0x1f.  This is only correct
1090         for 32-bit words.  For 64-bit words, the mask should be 0x3f.  For pointer sized
1091         shifts, the mask depends on sizeof(uintptr_t).
1092
1093         * offlineasm/cloop.rb:
1094
1095 2019-02-28  Justin Fan  <justin_fan@apple.com>
1096
1097         [Web GPU] Enable Web GPU only on 64-bit
1098         https://bugs.webkit.org/show_bug.cgi?id=195139
1099
1100         Because Metal is only supported on 64 bit apps.
1101
1102         Unreviewed build fix.
1103
1104         * Configurations/FeatureDefines.xcconfig:
1105
1106 2019-02-27  Mark Lam  <mark.lam@apple.com>
1107
1108         The parser is failing to record the token location of new in new.target.
1109         https://bugs.webkit.org/show_bug.cgi?id=195127
1110         <rdar://problem/39645578>
1111
1112         Reviewed by Yusuke Suzuki.
1113
1114         Also adjust the token location for the following to be as shown:
1115
1116             new.target
1117             ^
1118             super
1119             ^
1120             import.meta
1121             ^
1122
1123         * parser/Parser.cpp:
1124         (JSC::Parser<LexerType>::parseMemberExpression):
1125
1126 2019-02-27  Yusuke Suzuki  <ysuzuki@apple.com>
1127
1128         [JSC] mustHandleValues for dead bytecode locals should be ignored in DFG phases
1129         https://bugs.webkit.org/show_bug.cgi?id=195144
1130         <rdar://problem/47595961>
1131
1132         Reviewed by Mark Lam.
1133
1134         DFGMaximalFlushInsertionPhase inserts Flush for all the locals at the end of basic blocks. This enlarges the live ranges of
1135         locals in DFG, and it sometimes makes DFG value live while it is dead in bytecode. The issue happens when we use mustHandleValues
1136         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.
1137         At that time, we attempt to merge AbstractValue with dead mustHandleValue, which is cleared as jsUndefined() in
1138         DFG::Plan::cleanMustHandleValuesIfNecessary before start compilation, and crash because jsUndefined() may be irrelevant to the FlushFormat
1139         in VariableAccessData.
1140
1141         This patch makes the type of mustHandleValues Operands<Optional<JSValue>>. We clear dead JSValues in DFG::Plan::cleanMustHandleValuesIfNecessary.
1142         And we skip handling dead mustHandleValue in DFG phases.
1143
1144         * bytecode/Operands.h:
1145         (JSC::Operands::isLocal const):
1146         (JSC::Operands::isVariable const): Deleted.
1147         * dfg/DFGCFAPhase.cpp:
1148         (JSC::DFG::CFAPhase::injectOSR):
1149         * dfg/DFGDriver.cpp:
1150         (JSC::DFG::compileImpl):
1151         (JSC::DFG::compile):
1152         * dfg/DFGDriver.h:
1153         * dfg/DFGJITCode.cpp:
1154         (JSC::DFG::JITCode::reconstruct):
1155         * dfg/DFGJITCode.h:
1156         * dfg/DFGOperations.cpp:
1157         * dfg/DFGPlan.cpp:
1158         (JSC::DFG::Plan::Plan):
1159         (JSC::DFG::Plan::checkLivenessAndVisitChildren):
1160         (JSC::DFG::Plan::cleanMustHandleValuesIfNecessary):
1161         * dfg/DFGPlan.h:
1162         (JSC::DFG::Plan::mustHandleValues const):
1163         * dfg/DFGPredictionInjectionPhase.cpp:
1164         (JSC::DFG::PredictionInjectionPhase::run):
1165         * dfg/DFGTypeCheckHoistingPhase.cpp:
1166         (JSC::DFG::TypeCheckHoistingPhase::disableHoistingAcrossOSREntries):
1167         * ftl/FTLOSREntry.cpp:
1168         (JSC::FTL::prepareOSREntry):
1169         * jit/JITOperations.cpp:
1170
1171 2019-02-27  Simon Fraser  <simon.fraser@apple.com>
1172
1173         Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
1174
1175         * bytecode/CodeBlock.cpp:
1176         (JSC::CodeBlock::nameForRegister):
1177
1178 2019-02-27  Robin Morisset  <rmorisset@apple.com>
1179
1180         DFG: Loop-invariant code motion (LICM) should not hoist dead code
1181         https://bugs.webkit.org/show_bug.cgi?id=194945
1182         <rdar://problem/48311657>
1183
1184         Reviewed by Saam Barati.
1185
1186         * dfg/DFGLICMPhase.cpp:
1187         (JSC::DFG::LICMPhase::run):
1188
1189 2019-02-27  Antoine Quint  <graouts@apple.com>
1190
1191         Support Pointer Events on macOS
1192         https://bugs.webkit.org/show_bug.cgi?id=195008
1193         <rdar://problem/47454419>
1194
1195         Reviewed by Dean Jackson.
1196
1197         * Configurations/FeatureDefines.xcconfig:
1198
1199 2019-02-26  Mark Lam  <mark.lam@apple.com>
1200
1201         Remove poisons in JSCPoison and uses of them.
1202         https://bugs.webkit.org/show_bug.cgi?id=195082
1203
1204         Reviewed by Yusuke Suzuki.
1205
1206         Also removed unused poisoning code in WriteBarrier, AssemblyHelpers,
1207         DFG::SpeculativeJIT, FTLLowerDFGToB3, and FTL::Output.
1208
1209         * API/JSAPIWrapperObject.h:
1210         (JSC::JSAPIWrapperObject::wrappedObject):
1211         * API/JSCallbackFunction.h:
1212         * API/JSCallbackObject.h:
1213         * API/glib/JSAPIWrapperGlobalObject.h:
1214         * CMakeLists.txt:
1215         * JavaScriptCore.xcodeproj/project.pbxproj:
1216         * Sources.txt:
1217         * bytecode/AccessCase.cpp:
1218         (JSC::AccessCase::generateWithGuard):
1219         * dfg/DFGSpeculativeJIT.cpp:
1220         (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments):
1221         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
1222         (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon):
1223         (JSC::DFG::SpeculativeJIT::compileGetExecutable):
1224         (JSC::DFG::SpeculativeJIT::compileCreateThis):
1225         * dfg/DFGSpeculativeJIT.h:
1226         (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPoisonedPointer): Deleted.
1227         * ftl/FTLLowerDFGToB3.cpp:
1228         (JSC::FTL::DFG::LowerDFGToB3::compileGetExecutable):
1229         (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength):
1230         (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal):
1231         (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction):
1232         (JSC::FTL::DFG::LowerDFGToB3::weakPointer):
1233         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoison): Deleted.
1234         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnLoadedType): Deleted.
1235         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnType): Deleted.
1236         (JSC::FTL::DFG::LowerDFGToB3::weakPoisonedPointer): Deleted.
1237         * ftl/FTLOutput.h:
1238         (JSC::FTL::Output::weakPoisonedPointer): Deleted.
1239         * jit/AssemblyHelpers.cpp:
1240         (JSC::AssemblyHelpers::emitDynamicPoison): Deleted.
1241         (JSC::AssemblyHelpers::emitDynamicPoisonOnLoadedType): Deleted.
1242         (JSC::AssemblyHelpers::emitDynamicPoisonOnType): Deleted.
1243         * jit/AssemblyHelpers.h:
1244         * jit/JITOpcodes.cpp:
1245         (JSC::JIT::emit_op_create_this):
1246         * jit/JITPropertyAccess.cpp:
1247         (JSC::JIT::emitScopedArgumentsGetByVal):
1248         * jit/Repatch.cpp:
1249         (JSC::linkPolymorphicCall):
1250         * jit/ThunkGenerators.cpp:
1251         (JSC::virtualThunkFor):
1252         (JSC::nativeForGenerator):
1253         (JSC::boundThisNoArgsFunctionCallGenerator):
1254         * parser/UnlinkedSourceCode.h:
1255         * runtime/ArrayPrototype.h:
1256         * runtime/CustomGetterSetter.h:
1257         (JSC::CustomGetterSetter::getter const):
1258         (JSC::CustomGetterSetter::setter const):
1259         * runtime/InitializeThreading.cpp:
1260         (JSC::initializeThreading):
1261         * runtime/InternalFunction.cpp:
1262         (JSC::InternalFunction::getCallData):
1263         (JSC::InternalFunction::getConstructData):
1264         * runtime/InternalFunction.h:
1265         (JSC::InternalFunction::nativeFunctionFor):
1266         * runtime/JSArrayBuffer.h:
1267         * runtime/JSBoundFunction.h:
1268         * runtime/JSCPoison.cpp: Removed.
1269         * runtime/JSCPoison.h: Removed.
1270         * runtime/JSFunction.h:
1271         * runtime/JSGlobalObject.h:
1272         * runtime/JSScriptFetchParameters.h:
1273         * runtime/JSScriptFetcher.h:
1274         * runtime/JSString.h:
1275         * runtime/NativeExecutable.cpp:
1276         (JSC::NativeExecutable::hashFor const):
1277         * runtime/NativeExecutable.h:
1278         * runtime/Options.h:
1279         * runtime/ScopedArguments.h:
1280         * runtime/Structure.cpp:
1281         (JSC::StructureTransitionTable::setSingleTransition):
1282         * runtime/StructureTransitionTable.h:
1283         (JSC::StructureTransitionTable::map const):
1284         (JSC::StructureTransitionTable::weakImpl const):
1285         (JSC::StructureTransitionTable::setMap):
1286         * runtime/WriteBarrier.h:
1287         * wasm/WasmB3IRGenerator.cpp:
1288         * wasm/WasmInstance.h:
1289         * wasm/js/JSToWasm.cpp:
1290         (JSC::Wasm::createJSToWasmWrapper):
1291         * wasm/js/JSWebAssemblyCodeBlock.h:
1292         * wasm/js/JSWebAssemblyInstance.cpp:
1293         (JSC::JSWebAssemblyInstance::JSWebAssemblyInstance):
1294         (JSC::JSWebAssemblyInstance::visitChildren):
1295         * wasm/js/JSWebAssemblyInstance.h:
1296         * wasm/js/JSWebAssemblyMemory.h:
1297         * wasm/js/JSWebAssemblyModule.h:
1298         * wasm/js/JSWebAssemblyTable.cpp:
1299         (JSC::JSWebAssemblyTable::JSWebAssemblyTable):
1300         (JSC::JSWebAssemblyTable::grow):
1301         (JSC::JSWebAssemblyTable::clearFunction):
1302         * wasm/js/JSWebAssemblyTable.h:
1303         * wasm/js/WasmToJS.cpp:
1304         (JSC::Wasm::materializeImportJSCell):
1305         (JSC::Wasm::handleBadI64Use):
1306         (JSC::Wasm::wasmToJS):
1307         * wasm/js/WebAssemblyFunctionBase.h:
1308         * wasm/js/WebAssemblyModuleRecord.cpp:
1309         (JSC::WebAssemblyModuleRecord::link):
1310         (JSC::WebAssemblyModuleRecord::evaluate):
1311         * wasm/js/WebAssemblyModuleRecord.h:
1312         * wasm/js/WebAssemblyToJSCallee.h:
1313         * wasm/js/WebAssemblyWrapperFunction.h:
1314
1315 2019-02-26  Mark Lam  <mark.lam@apple.com>
1316
1317         wasmToJS() should purify incoming NaNs.
1318         https://bugs.webkit.org/show_bug.cgi?id=194807
1319         <rdar://problem/48189132>
1320
1321         Reviewed by Saam Barati.
1322
1323         * runtime/JSCJSValue.h:
1324         (JSC::jsNumber):
1325         * runtime/TypedArrayAdaptors.h:
1326         (JSC::IntegralTypedArrayAdaptor::toJSValue):
1327         * wasm/js/WasmToJS.cpp:
1328         (JSC::Wasm::wasmToJS):
1329
1330 2019-02-26  Dominik Infuehr  <dinfuehr@igalia.com>
1331
1332         Fix warnings on ARM and MIPS
1333         https://bugs.webkit.org/show_bug.cgi?id=195049
1334
1335         Reviewed by Mark Lam.
1336
1337         Fix all warnings on ARM and MIPS.
1338
1339         * assembler/MacroAssemblerPrinter.cpp:
1340         (JSC::Printer::printMemory):
1341         * assembler/testmasm.cpp:
1342         (JSC::testProbeModifiesStackValues):
1343         * bytecode/InByIdStatus.cpp:
1344         (JSC::InByIdStatus::computeFor):
1345         * runtime/CachedTypes.cpp:
1346         (JSC::VariableLengthObject::buffer const):
1347         * runtime/JSBigInt.h:
1348         * tools/JSDollarVM.cpp:
1349         (JSC::codeBlockFromArg):
1350
1351 2019-02-26  Mark Lam  <mark.lam@apple.com>
1352
1353         Misc cleanup in StructureIDTable after r242096.
1354         https://bugs.webkit.org/show_bug.cgi?id=195063
1355
1356         Reviewed by Saam Barati.
1357
1358         * runtime/StructureIDTable.cpp:
1359         (JSC::StructureIDTable::allocateID):
1360         - RELEASE_ASSERT that the StructureID allocation will succeed.
1361
1362         * runtime/StructureIDTable.h:
1363         (JSC::StructureIDTable::decode):
1364         (JSC::StructureIDTable::encode):
1365         - Add back a comment that Yusuke requested but was lost when the patch was rolled
1366           out and relanded.
1367         - Applied bitwise_casts that Saam requested.
1368
1369 2019-02-26  Mark Lam  <mark.lam@apple.com>
1370
1371         Gardening: 32-bit build fix after r242096.
1372         https://bugs.webkit.org/show_bug.cgi?id=194989
1373
1374         Not reviewed.
1375
1376         * jit/AssemblyHelpers.cpp:
1377         (JSC::AssemblyHelpers::emitLoadStructure):
1378
1379 2019-02-26  Mark Lam  <mark.lam@apple.com>
1380
1381         Unpoison MacroAssemblerCodePtr, ClassInfo pointers, and a few other things.
1382         https://bugs.webkit.org/show_bug.cgi?id=195039
1383
1384         Reviewed by Saam Barati.
1385
1386         1. Unpoison MacroAssemblerCodePtrs, ReturnAddressPtr.
1387         2. Replace PoisonedClassInfoPtr with ClassInfo*.
1388         3. Replace PoisonedMasmPtr with const void*.
1389         4. Remove all references to CodeBlockPoison, JITCodePoison, and GlobalDataPoison.
1390
1391         * API/JSCallbackObject.h:
1392         * API/JSObjectRef.cpp:
1393         (classInfoPrivate):
1394         * assembler/MacroAssemblerCodeRef.h:
1395         (JSC::FunctionPtr::FunctionPtr):
1396         (JSC::FunctionPtr::executableAddress const):
1397         (JSC::FunctionPtr::retaggedExecutableAddress const):
1398         (JSC::ReturnAddressPtr::ReturnAddressPtr):
1399         (JSC::ReturnAddressPtr::value const):
1400         (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr):
1401         (JSC::MacroAssemblerCodePtr::createFromExecutableAddress):
1402         (JSC::MacroAssemblerCodePtr:: const):
1403         (JSC::MacroAssemblerCodePtr::operator! const):
1404         (JSC::MacroAssemblerCodePtr::operator== const):
1405         (JSC::MacroAssemblerCodePtr::hash const):
1406         (JSC::MacroAssemblerCodePtr::emptyValue):
1407         (JSC::MacroAssemblerCodePtr::deletedValue):
1408         (JSC::FunctionPtr<tag>::FunctionPtr):
1409         (JSC::MacroAssemblerCodePtr::poisonedPtr const): Deleted.
1410         * b3/B3LowerMacros.cpp:
1411         * b3/testb3.cpp:
1412         (JSC::B3::testInterpreter):
1413         * dfg/DFGOSRExitCompilerCommon.h:
1414         (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk):
1415         * dfg/DFGSpeculativeJIT.cpp:
1416         (JSC::DFG::SpeculativeJIT::compileCheckSubClass):
1417         (JSC::DFG::SpeculativeJIT::compileNewStringObject):
1418         (JSC::DFG::SpeculativeJIT::emitSwitchIntJump):
1419         (JSC::DFG::SpeculativeJIT::emitSwitchImm):
1420         (JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
1421         (JSC::DFG::SpeculativeJIT::emitSwitchChar):
1422         * dfg/DFGSpeculativeJIT.h:
1423         * ftl/FTLLowerDFGToB3.cpp:
1424         (JSC::FTL::DFG::LowerDFGToB3::compileNewStringObject):
1425         (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass):
1426         * jit/AssemblyHelpers.h:
1427         (JSC::AssemblyHelpers::emitAllocateDestructibleObject):
1428         * jit/ThunkGenerators.cpp:
1429         (JSC::virtualThunkFor):
1430         (JSC::boundThisNoArgsFunctionCallGenerator):
1431         * runtime/JSCPoison.h:
1432         * runtime/JSDestructibleObject.h:
1433         (JSC::JSDestructibleObject::classInfo const):
1434         * runtime/JSSegmentedVariableObject.h:
1435         (JSC::JSSegmentedVariableObject::classInfo const):
1436         * runtime/Structure.h:
1437         * runtime/VM.h:
1438         * wasm/WasmB3IRGenerator.cpp:
1439         (JSC::Wasm::B3IRGenerator::addCall):
1440         (JSC::Wasm::B3IRGenerator::addCallIndirect):
1441         * wasm/WasmBinding.cpp:
1442         (JSC::Wasm::wasmToWasm):
1443
1444 2019-02-26  Mark Lam  <mark.lam@apple.com>
1445
1446         [Re-landing] Add some randomness into the StructureID.
1447         https://bugs.webkit.org/show_bug.cgi?id=194989
1448         <rdar://problem/47975563>
1449
1450         Reviewed by Yusuke Suzuki.
1451
1452         1. On 64-bit, the StructureID will now be encoded as:
1453
1454             ----------------------------------------------------------------
1455             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
1456             ----------------------------------------------------------------
1457
1458            The entropy bits are chosen at random and assigned when a StructureID is
1459            allocated.
1460
1461         2. Instead of Structure pointers, the StructureIDTable will now contain
1462            encodedStructureBits, which is encoded as such:
1463
1464             ----------------------------------------------------------------
1465             | 7 entropy bits |                   57 structure pointer bits |
1466             ----------------------------------------------------------------
1467
1468            The entropy bits here are the same 7 bits used in the encoding of the
1469            StructureID for this structure entry in the StructureIDTable.
1470
1471         3. Retrieval of the structure pointer given a StructureID is now computed as
1472            follows:
1473
1474                 index = structureID >> 7; // with arithmetic shift.
1475                 encodedStructureBits = structureIDTable[index];
1476                 structure = encodedStructureBits ^ (structureID << 57);
1477
1478             We use an arithmetic shift for the right shift because that will preserve
1479             the nuke bit in the high bit of the index if the StructureID was not
1480             decontaminated before use as expected.
1481
1482         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
1483
1484         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
1485            instead of always being the same as m_capacity.
1486
1487         6. Change StructureIDTable::s_unusedID's value to 0.
1488
1489            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
1490            StructureID on 64-bit.  Also, there was never any code that initializes unused
1491            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
1492            is the ID we'll get when the freelist is empty, prompting a resize of the
1493            structureIDTable.
1494
1495         This patch appears to be perf neutral on JetStream 2 run via the cli on a
1496         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
1497
1498         * ftl/FTLLowerDFGToB3.cpp:
1499         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
1500         * heap/SlotVisitor.cpp:
1501         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
1502         * jit/AssemblyHelpers.cpp:
1503         (JSC::AssemblyHelpers::emitLoadStructure):
1504         * jit/AssemblyHelpers.h:
1505         * jit/SpecializedThunkJIT.h:
1506         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
1507         * llint/LowLevelInterpreter.asm:
1508         * llint/LowLevelInterpreter64.asm:
1509         * runtime/StructureIDTable.cpp:
1510         (JSC::StructureIDTable::StructureIDTable):
1511         (JSC::StructureIDTable::makeFreeListFromRange):
1512         (JSC::StructureIDTable::resize):
1513         (JSC::StructureIDTable::allocateID):
1514         (JSC::StructureIDTable::deallocateID):
1515         * runtime/StructureIDTable.h:
1516         (JSC::StructureIDTable::decode):
1517         (JSC::StructureIDTable::encode):
1518         (JSC::StructureIDTable::get):
1519         (JSC::StructureIDTable::isValid):
1520
1521 2019-02-26  Ryan Haddad  <ryanhaddad@apple.com>
1522
1523         Unreviewed, rolling out r242071.
1524
1525         Breaks internal builds.
1526
1527         Reverted changeset:
1528
1529         "Add some randomness into the StructureID."
1530         https://bugs.webkit.org/show_bug.cgi?id=194989
1531         https://trac.webkit.org/changeset/242071
1532
1533 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
1534
1535         [JSC] Fix compilation on 32-bit platforms after r242071
1536         https://bugs.webkit.org/show_bug.cgi?id=195042
1537
1538         Reviewed by Carlos Garcia Campos.
1539
1540         * jit/AssemblyHelpers.cpp:
1541         (JSC::AssemblyHelpers::emitLoadStructure):
1542
1543 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
1544
1545         [JSC] Repeat string created from Array.prototype.join() take too much memory
1546         https://bugs.webkit.org/show_bug.cgi?id=193912
1547
1548         Reviewed by Saam Barati.
1549
1550         Added a fast case in Array.prototype.join when the array is
1551         uninitialized.
1552
1553         * runtime/ArrayPrototype.cpp:
1554         (JSC::canUseFastJoin):
1555         (JSC::fastJoin):
1556         * runtime/JSStringInlines.h:
1557         (JSC::repeatCharacter): moved from StringPrototype.cpp
1558         * runtime/StringPrototype.cpp:
1559
1560 2019-02-25  Mark Lam  <mark.lam@apple.com>
1561
1562         Add some randomness into the StructureID.
1563         https://bugs.webkit.org/show_bug.cgi?id=194989
1564         <rdar://problem/47975563>
1565
1566         Reviewed by Yusuke Suzuki.
1567
1568         1. On 64-bit, the StructureID will now be encoded as:
1569
1570             ----------------------------------------------------------------
1571             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
1572             ----------------------------------------------------------------
1573
1574            The entropy bits are chosen at random and assigned when a StructureID is
1575            allocated.
1576
1577         2. Instead of Structure pointers, the StructureIDTable will now contain
1578            encodedStructureBits, which is encoded as such:
1579
1580             ----------------------------------------------------------------
1581             | 7 entropy bits |                   57 structure pointer bits |
1582             ----------------------------------------------------------------
1583
1584            The entropy bits here are the same 7 bits used in the encoding of the
1585            StructureID for this structure entry in the StructureIDTable.
1586
1587         3. Retrieval of the structure pointer given a StructureID is now computed as
1588            follows:
1589
1590                 index = structureID >> 7; // with arithmetic shift.
1591                 encodedStructureBits = structureIDTable[index];
1592                 structure = encodedStructureBits ^ (structureID << 57);
1593
1594             We use an arithmetic shift for the right shift because that will preserve
1595             the nuke bit in the high bit of the index if the StructureID was not
1596             decontaminated before use as expected.
1597
1598         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
1599
1600         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
1601            instead of always being the same as m_capacity.
1602
1603         6. Change StructureIDTable::s_unusedID's value to 0.
1604
1605            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
1606            StructureID on 64-bit.  Also, there was never any code that initializes unused
1607            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
1608            is the ID we'll get when the freelist is empty, prompting a resize of the
1609            structureIDTable.
1610
1611         This patch appears to be perf neutral on JetStream 2 run via the cli on a
1612         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
1613
1614         * ftl/FTLLowerDFGToB3.cpp:
1615         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
1616         * heap/SlotVisitor.cpp:
1617         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
1618         * jit/AssemblyHelpers.cpp:
1619         (JSC::AssemblyHelpers::emitLoadStructure):
1620         * jit/AssemblyHelpers.h:
1621         * jit/SpecializedThunkJIT.h:
1622         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
1623         * llint/LowLevelInterpreter.asm:
1624         * llint/LowLevelInterpreter64.asm:
1625         * runtime/StructureIDTable.cpp:
1626         (JSC::StructureIDTable::StructureIDTable):
1627         (JSC::StructureIDTable::makeFreeListFromRange):
1628         (JSC::StructureIDTable::resize):
1629         (JSC::StructureIDTable::allocateID):
1630         (JSC::StructureIDTable::deallocateID):
1631         * runtime/StructureIDTable.h:
1632         (JSC::StructureIDTable::decode):
1633         (JSC::StructureIDTable::encode):
1634         (JSC::StructureIDTable::get):
1635         (JSC::StructureIDTable::isValid):
1636
1637 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1638
1639         [JSC] Revert r226885 to make SlotVisitor creation lazy
1640         https://bugs.webkit.org/show_bug.cgi?id=195013
1641
1642         Reviewed by Saam Barati.
1643
1644         We once changed SlotVisitor creation apriori to drop the lock. Also, it turns out that SlotVisitor is memory-consuming.
1645         We should defer SlotVisitor creation until it is actually required. This patch reverts r226885. Even with this patch,
1646         we still hold many SlotVisitors after we execute many parallel markers at least once. But recovering the feature of
1647         dynamically allocating SlotVisitors helps further memory optimizations in this area.
1648
1649         * heap/Heap.cpp:
1650         (JSC::Heap::Heap):
1651         (JSC::Heap::runBeginPhase):
1652         * heap/Heap.h:
1653         * heap/HeapInlines.h:
1654         (JSC::Heap::forEachSlotVisitor):
1655         (JSC::Heap::numberOfSlotVisitors):
1656         * heap/MarkingConstraintSolver.cpp:
1657         (JSC::MarkingConstraintSolver::didVisitSomething const):
1658         * heap/SlotVisitor.h:
1659
1660 2019-02-25  Saam Barati  <sbarati@apple.com>
1661
1662         testb3 and testair should test O0/O1/O2
1663         https://bugs.webkit.org/show_bug.cgi?id=194637
1664
1665         Reviewed by Mark Lam.
1666
1667         This patch makes it so that we run all tests in testair and testb3
1668         in O0, O1, and O2. However, some tests are invalid for O0 and O1.
1669         This patch makes it so we only run those tests in O2. These are
1670         often tests that assert certain optimizations have occurred. There
1671         are also a class of tests that rely on using patchpoints to stress 
1672         the register allocator into only a single valid allocation. The
1673         O0, and sometimes O1, register allocators are not always good enough
1674         to allocate such programs. To make these valid allocators to use, we rely
1675         on the FTL and Wasm to not emit such patchpoints.
1676
1677         * b3/air/testair.cpp:
1678         (main):
1679         * b3/testb3.cpp:
1680         (JSC::B3::compileProc):
1681         (JSC::B3::testAddLoadTwice):
1682         (JSC::B3::testMulLoadTwice):
1683         (JSC::B3::testSimplePatchpointWithOuputClobbersGPArgs):
1684         (JSC::B3::testSimplePatchpointWithOuputClobbersFPArgs):
1685         (JSC::B3::testPatchpointWithEarlyClobber):
1686         (JSC::B3::testSimpleCheck):
1687         (JSC::B3::testCheckFalse):
1688         (JSC::B3::testCheckTrue):
1689         (JSC::B3::testCheckLessThan):
1690         (JSC::B3::testCheckMegaCombo):
1691         (JSC::B3::testCheckTrickyMegaCombo):
1692         (JSC::B3::testCheckTwoMegaCombos):
1693         (JSC::B3::testCheckTwoNonRedundantMegaCombos):
1694         (JSC::B3::testCheckAddImm):
1695         (JSC::B3::testCheckAddImmCommute):
1696         (JSC::B3::testCheckAddImmSomeRegister):
1697         (JSC::B3::testCheckAdd):
1698         (JSC::B3::testCheckAdd64):
1699         (JSC::B3::testCheckAddFold):
1700         (JSC::B3::testCheckAddFoldFail):
1701         (JSC::B3::testCheckAddSelfOverflow64):
1702         (JSC::B3::testCheckAddSelfOverflow32):
1703         (JSC::B3::testCheckSubImm):
1704         (JSC::B3::testCheckSubBadImm):
1705         (JSC::B3::testCheckSub):
1706         (JSC::B3::testCheckSub64):
1707         (JSC::B3::testCheckSubFold):
1708         (JSC::B3::testCheckSubFoldFail):
1709         (JSC::B3::testCheckNeg):
1710         (JSC::B3::testCheckNeg64):
1711         (JSC::B3::testCheckMul):
1712         (JSC::B3::testCheckMulMemory):
1713         (JSC::B3::testCheckMul2):
1714         (JSC::B3::testCheckMul64):
1715         (JSC::B3::testCheckMulFold):
1716         (JSC::B3::testCheckMulFoldFail):
1717         (JSC::B3::testCheckMul64SShr):
1718         (JSC::B3::testLinearScanWithCalleeOnStack):
1719         (JSC::B3::testCheckSelect):
1720         (JSC::B3::testCheckSelectCheckSelect):
1721         (JSC::B3::testCheckSelectAndCSE):
1722         (JSC::B3::testLateRegister):
1723         (JSC::B3::testReduceStrengthCheckBottomUseInAnotherBlock):
1724         (JSC::B3::testSomeEarlyRegister):
1725         (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled2):
1726         (JSC::B3::testPinRegisters):
1727         (JSC::B3::testX86LeaAddAddShlLeft):
1728         (JSC::B3::testX86LeaAddAddShlRight):
1729         (JSC::B3::testX86LeaAddAdd):
1730         (JSC::B3::testX86LeaAddShlRight):
1731         (JSC::B3::testX86LeaAddShlLeftScale1):
1732         (JSC::B3::testX86LeaAddShlLeftScale2):
1733         (JSC::B3::testX86LeaAddShlLeftScale4):
1734         (JSC::B3::testX86LeaAddShlLeftScale8):
1735         (JSC::B3::testLoadBaseIndexShift2):
1736         (JSC::B3::testOptimizeMaterialization):
1737         (JSC::B3::testLICMPure):
1738         (JSC::B3::testLICMPureSideExits):
1739         (JSC::B3::testLICMPureWritesPinned):
1740         (JSC::B3::testLICMPureWrites):
1741         (JSC::B3::testLICMReadsPinned):
1742         (JSC::B3::testLICMReads):
1743         (JSC::B3::testLICMPureNotBackwardsDominant):
1744         (JSC::B3::testLICMPureNotBackwardsDominantFoiledByChild):
1745         (JSC::B3::testLICMControlDependent):
1746         (JSC::B3::testLICMControlDependentNotBackwardsDominant):
1747         (JSC::B3::testLICMReadsWritesDifferentHeaps):
1748         (JSC::B3::testWasmBoundsCheck):
1749         (JSC::B3::run):
1750         (main):
1751
1752 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1753
1754         [JSC] stress/function-constructor-reading-from-global-lexical-environment.js fails in 32bit arch
1755         https://bugs.webkit.org/show_bug.cgi?id=195030
1756         <rdar://problem/48385088>
1757
1758         Reviewed by Saam Barati.
1759
1760         While LLInt64 has checkTDZInGlobalPutToScopeIfNecessary for op_put_to_scope GlobalLexicalVar to check the value in the variable slot is not empty,
1761         this check is missing in LLInt32_64. Previously, this check was subsumed accidentally by the WatchpointSet check in GlobalLexicalVar in `notifyWrite`:
1762         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
1763         before configuring the WatchpointSet in the slow path. But after r241862, WatchpointSet is not used under non-JIT configuration. This skips WatchpointSet
1764         check and LLInt32_64 starts failing tests because of lack of checkTDZInGlobalPutToScopeIfNecessary. This patch adds checkTDZInGlobalPutToScopeIfNecessary
1765         in LLInt32_64 too. This patch fixes the following four failing tests.
1766
1767             stress/function-constructor-reading-from-global-lexical-environment.js.bytecode-cache
1768             stress/function-constructor-reading-from-global-lexical-environment.js.default
1769             stress/global-lexical-variable-tdz.js.bytecode-cache
1770             stress/global-lexical-variable-tdz.js.default
1771
1772         * llint/LowLevelInterpreter32_64.asm:
1773
1774 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1775
1776         [JSC] Make Intl fields lazily-allocated
1777         https://bugs.webkit.org/show_bug.cgi?id=195022
1778
1779         Reviewed by Mark Lam.
1780
1781         This patch makes the following memory footprint optimization in IntlObject.
1782
1783         1. Make IntlObject fields including Intl.Collator lazily-allocated because we already removed direct references from JS builtins to these constructors (@Collator etc.).
1784
1785         2. Move LazyProperty<IntlObject, Structure> structures from IntlObject to JSGlobalObject. This makes sizeof(IntlObject) the same to the other ones of usual runtime Objects,
1786            and drop one MarkedBlock.
1787
1788         * runtime/IntlCollatorConstructor.h:
1789         * runtime/IntlDateTimeFormatConstructor.h:
1790         * runtime/IntlNumberFormatConstructor.h:
1791         * runtime/IntlObject.cpp:
1792         (JSC::createCollatorConstructor):
1793         (JSC::createNumberFormatConstructor):
1794         (JSC::createDateTimeFormatConstructor):
1795         (JSC::createPluralRulesConstructor):
1796         (JSC::IntlObject::finishCreation):
1797         (JSC::IntlObject::visitChildren): Deleted.
1798         * runtime/IntlObject.h:
1799         * runtime/IntlPluralRulesConstructor.h:
1800         * runtime/JSGlobalObject.cpp:
1801         (JSC::JSGlobalObject::init):
1802         (JSC::JSGlobalObject::visitChildren):
1803         (JSC::JSGlobalObject::defaultCollator):
1804         * runtime/JSGlobalObject.h:
1805         (JSC::JSGlobalObject::collatorStructure):
1806         (JSC::JSGlobalObject::numberFormatStructure):
1807         (JSC::JSGlobalObject::dateTimeFormatStructure):
1808         (JSC::JSGlobalObject::pluralRulesStructure):
1809         (JSC::JSGlobalObject::intlObject const): Deleted.
1810         * runtime/JSGlobalObjectFunctions.cpp:
1811         (JSC::globalFuncDateTimeFormat):
1812         * runtime/NumberPrototype.cpp:
1813         (JSC::numberProtoFuncToLocaleString):
1814         * runtime/StringPrototype.cpp:
1815         (JSC::stringProtoFuncLocaleCompare):
1816
1817 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
1818
1819         Avoid hashing CompactVariableEnvironment when decoding CompactVariableMap::Handle
1820         https://bugs.webkit.org/show_bug.cgi?id=194937
1821
1822         Reviewed by Saam Barati.
1823
1824         Hashing the CompactVariableEnvironment is expensive and we could avoid it
1825         when decoding multiple handles to the same environment. This is sound because
1826         a pointer to the same CompactVariableEnvironment will hash the same.
1827
1828         * runtime/CachedTypes.cpp:
1829         (JSC::Decoder::handleForEnvironment const):
1830         (JSC::Decoder::setHandleForEnvironment):
1831         (JSC::CachedCompactVariableMapHandle::decode const):
1832
1833 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
1834
1835         Remove unnecessary WTF:: prefixes in CachedTypes
1836         https://bugs.webkit.org/show_bug.cgi?id=194936
1837
1838         Reviewed by Saam Barati.
1839
1840         Cleanup unnecessary prefixes from Optional, roundUpToMultipleOf and
1841         pageSize.
1842
1843         * runtime/CachedTypes.cpp:
1844         (JSC::Encoder::cachedOffsetForPtr):
1845         (JSC::Encoder::Page::malloc):
1846         (JSC::Encoder::allocateNewPage):
1847         (JSC::CachedPtr::encode):
1848         (JSC::CachedPtr::decode const):
1849         (JSC::CachedOptional::encode):
1850         (JSC::CachedOptional::decode const):
1851
1852 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1853
1854         [JSC] Drop direct references to Intl constructors by rewriting Intl JS builtins in C++
1855         https://bugs.webkit.org/show_bug.cgi?id=194976
1856
1857         Reviewed by Michael Saboff.
1858
1859         This patch paves the way to making IntlObject allocation lazy by removing direct references
1860         to Intl constructors (Intl.Collator etc.) from builtin JS. To achieve that,
1861
1862         1. We implement String.prototype.toLocaleCompare and Number.prototype.toLocaleString in C++
1863            instead of JS builtins. Since these functions end up calling ICU C++ runtime, writing them in
1864            JS does not offer performance improvement.
1865
1866         2. We remove @DateTimeFormat constructor reference, and instead, exposing @dateTimeFormat function,
1867            which returns formatted string directly. We still have JS builtins for DateTimeFormat things
1868            because the initialization of its "options" JSObject involves many get_by_id / put_by_id things,
1869            which are efficient in JS. But we avoid exposing @DateTimeFormat directly, so that Intl constructors
1870            can be lazily allocated.
1871
1872         * CMakeLists.txt:
1873         * DerivedSources-input.xcfilelist:
1874         * DerivedSources.make:
1875         * JavaScriptCore.xcodeproj/project.pbxproj:
1876         * builtins/BuiltinNames.h:
1877         * builtins/DatePrototype.js:
1878         (toLocaleString):
1879         (toLocaleDateString):
1880         (toLocaleTimeString):
1881         * builtins/NumberPrototype.js: Removed.
1882         * builtins/StringPrototype.js:
1883         (intrinsic.StringPrototypeReplaceIntrinsic.replace):
1884         (globalPrivate.getDefaultCollator): Deleted.
1885         * runtime/JSGlobalObject.cpp:
1886         (JSC::JSGlobalObject::init):
1887         (JSC::JSGlobalObject::visitChildren):
1888         (JSC::JSGlobalObject::defaultCollator):
1889         * runtime/JSGlobalObject.h:
1890         * runtime/JSGlobalObjectFunctions.cpp:
1891         (JSC::globalFuncDateTimeFormat):
1892         * runtime/JSGlobalObjectFunctions.h:
1893         * runtime/NumberPrototype.cpp:
1894         (JSC::NumberPrototype::finishCreation):
1895         (JSC::throwVMToThisNumberError):
1896         (JSC::numberProtoFuncToExponential):
1897         (JSC::numberProtoFuncToFixed):
1898         (JSC::numberProtoFuncToPrecision):
1899         (JSC::numberProtoFuncToString):
1900         (JSC::numberProtoFuncToLocaleString):
1901         (JSC::numberProtoFuncValueOf):
1902         * runtime/StringPrototype.cpp:
1903         (JSC::StringPrototype::finishCreation):
1904         (JSC::stringProtoFuncLocaleCompare):
1905
1906 2019-02-24  Devin Rousso  <drousso@apple.com>
1907
1908         Web Inspector: Change the InspectorOverlay to use native rather than canvas
1909         https://bugs.webkit.org/show_bug.cgi?id=105023
1910         <rdar://problem/13443692>
1911
1912         Reviewed by Brian Burg.
1913
1914         * inspector/protocol/OverlayTypes.json: Removed.
1915         Now that the overlay is entirely generated in C++, we no longer need the special prototol
1916         types for transferring data to a JavaScript context.
1917
1918         * inspector/protocol/Debugger.json:
1919         * inspector/agents/InspectorDebuggerAgent.h:
1920         * inspector/agents/InspectorDebuggerAgent.cpp:
1921         (Inspector::InspectorDebuggerAgent::setOverlayMessage): Deleted.
1922         Remove `Debugger.setOverlayMessage` command as it hasn't been used and is no longer supported.
1923
1924         * CMakeLists.txt:
1925         * DerivedSources-input.xcfilelist:
1926         * DerivedSources.make:
1927
1928 2019-02-24  Yusuke Suzuki  <ysuzuki@apple.com>
1929
1930         [JSC] Lazily create sentinel Map and Set buckets
1931         https://bugs.webkit.org/show_bug.cgi?id=194975
1932
1933         Reviewed by Saam Barati.
1934
1935         If VM::canUseJIT() returns false, we can lazily initialize sentinel Map and Set buckets.
1936         This patch adds getters to VM which lazily allocate these buckets. We eagerly initialize
1937         them if VM::canUseJIT() returns true since they can be touched from DFG and FTL.
1938
1939         * bytecode/BytecodeIntrinsicRegistry.cpp:
1940         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
1941         (JSC::BytecodeIntrinsicRegistry::sentinelMapBucketValue):
1942         (JSC::BytecodeIntrinsicRegistry::sentinelSetBucketValue):
1943         * bytecode/BytecodeIntrinsicRegistry.h:
1944         * dfg/DFGByteCodeParser.cpp:
1945         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
1946         * dfg/DFGOperations.cpp:
1947         * dfg/DFGSpeculativeJIT.cpp:
1948         (JSC::DFG::SpeculativeJIT::compileGetMapBucketNext):
1949         * dfg/DFGSpeculativeJIT64.cpp:
1950         (JSC::DFG::SpeculativeJIT::compile):
1951         * ftl/FTLLowerDFGToB3.cpp:
1952         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucket):
1953         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucketNext):
1954         * runtime/MapConstructor.cpp:
1955         (JSC::mapPrivateFuncMapBucketNext):
1956         * runtime/SetConstructor.cpp:
1957         (JSC::setPrivateFuncSetBucketNext):
1958         * runtime/VM.cpp:
1959         (JSC::VM::VM):
1960         (JSC::VM::sentinelSetBucketSlow):
1961         (JSC::VM::sentinelMapBucketSlow):
1962         * runtime/VM.h:
1963         (JSC::VM::sentinelSetBucket):
1964         (JSC::VM::sentinelMapBucket):
1965
1966 2019-02-20  Darin Adler  <darin@apple.com>
1967
1968         Finish removing String::format
1969         https://bugs.webkit.org/show_bug.cgi?id=194893
1970
1971         Reviewed by Daniel Bates.
1972
1973         * bytecode/CodeBlock.cpp:
1974         (JSC::CodeBlock::nameForRegister): Use makeString instead of String::format,
1975         using the new "pad" function.
1976
1977 2019-02-23  Robin Morisset  <rmorisset@apple.com>
1978
1979         Remove dead code: AdjacencyList::justOneChild()
1980         https://bugs.webkit.org/show_bug.cgi?id=194965
1981
1982         Reviewed by Sam Weinig.
1983
1984         * dfg/DFGAdjacencyList.h:
1985         (JSC::DFG::AdjacencyList::justOneChild const): Deleted.
1986
1987 2019-02-23  Michael Catanzaro  <mcatanzaro@igalia.com>
1988
1989         Unreviewed, fix -Wunused-param warning
1990
1991         * jsc.cpp:
1992
1993 2019-02-23  Mark Lam  <mark.lam@apple.com>
1994
1995         Add an exception check and some assertions in StringPrototype.cpp.
1996         https://bugs.webkit.org/show_bug.cgi?id=194962
1997         <rdar://problem/48013416>
1998
1999         Reviewed by Yusuke Suzuki and Saam Barati.
2000
2001         * runtime/StringPrototype.cpp:
2002         (JSC::jsSpliceSubstrings):
2003         (JSC::jsSpliceSubstringsWithSeparators):
2004         (JSC::operationStringProtoFuncReplaceRegExpEmptyStr):
2005
2006 2019-02-23  Keith Miller  <keith_miller@apple.com>
2007
2008         Add new mac target numbers
2009         https://bugs.webkit.org/show_bug.cgi?id=194955
2010
2011         Reviewed by Tim Horton.
2012
2013         * Configurations/Base.xcconfig:
2014         * Configurations/DebugRelease.xcconfig:
2015
2016 2019-02-22  Robin Morisset  <rmorisset@apple.com>
2017
2018         DFGBytecodeParser should not declare that a node won't clobberExit if DFGFixupPhase can later declare it does clobberExit
2019         https://bugs.webkit.org/show_bug.cgi?id=194953
2020         <rdar://problem/47595253>
2021
2022         Reviewed by Saam Barati.
2023
2024         For each node that
2025         (a) may or may not clobberExit depending on their arrayMode
2026         (b) and get their arrayMode from profiling information in DFGBytecodeParser
2027         (c) and can have their arrayMode refined by DFGFixupPhase,
2028         We must make sure to be conservative in the DFGBytecodeParser and treat it as if it unconditionnally clobbered the exit.
2029         Otherwise we will hit a validation failure after fixup if the next node was marked ExitValid and exits to the same semantic origin.
2030
2031         The list of nodes that fit (a) is:
2032         - StringCharAt
2033         - HasIndexProperty
2034         - GetByVal
2035         - PutByValDirect
2036         - PutByVal
2037         - PutByValAlias
2038         - GetIndexedPropertyStorage
2039
2040         Out of these, the following also fit (b) and (c):
2041         - HasIndexedProperty
2042         - GetByVal
2043         - PutByValDirect
2044         - PutByVal
2045
2046         GetByVal already had "m_exitOK = false; // GetByVal must be treated as if it clobbers exit state, since FixupPhase may make it generic."
2047         So we just have to fix the other three the same way.
2048
2049         * dfg/DFGByteCodeParser.cpp:
2050         (JSC::DFG::ByteCodeParser::parseBlock):
2051         (JSC::DFG::ByteCodeParser::handlePutByVal):
2052
2053 2019-02-22  Robin Morisset  <rmorisset@apple.com>
2054
2055         B3ReduceStrength: missing peephole optimizations for binary operations
2056         https://bugs.webkit.org/show_bug.cgi?id=194252
2057
2058         Reviewed by Saam Barati.
2059
2060         Adds several sets of optimizations for BitAnd, BitOr and BitXor.
2061         Using BitAnd distributivity over BitOr and BitXor:
2062           Turn any of these (for Op == BitOr || Op == BitXor):
2063                 Op(BitAnd(x1, x2), BitAnd(x1, x3))
2064                 Op(BitAnd(x2, x1), BitAnd(x1, x3))
2065                 Op(BitAnd(x1, x2), BitAnd(x3, x1))
2066                 Op(BitAnd(x2, x1), BitAnd(x3, x1))
2067            Into this: BitAnd(Op(x2, x3), x1)
2068            And any of these:
2069                 Op(BitAnd(x1, x2), x1)
2070                 Op(BitAnd(x2, x1), x1)
2071                 Op(x1, BitAnd(x1, x2))
2072                 Op(x1, BitAnd(x2, x1))
2073            Into this: BitAnd(Op(x2, x1), x1)
2074            This second set is equivalent to doing x1 => BitAnd(x1, x1), and then applying the first set.
2075         Using de Morgan laws (we represent not as BitXor with allOnes):
2076           BitAnd(BitXor(x1, allOnes), BitXor(x2, allOnes)) => BitXor(BitOr(x1, x2), allOnes)
2077           BitOr(BitXor(x1, allOnes), BitXor(x2, allOnes) => BitXor(BitAnd(x1, x2), allOnes)
2078           BitOr(BitXor(x, allOnes), c) => BitXor(BitAnd(x, ~c), allOnes)
2079           BitAnd(BitXor(x, allOnes), c) => BitXor(BitOr(x, ~c), allOnes)
2080         The latter two are equivalent to doing c => BitXor(~c, allOnes), and then applying the former two.
2081
2082         All of these transformations either reduce the number of operations (which we always do when possible), or bring the expression closer to having:
2083           - BitXor with all ones at the outermost
2084           - then BitAnd
2085           - then other BitXor
2086           - then BitOr at the innermost.
2087         These transformations that don't directly reduce the number of operations are still useful for normalization (helping things like CSE), and also can enable
2088         more optimizations (for example BitXor with all ones can easily cancel each other once they are all at the outermost level).
2089
2090         * b3/B3ReduceStrength.cpp:
2091         * b3/testb3.cpp:
2092         (JSC::B3::testBitAndNotNot):
2093         (JSC::B3::testBitAndNotImm):
2094         (JSC::B3::testBitOrAndAndArgs):
2095         (JSC::B3::testBitOrAndSameArgs):
2096         (JSC::B3::testBitOrNotNot):
2097         (JSC::B3::testBitOrNotImm):
2098         (JSC::B3::testBitXorAndAndArgs):
2099         (JSC::B3::testBitXorAndSameArgs):
2100         (JSC::B3::run):
2101
2102 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
2103
2104         [JSC] putNonEnumerable in JSWrapperMap is too costly
2105         https://bugs.webkit.org/show_bug.cgi?id=194935
2106
2107         Reviewed by Mark Lam.
2108
2109         When we convert Objective-C blocks to JS objects, we need to set up a corresponding function object correctly.
2110         During this allocation, we call [JSValue defineProperty:descriptor] to connect a "prototype" object and "constructor" object.
2111         The problem is that this API has a particularly costly implementation:
2112
2113             [[_context globalObject][@"Object"] invokeMethod:@"defineProperty" withArguments:@[ self, key, descriptor ]];
2114
2115         This wraps each JS objects appear in this code with Objective-C wrapper. And we convert a NSDictionary to JSObject, which
2116         has "writable", "enumerable", "configurable", "value" fields, and call the "defineProperty" JS function through Objective-C wrapper.
2117         This allocates many Objective-C wrappers and JS objects for descriptors. Since JSC has a direct C++ API "defineOwnProperty", we should
2118         bypass these Objective-C APIs and call JSC's code directly.
2119
2120         This patch changes `putNonEnumerable` implementation, from calling [JSValue defineProperty:descriptor] to calling JSC C++ code directly.
2121         We do not change [JSValue defineProperty:descriptor] implementation for now because of two reasons. (1) This is not used in our benchmarks
2122         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]
2123         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.
2124
2125         * API/APIUtils.h:
2126         (setException):
2127         * API/JSWrapperMap.mm:
2128         (putNonEnumerable):
2129         (copyMethodsToObject):
2130         (-[JSObjCClassInfo allocateConstructorAndPrototypeInContext:]):
2131         (-[JSObjCClassInfo wrapperForObject:inContext:]):
2132
2133 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
2134
2135         Unreviewed, build fix after r241954
2136         https://bugs.webkit.org/show_bug.cgi?id=194939
2137
2138         Renaming setCanAccessHeap was incomplete.
2139
2140         * runtime/SmallStrings.cpp:
2141         (JSC::SmallStrings::initializeCommonStrings):
2142         * runtime/VM.cpp:
2143         (JSC::VM::~VM):
2144
2145 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
2146
2147         [JSC] SmallStringsStorage is unnecessary
2148         https://bugs.webkit.org/show_bug.cgi?id=194939
2149
2150         Reviewed by Mark Lam.
2151
2152         SmallStrings hold common small JSStrings. Their underlying StringImpl is also held by SmallStringsStorage.
2153         But it is duplicate since we can get StringImpl from small JSStrings. This patch removes SmallStringsStorage,
2154         and get StringImpls from JSStrings if necessary.
2155
2156         We also add m_canAccessHeap flag to SmallStrings. At the time of VM destruction, JSStrings are destroyed when
2157         VM's Heap is finalized. We must not touch JSStrings before VM's heap (and JSStrings in SmallStrings) is initialized,
2158         and after VM's Heap is destroyed. We add this m_canAccessHeap flag to allow users to get StringImpl during the
2159         this sensitive period. If m_canAccessHeap is false, we get StringImpl from AtomicStringImpl::add.
2160
2161         * runtime/SmallStrings.cpp:
2162         (JSC::SmallStrings::initializeCommonStrings):
2163         (JSC::SmallStrings::singleCharacterStringRep):
2164         (JSC::SmallStringsStorage::rep): Deleted.
2165         (JSC::SmallStringsStorage::SmallStringsStorage): Deleted.
2166         (JSC::SmallStrings::createSingleCharacterString): Deleted.
2167         * runtime/SmallStrings.h:
2168         (JSC::SmallStrings::setCanAccessHeap):
2169         * runtime/VM.cpp:
2170         (JSC::VM::VM):
2171         (JSC::VM::~VM):
2172
2173 2019-02-22  Tadeu Zagallo  <tzagallo@apple.com>
2174
2175         Cache CompactVariableMap::Handle instead of VariableEnvironment for UnlinkedFunctionExecutable
2176         https://bugs.webkit.org/show_bug.cgi?id=194706
2177
2178         Reviewed by Saam Barati.
2179
2180         In https://bugs.webkit.org/show_bug.cgi?id=194583 we started using a
2181         CompactVariableMap::Handle instead of VariableEnvironment for
2182         UnlinkedFunctionExecutables, but we were creating the full environment
2183         to encode the executable in the bytecode cache. This patch changes it so
2184         that we cache the handle instead of the environment. This avoids duplicating
2185         the VariableEnvironment whenever we have to cache two handles that point
2186         to the environment.
2187
2188         * bytecode/UnlinkedFunctionExecutable.h:
2189         * parser/VariableEnvironment.cpp:
2190         (JSC::CompactVariableMap::get):
2191         * parser/VariableEnvironment.h:
2192         * runtime/CachedTypes.cpp:
2193         (JSC::CachedCompactVariableEnvironment::encode):
2194         (JSC::CachedCompactVariableEnvironment::decode const):
2195         (JSC::CachedCompactVariableMapHandle::encode):
2196         (JSC::CachedCompactVariableMapHandle::decode const):
2197         (JSC::CachedFunctionExecutable::encode):
2198         (JSC::CachedFunctionExecutable::decode const):
2199         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2200
2201 2019-02-21  Saam Barati  <sbarati@apple.com>
2202
2203         Update JSScript SPI based on feedback
2204         https://bugs.webkit.org/show_bug.cgi?id=194517
2205
2206         Reviewed by Keith Miller.
2207
2208         This patch updates the JSScript SPI in the following ways:
2209         - JSScript can now represent both modules and programs. This is a property
2210         of the script determined during creation.
2211         - JSScript now takes a sourceURL during construction. For modules, this acts
2212         as the module identifier.
2213         - JSScript now has SPI for writing the cache out to disk. We don't do this
2214         automatically.
2215         - JSScript will load the bytecode cache on creation if it exists.
2216         - We retrofit these new requirements on the prior JSScript SPI that
2217         we're going to remove as soon as we can: https://bugs.webkit.org/show_bug.cgi?id=194909.
2218         Previous SPI assumes all JSScripts are modules. Previous SPI also assigns
2219         a sourceURL to the JSScript based on what the module loader decided the
2220         identifier should be. We'll remove this once we remove the old SPI.
2221         
2222         This patch also adds SPI to JSContext to evaluate a JSScript. For modules,
2223         this is like returning the result of doing dynamic import. For programs,
2224         this does normal program evaluation.
2225         
2226         This patch also fixes a bug in generateBytecode/generateModuleBytecode where
2227         we would try to cache the bytecode even if recursivelyGenerateUnlinkedCodeBlock
2228         returned null. E.g, if the script had a syntax error.
2229         
2230         When writing tests, I also discovered that someone previously broke
2231         testapi. This patch also fixes those failures. They were broken when
2232         we switched to using a testapiScripts directory to hold our test .js
2233         scripts. 
2234
2235         * API/JSAPIGlobalObject.h:
2236         * API/JSAPIGlobalObject.mm:
2237         (JSC::JSAPIGlobalObject::moduleLoaderResolve):
2238         (JSC::JSAPIGlobalObject::moduleLoaderFetch):
2239         (JSC::JSAPIGlobalObject::loadAndEvaluateJSScriptModule):
2240         * API/JSBase.cpp:
2241         (JSEvaluateScriptInternal):
2242         (JSEvaluateScript):
2243         * API/JSBaseInternal.h: Added.
2244         * API/JSContext.mm:
2245         (-[JSContext evaluateScript:withSourceURL:]):
2246         (-[JSContext evaluateJSScript:]):
2247         * API/JSContextPrivate.h:
2248         * API/JSScript.h:
2249         * API/JSScript.mm:
2250         (+[JSScript scriptWithSource:inVirtualMachine:]):
2251         (+[JSScript scriptFromASCIIFile:inVirtualMachine:withCodeSigning:andBytecodeCache:]):
2252         (createError):
2253         (+[JSScript scriptOfType:inVirtualMachine:withSourceURL:andSource:andBytecodeCache:error:]):
2254         (+[JSScript scriptOfType:inVirtualMachine:memoryMappedFromASCIIFile:withSourceURL:andBytecodeCache:error:]):
2255         (-[JSScript cacheBytecodeWithError:]):
2256         (-[JSScript sourceURL]):
2257         (-[JSScript type]):
2258         (-[JSScript jsSourceCode]):
2259         (-[JSScript writeCache:]):
2260         (-[JSScript setSourceURL:]):
2261         (-[JSScript forceRecreateJSSourceCode]):
2262         (-[JSScript writeCache]): Deleted.
2263         (-[JSScript jsSourceCode:]): Deleted.
2264         * API/JSScriptInternal.h:
2265         * API/tests/FunctionOverridesTest.cpp:
2266         (testFunctionOverrides):
2267         * API/tests/testapi.c:
2268         (main):
2269         * API/tests/testapi.mm:
2270         (tempFile):
2271         (testModuleBytecodeCache):
2272         (testProgramBytecodeCache):
2273         (testBytecodeCacheWithSyntaxError):
2274         (testProgramJSScriptException):
2275         (testLoadBasicFileLegacySPI):
2276         (+[JSContextMemoryMappedLoaderDelegate newContext]):
2277         (-[JSContextMemoryMappedLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
2278         (testLoadBasicFile):
2279         (+[JSContextAugmentedLoaderDelegate newContext]):
2280         (-[JSContextAugmentedLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
2281         (testJSScriptURL):
2282         (testObjectiveCAPI):
2283         (testBytecodeCache): Deleted.
2284         * API/tests/testapiScripts/foo.js: Added.
2285         * JavaScriptCore.xcodeproj/project.pbxproj:
2286         * runtime/Completion.cpp:
2287         (JSC::generateBytecode):
2288         (JSC::generateModuleBytecode):
2289
2290 2019-02-21  Mark Lam  <mark.lam@apple.com>
2291
2292         Add more doesGC() assertions.
2293         https://bugs.webkit.org/show_bug.cgi?id=194911
2294         <rdar://problem/48285723>
2295
2296         Reviewed by Saam Barati and Yusuke Suzuki.
2297
2298         * dfg/DFGOSRExit.cpp:
2299         (JSC::DFG::OSRExit::compileOSRExit):
2300         - Set expectDoesGC here because we no longer have to worry about missing store
2301           barriers in optimized code after this point.  This will prevent false positive
2302           assertion failures arising from functions called beneath compileOSRExit().
2303
2304         (JSC::DFG::OSRExit::compileExit):
2305         - Add a comment to explain why the generated ramp needs to set expectDoesGC even
2306           though compileOSRExit() also sets it.  Reason: compileOSRExit() is only called
2307           for the first OSR from this code origin, the generated ramp is called for many
2308           subsequents OSR exits from this code origin.
2309
2310         * ftl/FTLOSRExitCompiler.cpp:
2311         (JSC::FTL::compileStub):
2312         - Added a comment for the equivalent reason to the one above.
2313
2314         (JSC::FTL::compileFTLOSRExit):
2315         - Set expectDoesGC here because we no longer have to worry about missing store
2316           barriers in optimized code after this point.  This will prevent false positive
2317           assertion failures arising from functions called beneath compileFTLOSRExit().
2318
2319         * heap/CompleteSubspace.cpp:
2320         (JSC::CompleteSubspace::tryAllocateSlow):
2321         * heap/CompleteSubspaceInlines.h:
2322         (JSC::CompleteSubspace::allocateNonVirtual):
2323         - assert expectDoesGC.
2324
2325         * heap/DeferGC.h:
2326         (JSC::DeferGC::~DeferGC):
2327         - assert expectDoesGC.
2328         - Also added WTF_FORBID_HEAP_ALLOCATION to DeferGC, DeferGCForAWhile, and DisallowGC
2329           because all 3 should be stack allocated RAII objects.
2330
2331         * heap/GCDeferralContext.h:
2332         * heap/GCDeferralContextInlines.h:
2333         (JSC::GCDeferralContext::~GCDeferralContext):
2334         - Added WTF_FORBID_HEAP_ALLOCATION.
2335         - assert expectDoesGC.
2336
2337         * heap/Heap.cpp:
2338         (JSC::Heap::collectNow):
2339         (JSC::Heap::collectAsync):
2340         (JSC::Heap::collectSync):
2341         (JSC::Heap::stopIfNecessarySlow):
2342         (JSC::Heap::collectIfNecessaryOrDefer):
2343         * heap/HeapInlines.h:
2344         (JSC::Heap::acquireAccess):
2345         (JSC::Heap::stopIfNecessary):
2346         * heap/LargeAllocation.cpp:
2347         (JSC::LargeAllocation::tryCreate):
2348         * heap/LocalAllocatorInlines.h:
2349         (JSC::LocalAllocator::allocate):
2350         - conservatively assert expectDoesGC on these functions that may trigger a GC
2351           though they don't always do.
2352
2353         * runtime/DisallowScope.h:
2354         - DisallowScope should be stack allocated because it's an RAII object.
2355
2356         * runtime/JSCellInlines.h:
2357         (JSC::tryAllocateCellHelper):
2358         - Remove the expectDoesGC assertion because it is now covered by assertions in
2359           CompleteSubspace, LargeAllocation, and LocalAllocator.
2360
2361         * runtime/RegExpMatchesArray.h:
2362         (JSC::createRegExpMatchesArray):
2363         - assert expectDoesGC.
2364
2365 2019-02-21  Yusuke Suzuki  <ysuzuki@apple.com>
2366
2367         [JSC] Use Fast Malloc as much as possible
2368         https://bugs.webkit.org/show_bug.cgi?id=194316
2369
2370         Reviewed by Mark Lam.
2371
2372         We should use Fast Malloc as much as possible to offer the whole memory view to bmalloc.
2373
2374         * inspector/scripts/codegen/cpp_generator_templates.py:
2375         * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
2376         * inspector/scripts/tests/generic/expected/enum-values.json-result:
2377         * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
2378         * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
2379         * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
2380         * jit/ExecutableAllocator.h:
2381         * jsc.cpp:
2382         * runtime/JSRunLoopTimer.h:
2383         * tools/VMInspector.h:
2384         * wasm/WasmThunks.h:
2385
2386 2019-02-20  Yusuke Suzuki  <ysuzuki@apple.com>
2387
2388         [JSC] Remove WatchpointSet creation for SymbolTable entries if VM::canUseJIT() returns false
2389         https://bugs.webkit.org/show_bug.cgi?id=194891
2390
2391         Reviewed by Geoffrey Garen.
2392
2393         WatchpointSet in SymbolTable is used to fold the value into a constant in JIT tiers. And it is
2394         not useful under the non-JIT mode. This patch avoids creation of WatchpointSet in SymbolTable
2395         if VM::canUseJIT() returns false.
2396
2397         * llint/LowLevelInterpreter32_64.asm:
2398         * llint/LowLevelInterpreter64.asm:
2399         * runtime/SymbolTable.cpp:
2400         (JSC::SymbolTableEntry::addWatchpoint): Deleted.
2401         * runtime/SymbolTable.h:
2402         (JSC::SymbolTableEntry::isWatchable const):
2403         (JSC::SymbolTableEntry::watchpointSet):
2404
2405 2019-02-20  Mark Lam  <mark.lam@apple.com>
2406
2407         Add code to validate expected GC activity modelled by doesGC() against what the runtime encounters.
2408         https://bugs.webkit.org/show_bug.cgi?id=193938
2409         <rdar://problem/47616277>
2410
2411         Reviewed by Michael Saboff, Saam Barati, and Robin Morisset.
2412
2413         In DFG::SpeculativeJIT::compile() and FTL::LowerDFGToB3::compileNode(), before
2414         emitting code / B3IR for each DFG node, we emit a write to set Heap::m_expectDoesGC
2415         to the value returned by doesGC() for that node.  In the runtime (i.e. in allocateCell()
2416         and functions that can resolve a rope), we assert that Heap::m_expectDoesGC is
2417         true.
2418
2419         This validation code is currently only enabled for debug builds.  It is disabled
2420         for release builds by default, but it can easily be made to run on release builds
2421         as well by forcing ENABLE_DFG_DOES_GC_VALIDATION to 1 in Heap.h.
2422
2423         To allow this validation code to run on release builds as well, the validation uses
2424         RELEASE_ASSERT instead of ASSERT.
2425
2426         To ensure that Heap.h is #include'd for all files that needs to do this validation
2427         (so that the validation code is accidentally disabled), we guard the validation
2428         code with an if conditional on constexpr bool validateDFGDoesGC (instead of using
2429         a #if ENABLE(DFG_DOES_GC_VALIDATION)).  This way, if Heap.h isn't #include'd, the
2430         validation code will fail to build (no silent failures).
2431
2432         Currently, all JSC tests and Layout tests should pass with this validation enabled
2433         in debug builds.  We'll only see new failures if there's a regression or if new
2434         tests reveal a previously untested code path that has an undetected issue.
2435
2436         * dfg/DFGOSRExit.cpp:
2437         (JSC::DFG::OSRExit::executeOSRExit):
2438         (JSC::DFG::OSRExit::compileExit):
2439         * dfg/DFGSpeculativeJIT64.cpp:
2440         (JSC::DFG::SpeculativeJIT::compile):
2441         * ftl/FTLLowerDFGToB3.cpp:
2442         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
2443         * ftl/FTLOSRExitCompiler.cpp:
2444         (JSC::FTL::compileStub):
2445         * heap/Heap.h:
2446         (JSC::Heap::expectDoesGC const):
2447         (JSC::Heap::setExpectDoesGC):
2448         (JSC::Heap::addressOfExpectDoesGC):
2449         * jit/JITArithmetic.cpp:
2450         (JSC::JIT::emit_compareAndJump):
2451         * runtime/JSCellInlines.h:
2452         (JSC::tryAllocateCellHelper):
2453         * runtime/JSString.h:
2454         (JSC::jsSingleCharacterString):
2455         (JSC::JSString::toAtomicString const):
2456         (JSC::JSString::toExistingAtomicString const):
2457         (JSC::JSString::value const):
2458         (JSC::JSString::tryGetValue const):
2459         (JSC::JSRopeString::unsafeView const):
2460         (JSC::JSRopeString::viewWithUnderlyingString const):
2461         (JSC::JSString::unsafeView const):
2462
2463 2019-02-20  Andy Estes  <aestes@apple.com>
2464
2465         [Xcode] Add SDKVariant.xcconfig to various Xcode projects
2466         https://bugs.webkit.org/show_bug.cgi?id=194869
2467
2468         Rubber-stamped by Jer Noble.
2469
2470         * JavaScriptCore.xcodeproj/project.pbxproj:
2471
2472 2019-02-19  Joseph Pecoraro  <pecoraro@apple.com>
2473
2474         Web Inspector: Improve ES6 Class instances in Heap Snapshot instances view
2475         https://bugs.webkit.org/show_bug.cgi?id=172848
2476         <rdar://problem/25709212>
2477
2478         Reviewed by Mark Lam.
2479
2480         * heap/HeapSnapshotBuilder.h:
2481         * heap/HeapSnapshotBuilder.cpp:
2482         Update the snapshot version. Change the node's 0 | 1 internal value
2483         to be a 32bit bit flag. This is nice in that it is both compatible
2484         with the previous snapshot version and the same size. We can use more
2485         flags in the future.
2486
2487         (JSC::HeapSnapshotBuilder::json):
2488         In cases where the classInfo gives us "Object" check for a better
2489         class name by checking (o).__proto__.constructor.name. We avoid this
2490         check in cases where (o).hasOwnProperty("constructor") which is the
2491         case for most Foo.prototype objects. Otherwise this would get the
2492         name of the Foo superclass for the Foo.prototype object.
2493
2494         * runtime/JSObject.cpp:
2495         (JSC::JSObject::calculatedClassName):
2496         Handle some possible edge cases that were not handled before, such as
2497         a JSObject without a GlobalObject or an object which doesn't
2498         have a default getPrototype. Try to make the code a little clearer.
2499
2500 2019-02-19  Truitt Savell  <tsavell@apple.com>
2501
2502         Unreviewed, rolling out r241784.
2503
2504         Broke all OpenSource builds.
2505
2506         Reverted changeset:
2507
2508         "Web Inspector: Improve ES6 Class instances in Heap Snapshot
2509         instances view"
2510         https://bugs.webkit.org/show_bug.cgi?id=172848
2511         https://trac.webkit.org/changeset/241784
2512
2513 2019-02-19  Joseph Pecoraro  <pecoraro@apple.com>
2514
2515         Web Inspector: Improve ES6 Class instances in Heap Snapshot instances view
2516         https://bugs.webkit.org/show_bug.cgi?id=172848
2517         <rdar://problem/25709212>
2518
2519         Reviewed by Mark Lam.
2520
2521         * heap/HeapSnapshotBuilder.h:
2522         * heap/HeapSnapshotBuilder.cpp:
2523         Update the snapshot version. Change the node's 0 | 1 internal value
2524         to be a 32bit bit flag. This is nice in that it is both compatible
2525         with the previous snapshot version and the same size. We can use more
2526         flags in the future.
2527
2528         (JSC::HeapSnapshotBuilder::json):
2529         In cases where the classInfo gives us "Object" check for a better
2530         class name by checking (o).__proto__.constructor.name. We avoid this
2531         check in cases where (o).hasOwnProperty("constructor") which is the
2532         case for most Foo.prototype objects. Otherwise this would get the
2533         name of the Foo superclass for the Foo.prototype object.
2534
2535         * runtime/JSObject.cpp:
2536         (JSC::JSObject::calculatedClassName):
2537         Handle some possible edge cases that were not handled before, such as
2538         a JSObject without a GlobalObject or an object which doesn't
2539         have a default getPrototype. Try to make the code a little clearer.
2540
2541 2019-02-19  Robin Morisset  <rmorisset@apple.com>
2542
2543         B3-O2 incorrectly optimizes this subtest
2544         https://bugs.webkit.org/show_bug.cgi?id=194625
2545
2546         Reviewed by Saam Barati.
2547
2548         Trivial fix. Instead of doing
2549             if (!cond) foo else bar => if (cond) bar else foo
2550         B3LowerToAir was doing
2551             if (x^C) foo else bar => if (cond) bar else foo whenever C&1, even if C was for example 3.
2552
2553         * b3/B3LowerToAir.cpp:
2554         * b3/testb3.cpp:
2555         (JSC::B3::testBitNotOnBooleanAndBranch32):
2556         (JSC::B3::testNotOnBooleanAndBranch32): Added.
2557
2558 2019-02-19  Robin Morisset  <rmorisset@apple.com>
2559
2560         CachedCall should not consider it UNLIKELY that it will not stack overflow
2561         https://bugs.webkit.org/show_bug.cgi?id=194831
2562
2563         Reviewed by Mark Lam.
2564
2565         * interpreter/CachedCall.h:
2566         (JSC::CachedCall::CachedCall):
2567
2568 2019-02-19  Mark Lam  <mark.lam@apple.com>
2569
2570         Fix DFG doesGC() for TryGetById and ProfileType nodes.
2571         https://bugs.webkit.org/show_bug.cgi?id=194821
2572         <rdar://problem/48206690>
2573
2574         Reviewed by Saam Barati.
2575
2576         Fix doesGC() for the following nodes:
2577
2578             ProfileType:
2579                 calls operationProcessTypeProfilerLogDFG(), which can calculatedClassName(),
2580                 which can call JSString::tryGetValue(), which can resolve a rope.
2581
2582             TryGetById:
2583                 calls operationTryGetByIdOptimize(), which can startWatchingPropertyForReplacements()
2584                 on a structure, which can allocate StructureRareData.
2585
2586         * dfg/DFGDoesGC.cpp:
2587         (JSC::DFG::doesGC):
2588
2589 2019-02-18  Yusuke Suzuki  <ysuzuki@apple.com>
2590
2591         [JSC] Introduce JSNonDestructibleProxy for JavaScriptCore.framework's GlobalThis
2592         https://bugs.webkit.org/show_bug.cgi?id=194799
2593
2594         Reviewed by Saam Barati.
2595
2596         JSProxy is destructible one because we have JSWindowProxy which has ref counted object.
2597         However, JavaScriptCore.framework's JSProxy for GlobalThis does not need to be destructible.
2598         This is important since we need to separate Heap subspaces between destructible and non-destructible objects.
2599         If we can put more and more objects in non-destructible status, we can get rid of low-usage MarkedBlock.
2600         This patch adds JSNonDestructibleProxy, which is not destructible JSProxy. While it inherits JSDestructibleObject,
2601         we can make the subclass still non-destructible thanks to Subspace mechanism. This drops one more low-usage MarkedBlock.
2602
2603         * CMakeLists.txt:
2604         * JavaScriptCore.xcodeproj/project.pbxproj:
2605         * Sources.txt:
2606         * runtime/JSGlobalObject.cpp:
2607         (JSC::JSGlobalObject::resetPrototype):
2608         (JSC::JSGlobalObject::finishCreation):
2609         * runtime/JSNonDestructibleProxy.cpp: Added.
2610         * runtime/JSNonDestructibleProxy.h: Added.
2611         (JSC::JSNonDestructibleProxy::subspaceFor):
2612         (JSC::JSNonDestructibleProxy::create):
2613         (JSC::JSNonDestructibleProxy::createStructure):
2614         (JSC::JSNonDestructibleProxy::JSNonDestructibleProxy):
2615         * runtime/JSProxy.h:
2616         (JSC::JSProxy::JSProxy):
2617
2618 2019-02-19  Robin Morisset  <rmorisset@apple.com>
2619
2620         B3ReduceStrength::simplifyCFG() could do a lot more on each iteration
2621         https://bugs.webkit.org/show_bug.cgi?id=194475
2622
2623         Reviewed by Saam Barati.
2624
2625         B3ReduceStrength::simplifyCFG() does three optimizations (which I will call A, B and C):
2626         - A makes any terminal that points to a block that is empty except for a jump point to that jump's target instead.
2627         - B transforms any branch or switch that points to a single block into a jump
2628         - C finds blocks ending with jumps, whose successor has a single predecessor, and inline that successor block in place of the jump
2629
2630         It currently is limited in the following way:
2631         - A and C can only fire once per block per iteration
2632         - B can create jumps that would trigger A, but they may not be seen until the next iteration
2633
2634         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.
2635         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.
2636
2637         On JetStream2 it reduces the average number of iterations from 3.35 to 3.24.
2638
2639         * b3/B3ReduceStrength.cpp:
2640
2641 2019-02-19  Tadeu Zagallo  <tzagallo@apple.com>
2642
2643         Move bytecode cache-related filesystem code out of CodeCache
2644         https://bugs.webkit.org/show_bug.cgi?id=194675
2645
2646         Reviewed by Saam Barati.
2647
2648         The code is only used for the bytecode-cache tests, so it should live in
2649         jsc.cpp rather than in the CodeCache. The logic now lives in ShellSourceProvider,
2650         which overrides the a virtual method in SourceProvider, `cacheBytecode`,
2651         in order to write the cache to disk.
2652
2653         * jsc.cpp:
2654         (ShellSourceProvider::create):
2655         (ShellSourceProvider::~ShellSourceProvider):
2656         (ShellSourceProvider::cachePath const):
2657         (ShellSourceProvider::loadBytecode):
2658         (ShellSourceProvider::ShellSourceProvider):
2659         (jscSource):
2660         (GlobalObject::moduleLoaderFetch):
2661         (functionDollarEvalScript):
2662         (runWithOptions):
2663         * parser/SourceProvider.h:
2664         (JSC::SourceProvider::cacheBytecode const):
2665         * runtime/CodeCache.cpp:
2666         (JSC::writeCodeBlock):
2667         * runtime/CodeCache.h:
2668         (JSC::CodeCacheMap::fetchFromDiskImpl):
2669
2670 2019-02-18  Dominik Infuehr  <dinfuehr@igalia.com>
2671
2672         [ARM] Fix crash with sampling profiler
2673         https://bugs.webkit.org/show_bug.cgi?id=194772
2674
2675         Reviewed by Mark Lam.
2676
2677         sampling-profiler-richards.js was crashing with an enabled sampling profiler. add32
2678         did not update the stack pointer in a single instruction. The src register was first
2679         moved into the stack pointer, the immediate imm was added in a subsequent instruction.
2680
2681         This was problematic when a signal handler was invoked before applying the immediate,
2682         when the stack pointer is still set to the temporary value. Avoid this by calculating src+imm in
2683         a temporary register and then move it in one go into the stack pointer.
2684
2685         * assembler/MacroAssemblerARMv7.h:
2686         (JSC::MacroAssemblerARMv7::add32):
2687
2688 2019-02-18  Mark Lam  <mark.lam@apple.com>
2689
2690         Fix DFG doesGC() for CompareEq/Less/LessEq/Greater/GreaterEq and CompareStrictEq nodes.
2691         https://bugs.webkit.org/show_bug.cgi?id=194800
2692         <rdar://problem/48183773>
2693
2694         Reviewed by Yusuke Suzuki.
2695
2696         Fix doesGC() for the following nodes:
2697
2698             CompareEq:
2699             CompareLess:
2700             CompareLessEq:
2701             CompareGreater:
2702             CompareGreaterEq:
2703             CompareStrictEq:
2704                 Only return false (i.e. does not GC) for child node use kinds that have
2705                 been vetted to not do anything that can GC.  For all other use kinds
2706                 (including StringUse and BigIntUse), we return true (i.e. does GC).
2707
2708         * dfg/DFGDoesGC.cpp:
2709         (JSC::DFG::doesGC):
2710
2711 2019-02-16  Darin Adler  <darin@apple.com>
2712
2713         Continue reducing use of String::format, now focusing on hex: "%p", "%x", etc.
2714         https://bugs.webkit.org/show_bug.cgi?id=194752
2715
2716         Reviewed by Daniel Bates.
2717
2718         * heap/HeapSnapshotBuilder.cpp:
2719         (JSC::HeapSnapshotBuilder::json): Added back the "0x" that was removed when changing
2720         this file to use appendUnsignedAsHex instead of "%p". The intent at that time was to
2721         keep behavior the same, so let's do that.
2722
2723         * parser/Lexer.cpp:
2724         (JSC::Lexer<T>::invalidCharacterMessage const): Use makeString and hex instead of
2725         String::format and "%04x".
2726
2727 2019-02-18  Yusuke Suzuki  <ysuzuki@apple.com>
2728
2729         [JSC] Add LazyClassStructure::getInitializedOnMainThread
2730         https://bugs.webkit.org/show_bug.cgi?id=194784
2731         <rdar://problem/48154820>
2732
2733         Reviewed by Mark Lam.
2734
2735         LazyClassStructure::get and LazyProperty::get functions do not allow compiler threads to call them. But for booleanPrototype, numberPrototype and symbolPrototype cases,
2736         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
2737         and LazyProperty::get for booleanPrototype, numberPrototype and symbolPrototype. But still assertion hits because the assertion requires that these functions need to be
2738         called in non compiler threads. Calling `getConcurrently()` is not possible since symbolPrototype() function is called from both the main thread and compiler threads,
2739         and we would like to lazily initialize SymbolPrototype object if it is called from the main thread, which can happen with non-JIT configuration.
2740
2741         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
2742         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,
2743         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.
2744         With JIT configuration, we eagerly initialize them in JSGlobalObject::init so that `getInitializedOnMainThread()` always succeeds.
2745
2746         Basically, `getInitializedOnMainThread()` is `get` with different assertion location: While `get` always crashes if it is called from compiler threads, `getInitializedOnMainThread()`
2747         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.
2748
2749         * runtime/JSGlobalObject.h:
2750         (JSC::JSGlobalObject::booleanPrototype const):
2751         (JSC::JSGlobalObject::numberPrototype const):
2752         (JSC::JSGlobalObject::symbolPrototype const):
2753         * runtime/LazyClassStructure.h:
2754         (JSC::LazyClassStructure::getInitializedOnMainThread const):
2755         (JSC::LazyClassStructure::prototypeInitializedOnMainThread const):
2756         (JSC::LazyClassStructure::constructorInitializedOnMainThread const):
2757         * runtime/LazyProperty.h:
2758         (JSC::LazyProperty::get const):
2759         (JSC::LazyProperty::getInitializedOnMainThread const):
2760
2761 2019-02-18  Joseph Pecoraro  <pecoraro@apple.com>
2762
2763         Web Inspector: Better categorize CPU usage per-thread / worker
2764         https://bugs.webkit.org/show_bug.cgi?id=194564
2765
2766         Reviewed by Devin Rousso.
2767
2768         * inspector/protocol/CPUProfiler.json:
2769         Add additional properties per-Event, and new per-Thread object info.
2770
2771 2019-02-18  Tadeu Zagallo  <tzagallo@apple.com>
2772
2773         Bytecode cache should a have a boot-specific validation
2774         https://bugs.webkit.org/show_bug.cgi?id=194769
2775         <rdar://problem/48149509>
2776
2777         Reviewed by Keith Miller.
2778
2779         Add the boot UUID to the cached bytecode to enforce that it is not reused
2780         across reboots.
2781
2782         * runtime/CachedTypes.cpp:
2783         (JSC::Encoder::malloc):
2784         (JSC::GenericCacheEntry::GenericCacheEntry):
2785         (JSC::GenericCacheEntry::tag const):
2786         (JSC::CacheEntry::CacheEntry):
2787         (JSC::CacheEntry::decode const):
2788         (JSC::GenericCacheEntry::decode const):
2789         (JSC::encodeCodeBlock):
2790
2791 2019-02-18  Eric Carlson  <eric.carlson@apple.com>
2792
2793         Add MSE logging configuration
2794         https://bugs.webkit.org/show_bug.cgi?id=194719
2795         <rdar://problem/48122151>
2796
2797         Reviewed by Joseph Pecoraro.
2798
2799         * inspector/ConsoleMessage.cpp:
2800         (Inspector::messageSourceValue):
2801         * inspector/protocol/Console.json:
2802         * inspector/scripts/codegen/generator.py:
2803         * runtime/ConsoleTypes.h:
2804
2805 2019-02-18  Tadeu Zagallo  <tzagallo@apple.com>
2806
2807         Add version number to cached bytecode
2808         https://bugs.webkit.org/show_bug.cgi?id=194768
2809         <rdar://problem/48147968>
2810
2811         Reviewed by Saam Barati.
2812
2813         Add a version number to the bytecode cache that should be unique per build.
2814
2815         * CMakeLists.txt:
2816         * DerivedSources-output.xcfilelist:
2817         * DerivedSources.make:
2818         * runtime/CachedTypes.cpp:
2819         (JSC::Encoder::malloc):
2820         (JSC::GenericCacheEntry::GenericCacheEntry):
2821         (JSC::CacheEntry::CacheEntry):
2822         (JSC::CacheEntry::encode):
2823         (JSC::CacheEntry::decode const):
2824         (JSC::GenericCacheEntry::decode const):
2825         (JSC::decodeCodeBlockImpl):
2826         * runtime/CodeCache.h:
2827         (JSC::CodeCacheMap::fetchFromDiskImpl):
2828
2829 2019-02-17  Saam Barati  <sbarati@apple.com>
2830
2831         WasmB3IRGenerator models some effects incorrectly
2832         https://bugs.webkit.org/show_bug.cgi?id=194038
2833
2834         Reviewed by Keith Miller.
2835
2836         * wasm/WasmB3IRGenerator.cpp:
2837         (JSC::Wasm::B3IRGenerator::restoreWasmContextInstance):
2838         (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState):
2839         These two functions were using global state instead of the
2840         arguments passed into the function.
2841
2842         (JSC::Wasm::B3IRGenerator::addOp<F64ConvertUI64>):
2843         (JSC::Wasm::B3IRGenerator::addOp<OpType::F32ConvertUI64>):
2844         (JSC::Wasm::B3IRGenerator::addOp<OpType::I64TruncUF64>):
2845         (JSC::Wasm::B3IRGenerator::addOp<OpType::I64TruncUF32>):
2846         Any patchpoint that allows scratch register usage must
2847         also say that it clobbers the scratch registers.
2848
2849 2019-02-17  Saam Barati  <sbarati@apple.com>
2850
2851         Deadlock when adding a Structure property transition and then doing incremental marking
2852         https://bugs.webkit.org/show_bug.cgi?id=194767
2853
2854         Reviewed by Mark Lam.
2855
2856         This can happen in the following scenario:
2857         
2858         You have a Structure S. S is on the mark stack. Then:
2859         1. S grabs its lock
2860         2. S adds a new property transition
2861         3. We find out we need to do some incremental marking
2862         4. We mark S
2863         5. visitChildren on S will try to grab its lock
2864         6. We are now in a deadlock
2865
2866         * heap/Heap.cpp:
2867         (JSC::Heap::performIncrement):
2868         * runtime/Structure.cpp:
2869         (JSC::Structure::addNewPropertyTransition):
2870
2871 2019-02-17  David Kilzer  <ddkilzer@apple.com>
2872
2873         Unreviewed, rolling out r241620.
2874
2875         "Causes use-after-free crashes running layout tests with ASan and GuardMalloc."
2876         (Requested by ddkilzer on #webkit.)
2877
2878         Reverted changeset:
2879
2880         "[WTF] Add environment variable helpers"
2881         https://bugs.webkit.org/show_bug.cgi?id=192405
2882         https://trac.webkit.org/changeset/241620
2883
2884 2019-02-17  Commit Queue  <commit-queue@webkit.org>
2885
2886         Unreviewed, rolling out r241612.
2887         https://bugs.webkit.org/show_bug.cgi?id=194762
2888
2889         "It regressed JetStream2 parsing tests by ~40%" (Requested by
2890         saamyjoon on #webkit).
2891
2892         Reverted changeset:
2893
2894         "Move bytecode cache-related filesystem code out of CodeCache"
2895         https://bugs.webkit.org/show_bug.cgi?id=194675
2896         https://trac.webkit.org/changeset/241612
2897
2898 2019-02-16  Yusuke Suzuki  <ysuzuki@apple.com>
2899
2900         [JSC] JSWrapperObject should not be destructible
2901         https://bugs.webkit.org/show_bug.cgi?id=194743
2902
2903         Reviewed by Saam Barati.
2904
2905         JSWrapperObject should be just a wrapper object for JSValue, thus, it should not be a JSDestructibleObject.
2906         Currently it is destructible object because DateInstance uses it. This patch changes Base of DateInstance from
2907         JSWrapperObject to JSDestructibleObject, and makes JSWrapperObject non-destructible.
2908
2909         * runtime/BigIntObject.cpp:
2910         (JSC::BigIntObject::BigIntObject):
2911         * runtime/BooleanConstructor.cpp:
2912         (JSC::BooleanConstructor::finishCreation):
2913         * runtime/BooleanObject.cpp:
2914         (JSC::BooleanObject::BooleanObject):
2915         * runtime/BooleanObject.h:
2916         * runtime/DateInstance.cpp:
2917         (JSC::DateInstance::DateInstance):
2918         (JSC::DateInstance::finishCreation):
2919         * runtime/DateInstance.h:
2920         * runtime/DatePrototype.cpp:
2921         (JSC::dateProtoFuncGetTime):
2922         (JSC::dateProtoFuncSetTime):
2923         (JSC::setNewValueFromTimeArgs):
2924         (JSC::setNewValueFromDateArgs):
2925         (JSC::dateProtoFuncSetYear):
2926         * runtime/JSCPoison.h:
2927         * runtime/JSWrapperObject.h:
2928         (JSC::JSWrapperObject::JSWrapperObject):
2929         * runtime/NumberObject.cpp:
2930         (JSC::NumberObject::NumberObject):
2931         * runtime/NumberObject.h:
2932         * runtime/StringConstructor.cpp:
2933         (JSC::StringConstructor::finishCreation):
2934         * runtime/StringObject.cpp:
2935         (JSC::StringObject::StringObject):
2936         * runtime/StringObject.h:
2937         (JSC::StringObject::internalValue const):
2938         * runtime/SymbolObject.cpp:
2939         (JSC::SymbolObject::SymbolObject):
2940         * runtime/SymbolObject.h:
2941
2942 2019-02-16  Yusuke Suzuki  <ysuzuki@apple.com>
2943
2944         [JSC] Shrink UnlinkedFunctionExecutable
2945         https://bugs.webkit.org/show_bug.cgi?id=194733
2946
2947         Reviewed by Mark Lam.
2948
2949         UnlinkedFunctionExecutable has sourceURLDirective and sourceMappingURLDirective. These
2950         directives can be found in the comment of non typical function's source code (Program,
2951         Eval code, and Global function from function constructor etc.), and tricky thing is that
2952         SourceProvider's directives are updated by Parser. The reason why we have these fields in
2953         UnlinkedFunctionExecutable is that we need to update the SourceProvider's directives even
2954         if we skip parsing by using CodeCache. These fields are effective only if (1)
2955         UnlinkedFunctionExecutable is for non typical function things, and (2) it has sourceURLDirective
2956         or sourceMappingURLDirective. This is rare enough to purge them to a separated
2957         UnlinkedFunctionExecutable::RareData to make UnlinkedFunctionExecutable small.
2958         sizeof(UnlinkedFunctionExecutable) is very important since it is super frequently allocated
2959         cell. Furthermore, the current JSC allocates two MarkedBlocks for UnlinkedFunctionExecutable
2960         in JSGlobalObject initialization, but the usage of the second MarkedBlock is quite low (8%).
2961         If we can reduce the size of UnlinkedFunctionExecutable, we can make them one MarkedBlock.
2962         Since UnlinkedFunctionExecutable is allocated from IsoSubspace, we do not need to fit it to
2963         one of size class.
2964
2965         This patch adds RareData to UnlinkedFunctionExecutable and move some rare datas into RareData.
2966         And kill one MarkedBlock allocation in JSC initialization phase.
2967
2968         * bytecode/UnlinkedFunctionExecutable.cpp:
2969         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2970         (JSC::UnlinkedFunctionExecutable::ensureRareDataSlow):
2971         * bytecode/UnlinkedFunctionExecutable.h:
2972         * debugger/DebuggerLocation.cpp:
2973         (JSC::DebuggerLocation::DebuggerLocation):
2974         * inspector/ScriptDebugServer.cpp:
2975         (Inspector::ScriptDebugServer::dispatchDidParseSource):
2976         * parser/Lexer.h:
2977         (JSC::Lexer::sourceURLDirective const):
2978         (JSC::Lexer::sourceMappingURLDirective const):
2979         (JSC::Lexer::sourceURL const): Deleted.
2980         (JSC::Lexer::sourceMappingURL const): Deleted.
2981         * parser/Parser.h:
2982         (JSC::Parser<LexerType>::parse):
2983         * parser/SourceProvider.h:
2984         (JSC::SourceProvider::sourceURLDirective const):
2985         (JSC::SourceProvider::sourceMappingURLDirective const):
2986         (JSC::SourceProvider::setSourceURLDirective):
2987         (JSC::SourceProvider::setSourceMappingURLDirective):
2988         (JSC::SourceProvider::sourceURL const): Deleted. We rename it from sourceURL to sourceURLDirective
2989         since it is the correct name.
2990         (JSC::SourceProvider::sourceMappingURL const): Deleted. We rename it from sourceMappingURL to
2991         sourceMappingURLDirective since it is the correct name.
2992         * runtime/CachedTypes.cpp:
2993         (JSC::CachedSourceProviderShape::encode):
2994         (JSC::CachedFunctionExecutableRareData::encode):
2995         (JSC::CachedFunctionExecutableRareData::decode const): CachedFunctionExecutable did not have
2996         sourceMappingURL to sourceMappingURLDirective. So this patch keeps the same logic.
2997         (JSC::CachedFunctionExecutable::rareData const):
2998         (JSC::CachedFunctionExecutable::encode):
2999         (JSC::CachedFunctionExecutable::decode const):
3000         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
3001         * runtime/CodeCache.cpp:
3002         (JSC::CodeCache::getUnlinkedGlobalCodeBlock):
3003         (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
3004         * runtime/CodeCache.h:
3005         (JSC::generateUnlinkedCodeBlockImpl):
3006         * runtime/FunctionExecutable.h:
3007         * runtime/SamplingProfiler.cpp:
3008         (JSC::SamplingProfiler::StackFrame::url):
3009
3010 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
3011
3012         [JSC] Remove unused global private variables
3013         https://bugs.webkit.org/show_bug.cgi?id=194741
3014
3015         Reviewed by Joseph Pecoraro.
3016
3017         There are some private functions and constants that are no longer referenced from builtin JS code.
3018         This patch cleans up them.
3019
3020         * builtins/BuiltinNames.h:
3021         * builtins/ObjectConstructor.js:
3022         (entries):
3023         * runtime/JSGlobalObject.cpp:
3024         (JSC::JSGlobalObject::init):
3025
3026 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
3027
3028         [JSC] Lazily create empty RegExp
3029         https://bugs.webkit.org/show_bug.cgi?id=194735
3030
3031         Reviewed by Keith Miller.
3032
3033         Some scripts do not have any RegExp. In that case, allocating MarkedBlock for RegExp is costly.
3034         Previously, there was always one RegExp, "empty RegExp". This patch lazily creates it and drop
3035         one MarkedBlock.
3036
3037         * runtime/JSGlobalObject.cpp:
3038         (JSC::JSGlobalObject::init):
3039         * runtime/RegExpCache.cpp:
3040         (JSC::RegExpCache::ensureEmptyRegExpSlow):
3041         (JSC::RegExpCache::initialize): Deleted.
3042         * runtime/RegExpCache.h:
3043         (JSC::RegExpCache::ensureEmptyRegExp):
3044         (JSC::RegExpCache::emptyRegExp const): Deleted.
3045         * runtime/RegExpCachedResult.cpp:
3046         (JSC::RegExpCachedResult::lastResult):
3047         * runtime/RegExpCachedResult.h:
3048         * runtime/VM.cpp:
3049         (JSC::VM::VM):
3050
3051 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
3052
3053         [JSC] Make builtin objects more lazily initialized under non-JIT mode
3054         https://bugs.webkit.org/show_bug.cgi?id=194727
3055
3056         Reviewed by Saam Barati.
3057
3058         Boolean, Symbol, and Number constructors and prototypes are initialized eagerly, but this is largely
3059         because concurrent compiler can touch NumberPrototype etc. when traversing object's prototypes. This
3060         means that eager initialization is not necessary under non-JIT mode. While we can investigate all the
3061         accesses to these prototypes from the concurrent compiler threads, this "lazily initialize under non-JIT"
3062         is safe and beneficial to non-JIT mode. This patch lazily initializes them under non-JIT mode, and
3063         drop some @Number references to avoid eager initialization. This removes some object allocations and 1
3064         MarkedBlock allocation just for Symbols.
3065
3066         * runtime/JSGlobalObject.cpp:
3067         (JSC::JSGlobalObject::init):
3068         (JSC::JSGlobalObject::visitChildren):
3069         * runtime/JSGlobalObject.h:
3070         (JSC::JSGlobalObject::numberToStringWatchpoint):
3071         (JSC::JSGlobalObject::booleanPrototype const):
3072         (JSC::JSGlobalObject::numberPrototype const):
3073         (JSC::JSGlobalObject::symbolPrototype const):
3074         (JSC::JSGlobalObject::booleanObjectStructure const):
3075         (JSC::JSGlobalObject::symbolObjectStructure const):
3076         (JSC::JSGlobalObject::numberObjectStructure const):
3077         (JSC::JSGlobalObject::stringObjectStructure const):
3078
3079 2019-02-15  Michael Saboff  <msaboff@apple.com>
3080
3081         RELEASE_ASSERT at com.apple.JavaScriptCore: JSC::jsSubstringOfResolved
3082         https://bugs.webkit.org/show_bug.cgi?id=194558
3083
3084         Reviewed by Saam Barati.
3085
3086         Added an in bounds check before the read of the next character for Unicode regular expressions
3087         for pattern generation that didn't already have such checks.
3088
3089         * yarr/YarrJIT.cpp:
3090         (JSC::Yarr::YarrGenerator::generatePatternCharacterOnce):
3091         (JSC::Yarr::YarrGenerator::generatePatternCharacterFixed):
3092         (JSC::Yarr::YarrGenerator::generateCharacterClassOnce):
3093         (JSC::Yarr::YarrGenerator::generateCharacterClassFixed):
3094
3095 2019-02-15  Dean Jackson  <dino@apple.com>
3096
3097         Allow emulation of user gestures from Web Inspector console
3098         https://bugs.webkit.org/show_bug.cgi?id=194725
3099         <rdar://problem/48126604>
3100
3101         Reviewed by Joseph Pecoraro and Devin Rousso.
3102
3103         * inspector/agents/InspectorRuntimeAgent.cpp: Add a new optional parameter, emulateUserGesture,
3104         to the evaluate function, and mark the function as override so that PageRuntimeAgent
3105         can change the behaviour.
3106         (Inspector::InspectorRuntimeAgent::evaluate):
3107         * inspector/agents/InspectorRuntimeAgent.h:
3108         * inspector/protocol/Runtime.json:
3109
3110 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
3111
3112         [JSC] Do not initialize Wasm related data if Wasm is not enabled
3113         https://bugs.webkit.org/show_bug.cgi?id=194728
3114
3115         Reviewed by Mark Lam.
3116
3117         Under non-JIT mode, these data structures are unnecessary. Should not allocate extra memory for that.
3118
3119         * runtime/InitializeThreading.cpp:
3120         (JSC::initializeThreading):
3121         * runtime/JSLock.cpp:
3122         (JSC::JSLock::didAcquireLock):
3123
3124 2019-02-15  Ross Kirsling  <ross.kirsling@sony.com>
3125
3126         [WTF] Add environment variable helpers
3127         https://bugs.webkit.org/show_bug.cgi?id=192405
3128
3129         Reviewed by Michael Catanzaro.
3130
3131         * inspector/remote/glib/RemoteInspectorGlib.cpp:
3132         (Inspector::RemoteInspector::RemoteInspector):
3133         (Inspector::RemoteInspector::start):
3134         * jsc.cpp:
3135         (startTimeoutThreadIfNeeded):
3136         * runtime/Options.cpp:
3137         (JSC::overrideOptionWithHeuristic):
3138         (JSC::Options::overrideAliasedOptionWithHeuristic):
3139         (JSC::Options::initialize):
3140         * runtime/VM.cpp:
3141         (JSC::enableAssembler):
3142         (JSC::VM::VM):
3143         * tools/CodeProfiling.cpp:
3144         (JSC::CodeProfiling::notifyAllocator):
3145         Utilize WTF::Environment where possible.
3146
3147 2019-02-15  Mark Lam  <mark.lam@apple.com>
3148
3149         SamplingProfiler::stackTracesAsJSON() should escape strings.
3150         https://bugs.webkit.org/show_bug.cgi?id=194649
3151         <rdar://problem/48072386>
3152
3153         Reviewed by Saam Barati.
3154
3155         Ditto for TypeSet::toJSONString() and TypeSet::toJSONString().
3156
3157         * runtime/SamplingProfiler.cpp:
3158         (JSC::SamplingProfiler::stackTracesAsJSON):
3159         * runtime/TypeSet.cpp:
3160         (JSC::TypeSet::toJSONString const):
3161         (JSC::StructureShape::toJSONString const):
3162
3163 2019-02-15  Robin Morisset  <rmorisset@apple.com>
3164
3165         CodeBlock::jettison should clear related watchpoints
3166         https://bugs.webkit.org/show_bug.cgi?id=194544
3167
3168         Reviewed by Mark Lam.
3169
3170         * bytecode/CodeBlock.cpp:
3171         (JSC::CodeBlock::jettison):
3172         * dfg/DFGCommonData.h:
3173         (JSC::DFG::CommonData::clearWatchpoints): Added.
3174         * dfg/CommonData.cpp:
3175         (JSC::DFG::CommonData::clearWatchpoints): Added.
3176
3177 2019-02-15  Tadeu Zagallo  <tzagallo@apple.com>
3178
3179         Move bytecode cache-related filesystem code out of CodeCache
3180         https://bugs.webkit.org/show_bug.cgi?id=194675
3181
3182         Reviewed by Saam Barati.
3183
3184         That code is only used for the bytecode-cache tests, so it should live in
3185         jsc.cpp rather than in the CodeCache.
3186
3187         * jsc.cpp:
3188         (CliSourceProvider::create):
3189         (CliSourceProvider::~CliSourceProvider):
3190         (CliSourceProvider::cachePath const):
3191         (CliSourceProvider::loadBytecode):
3192         (CliSourceProvider::CliSourceProvider):
3193         (jscSource):
3194         (GlobalObject::moduleLoaderFetch):
3195         (functionDollarEvalScript):
3196         (runWithOptions):
3197         * parser/SourceProvider.h:
3198         (JSC::SourceProvider::cacheBytecode const):
3199         * runtime/CodeCache.cpp:
3200         (JSC::writeCodeBlock):
3201         * runtime/CodeCache.h:
3202         (JSC::CodeCacheMap::fetchFromDiskImpl):
3203
3204 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
3205
3206         [JSC] DFG, FTL, and Wasm worklist creation should be fenced
3207         https://bugs.webkit.org/show_bug.cgi?id=194714
3208
3209         Reviewed by Mark Lam.
3210
3211         Let's consider about the following extreme case.
3212
3213         1. VM (A) is created.
3214         2. Another VM (B) is created on a different thread.
3215         3. (A) is being destroyed. It calls DFG::existingWorklistForIndexOrNull in a destructor.
3216         4. At the same time, (B) starts using DFG Worklist and it is instantiated in call_once.
3217         5. But (A) reads the pointer directly through DFG::existingWorklistForIndexOrNull.
3218         6. (A) sees the half-baked worklist, which may be in the middle of creation.
3219
3220         This patch puts store-store fence just before putting a pointer to a global variable.
3221         This fence is executed only three times at most, for DFG, FTL, and Wasm worklist initializations.
3222
3223         * dfg/DFGWorklist.cpp:
3224         (JSC::DFG::ensureGlobalDFGWorklist):
3225         (JSC::DFG::ensureGlobalFTLWorklist):
3226         * wasm/WasmWorklist.cpp:
3227         (JSC::Wasm::ensureWorklist):
3228
3229 2019-02-15  Commit Queue  <commit-queue@webkit.org>
3230
3231         Unreviewed, rolling out r241559 and r241566.
3232         https://bugs.webkit.org/show_bug.cgi?id=194710
3233
3234         Causes layout test crashes under GuardMalloc (Requested by
3235         ryanhaddad on #webkit).
3236
3237         Reverted changesets:
3238
3239         "[WTF] Add environment variable helpers"
3240         https://bugs.webkit.org/show_bug.cgi?id=192405
3241         https://trac.webkit.org/changeset/241559
3242
3243         "Unreviewed build fix for WinCairo Debug after r241559."
3244         https://trac.webkit.org/changeset/241566
3245
3246 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
3247
3248         [JSC] Do not even allocate JIT worklists in non-JIT mode
3249         https://bugs.webkit.org/show_bug.cgi?id=194693
3250
3251         Reviewed by Mark Lam.
3252
3253         Heap always allocates JIT worklists for Baseline, DFG, and FTL. While they do not have actual threads, Worklist itself already allocates some memory.
3254         And we do not perform any GC operations that are only meaningful in JIT environment.
3255
3256         1. We add VM::canUseJIT() check in Heap's ensureXXXWorklist things to prevent them from being allocated.
3257         2. We remove DFG marking constraint in non-JIT mode.
3258         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)
3259         4. We do not visit JITStubRoutineSet.
3260         5. Align JITWorklist function names to the other worklists.
3261
3262         * dfg/DFGOSRExitPreparation.cpp:
3263         (JSC::DFG::prepareCodeOriginForOSRExit):
3264         * dfg/DFGPlan.h:
3265         * dfg/DFGWorklist.cpp:
3266         (JSC::DFG::markCodeBlocks): Deleted.
3267         * dfg/DFGWorklist.h:
3268         * heap/Heap.cpp:
3269         (JSC::Heap::completeAllJITPlans):
3270         (JSC::Heap::iterateExecutingAndCompilingCodeBlocks):
3271         (JSC::Heap::gatherScratchBufferRoots):
3272         (JSC::Heap::removeDeadCompilerWorklistEntries):
3273         (JSC::Heap::stopThePeriphery):
3274         (JSC::Heap::suspendCompilerThreads):
3275         (JSC::Heap::resumeCompilerThreads):
3276         (JSC::Heap::addCoreConstraints):
3277         * jit/JITWorklist.cpp:
3278         (JSC::JITWorklist::existingGlobalWorklistOrNull):
3279         (JSC::JITWorklist::ensureGlobalWorklist):
3280         (JSC::JITWorklist::instance): Deleted.
3281         * jit/JITWorklist.h:
3282         * llint/LLIntSlowPaths.cpp:
3283         (JSC::LLInt::jitCompileAndSetHeuristics):
3284         * runtime/VM.cpp:
3285         (JSC::VM::~VM):
3286         (JSC::VM::gatherScratchBufferRoots):
3287         (JSC::VM::gatherConservativeRoots): Deleted.
3288         * runtime/VM.h:
3289
3290 2019-02-15  Saam barati  <sbarati@apple.com>
3291
3292         [WebAssembly] Write a new register allocator for Air O0 and make BBQ use it
3293         https://bugs.webkit.org/show_bug.cgi?id=194036
3294
3295         Reviewed by Yusuke Suzuki.
3296
3297         This patch adds a new Air-O0 backend. Air-O0 runs fewer passes and doesn't
3298         use linear scan for register allocation. Instead of linear scan, Air-O0 does
3299         mostly block-local register allocation, and it does this as it's emitting
3300         code directly. The register allocator uses liveness analysis to reduce
3301         the number of spills. Doing register allocation as we're emitting code
3302         allows us to skip editing the IR to insert spills, which saves a non trivial
3303         amount of compile time. For stack allocation, we give each Tmp its own slot.
3304         This is less than ideal. We probably want to do some trivial live range analysis
3305         in the future. The reason this isn't a deal breaker for Wasm is that this patch
3306         makes it so that we reuse Tmps as we're generating Air IR in the AirIRGenerator.
3307         Because Wasm is a stack machine, we trivially know when we kill a stack value (its last use).
3308         
3309         This patch is another 25% Wasm startup time speedup. It seems to be worth
3310         another 1% on JetStream2.
3311
3312         * JavaScriptCore.xcodeproj/project.pbxproj:
3313         * Sources.txt:
3314         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp: Added.
3315         (JSC::B3::Air::GenerateAndAllocateRegisters::GenerateAndAllocateRegisters):
3316         (JSC::B3::Air::GenerateAndAllocateRegisters::buildLiveRanges):
3317         (JSC::B3::Air::GenerateAndAllocateRegisters::insertBlocksForFlushAfterTerminalPatchpoints):
3318         (JSC::B3::Air::callFrameAddr):
3319         (JSC::B3::Air::GenerateAndAllocateRegisters::flush):
3320         (JSC::B3::Air::GenerateAndAllocateRegisters::spill):
3321         (JSC::B3::Air::GenerateAndAllocateRegisters::alloc):
3322         (JSC::B3::Air::GenerateAndAllocateRegisters::freeDeadTmpsIfNeeded):
3323         (JSC::B3::Air::GenerateAndAllocateRegisters::assignTmp):
3324         (JSC::B3::Air::GenerateAndAllocateRegisters::isDisallowedRegister):