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