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