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