Unreviewed, rolling out r243672.
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2019-04-15  Commit Queue  <commit-queue@webkit.org>
2
3         Unreviewed, rolling out r243672.
4         https://bugs.webkit.org/show_bug.cgi?id=196952
5
6         [JSValue release] should be thread-safe (Requested by
7         yusukesuzuki on #webkit).
8
9         Reverted changeset:
10
11         "[JSC] JSWrapperMap should not use Objective-C Weak map
12         (NSMapTable with NSPointerFunctionsWeakMemory) for
13         m_cachedObjCWrappers"
14         https://bugs.webkit.org/show_bug.cgi?id=196392
15         https://trac.webkit.org/changeset/243672
16
17 2019-04-15  Saam barati  <sbarati@apple.com>
18
19         SafeToExecute for GetByOffset/GetGetterByOffset/PutByOffset is using the wrong child for the base
20         https://bugs.webkit.org/show_bug.cgi?id=196945
21         <rdar://problem/49802750>
22
23         Reviewed by Filip Pizlo.
24
25         * dfg/DFGSafeToExecute.h:
26         (JSC::DFG::safeToExecute):
27
28 2019-04-15  Robin Morisset  <rmorisset@apple.com>
29
30         DFG should be able to constant fold Object.create() with a constant prototype operand
31         https://bugs.webkit.org/show_bug.cgi?id=196886
32
33         Reviewed by Yusuke Suzuki.
34
35
36         It is a fairly simple and limited patch, as it only works when the DFG can prove the exact object used as prototype.
37         But when it applies it can be a significant win:
38                                                         Baseline                   Optim                                       
39         object-create-constant-prototype              3.6082+-0.0979     ^      1.6947+-0.0756        ^ definitely 2.1292x faster
40         object-create-null                           11.4492+-0.2510     ?     11.5030+-0.2402        ?
41         object-create-unknown-object-prototype       15.6067+-0.1851     ?     15.7500+-0.2322        ?
42         object-create-untyped-prototype               8.8873+-0.1240     ?      8.9806+-0.1202        ? might be 1.0105x slower
43         <geometric>                                   8.6967+-0.1208     ^      7.2408+-0.1367        ^ definitely 1.2011x faster
44
45         The only subtlety is that we need to to access the StructureCache concurrently from the compiler thread (see https://bugs.webkit.org/show_bug.cgi?id=186199)
46         I solved this with a simple lock, taken when the compiler thread tries to read it, and when the main thread tries to modify it.
47         I expect it to be extremely low contention, but will watch the bots just in case.
48         The lock is taken neither when the main thread is only reading the cache (it has no-one to race with), nor when the GC purges it of dead entries (it does not free anything while a compiler thread is in the middle of a phase).
49
50         * dfg/DFGAbstractInterpreterInlines.h:
51         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
52         * dfg/DFGConstantFoldingPhase.cpp:
53         (JSC::DFG::ConstantFoldingPhase::foldConstants):
54         * runtime/StructureCache.cpp:
55         (JSC::StructureCache::createEmptyStructure):
56         (JSC::StructureCache::tryEmptyObjectStructureForPrototypeFromCompilerThread):
57         * runtime/StructureCache.h:
58
59 2019-04-15  Devin Rousso  <drousso@apple.com>
60
61         Web Inspector: fake value descriptors for promises add a catch handler, preventing "rejectionhandled" events from being fired
62         https://bugs.webkit.org/show_bug.cgi?id=196484
63         <rdar://problem/49114725>
64
65         Reviewed by Joseph Pecoraro.
66
67         Only add a catch handler when the promise is reachable via a native getter and is known to
68         have rejected. A non-rejected promise doesn't need a catch handler, and any promise that
69         isn't reachable via a getter won't actually be reached, as `InjectedScript` doesn't call any
70         functions, instead only getting the function object itself.
71
72         * inspector/InjectedScriptSource.js:
73         (InjectedScript.prototype._propertyDescriptors.createFakeValueDescriptor):
74
75         * inspector/JSInjectedScriptHost.h:
76         * inspector/JSInjectedScriptHost.cpp:
77         (Inspector::JSInjectedScriptHost::isPromiseRejectedWithNativeGetterTypeError): Added.
78         * inspector/JSInjectedScriptHostPrototype.cpp:
79         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
80         (Inspector::jsInjectedScriptHostPrototypeFunctionIsPromiseRejectedWithNativeGetterTypeError): Added.
81
82         * runtime/ErrorInstance.h:
83         (JSC::ErrorInstance::setNativeGetterTypeError): Added.
84         (JSC::ErrorInstance::isNativeGetterTypeError const): Added.
85
86         * runtime/Error.h:
87         (JSC::throwVMGetterTypeError): Added.
88         * runtime/Error.cpp:
89         (JSC::createGetterTypeError): Added.
90         (JSC::throwGetterTypeError): Added.
91         (JSC::throwDOMAttributeGetterTypeError):
92
93 2019-04-15  Robin Morisset  <rmorisset@apple.com>
94
95         B3::Value should have different kinds of adjacency lists
96         https://bugs.webkit.org/show_bug.cgi?id=196091
97
98         Reviewed by Filip Pizlo.
99
100         The key idea of this optimization is to replace the Vector<Value*, 3> m_children in B3::Value (40 bytes on 64-bits platform) by one of the following:
101         - Nothing (0 bytes)
102         - 1 Value* (8 bytes)
103         - 2 Value* (16 bytes)
104         - 3 Value* (24 bytes)
105         - A Vector<Value*, 3>
106         after the end of the Value object, depending on the kind of the Value.
107         So for example, when allocating an Add, we would allocate an extra 16 bytes into which to store 2 Values.
108         This would halve the memory consumption of Const64/Const32/Nop/Identity and a bunch more kinds of values, and reduce by a more moderate amount the memory consumption of the rest of non-varargs values (e.g. Add would go from 72 to 48 bytes).
109
110         A few implementation points:
111         - Even if there is no children, we must remember to allocate at least enough space for replaceWithIdentity to work later. It needs sizeof(Value) (for the object itself) + sizeof(Value*) (for the pointer to its child)
112         - We must make sure to destroy the vector whenever we destroy a Value which is VarArgs
113         - We must remember how many elements there are in the case where we did not allocate a Vector. We cannot do it purely by relying on the kind, both for speed reasons and because Return can have either 0 or 1 argument in B3
114           Thankfully, we have an extra byte of padding to use in the middle of B3::Value
115         - In order to support clone(), we must have a separate version of allocate, which extracts the opcode from the to-be-cloned object instead of from the call to the constructor
116         - Speaking of which, we need a special templated function opcodeFromConstructor, because some of the constructors of subclasses of Value don't take an explicit Opcode as argument, typically because they match a single one.
117         - To maximize performance, we provide specialized versions of child/lastChild/numChildren/children in the subclasses of Value, skipping checks when the actual type of the Value is already known.
118           This is done through the B3_SPECIALIZE_VALUE_FOR_... defined at the bottom of B3Value.h
119         - In the constructors of Value, we convert all extra children arguments to Value* eagerly. It is not required for correctness (they will be converted when put into a Vector<Value*> or a Value* in the end), but it helps limit an explosion in the number of template instantiations.
120         - I moved DeepValueDump::dump from the .h to the .cpp, as there is no good reason to inline it, and recompiling JSC is already slow enough
121
122         * JavaScriptCore.xcodeproj/project.pbxproj:
123         * b3/B3ArgumentRegValue.cpp:
124         (JSC::B3::ArgumentRegValue::cloneImpl const): Deleted.
125         * b3/B3ArgumentRegValue.h:
126         * b3/B3AtomicValue.cpp:
127         (JSC::B3::AtomicValue::AtomicValue):
128         (JSC::B3::AtomicValue::cloneImpl const): Deleted.
129         * b3/B3AtomicValue.h:
130         * b3/B3BasicBlock.h:
131         * b3/B3BasicBlockInlines.h:
132         (JSC::B3::BasicBlock::appendNewNonTerminal): Deleted.
133         * b3/B3CCallValue.cpp:
134         (JSC::B3::CCallValue::appendArgs):
135         (JSC::B3::CCallValue::cloneImpl const): Deleted.
136         * b3/B3CCallValue.h:
137         * b3/B3CheckValue.cpp:
138         (JSC::B3::CheckValue::cloneImpl const): Deleted.
139         * b3/B3CheckValue.h:
140         * b3/B3Const32Value.cpp:
141         (JSC::B3::Const32Value::cloneImpl const): Deleted.
142         * b3/B3Const32Value.h:
143         * b3/B3Const64Value.cpp:
144         (JSC::B3::Const64Value::cloneImpl const): Deleted.
145         * b3/B3Const64Value.h:
146         * b3/B3ConstDoubleValue.cpp:
147         (JSC::B3::ConstDoubleValue::cloneImpl const): Deleted.
148         * b3/B3ConstDoubleValue.h:
149         * b3/B3ConstFloatValue.cpp:
150         (JSC::B3::ConstFloatValue::cloneImpl const): Deleted.
151         * b3/B3ConstFloatValue.h:
152         * b3/B3ConstPtrValue.h:
153         (JSC::B3::ConstPtrValue::opcodeFromConstructor):
154         * b3/B3FenceValue.cpp:
155         (JSC::B3::FenceValue::FenceValue):
156         (JSC::B3::FenceValue::cloneImpl const): Deleted.
157         * b3/B3FenceValue.h:
158         * b3/B3MemoryValue.cpp:
159         (JSC::B3::MemoryValue::MemoryValue):
160         (JSC::B3::MemoryValue::cloneImpl const): Deleted.
161         * b3/B3MemoryValue.h:
162         * b3/B3MoveConstants.cpp:
163         * b3/B3PatchpointValue.cpp:
164         (JSC::B3::PatchpointValue::cloneImpl const): Deleted.
165         * b3/B3PatchpointValue.h:
166         (JSC::B3::PatchpointValue::opcodeFromConstructor):
167         * b3/B3Procedure.cpp:
168         * b3/B3Procedure.h:
169         * b3/B3ProcedureInlines.h:
170         (JSC::B3::Procedure::add):
171         * b3/B3SlotBaseValue.cpp:
172         (JSC::B3::SlotBaseValue::cloneImpl const): Deleted.
173         * b3/B3SlotBaseValue.h:
174         * b3/B3StackmapSpecial.cpp:
175         (JSC::B3::StackmapSpecial::forEachArgImpl):
176         (JSC::B3::StackmapSpecial::isValidImpl):
177         * b3/B3StackmapValue.cpp:
178         (JSC::B3::StackmapValue::append):
179         (JSC::B3::StackmapValue::StackmapValue):
180         * b3/B3StackmapValue.h:
181         * b3/B3SwitchValue.cpp:
182         (JSC::B3::SwitchValue::SwitchValue):
183         (JSC::B3::SwitchValue::cloneImpl const): Deleted.
184         * b3/B3SwitchValue.h:
185         (JSC::B3::SwitchValue::opcodeFromConstructor):
186         * b3/B3UpsilonValue.cpp:
187         (JSC::B3::UpsilonValue::cloneImpl const): Deleted.
188         * b3/B3UpsilonValue.h:
189         * b3/B3Value.cpp:
190         (JSC::B3::DeepValueDump::dump const):
191         (JSC::B3::Value::~Value):
192         (JSC::B3::Value::replaceWithIdentity):
193         (JSC::B3::Value::replaceWithNopIgnoringType):
194         (JSC::B3::Value::replaceWithPhi):
195         (JSC::B3::Value::replaceWithJump):
196         (JSC::B3::Value::replaceWithOops):
197         (JSC::B3::Value::replaceWith):
198         (JSC::B3::Value::invertedCompare const):
199         (JSC::B3::Value::returnsBool const):
200         (JSC::B3::Value::cloneImpl const): Deleted.
201         * b3/B3Value.h:
202         (JSC::B3::DeepValueDump::dump const): Deleted.
203         * b3/B3ValueInlines.h:
204         (JSC::B3::Value::adjacencyListOffset const):
205         (JSC::B3::Value::cloneImpl const):
206         * b3/B3VariableValue.cpp:
207         (JSC::B3::VariableValue::VariableValue):
208         (JSC::B3::VariableValue::cloneImpl const): Deleted.
209         * b3/B3VariableValue.h:
210         * b3/B3WasmAddressValue.cpp:
211         (JSC::B3::WasmAddressValue::WasmAddressValue):
212         (JSC::B3::WasmAddressValue::cloneImpl const): Deleted.
213         * b3/B3WasmAddressValue.h:
214         * b3/B3WasmBoundsCheckValue.cpp:
215         (JSC::B3::WasmBoundsCheckValue::WasmBoundsCheckValue):
216         (JSC::B3::WasmBoundsCheckValue::cloneImpl const): Deleted.
217         * b3/B3WasmBoundsCheckValue.h:
218         (JSC::B3::WasmBoundsCheckValue::accepts):
219         (JSC::B3::WasmBoundsCheckValue::opcodeFromConstructor):
220         * b3/testb3.cpp:
221         (JSC::B3::testCallFunctionWithHellaArguments):
222         (JSC::B3::testCallFunctionWithHellaArguments2):
223         (JSC::B3::testCallFunctionWithHellaArguments3):
224         (JSC::B3::testCallFunctionWithHellaDoubleArguments):
225         (JSC::B3::testCallFunctionWithHellaFloatArguments):
226         * ftl/FTLOutput.h:
227         (JSC::FTL::Output::call):
228
229 2019-04-15  Tadeu Zagallo  <tzagallo@apple.com>
230
231         Bytecode cache should not encode the SourceProvider for UnlinkedFunctionExecutable's classSource
232         https://bugs.webkit.org/show_bug.cgi?id=196878
233
234         Reviewed by Saam Barati.
235
236         Every time we encode an (Unlinked)SourceCode, we encode its SourceProvider,
237         including the full source if it's a StringSourceProvider. This wasn't an issue,
238         since the SourceCode contains a RefPtr to the SourceProvider, and the Encoder
239         would avoid encoding the provider multiple times. With the addition of the
240         incremental cache, each UnlinkedFunctionCodeBlock is encoded in isolation, which
241         means we can no longer deduplicate it and the full program text was being encoded
242         multiple times in the cache.
243         As a work around, this patch adds a custom cached type for encoding the SourceCode
244         without its provider, and later injects the SourceProvider through the Decoder.
245
246         * parser/SourceCode.h:
247         * parser/UnlinkedSourceCode.h:
248         (JSC::UnlinkedSourceCode::provider const):
249         * runtime/CachedTypes.cpp:
250         (JSC::Decoder::Decoder):
251         (JSC::Decoder::create):
252         (JSC::Decoder::provider const):
253         (JSC::CachedSourceCodeWithoutProvider::encode):
254         (JSC::CachedSourceCodeWithoutProvider::decode const):
255         (JSC::decodeCodeBlockImpl):
256         * runtime/CachedTypes.h:
257
258 2019-04-15  Robin Morisset  <rmorisset@apple.com>
259
260         MarkedSpace.cpp is not in the Xcode workspace
261         https://bugs.webkit.org/show_bug.cgi?id=196928
262
263         Reviewed by Saam Barati.
264
265         * JavaScriptCore.xcodeproj/project.pbxproj:
266
267 2019-04-15  Tadeu Zagallo  <tzagallo@apple.com>
268
269         Incremental bytecode cache should not append function updates when loaded from memory
270         https://bugs.webkit.org/show_bug.cgi?id=196865
271
272         Reviewed by Filip Pizlo.
273
274         Function updates hold the assumption that a function can only be executed/cached
275         after its containing code block has already been cached. This assumptions does
276         not hold if the UnlinkedCodeBlock is loaded from memory by the CodeCache, since
277         we might have two independent SourceProviders executing different paths of the
278         code and causing the same UnlinkedCodeBlock to be modified in memory.
279         Use a RefPtr instead of Ref for m_cachedBytecode in ShellSourceProvider to distinguish
280         between a new, empty cache and a cache that was not loaded and therefore cannot be updated.
281
282         * jsc.cpp:
283         (ShellSourceProvider::ShellSourceProvider):
284
285 2019-04-15  Saam barati  <sbarati@apple.com>
286
287         mergeOSREntryValue is wrong when the incoming value does not match up with the flush format
288         https://bugs.webkit.org/show_bug.cgi?id=196918
289
290         Reviewed by Yusuke Suzuki.
291
292         r244238 lead to some debug failures because we were calling checkConsistency()
293         before doing fixTypeForRepresentation when merging in must handle values in
294         CFA. This patch fixes that.
295         
296         However, as I was reading over mergeOSREntryValue, I realized it was wrong. It
297         was possible it could merge in a value/type outside of the variable's flushed type.
298         Once the flush format types are locked in, we can't introduce a type out of
299         that range. This probably never lead to any crashes as our profiling injection
300         and speculation decision code is solid. However, what we were doing is clearly
301         wrong, and something a fuzzer could have found if we fuzzed the must handle
302         values inside prediction injection. We should do that fuzzing:
303         https://bugs.webkit.org/show_bug.cgi?id=196924
304
305         * dfg/DFGAbstractValue.cpp:
306         (JSC::DFG::AbstractValue::mergeOSREntryValue):
307         * dfg/DFGAbstractValue.h:
308         * dfg/DFGCFAPhase.cpp:
309         (JSC::DFG::CFAPhase::injectOSR):
310
311 2019-04-15  Robin Morisset  <rmorisset@apple.com>
312
313         Several structures and enums in the Yarr interpreter can be shrunk
314         https://bugs.webkit.org/show_bug.cgi?id=196923
315
316         Reviewed by Saam Barati.
317
318         YarrOp: 88 -> 80
319         RegularExpression: 40 -> 32
320         ByteTerm: 56 -> 48
321         PatternTerm: 56 -> 48
322
323         * yarr/RegularExpression.cpp:
324         * yarr/YarrInterpreter.h:
325         * yarr/YarrJIT.cpp:
326         (JSC::Yarr::YarrGenerator::YarrOp::YarrOp):
327         * yarr/YarrParser.h:
328         * yarr/YarrPattern.h:
329
330 2019-04-15  Devin Rousso  <drousso@apple.com>
331
332         Web Inspector: REGRESSION(r244172): crash when trying to add extra domain while inspecting JSContext
333         https://bugs.webkit.org/show_bug.cgi?id=196925
334         <rdar://problem/49873994>
335
336         Reviewed by Joseph Pecoraro.
337
338         Move the logic for creating the `InspectorAgent` and `InspectorDebuggerAgent` into separate
339         functions so that callers can be guaranteed to have a valid instance of the agent.
340
341         * inspector/JSGlobalObjectInspectorController.h:
342         * inspector/JSGlobalObjectInspectorController.cpp:
343         (Inspector::JSGlobalObjectInspectorController::connectFrontend):
344         (Inspector::JSGlobalObjectInspectorController::frontendInitialized):
345         (Inspector::JSGlobalObjectInspectorController::appendExtraAgent):
346         (Inspector::JSGlobalObjectInspectorController::ensureInspectorAgent): Added.
347         (Inspector::JSGlobalObjectInspectorController::ensureDebuggerAgent): Added.
348         (Inspector::JSGlobalObjectInspectorController::createLazyAgents):
349
350 2019-04-14  Don Olmstead  <don.olmstead@sony.com>
351
352         [CMake] JavaScriptCore derived sources should only be referenced inside JavaScriptCore
353         https://bugs.webkit.org/show_bug.cgi?id=196742
354
355         Reviewed by Konstantin Tokarev.
356
357         Migrate to using JavaScriptCore_DERIVED_SOURCES_DIR instead of DERIVED_SOURCES_JAVASCRIPTCORE_DIR
358         to support moving the JavaScriptCore derived sources outside of a shared directory.
359
360         Also use JavaScriptCore_DERIVED_SOURCES_DIR instead of DERIVED_SOUCES_DIR.
361
362         * CMakeLists.txt:
363
364 2019-04-13  Tadeu Zagallo  <tzagallo@apple.com>
365
366         CodeCache should check that the UnlinkedCodeBlock was successfully created before caching it
367         https://bugs.webkit.org/show_bug.cgi?id=196880
368
369         Reviewed by Yusuke Suzuki.
370
371         CodeCache should not tell the SourceProvider to cache the bytecode if it failed
372         to create the UnlinkedCodeBlock.
373
374         * runtime/CodeCache.cpp:
375         (JSC::CodeCache::getUnlinkedGlobalCodeBlock):
376
377 2019-04-12  Saam barati  <sbarati@apple.com>
378
379         r244079 logically broke shouldSpeculateInt52
380         https://bugs.webkit.org/show_bug.cgi?id=196884
381
382         Reviewed by Yusuke Suzuki.
383
384         In r244079, I changed shouldSpeculateInt52 to only return true
385         when the prediction is isAnyInt52Speculation(). However, it was
386         wrong to not to include SpecInt32 in this for two reasons:
387
388         1. We diligently write code that first checks if we should speculate Int32.
389         For example:
390         if (shouldSpeculateInt32()) ... 
391         else if (shouldSpeculateInt52()) ...
392
393         It would be wrong not to fall back to Int52 if we're dealing with the union of
394         Int32 and Int52.
395
396         It would be a performance mistake to not include Int32 here because
397         data flow can easily tell us that we have variables that are the union
398         of Int32 and Int52 values. It's better to speculate Int52 than Double
399         in that situation.
400
401         2. We also write code where we ask if the inputs can be Int52, e.g, if
402         we know via profiling that an Add overflows, we may not emit an Int32 add.
403         However, we only emit such an add if both inputs can be Int52, and Int32
404         can trivially become Int52.
405
406        This patch recovers the 0.5-1% regression r244079 caused on JetStream 2.
407
408         * bytecode/SpeculatedType.h:
409         (JSC::isInt32SpeculationForArithmetic):
410         (JSC::isInt32OrBooleanSpeculationForArithmetic):
411         (JSC::isInt32OrInt52Speculation):
412         * dfg/DFGFixupPhase.cpp:
413         (JSC::DFG::FixupPhase::observeUseKindOnNode):
414         * dfg/DFGNode.h:
415         (JSC::DFG::Node::shouldSpeculateInt52):
416         * dfg/DFGPredictionPropagationPhase.cpp:
417         * dfg/DFGVariableAccessData.cpp:
418         (JSC::DFG::VariableAccessData::couldRepresentInt52Impl):
419
420 2019-04-12  Saam barati  <sbarati@apple.com>
421
422         Unreviewed. Build fix after r244233.
423
424         * assembler/CPU.cpp:
425
426 2019-04-12  Saam barati  <sbarati@apple.com>
427
428         Sometimes we need to user fewer CPUs in our threading calculations
429         https://bugs.webkit.org/show_bug.cgi?id=196794
430         <rdar://problem/49389497>
431
432         Reviewed by Yusuke Suzuki.
433
434         * JavaScriptCore.xcodeproj/project.pbxproj:
435         * Sources.txt:
436         * assembler/CPU.cpp: Added.
437         (JSC::isKernTCSMAvailable):
438         (JSC::enableKernTCSM):
439         (JSC::kernTCSMAwareNumberOfProcessorCores):
440         * assembler/CPU.h:
441         (JSC::isKernTCSMAvailable):
442         (JSC::enableKernTCSM):
443         (JSC::kernTCSMAwareNumberOfProcessorCores):
444         * heap/MachineStackMarker.h:
445         (JSC::MachineThreads::addCurrentThread):
446         * runtime/JSLock.cpp:
447         (JSC::JSLock::didAcquireLock):
448         * runtime/Options.cpp:
449         (JSC::computeNumberOfWorkerThreads):
450         (JSC::computePriorityDeltaOfWorkerThreads):
451         * wasm/WasmWorklist.cpp:
452         (JSC::Wasm::Worklist::Worklist):
453
454 2019-04-12  Robin Morisset  <rmorisset@apple.com>
455
456         Use padding at end of ArrayBuffer
457         https://bugs.webkit.org/show_bug.cgi?id=196823
458
459         Reviewed by Filip Pizlo.
460
461         * runtime/ArrayBuffer.h:
462
463 2019-04-11  Yusuke Suzuki  <ysuzuki@apple.com>
464
465         [JSC] op_has_indexed_property should not assume subscript part is Uint32
466         https://bugs.webkit.org/show_bug.cgi?id=196850
467
468         Reviewed by Saam Barati.
469
470         op_has_indexed_property assumed that subscript part is always Uint32. However, this is just a load from non-constant RegisterID,
471         DFG can store it in double format and can perform OSR exit. op_has_indexed_property should not assume that.
472         In this patch, instead, we check it with isAnyInt and get uint32_t from AnyInt.
473
474         * jit/JITOpcodes.cpp:
475         (JSC::JIT::emit_op_has_indexed_property):
476         * jit/JITOpcodes32_64.cpp:
477         (JSC::JIT::emit_op_has_indexed_property):
478         * jit/JITOperations.cpp:
479         * runtime/CommonSlowPaths.cpp:
480         (JSC::SLOW_PATH_DECL):
481
482 2019-04-11  Saam barati  <sbarati@apple.com>
483
484         Remove invalid assertion in operationInstanceOfCustom
485         https://bugs.webkit.org/show_bug.cgi?id=196842
486         <rdar://problem/49725493>
487
488         Reviewed by Michael Saboff.
489
490         In the generated JIT code, we go to the slow path when the incoming function
491         isn't the Node's CodeOrigin's functionProtoHasInstanceSymbolFunction. However,
492         in the JIT operation, we were asserting against exec->lexicalGlobalObject()'s
493         functionProtoHasInstanceSymbolFunction. That assertion might be wrong when
494         inlining across global objects as exec->lexicalGlobalObject() uses the machine
495         frame for procuring the global object. There is no harm when this assertion fails
496         as we just execute the slow path. This patch removes the assertion. (However, this
497         does shed light on the deficiency in our exec->lexicalGlobalObject() function with
498         respect to inlining. However, this isn't new -- we've known about this for a while.)
499
500         * jit/JITOperations.cpp:
501
502 2019-04-11  Michael Saboff  <msaboff@apple.com>
503
504         Improve the Inline Cache Stats code
505         https://bugs.webkit.org/show_bug.cgi?id=196836
506
507         Reviewed by Saam Barati.
508
509         Needed to handle the case where the Identifier could be null, for example with InstanceOfAddAccessCase
510         and InstanceOfReplaceWithJump.
511
512         Added the ability to log the location of a GetBy and PutBy property as either on self or up the
513         protocol chain.
514
515         * jit/ICStats.cpp:
516         (JSC::ICEvent::operator< const):
517         (JSC::ICEvent::dump const):
518         * jit/ICStats.h:
519         (JSC::ICEvent::ICEvent):
520         (JSC::ICEvent::hash const):
521         * jit/JITOperations.cpp:
522         * jit/Repatch.cpp:
523         (JSC::tryCacheGetByID):
524         (JSC::tryCachePutByID):
525         (JSC::tryCacheInByID):
526
527 2019-04-11  Devin Rousso  <drousso@apple.com>
528
529         Web Inspector: Timelines: can't reliably stop/start a recording
530         https://bugs.webkit.org/show_bug.cgi?id=196778
531         <rdar://problem/47606798>
532
533         Reviewed by Timothy Hatcher.
534
535         * inspector/protocol/ScriptProfiler.json:
536         * inspector/protocol/Timeline.json:
537         It is possible to determine when programmatic capturing starts/stops in the frontend based
538         on the state when the backend causes the state to change, such as if the state is "inactive"
539         when the frontend is told that the backend has started capturing.
540
541         * inspector/protocol/CPUProfiler.json:
542         * inspector/protocol/Memory.json:
543         Send an end timestamp to match other instruments.
544
545         * inspector/JSGlobalObjectConsoleClient.cpp:
546         (Inspector::JSGlobalObjectConsoleClient::startConsoleProfile):
547         (Inspector::JSGlobalObjectConsoleClient::stopConsoleProfile):
548
549         * inspector/agents/InspectorScriptProfilerAgent.h:
550         * inspector/agents/InspectorScriptProfilerAgent.cpp:
551         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
552         (Inspector::InspectorScriptProfilerAgent::programmaticCaptureStarted): Deleted.
553         (Inspector::InspectorScriptProfilerAgent::programmaticCaptureStopped): Deleted.
554
555 2019-04-11  Saam barati  <sbarati@apple.com>
556
557         Rename SetArgument to SetArgumentDefinitely
558         https://bugs.webkit.org/show_bug.cgi?id=196828
559
560         Reviewed by Yusuke Suzuki.
561
562         This is in preparation for https://bugs.webkit.org/show_bug.cgi?id=196712
563         where we will introduce a node named SetArgumentMaybe. Doing this refactoring
564         first will make reviewing that other patch easier.
565
566         * dfg/DFGAbstractInterpreterInlines.h:
567         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
568         * dfg/DFGByteCodeParser.cpp:
569         (JSC::DFG::ByteCodeParser::handleVarargsInlining):
570         (JSC::DFG::ByteCodeParser::parseBlock):
571         * dfg/DFGCPSRethreadingPhase.cpp:
572         (JSC::DFG::CPSRethreadingPhase::freeUnnecessaryNodes):
573         (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor):
574         (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor):
575         (JSC::DFG::CPSRethreadingPhase::canonicalizeLocalsInBlock):
576         (JSC::DFG::CPSRethreadingPhase::specialCaseArguments):
577         (JSC::DFG::CPSRethreadingPhase::propagatePhis):
578         (JSC::DFG::CPSRethreadingPhase::computeIsFlushed):
579         * dfg/DFGClobberize.h:
580         (JSC::DFG::clobberize):
581         * dfg/DFGCommon.h:
582         * dfg/DFGDoesGC.cpp:
583         (JSC::DFG::doesGC):
584         * dfg/DFGFixupPhase.cpp:
585         (JSC::DFG::FixupPhase::fixupNode):
586         * dfg/DFGGraph.cpp:
587         (JSC::DFG::Graph::methodOfGettingAValueProfileFor):
588         * dfg/DFGGraph.h:
589         * dfg/DFGInPlaceAbstractState.cpp:
590         (JSC::DFG::InPlaceAbstractState::initialize):
591         (JSC::DFG::InPlaceAbstractState::endBasicBlock):
592         * dfg/DFGLiveCatchVariablePreservationPhase.cpp:
593         (JSC::DFG::LiveCatchVariablePreservationPhase::handleBlockForTryCatch):
594         * dfg/DFGMaximalFlushInsertionPhase.cpp:
595         (JSC::DFG::MaximalFlushInsertionPhase::treatRegularBlock):
596         (JSC::DFG::MaximalFlushInsertionPhase::treatRootBlock):
597         * dfg/DFGMayExit.cpp:
598         * dfg/DFGNode.cpp:
599         (JSC::DFG::Node::hasVariableAccessData):
600         * dfg/DFGNode.h:
601         (JSC::DFG::Node::convertPhantomToPhantomLocal):
602         * dfg/DFGNodeType.h:
603         * dfg/DFGOSREntrypointCreationPhase.cpp:
604         (JSC::DFG::OSREntrypointCreationPhase::run):
605         * dfg/DFGPhantomInsertionPhase.cpp:
606         * dfg/DFGPredictionPropagationPhase.cpp:
607         * dfg/DFGSSAConversionPhase.cpp:
608         (JSC::DFG::SSAConversionPhase::run):
609         * dfg/DFGSafeToExecute.h:
610         (JSC::DFG::safeToExecute):
611         * dfg/DFGSpeculativeJIT.cpp:
612         (JSC::DFG::SpeculativeJIT::checkArgumentTypes):
613         * dfg/DFGSpeculativeJIT32_64.cpp:
614         (JSC::DFG::SpeculativeJIT::compile):
615         * dfg/DFGSpeculativeJIT64.cpp:
616         (JSC::DFG::SpeculativeJIT::compile):
617         * dfg/DFGTypeCheckHoistingPhase.cpp:
618         (JSC::DFG::TypeCheckHoistingPhase::run):
619         * dfg/DFGValidate.cpp:
620         * ftl/FTLCapabilities.cpp:
621         (JSC::FTL::canCompile):
622
623 2019-04-11  Truitt Savell  <tsavell@apple.com>
624
625         Unreviewed, rolling out r244158.
626
627         Casued 8 inspector/timeline/ test failures.
628
629         Reverted changeset:
630
631         "Web Inspector: Timelines: can't reliably stop/start a
632         recording"
633         https://bugs.webkit.org/show_bug.cgi?id=196778
634         https://trac.webkit.org/changeset/244158
635
636 2019-04-10  Saam Barati  <sbarati@apple.com>
637
638         AbstractValue::validateOSREntryValue is wrong for Int52 constants
639         https://bugs.webkit.org/show_bug.cgi?id=196801
640         <rdar://problem/49771122>
641
642         Reviewed by Yusuke Suzuki.
643
644         validateOSREntryValue should not care about the format of the incoming
645         value for Int52s. This patch normalizes the format of m_value and
646         the incoming value when comparing them.
647
648         * dfg/DFGAbstractValue.h:
649         (JSC::DFG::AbstractValue::validateOSREntryValue const):
650
651 2019-04-10  Saam Barati  <sbarati@apple.com>
652
653         ArithSub over Int52 has shouldCheckOverflow as always true
654         https://bugs.webkit.org/show_bug.cgi?id=196796
655
656         Reviewed by Yusuke Suzuki.
657
658         AI was checking for ArithSub over Int52 if !shouldCheckOverflow. However,
659         shouldCheckOverflow is always true, so !shouldCheckOverflow is always
660         false. We shouldn't check something we assert against.
661
662         * dfg/DFGAbstractInterpreterInlines.h:
663         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
664
665 2019-04-10  Basuke Suzuki  <basuke.suzuki@sony.com>
666
667         [PlayStation] Specify byte order clearly on Remote Inspector Protocol
668         https://bugs.webkit.org/show_bug.cgi?id=196790
669
670         Reviewed by Ross Kirsling.
671
672         Original implementation lacks byte order specification. Network byte order is the
673         good candidate if there's no strong reason to choose other.
674         Currently no client exists for PlayStation remote inspector protocol, so we can
675         change the byte order without care.
676
677         * inspector/remote/playstation/RemoteInspectorMessageParserPlayStation.cpp:
678         (Inspector::MessageParser::createMessage):
679         (Inspector::MessageParser::parse):
680
681 2019-04-10  Devin Rousso  <drousso@apple.com>
682
683        Web Inspector: Inspector: lazily create the agent
684        https://bugs.webkit.org/show_bug.cgi?id=195971
685        <rdar://problem/49039645>
686
687        Reviewed by Joseph Pecoraro.
688
689        * inspector/JSGlobalObjectInspectorController.cpp:
690        (Inspector::JSGlobalObjectInspectorController::JSGlobalObjectInspectorController):
691        (Inspector::JSGlobalObjectInspectorController::connectFrontend):
692        (Inspector::JSGlobalObjectInspectorController::appendExtraAgent):
693        (Inspector::JSGlobalObjectInspectorController::createLazyAgents):
694
695        * inspector/agents/InspectorAgent.h:
696        * inspector/agents/InspectorAgent.cpp:
697
698 2019-04-10  Saam Barati  <sbarati@apple.com>
699
700         Work around an arm64_32 LLVM miscompile bug
701         https://bugs.webkit.org/show_bug.cgi?id=196788
702
703         Reviewed by Yusuke Suzuki.
704
705         * runtime/CachedTypes.cpp:
706
707 2019-04-10  Devin Rousso  <drousso@apple.com>
708
709         Web Inspector: Timelines: can't reliably stop/start a recording
710         https://bugs.webkit.org/show_bug.cgi?id=196778
711         <rdar://problem/47606798>
712
713         Reviewed by Timothy Hatcher.
714
715         * inspector/protocol/ScriptProfiler.json:
716         * inspector/protocol/Timeline.json:
717         It is possible to determine when programmatic capturing starts/stops in the frontend based
718         on the state when the backend causes the state to change, such as if the state is "inactive"
719         when the frontend is told that the backend has started capturing.
720
721         * inspector/protocol/CPUProfiler.json:
722         * inspector/protocol/Memory.json:
723         Send an end timestamp to match other instruments.
724
725         * inspector/JSGlobalObjectConsoleClient.cpp:
726         (Inspector::JSGlobalObjectConsoleClient::startConsoleProfile):
727         (Inspector::JSGlobalObjectConsoleClient::stopConsoleProfile):
728
729         * inspector/agents/InspectorScriptProfilerAgent.h:
730         * inspector/agents/InspectorScriptProfilerAgent.cpp:
731         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
732         (Inspector::InspectorScriptProfilerAgent::programmaticCaptureStarted): Deleted.
733         (Inspector::InspectorScriptProfilerAgent::programmaticCaptureStopped): Deleted.
734
735 2019-04-10  Tadeu Zagallo  <tzagallo@apple.com>
736
737         Unreviewed, fix watch build after r244143
738         https://bugs.webkit.org/show_bug.cgi?id=195000
739
740         The result of `lseek` should be `off_t` rather than `int`.
741
742         * jsc.cpp:
743
744 2019-04-10  Tadeu Zagallo  <tzagallo@apple.com>
745
746         Add support for incremental bytecode cache updates
747         https://bugs.webkit.org/show_bug.cgi?id=195000
748
749         Reviewed by Filip Pizlo.
750
751         Add support for incremental updates to the bytecode cache. The cache
752         is constructed as follows:
753         - When the cache is empty, the initial payload can be added to the BytecodeCache
754         by calling BytecodeCache::addGlobalUpdate. This represents the encoded
755         top-level UnlinkedCodeBlock.
756         - Afterwards, updates can be added by calling BytecodeCache::addFunctionUpdate.
757         The update is applied by appending the encoded UnlinkedFunctionCodeBlock
758         to the existing cache and updating the CachedFunctionExecutableMetadata
759         and the offset of the new CachedFunctionCodeBlock in the owner CachedFunctionExecutable.
760
761         * API/JSScript.mm:
762         (-[JSScript readCache]):
763         (-[JSScript isUsingBytecodeCache]):
764         (-[JSScript init]):
765         (-[JSScript cachedBytecode]):
766         (-[JSScript writeCache:]):
767         * API/JSScriptInternal.h:
768         * API/JSScriptSourceProvider.h:
769         * API/JSScriptSourceProvider.mm:
770         (JSScriptSourceProvider::cachedBytecode const):
771         * CMakeLists.txt:
772         * JavaScriptCore.xcodeproj/project.pbxproj:
773         * Sources.txt:
774         * bytecode/UnlinkedFunctionExecutable.cpp:
775         (JSC::generateUnlinkedFunctionCodeBlock):
776         * jsc.cpp:
777         (ShellSourceProvider::~ShellSourceProvider):
778         (ShellSourceProvider::cachePath const):
779         (ShellSourceProvider::loadBytecode const):
780         (ShellSourceProvider::ShellSourceProvider):
781         (ShellSourceProvider::cacheEnabled):
782         * parser/SourceProvider.h:
783         (JSC::SourceProvider::cachedBytecode const):
784         (JSC::SourceProvider::updateCache const):
785         (JSC::SourceProvider::commitCachedBytecode const):
786         * runtime/CachePayload.cpp: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
787         (JSC::CachePayload::makeMappedPayload):
788         (JSC::CachePayload::makeMallocPayload):
789         (JSC::CachePayload::makeEmptyPayload):
790         (JSC::CachePayload::CachePayload):
791         (JSC::CachePayload::~CachePayload):
792         (JSC::CachePayload::operator=):
793         (JSC::CachePayload::freeData):
794         * runtime/CachePayload.h: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
795         (JSC::CachePayload::data const):
796         (JSC::CachePayload::size const):
797         (JSC::CachePayload::CachePayload):
798         * runtime/CacheUpdate.cpp: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
799         (JSC::CacheUpdate::CacheUpdate):
800         (JSC::CacheUpdate::operator=):
801         (JSC::CacheUpdate::isGlobal const):
802         (JSC::CacheUpdate::asGlobal const):
803         (JSC::CacheUpdate::asFunction const):
804         * runtime/CacheUpdate.h: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
805         * runtime/CachedBytecode.cpp: Added.
806         (JSC::CachedBytecode::addGlobalUpdate):
807         (JSC::CachedBytecode::addFunctionUpdate):
808         (JSC::CachedBytecode::copyLeafExecutables):
809         (JSC::CachedBytecode::commitUpdates const):
810         * runtime/CachedBytecode.h: Added.
811         (JSC::CachedBytecode::create):
812         (JSC::CachedBytecode::leafExecutables):
813         (JSC::CachedBytecode::data const):
814         (JSC::CachedBytecode::size const):
815         (JSC::CachedBytecode::hasUpdates const):
816         (JSC::CachedBytecode::sizeForUpdate const):
817         (JSC::CachedBytecode::CachedBytecode):
818         * runtime/CachedTypes.cpp:
819         (JSC::Encoder::addLeafExecutable):
820         (JSC::Encoder::release):
821         (JSC::Decoder::Decoder):
822         (JSC::Decoder::create):
823         (JSC::Decoder::size const):
824         (JSC::Decoder::offsetOf):
825         (JSC::Decoder::ptrForOffsetFromBase):
826         (JSC::Decoder::addLeafExecutable):
827         (JSC::VariableLengthObject::VariableLengthObject):
828         (JSC::VariableLengthObject::buffer const):
829         (JSC::CachedPtrOffsets::offsetOffset):
830         (JSC::CachedWriteBarrierOffsets::ptrOffset):
831         (JSC::CachedFunctionExecutable::features const):
832         (JSC::CachedFunctionExecutable::hasCapturedVariables const):
833         (JSC::CachedFunctionExecutableOffsets::codeBlockForCallOffset):
834         (JSC::CachedFunctionExecutableOffsets::codeBlockForConstructOffset):
835         (JSC::CachedFunctionExecutableOffsets::metadataOffset):
836         (JSC::CachedFunctionExecutable::encode):
837         (JSC::CachedFunctionExecutable::decode const):
838         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
839         (JSC::encodeCodeBlock):
840         (JSC::encodeFunctionCodeBlock):
841         (JSC::decodeCodeBlockImpl):
842         (JSC::isCachedBytecodeStillValid):
843         * runtime/CachedTypes.h:
844         (JSC::VariableLengthObjectBase::VariableLengthObjectBase):
845         (JSC::decodeCodeBlock):
846         * runtime/CodeCache.cpp:
847         (JSC::CodeCache::getUnlinkedGlobalCodeBlock):
848         (JSC::CodeCache::updateCache):
849         (JSC::CodeCache::write):
850         (JSC::writeCodeBlock):
851         (JSC::serializeBytecode):
852         * runtime/CodeCache.h:
853         (JSC::SourceCodeValue::SourceCodeValue):
854         (JSC::CodeCacheMap::findCacheAndUpdateAge):
855         (JSC::CodeCacheMap::fetchFromDiskImpl):
856         * runtime/Completion.cpp:
857         (JSC::generateProgramBytecode):
858         (JSC::generateModuleBytecode):
859         * runtime/Completion.h:
860         * runtime/LeafExecutable.cpp: Copied from Source/JavaScriptCore/API/JSScriptSourceProvider.mm.
861         (JSC::LeafExecutable::operator+ const):
862         * runtime/LeafExecutable.h: Copied from Source/JavaScriptCore/API/JSScriptSourceProvider.mm.
863         (JSC::LeafExecutable::LeafExecutable):
864         (JSC::LeafExecutable::base const):
865
866 2019-04-10  Michael Catanzaro  <mcatanzaro@igalia.com>
867
868         Unreviewed, rolling out r243989.
869
870         Broke i686 builds
871
872         Reverted changeset:
873
874         "[CMake] Detect SSE2 at compile time"
875         https://bugs.webkit.org/show_bug.cgi?id=196488
876         https://trac.webkit.org/changeset/243989
877
878 2019-04-10  Robin Morisset  <rmorisset@apple.com>
879
880         We should clear m_needsOverflowCheck when hitting an exception in defineProperties in ObjectConstructor.cpp
881         https://bugs.webkit.org/show_bug.cgi?id=196746
882
883         Reviewed by Yusuke Suzuki..
884
885         It should be safe as in that case we are not completing the operation, and so not going to have any buffer overflow.
886
887         * runtime/ObjectConstructor.cpp:
888         (JSC::defineProperties):
889
890 2019-04-10  Antoine Quint  <graouts@apple.com>
891
892         Enable Pointer Events on watchOS
893         https://bugs.webkit.org/show_bug.cgi?id=196771
894         <rdar://problem/49040909>
895
896         Reviewed by Dean Jackson.
897
898         * Configurations/FeatureDefines.xcconfig:
899
900 2019-04-09  Keith Rollin  <krollin@apple.com>
901
902         Unreviewed build maintenance -- update .xcfilelists.
903
904         * DerivedSources-input.xcfilelist:
905
906 2019-04-09  Ross Kirsling  <ross.kirsling@sony.com>
907
908         JSC should build successfully even with -DENABLE_UNIFIED_BUILDS=OFF
909         https://bugs.webkit.org/show_bug.cgi?id=193073
910
911         Reviewed by Keith Miller.
912
913         * bytecompiler/BytecodeGenerator.cpp:
914         (JSC::BytecodeGenerator::emitEqualityOpImpl):
915         (JSC::BytecodeGenerator::emitEqualityOp): Deleted.
916         * bytecompiler/BytecodeGenerator.h:
917         (JSC::BytecodeGenerator::emitEqualityOp):
918         Factor out the logic that uses the template parameter and keep it in the header.
919
920         * jit/JITPropertyAccess.cpp:
921         List off the template specializations needed by JITOperations.cpp.
922         This is unfortunate but at least there are only two (x2) by definition?
923         Trying to do away with this incurs a severe domino effect...
924
925         * API/JSValueRef.cpp:
926         * b3/B3OptimizeAssociativeExpressionTrees.cpp:
927         * b3/air/AirHandleCalleeSaves.cpp:
928         * builtins/BuiltinNames.cpp:
929         * bytecode/AccessCase.cpp:
930         * bytecode/BytecodeIntrinsicRegistry.cpp:
931         * bytecode/BytecodeIntrinsicRegistry.h:
932         * bytecode/BytecodeRewriter.cpp:
933         * bytecode/BytecodeUseDef.h:
934         * bytecode/CodeBlock.cpp:
935         * bytecode/InstanceOfAccessCase.cpp:
936         * bytecode/MetadataTable.cpp:
937         * bytecode/PolyProtoAccessChain.cpp:
938         * bytecode/StructureSet.cpp:
939         * bytecompiler/NodesCodegen.cpp:
940         * dfg/DFGCFAPhase.cpp:
941         * dfg/DFGPureValue.cpp:
942         * heap/GCSegmentedArray.h:
943         * heap/HeapInlines.h:
944         * heap/IsoSubspace.cpp:
945         * heap/LocalAllocator.cpp:
946         * heap/LocalAllocator.h:
947         * heap/LocalAllocatorInlines.h:
948         * heap/MarkingConstraintSolver.cpp:
949         * inspector/ScriptArguments.cpp:
950         (Inspector::ScriptArguments::isEqual const):
951         * inspector/ScriptCallStackFactory.cpp:
952         * interpreter/CallFrame.h:
953         * interpreter/Interpreter.cpp:
954         * interpreter/StackVisitor.cpp:
955         * llint/LLIntEntrypoint.cpp:
956         * runtime/ArrayIteratorPrototype.cpp:
957         * runtime/BigIntPrototype.cpp:
958         * runtime/CachedTypes.cpp:
959         * runtime/ErrorType.cpp:
960         * runtime/IndexingType.cpp:
961         * runtime/JSCellInlines.h:
962         * runtime/JSImmutableButterfly.h:
963         * runtime/Operations.h:
964         * runtime/RegExpCachedResult.cpp:
965         * runtime/RegExpConstructor.cpp:
966         * runtime/RegExpGlobalData.cpp:
967         * runtime/StackFrame.h:
968         * wasm/WasmSignature.cpp:
969         * wasm/js/JSToWasm.cpp:
970         * wasm/js/JSToWasmICCallee.cpp:
971         * wasm/js/WebAssemblyFunction.h:
972         Fix includes / forward declarations (and a couple of nearby clang warnings).
973
974 2019-04-09  Don Olmstead  <don.olmstead@sony.com>
975
976         [CMake] Apple builds should use ICU_INCLUDE_DIRS
977         https://bugs.webkit.org/show_bug.cgi?id=196720
978
979         Reviewed by Konstantin Tokarev.
980
981         * PlatformMac.cmake:
982
983 2019-04-09  Saam barati  <sbarati@apple.com>
984
985         Clean up Int52 code and some bugs in it
986         https://bugs.webkit.org/show_bug.cgi?id=196639
987         <rdar://problem/49515757>
988
989         Reviewed by Yusuke Suzuki.
990
991         This patch fixes bugs in our Int52 code. The primary change in this patch is
992         adopting a segregated type lattice for Int52. Previously, for Int52 values,
993         we represented them with SpecInt32Only and SpecInt52Only. For an Int52,
994         SpecInt32Only meant that the value is in int32 range. And SpecInt52Only meant
995         that the is outside of the int32 range.
996         
997         However, this got confusing because we reused SpecInt32Only both for JSValue
998         representations and Int52 representations. This actually lead to some bugs.
999         
1000         1. It's possible that roundtripping through Int52 representation would say
1001         it produces the wrong type. For example, consider this program and how we
1002         used to annotate types in AI:
1003         a: JSConstant(10.0) => m_type is SpecAnyIntAsDouble
1004         b: Int52Rep(@a) => m_type is SpecInt52Only
1005         c: ValueRep(@b) => m_type is SpecAnyIntAsDouble
1006         
1007         In AI, for the above program, we'd say that @c produces SpecAnyIntAsDouble.
1008         However, the execution semantics are such that it'd actually produce a boxed
1009         Int32. This patch fixes the bug where we'd say that Int52Rep over SpecAnyIntAsDouble
1010         would produce SpecInt52Only. This is clearly wrong, as SpecAnyIntAsDouble can
1011         mean an int value in either int32 or int52 range.
1012         
1013         2. AsbstractValue::validateTypeAcceptingBoxedInt52 was wrong in how it
1014         accepted Int52 values. It was wrong in two different ways:
1015         a: If the AbstractValue's type was SpecInt52Only, and the incoming value
1016         was a boxed double, but represented a value in int32 range, the incoming
1017         value would incorrectly validate as being acceptable. However, we should
1018         have rejected this value.
1019         b: If the AbstractValue's type was SpecInt32Only, and the incoming value
1020         was an Int32 boxed in a double, this would not validate, even though
1021         it should have validated.
1022         
1023         Solving 2 was easiest if we segregated out the Int52 type into its own
1024         lattice. This patch makes a new Int52 lattice, which is composed of
1025         SpecInt32AsInt52 and SpecNonInt32AsInt52.
1026         
1027         The conversion rules are now really simple.
1028         
1029         Int52 rep => JSValue rep
1030         SpecInt32AsInt52 => SpecInt32Only
1031         SpecNonInt32AsInt52 => SpecAnyIntAsDouble
1032         
1033         JSValue rep => Int52 rep
1034         SpecInt32Only => SpecInt32AsInt52
1035         SpecAnyIntAsDouble => SpecInt52Any
1036         
1037         With these rules, the program in (1) will now correctly report that @c
1038         returns SpecInt32Only | SpecAnyIntAsDouble.
1039
1040         * bytecode/SpeculatedType.cpp:
1041         (JSC::dumpSpeculation):
1042         (JSC::speculationToAbbreviatedString):
1043         (JSC::int52AwareSpeculationFromValue):
1044         (JSC::leastUpperBoundOfStrictlyEquivalentSpeculations):
1045         (JSC::speculationFromString):
1046         * bytecode/SpeculatedType.h:
1047         (JSC::isInt32SpeculationForArithmetic):
1048         (JSC::isInt32OrBooleanSpeculationForArithmetic):
1049         (JSC::isAnyInt52Speculation):
1050         (JSC::isIntAnyFormat):
1051         (JSC::isInt52Speculation): Deleted.
1052         (JSC::isAnyIntSpeculation): Deleted.
1053         * dfg/DFGAbstractInterpreterInlines.h:
1054         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1055         * dfg/DFGAbstractValue.cpp:
1056         (JSC::DFG::AbstractValue::fixTypeForRepresentation):
1057         (JSC::DFG::AbstractValue::checkConsistency const):
1058         * dfg/DFGAbstractValue.h:
1059         (JSC::DFG::AbstractValue::isInt52Any const):
1060         (JSC::DFG::AbstractValue::validateTypeAcceptingBoxedInt52 const):
1061         * dfg/DFGFixupPhase.cpp:
1062         (JSC::DFG::FixupPhase::fixupArithMul):
1063         (JSC::DFG::FixupPhase::fixupNode):
1064         (JSC::DFG::FixupPhase::fixupGetPrototypeOf):
1065         (JSC::DFG::FixupPhase::fixupToThis):
1066         (JSC::DFG::FixupPhase::fixupToStringOrCallStringConstructor):
1067         (JSC::DFG::FixupPhase::observeUseKindOnNode):
1068         (JSC::DFG::FixupPhase::fixIntConvertingEdge):
1069         (JSC::DFG::FixupPhase::attemptToMakeIntegerAdd):
1070         (JSC::DFG::FixupPhase::fixupCompareStrictEqAndSameValue):
1071         (JSC::DFG::FixupPhase::fixupChecksInBlock):
1072         * dfg/DFGGraph.h:
1073         (JSC::DFG::Graph::addShouldSpeculateInt52):
1074         (JSC::DFG::Graph::binaryArithShouldSpeculateInt52):
1075         (JSC::DFG::Graph::unaryArithShouldSpeculateInt52):
1076         (JSC::DFG::Graph::addShouldSpeculateAnyInt): Deleted.
1077         (JSC::DFG::Graph::binaryArithShouldSpeculateAnyInt): Deleted.
1078         (JSC::DFG::Graph::unaryArithShouldSpeculateAnyInt): Deleted.
1079         * dfg/DFGNode.h:
1080         (JSC::DFG::Node::shouldSpeculateInt52):
1081         (JSC::DFG::Node::shouldSpeculateAnyInt): Deleted.
1082         * dfg/DFGPredictionPropagationPhase.cpp:
1083         * dfg/DFGSpeculativeJIT.cpp:
1084         (JSC::DFG::SpeculativeJIT::setIntTypedArrayLoadResult):
1085         (JSC::DFG::SpeculativeJIT::compileArithAdd):
1086         (JSC::DFG::SpeculativeJIT::compileArithSub):
1087         (JSC::DFG::SpeculativeJIT::compileArithNegate):
1088         * dfg/DFGSpeculativeJIT64.cpp:
1089         (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal):
1090         (JSC::DFG::SpeculativeJIT::fillSpeculateInt52):
1091         * dfg/DFGUseKind.h:
1092         (JSC::DFG::typeFilterFor):
1093         * dfg/DFGVariableAccessData.cpp:
1094         (JSC::DFG::VariableAccessData::makePredictionForDoubleFormat):
1095         (JSC::DFG::VariableAccessData::couldRepresentInt52Impl):
1096         * ftl/FTLLowerDFGToB3.cpp:
1097         (JSC::FTL::DFG::LowerDFGToB3::compileArithAddOrSub):
1098         (JSC::FTL::DFG::LowerDFGToB3::compileArithNegate):
1099         (JSC::FTL::DFG::LowerDFGToB3::setIntTypedArrayLoadResult):
1100
1101 2019-04-09  Tadeu Zagallo  <tzagallo@apple.com>
1102
1103         ASSERTION FAILED: !scope.exception() || !hasProperty in JSObject::get
1104         https://bugs.webkit.org/show_bug.cgi?id=196708
1105         <rdar://problem/49556803>
1106
1107         Reviewed by Yusuke Suzuki.
1108
1109         `operationPutToScope` needs to return early if an exception is thrown while
1110         checking if `hasProperty`.
1111
1112         * jit/JITOperations.cpp:
1113
1114 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
1115
1116         [JSC] DFG should respect node's strict flag
1117         https://bugs.webkit.org/show_bug.cgi?id=196617
1118
1119         Reviewed by Saam Barati.
1120
1121         We accidentally use codeBlock->isStrictMode() directly in DFG and FTL. But this is wrong since this CodeBlock is the top level DFG/FTL CodeBlock,
1122         and this code does not respect the isStrictMode flag for the inlined CodeBlocks. In this patch, we start using isStrictModeFor(CodeOrigin) consistently
1123         in DFG and FTL to get the right isStrictMode flag for the DFG node.
1124         And we also split compilePutDynamicVar into compilePutDynamicVarStrict and compilePutDynamicVarNonStrict since (1) it is cleaner than accessing inlined
1125         callframe in the operation function, and (2) it is aligned to the other functions like operationPutByValDirectNonStrict etc.
1126         This bug is discovered by RandomizingFuzzerAgent by expanding the DFG coverage.
1127
1128         * dfg/DFGAbstractInterpreterInlines.h:
1129         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1130         * dfg/DFGConstantFoldingPhase.cpp:
1131         (JSC::DFG::ConstantFoldingPhase::foldConstants):
1132         * dfg/DFGFixupPhase.cpp:
1133         (JSC::DFG::FixupPhase::fixupToThis):
1134         * dfg/DFGOperations.cpp:
1135         * dfg/DFGOperations.h:
1136         * dfg/DFGPredictionPropagationPhase.cpp:
1137         * dfg/DFGSpeculativeJIT.cpp:
1138         (JSC::DFG::SpeculativeJIT::compileDoublePutByVal):
1139         (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray):
1140         (JSC::DFG::SpeculativeJIT::compilePutDynamicVar):
1141         (JSC::DFG::SpeculativeJIT::compileToThis):
1142         * dfg/DFGSpeculativeJIT32_64.cpp:
1143         (JSC::DFG::SpeculativeJIT::compileContiguousPutByVal):
1144         (JSC::DFG::SpeculativeJIT::compile):
1145         * dfg/DFGSpeculativeJIT64.cpp:
1146         (JSC::DFG::SpeculativeJIT::compile):
1147         * ftl/FTLLowerDFGToB3.cpp:
1148         (JSC::FTL::DFG::LowerDFGToB3::compilePutByVal):
1149         (JSC::FTL::DFG::LowerDFGToB3::compilePutDynamicVar):
1150
1151 2019-04-08  Don Olmstead  <don.olmstead@sony.com>
1152
1153         [CMake][WinCairo] Separate copied headers into different directories
1154         https://bugs.webkit.org/show_bug.cgi?id=196655
1155
1156         Reviewed by Michael Catanzaro.
1157
1158         * CMakeLists.txt:
1159         * shell/PlatformWin.cmake:
1160
1161 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
1162
1163         [JSC] isRope jump in StringSlice should not jump over register allocations
1164         https://bugs.webkit.org/show_bug.cgi?id=196716
1165
1166         Reviewed by Saam Barati.
1167
1168         Jumping over the register allocation code in DFG (like the following) is wrong.
1169
1170             auto jump = m_jit.branchXXX();
1171             {
1172                 GPRTemporary reg(this);
1173                 GPRReg regGPR = reg.gpr();
1174                 ...
1175             }
1176             jump.link(&m_jit);
1177
1178         When GPRTemporary::gpr allocates a new register, it can flush the previous register value into the stack and make the register usable.
1179         Jumping over this register allocation code skips the flushing code, and makes the DFG's stack and register content tracking inconsistent:
1180         DFG thinks that the content is flushed and stored in particular stack slot even while this flushing code is skipped.
1181         In this patch, we perform register allocations before jumping to the slow path based on `isRope` condition in StringSlice.
1182
1183         * dfg/DFGSpeculativeJIT.cpp:
1184         (JSC::DFG::SpeculativeJIT::compileStringSlice):
1185
1186 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
1187
1188         [JSC] to_index_string should not assume incoming value is Uint32
1189         https://bugs.webkit.org/show_bug.cgi?id=196713
1190
1191         Reviewed by Saam Barati.
1192
1193         The slow path of to_index_string assumes that incoming value is Uint32. But we should not have
1194         this assumption since DFG may decide we should have it double format. This patch removes this
1195         assumption, and instead, we should assume that incoming value is AnyInt and the range of this
1196         is within Uint32.
1197
1198         * runtime/CommonSlowPaths.cpp:
1199         (JSC::SLOW_PATH_DECL):
1200
1201 2019-04-08  Justin Fan  <justin_fan@apple.com>
1202
1203         [Web GPU] Fix Web GPU experimental feature on iOS
1204         https://bugs.webkit.org/show_bug.cgi?id=196632
1205
1206         Reviewed by Myles C. Maxfield.
1207
1208         Properly make Web GPU available on iOS 11+.
1209
1210         * Configurations/FeatureDefines.xcconfig:
1211         * Configurations/WebKitTargetConditionals.xcconfig:
1212
1213 2019-04-08  Ross Kirsling  <ross.kirsling@sony.com>
1214
1215         -f[no-]var-tracking-assignments is GCC-only
1216         https://bugs.webkit.org/show_bug.cgi?id=196699
1217
1218         Reviewed by Don Olmstead.
1219
1220         * CMakeLists.txt:
1221         Just remove the build flag altogether -- it supposedly doesn't solve the problem it was meant to
1222         and said problem evidently no longer occurs as of GCC 9.
1223
1224 2019-04-08  Saam Barati  <sbarati@apple.com>
1225
1226         WebAssembly.RuntimeError missing exception check
1227         https://bugs.webkit.org/show_bug.cgi?id=196700
1228         <rdar://problem/49693932>
1229
1230         Reviewed by Yusuke Suzuki.
1231
1232         * wasm/js/JSWebAssemblyRuntimeError.h:
1233         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
1234         (JSC::constructJSWebAssemblyRuntimeError):
1235
1236 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
1237
1238         Unreviewed, rolling in r243948 with test fix
1239         https://bugs.webkit.org/show_bug.cgi?id=196486
1240
1241         * parser/ASTBuilder.h:
1242         (JSC::ASTBuilder::createString):
1243         * parser/Lexer.cpp:
1244         (JSC::Lexer<T>::parseMultilineComment):
1245         (JSC::Lexer<T>::lexWithoutClearingLineTerminator):
1246         (JSC::Lexer<T>::lex): Deleted.
1247         * parser/Lexer.h:
1248         (JSC::Lexer::hasLineTerminatorBeforeToken const):
1249         (JSC::Lexer::setHasLineTerminatorBeforeToken):
1250         (JSC::Lexer<T>::lex):
1251         (JSC::Lexer::prevTerminator const): Deleted.
1252         (JSC::Lexer::setTerminator): Deleted.
1253         * parser/Parser.cpp:
1254         (JSC::Parser<LexerType>::allowAutomaticSemicolon):
1255         (JSC::Parser<LexerType>::parseSingleFunction):
1256         (JSC::Parser<LexerType>::parseStatementListItem):
1257         (JSC::Parser<LexerType>::maybeParseAsyncFunctionDeclarationStatement):
1258         (JSC::Parser<LexerType>::parseFunctionInfo):
1259         (JSC::Parser<LexerType>::parseClass):
1260         (JSC::Parser<LexerType>::parseExportDeclaration):
1261         (JSC::Parser<LexerType>::parseAssignmentExpression):
1262         (JSC::Parser<LexerType>::parseYieldExpression):
1263         (JSC::Parser<LexerType>::parseProperty):
1264         (JSC::Parser<LexerType>::parsePrimaryExpression):
1265         (JSC::Parser<LexerType>::parseMemberExpression):
1266         * parser/Parser.h:
1267         (JSC::Parser::nextWithoutClearingLineTerminator):
1268         (JSC::Parser::lexCurrentTokenAgainUnderCurrentContext):
1269         (JSC::Parser::internalSaveLexerState):
1270         (JSC::Parser::restoreLexerState):
1271
1272 2019-04-08  Ryan Haddad  <ryanhaddad@apple.com>
1273
1274         Unreviewed, rolling out r243948.
1275
1276         Caused inspector/runtime/parse.html to fail
1277
1278         Reverted changeset:
1279
1280         "SIGSEGV in JSC::BytecodeGenerator::addStringConstant"
1281         https://bugs.webkit.org/show_bug.cgi?id=196486
1282         https://trac.webkit.org/changeset/243948
1283
1284 2019-04-08  Ryan Haddad  <ryanhaddad@apple.com>
1285
1286         Unreviewed, rolling out r243943.
1287
1288         Caused test262 failures.
1289
1290         Reverted changeset:
1291
1292         "[JSC] Filter DontEnum properties in
1293         ProxyObject::getOwnPropertyNames()"
1294         https://bugs.webkit.org/show_bug.cgi?id=176810
1295         https://trac.webkit.org/changeset/243943
1296
1297 2019-04-08  Claudio Saavedra  <csaavedra@igalia.com>
1298
1299         [JSC] Partially fix the build with unified builds disabled
1300         https://bugs.webkit.org/show_bug.cgi?id=196647
1301
1302         Reviewed by Konstantin Tokarev.
1303
1304         If you disable unified builds you find all kind of build
1305         errors. This partially tries to fix them but there's a lot
1306         more.
1307
1308         * API/JSBaseInternal.h:
1309         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp:
1310         * b3/air/AirHandleCalleeSaves.h:
1311         * bytecode/ExecutableToCodeBlockEdge.cpp:
1312         * bytecode/ExitFlag.h:
1313         * bytecode/ICStatusUtils.h:
1314         * bytecode/UnlinkedMetadataTable.h:
1315         * dfg/DFGPureValue.h:
1316         * heap/IsoAlignedMemoryAllocator.cpp:
1317         * heap/IsoAlignedMemoryAllocator.h:
1318
1319 2019-04-08  Guillaume Emont  <guijemont@igalia.com>
1320
1321         Enable DFG on MIPS
1322         https://bugs.webkit.org/show_bug.cgi?id=196689
1323
1324         Reviewed by Žan Doberšek.
1325
1326         Since the bytecode change, we enabled the baseline JIT on mips in
1327         r240432, but DFG is still missing. With this change, all tests are
1328         passing on a ci20 board.
1329
1330         * jit/RegisterSet.cpp:
1331         (JSC::RegisterSet::calleeSaveRegisters):
1332         Added s0, which is used in llint.
1333
1334 2019-04-08  Xan Lopez  <xan@igalia.com>
1335
1336         [CMake] Detect SSE2 at compile time
1337         https://bugs.webkit.org/show_bug.cgi?id=196488
1338
1339         Reviewed by Carlos Garcia Campos.
1340
1341         * assembler/MacroAssemblerX86Common.cpp: Remove unnecessary (and
1342         incorrect) static_assert.
1343
1344 2019-04-07  Michael Saboff  <msaboff@apple.com>
1345
1346         REGRESSION (r243642): Crash in reddit.com page
1347         https://bugs.webkit.org/show_bug.cgi?id=196684
1348
1349         Reviewed by Geoffrey Garen.
1350
1351         In r243642, the code that saves and restores the count for non-greedy character classes
1352         was inadvertently put inside an if statement.  This code should be generated for all
1353         non-greedy character classes.
1354
1355         * yarr/YarrJIT.cpp:
1356         (JSC::Yarr::YarrGenerator::generateCharacterClassNonGreedy):
1357         (JSC::Yarr::YarrGenerator::backtrackCharacterClassNonGreedy):
1358
1359 2019-04-07  Yusuke Suzuki  <ysuzuki@apple.com>
1360
1361         [JSC] CallLinkInfo should clear Callee or CodeBlock even if it is unlinked by jettison
1362         https://bugs.webkit.org/show_bug.cgi?id=196683
1363
1364         Reviewed by Saam Barati.
1365
1366         In r243626, we stop repatching CallLinkInfo when the CallLinkInfo is held by jettisoned CodeBlock.
1367         But we still need to clear the Callee or CodeBlock since they are now dead. Otherwise, CodeBlock's
1368         visitWeak eventually accesses this dead cells and crashes because the owner CodeBlock of CallLinkInfo
1369         can be still live.
1370
1371         We also move all repatching operations from CallLinkInfo.cpp to Repatch.cpp for consistency because the
1372         other repatching operations in CallLinkInfo are implemented in Repatch.cpp side.
1373
1374         * bytecode/CallLinkInfo.cpp:
1375         (JSC::CallLinkInfo::setCallee):
1376         (JSC::CallLinkInfo::clearCallee):
1377         * jit/Repatch.cpp:
1378         (JSC::linkFor):
1379         (JSC::revertCall):
1380
1381 2019-04-05  Yusuke Suzuki  <ysuzuki@apple.com>
1382
1383         [JSC] OSRExit recovery for SpeculativeAdd does not consier "A = A + A" pattern
1384         https://bugs.webkit.org/show_bug.cgi?id=196582
1385
1386         Reviewed by Saam Barati.
1387
1388         In DFG, our ArithAdd with overflow is executed speculatively, and we recover the value when overflow flag is set.
1389         The recovery is subtracting the operand from the destination to get the original two operands. Our recovery code
1390         handles A + B = A, A + B = B cases. But it misses A + A = A case (here, A and B are GPRReg). Our recovery code
1391         attempts to produce the original operand by performing A - A, and it always produces zero accidentally.
1392
1393         This patch adds the recovery code for A + A = A case. Because we know that this ArithAdd overflows, and operands were
1394         same values, we can calculate the original operand from the destination value by `((int32_t)value >> 1) ^ 0x80000000`.
1395
1396         We also found that FTL recovery code is dead. We remove them in this patch.
1397
1398         * dfg/DFGOSRExit.cpp:
1399         (JSC::DFG::OSRExit::executeOSRExit):
1400         (JSC::DFG::OSRExit::compileExit):
1401         * dfg/DFGOSRExit.h:
1402         (JSC::DFG::SpeculationRecovery::SpeculationRecovery):
1403         * dfg/DFGSpeculativeJIT.cpp:
1404         (JSC::DFG::SpeculativeJIT::compileArithAdd):
1405         * ftl/FTLExitValue.cpp:
1406         (JSC::FTL::ExitValue::dataFormat const):
1407         (JSC::FTL::ExitValue::dumpInContext const):
1408         * ftl/FTLExitValue.h:
1409         (JSC::FTL::ExitValue::isArgument const):
1410         (JSC::FTL::ExitValue::hasIndexInStackmapLocations const):
1411         (JSC::FTL::ExitValue::adjustStackmapLocationsIndexByOffset):
1412         (JSC::FTL::ExitValue::recovery): Deleted.
1413         (JSC::FTL::ExitValue::isRecovery const): Deleted.
1414         (JSC::FTL::ExitValue::leftRecoveryArgument const): Deleted.
1415         (JSC::FTL::ExitValue::rightRecoveryArgument const): Deleted.
1416         (JSC::FTL::ExitValue::recoveryFormat const): Deleted.
1417         (JSC::FTL::ExitValue::recoveryOpcode const): Deleted.
1418         * ftl/FTLLowerDFGToB3.cpp:
1419         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
1420         (JSC::FTL::DFG::LowerDFGToB3::preparePatchpointForExceptions):
1421         (JSC::FTL::DFG::LowerDFGToB3::appendOSRExit):
1422         (JSC::FTL::DFG::LowerDFGToB3::exitValueForNode):
1423         (JSC::FTL::DFG::LowerDFGToB3::addAvailableRecovery): Deleted.
1424         * ftl/FTLOSRExitCompiler.cpp:
1425         (JSC::FTL::compileRecovery):
1426
1427 2019-04-05  Ryan Haddad  <ryanhaddad@apple.com>
1428
1429         Unreviewed, rolling out r243665.
1430
1431         Caused iOS JSC tests to exit with an exception.
1432
1433         Reverted changeset:
1434
1435         "Assertion failed in JSC::createError"
1436         https://bugs.webkit.org/show_bug.cgi?id=196305
1437         https://trac.webkit.org/changeset/243665
1438
1439 2019-04-05  Yusuke Suzuki  <ysuzuki@apple.com>
1440
1441         SIGSEGV in JSC::BytecodeGenerator::addStringConstant
1442         https://bugs.webkit.org/show_bug.cgi?id=196486
1443
1444         Reviewed by Saam Barati.
1445
1446         When parsing a FunctionExpression / FunctionDeclaration etc., we use SyntaxChecker for the body of the function because we do not have any interest on the nodes of the body at that time.
1447         The nodes will be parsed with the ASTBuilder when the function itself is parsed for code generation. This works well previously because all the function ends with "}" previously.
1448         SyntaxChecker lexes this "}" token, and parser restores the context back to ASTBuilder and continues parsing.
1449
1450         But now, we have ArrowFunctionExpression without braces `arrow => expr`. Let's consider the following code.
1451
1452                 arrow => expr
1453                 "string!"
1454
1455         We parse arrow function's body with SyntaxChecker. At that time, we lex "string!" token under the SyntaxChecker context. But this means that we may not build string content for this token
1456         since SyntaxChecker may not have interest on string content itself in certain case. After the parser is back to ASTBuilder, we parse "string!" as ExpressionStatement with string constant,
1457         generate StringNode with non-built identifier (nullptr), and we accidentally create StringNode with nullptr.
1458
1459         This patch fixes this problem. The root cause of this problem is that the last token lexed in the previous context is used. We add lexCurrentTokenAgainUnderCurrentContext which will re-lex
1460         the current token under the current context (may be ASTBuilder). This should be done only when the caller's context is different from SyntaxChecker, which avoids unnecessary lexing.
1461         We leverage existing SavePoint mechanism to implement lexCurrentTokenAgainUnderCurrentContext cleanly.
1462
1463         And we also fix the bug in the existing SavePoint mechanism, which is shown in the attached test script. When we save LexerState, we do not save line terminator status. This patch also introduces
1464         lexWithoutClearingLineTerminator, which lex the token without clearing line terminator status.
1465
1466         * parser/ASTBuilder.h:
1467         (JSC::ASTBuilder::createString):
1468         * parser/Lexer.cpp:
1469         (JSC::Lexer<T>::parseMultilineComment):
1470         (JSC::Lexer<T>::lexWithoutClearingLineTerminator): EOF token also should record offset information. This offset information is correctly handled in Lexer::setOffset too.
1471         (JSC::Lexer<T>::lex): Deleted.
1472         * parser/Lexer.h:
1473         (JSC::Lexer::hasLineTerminatorBeforeToken const):
1474         (JSC::Lexer::setHasLineTerminatorBeforeToken):
1475         (JSC::Lexer<T>::lex):
1476         (JSC::Lexer::prevTerminator const): Deleted.
1477         (JSC::Lexer::setTerminator): Deleted.
1478         * parser/Parser.cpp:
1479         (JSC::Parser<LexerType>::allowAutomaticSemicolon):
1480         (JSC::Parser<LexerType>::parseSingleFunction):
1481         (JSC::Parser<LexerType>::parseStatementListItem):
1482         (JSC::Parser<LexerType>::maybeParseAsyncFunctionDeclarationStatement):
1483         (JSC::Parser<LexerType>::parseFunctionInfo):
1484         (JSC::Parser<LexerType>::parseClass):
1485         (JSC::Parser<LexerType>::parseExportDeclaration):
1486         (JSC::Parser<LexerType>::parseAssignmentExpression):
1487         (JSC::Parser<LexerType>::parseYieldExpression):
1488         (JSC::Parser<LexerType>::parseProperty):
1489         (JSC::Parser<LexerType>::parsePrimaryExpression):
1490         (JSC::Parser<LexerType>::parseMemberExpression):
1491         * parser/Parser.h:
1492         (JSC::Parser::nextWithoutClearingLineTerminator):
1493         (JSC::Parser::lexCurrentTokenAgainUnderCurrentContext):
1494         (JSC::Parser::internalSaveLexerState):
1495         (JSC::Parser::restoreLexerState):
1496
1497 2019-04-05  Caitlin Potter  <caitp@igalia.com>
1498
1499         [JSC] Filter DontEnum properties in ProxyObject::getOwnPropertyNames()
1500         https://bugs.webkit.org/show_bug.cgi?id=176810
1501
1502         Reviewed by Saam Barati.
1503
1504         This adds conditional logic following the invariant checks, to perform
1505         filtering in common uses of getOwnPropertyNames.
1506
1507         While this would ideally only be done in JSPropertyNameEnumerator, adding
1508         the filtering to ProxyObject::performGetOwnPropertyNames maintains the
1509         invariant that the EnumerationMode is properly followed.
1510
1511         * runtime/PropertyNameArray.h:
1512         (JSC::PropertyNameArray::reset):
1513         * runtime/ProxyObject.cpp:
1514         (JSC::ProxyObject::performGetOwnPropertyNames):
1515
1516 2019-04-05  Commit Queue  <commit-queue@webkit.org>
1517
1518         Unreviewed, rolling out r243833.
1519         https://bugs.webkit.org/show_bug.cgi?id=196645
1520
1521         This change breaks build of WPE and GTK ports (Requested by
1522         annulen on #webkit).
1523
1524         Reverted changeset:
1525
1526         "[CMake][WTF] Mirror XCode header directories"
1527         https://bugs.webkit.org/show_bug.cgi?id=191662
1528         https://trac.webkit.org/changeset/243833
1529
1530 2019-04-05  Caitlin Potter  <caitp@igalia.com>
1531
1532         [JSC] throw if ownKeys Proxy trap result contains duplicate keys
1533         https://bugs.webkit.org/show_bug.cgi?id=185211
1534
1535         Reviewed by Saam Barati.
1536
1537         Implements the normative spec change in https://github.com/tc39/ecma262/pull/833
1538
1539         This involves tracking duplicate keys returned from the ownKeys trap in yet
1540         another HashTable, and may incur a minor performance penalty in some cases. This
1541         is not expected to significantly affect web performance.
1542
1543         * runtime/ProxyObject.cpp:
1544         (JSC::ProxyObject::performGetOwnPropertyNames):
1545
1546 2019-04-04  Yusuke Suzuki  <ysuzuki@apple.com>
1547
1548         [JSC] makeBoundFunction should not assume incoming "length" value is Int32 because it performs some calculation in bytecode
1549         https://bugs.webkit.org/show_bug.cgi?id=196631
1550
1551         Reviewed by Saam Barati.
1552
1553         makeBoundFunction assumes that "length" argument is always Int32. But this should not be done since this "length" value is calculated in builtin JS code.
1554         DFG may store this value in Double format so that we should not rely on that this value is Int32. This patch fixes makeBoundFunction function to perform
1555         toInt32 operation. We also insert a missing exception check for `JSString::value(ExecState*)` in makeBoundFunction.
1556
1557         * JavaScriptCore.xcodeproj/project.pbxproj:
1558         * Sources.txt:
1559         * interpreter/CallFrameInlines.h:
1560         * runtime/DoublePredictionFuzzerAgent.cpp: Copied from Source/JavaScriptCore/interpreter/CallFrameInlines.h.
1561         (JSC::DoublePredictionFuzzerAgent::DoublePredictionFuzzerAgent):
1562         (JSC::DoublePredictionFuzzerAgent::getPrediction):
1563         * runtime/DoublePredictionFuzzerAgent.h: Copied from Source/JavaScriptCore/interpreter/CallFrameInlines.h.
1564         * runtime/JSGlobalObject.cpp:
1565         (JSC::makeBoundFunction):
1566         * runtime/Options.h:
1567         * runtime/VM.cpp:
1568         (JSC::VM::VM):
1569
1570 2019-04-04  Robin Morisset  <rmorisset@apple.com>
1571
1572         B3ReduceStrength should know that Mul distributes over Add and Sub
1573         https://bugs.webkit.org/show_bug.cgi?id=196325
1574         <rdar://problem/49441650>
1575
1576         Reviewed by Saam Barati.
1577
1578         Fix some obviously wrong code that was due to an accidental copy-paste.
1579         It made the entire optimization dead code that never ran.
1580
1581         * b3/B3ReduceStrength.cpp:
1582
1583 2019-04-04  Saam Barati  <sbarati@apple.com>
1584
1585         Unreviewed, build fix for CLoop after r243886
1586
1587         * interpreter/Interpreter.cpp:
1588         (JSC::UnwindFunctor::copyCalleeSavesToEntryFrameCalleeSavesBuffer const):
1589         * interpreter/StackVisitor.cpp:
1590         (JSC::StackVisitor::Frame::calleeSaveRegistersForUnwinding):
1591         * interpreter/StackVisitor.h:
1592
1593 2019-04-04  Commit Queue  <commit-queue@webkit.org>
1594
1595         Unreviewed, rolling out r243898.
1596         https://bugs.webkit.org/show_bug.cgi?id=196624
1597
1598         `#if !ENABLE(C_LOOP) && NUMBER_OF_CALLEE_SAVES_REGISTERS > 0`
1599         does not work well (Requested by yusukesuzuki on #webkit).
1600
1601         Reverted changeset:
1602
1603         "Unreviewed, build fix for CLoop and Windows after r243886"
1604         https://bugs.webkit.org/show_bug.cgi?id=196387
1605         https://trac.webkit.org/changeset/243898
1606
1607 2019-04-04  Yusuke Suzuki  <ysuzuki@apple.com>
1608
1609         Unreviewed, build fix for CLoop and Windows after r243886
1610         https://bugs.webkit.org/show_bug.cgi?id=196387
1611
1612         RegisterAtOffsetList does not exist if ENABLE(ASSEMBLER) is false.
1613
1614         * interpreter/StackVisitor.cpp:
1615         (JSC::StackVisitor::Frame::calleeSaveRegistersForUnwinding):
1616         * interpreter/StackVisitor.h:
1617
1618 2019-04-04  Saam barati  <sbarati@apple.com>
1619
1620         Teach Call ICs how to call Wasm
1621         https://bugs.webkit.org/show_bug.cgi?id=196387
1622
1623         Reviewed by Filip Pizlo.
1624
1625         This patch teaches JS to call Wasm without going through the native thunk.
1626         Currently, we emit a JIT "JS" callee stub which marshals arguments from
1627         JS to Wasm. Like the native version of this, this thunk is responsible
1628         for saving and restoring the VM's current Wasm context. Instead of emitting
1629         an exception handler, we also teach the unwinder how to read the previous
1630         wasm context to restore it as it unwindws past this frame.
1631         
1632         This patch is straight forward, and leaves some areas for perf improvement:
1633         - We can teach the DFG/FTL to directly use the Wasm calling convention when
1634           it knows it's calling a single Wasm function. This way we don't shuffle
1635           registers to the stack and then back into registers.
1636         - We bail out to the slow path for mismatched arity. I opened a bug to fix
1637           optimize arity check failures: https://bugs.webkit.org/show_bug.cgi?id=196564
1638         - We bail out to the slow path Double JSValues flowing into i32 arguments.
1639           We should teach this thunk how to do that conversion directly.
1640         
1641         This patch also refactors the code to explicitly have a single pinned size register.
1642         We used pretend in some places that we could have more than one pinned size register.
1643         However, there was other code that just asserted the size was one. This patch just rips
1644         out this code since we never moved to having more than one pinned size register. Doing
1645         this refactoring cleans up the various places where we set up the size register.
1646         
1647         This patch is a 50-60% progression on JetStream 2's richards-wasm.
1648
1649         * JavaScriptCore.xcodeproj/project.pbxproj:
1650         * Sources.txt:
1651         * assembler/MacroAssemblerCodeRef.h:
1652         (JSC::MacroAssemblerCodeRef::operator=):
1653         (JSC::MacroAssemblerCodeRef::MacroAssemblerCodeRef):
1654         * interpreter/Interpreter.cpp:
1655         (JSC::UnwindFunctor::operator() const):
1656         (JSC::UnwindFunctor::copyCalleeSavesToEntryFrameCalleeSavesBuffer const):
1657         * interpreter/StackVisitor.cpp:
1658         (JSC::StackVisitor::Frame::calleeSaveRegistersForUnwinding):
1659         (JSC::StackVisitor::Frame::calleeSaveRegisters): Deleted.
1660         * interpreter/StackVisitor.h:
1661         * jit/JITOperations.cpp:
1662         * jit/RegisterSet.cpp:
1663         (JSC::RegisterSet::runtimeTagRegisters):
1664         (JSC::RegisterSet::specialRegisters):
1665         (JSC::RegisterSet::runtimeRegisters): Deleted.
1666         * jit/RegisterSet.h:
1667         * jit/Repatch.cpp:
1668         (JSC::linkPolymorphicCall):
1669         * runtime/JSFunction.cpp:
1670         (JSC::getCalculatedDisplayName):
1671         * runtime/JSGlobalObject.cpp:
1672         (JSC::JSGlobalObject::init):
1673         (JSC::JSGlobalObject::visitChildren):
1674         * runtime/JSGlobalObject.h:
1675         (JSC::JSGlobalObject::jsToWasmICCalleeStructure const):
1676         * runtime/VM.cpp:
1677         (JSC::VM::VM):
1678         * runtime/VM.h:
1679         * wasm/WasmAirIRGenerator.cpp:
1680         (JSC::Wasm::AirIRGenerator::AirIRGenerator):
1681         (JSC::Wasm::AirIRGenerator::restoreWebAssemblyGlobalState):
1682         (JSC::Wasm::AirIRGenerator::addCallIndirect):
1683         * wasm/WasmB3IRGenerator.cpp:
1684         (JSC::Wasm::B3IRGenerator::B3IRGenerator):
1685         (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState):
1686         (JSC::Wasm::B3IRGenerator::addCallIndirect):
1687         * wasm/WasmBinding.cpp:
1688         (JSC::Wasm::wasmToWasm):
1689         * wasm/WasmContext.h:
1690         (JSC::Wasm::Context::pointerToInstance):
1691         * wasm/WasmContextInlines.h:
1692         (JSC::Wasm::Context::store):
1693         * wasm/WasmMemoryInformation.cpp:
1694         (JSC::Wasm::getPinnedRegisters):
1695         (JSC::Wasm::PinnedRegisterInfo::get):
1696         (JSC::Wasm::PinnedRegisterInfo::PinnedRegisterInfo):
1697         * wasm/WasmMemoryInformation.h:
1698         (JSC::Wasm::PinnedRegisterInfo::toSave const):
1699         * wasm/WasmOMGPlan.cpp:
1700         (JSC::Wasm::OMGPlan::work):
1701         * wasm/js/JSToWasm.cpp:
1702         (JSC::Wasm::createJSToWasmWrapper):
1703         * wasm/js/JSToWasmICCallee.cpp: Added.
1704         (JSC::JSToWasmICCallee::create):
1705         (JSC::JSToWasmICCallee::createStructure):
1706         (JSC::JSToWasmICCallee::visitChildren):
1707         * wasm/js/JSToWasmICCallee.h: Added.
1708         (JSC::JSToWasmICCallee::function):
1709         (JSC::JSToWasmICCallee::JSToWasmICCallee):
1710         * wasm/js/WebAssemblyFunction.cpp:
1711         (JSC::WebAssemblyFunction::useTagRegisters const):
1712         (JSC::WebAssemblyFunction::calleeSaves const):
1713         (JSC::WebAssemblyFunction::usedCalleeSaveRegisters const):
1714         (JSC::WebAssemblyFunction::previousInstanceOffset const):
1715         (JSC::WebAssemblyFunction::previousInstance):
1716         (JSC::WebAssemblyFunction::jsCallEntrypointSlow):
1717         (JSC::WebAssemblyFunction::visitChildren):
1718         (JSC::WebAssemblyFunction::destroy):
1719         * wasm/js/WebAssemblyFunction.h:
1720         * wasm/js/WebAssemblyFunctionHeapCellType.cpp: Added.
1721         (JSC::WebAssemblyFunctionDestroyFunc::operator() const):
1722         (JSC::WebAssemblyFunctionHeapCellType::WebAssemblyFunctionHeapCellType):
1723         (JSC::WebAssemblyFunctionHeapCellType::~WebAssemblyFunctionHeapCellType):
1724         (JSC::WebAssemblyFunctionHeapCellType::finishSweep):
1725         (JSC::WebAssemblyFunctionHeapCellType::destroy):
1726         * wasm/js/WebAssemblyFunctionHeapCellType.h: Added.
1727         * wasm/js/WebAssemblyPrototype.h:
1728
1729 2019-04-04  Yusuke Suzuki  <ysuzuki@apple.com>
1730
1731         [JSC] Pass CodeOrigin to FuzzerAgent
1732         https://bugs.webkit.org/show_bug.cgi?id=196590
1733
1734         Reviewed by Saam Barati.
1735
1736         Pass CodeOrigin instead of bytecodeIndex. CodeOrigin includes richer information (InlineCallFrame*).
1737         We also mask prediction with SpecBytecodeTop in DFGByteCodeParser. The fuzzer can produce any SpeculatedTypes,
1738         but DFGByteCodeParser should only see predictions that can be actually produced from the bytecode execution.
1739
1740         * dfg/DFGByteCodeParser.cpp:
1741         (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit):
1742         * runtime/FuzzerAgent.cpp:
1743         (JSC::FuzzerAgent::getPrediction):
1744         * runtime/FuzzerAgent.h:
1745         * runtime/RandomizingFuzzerAgent.cpp:
1746         (JSC::RandomizingFuzzerAgent::getPrediction):
1747         * runtime/RandomizingFuzzerAgent.h:
1748
1749 2019-04-04  Caio Lima  <ticaiolima@gmail.com>
1750
1751         [JSC] We should consider moving UnlinkedFunctionExecutable::m_parentScopeTDZVariables to RareData
1752         https://bugs.webkit.org/show_bug.cgi?id=194944
1753
1754         Reviewed by Keith Miller.
1755
1756         Based on profile data collected on JetStream2, Speedometer 2 and
1757         other benchmarks, it is very rare having non-empty
1758         UnlinkedFunctionExecutable::m_parentScopeTDZVariables.
1759
1760         - Data collected from Speedometer2
1761             Total number of UnlinkedFunctionExecutable: 39463
1762             Total number of non-empty parentScopeTDZVars: 428 (~1%)
1763
1764         - Data collected from JetStream2
1765             Total number of UnlinkedFunctionExecutable: 83715
1766             Total number of non-empty parentScopeTDZVars: 5285 (~6%)
1767
1768         We also collected numbers on 6 of top 10 Alexia sites.
1769
1770         - Data collected from youtube.com
1771             Total number of UnlinkedFunctionExecutable: 29599
1772             Total number of non-empty parentScopeTDZVars: 97 (~0.3%)
1773
1774         - Data collected from twitter.com
1775             Total number of UnlinkedFunctionExecutable: 23774
1776             Total number of non-empty parentScopeTDZVars: 172 (~0.7%)
1777
1778         - Data collected from google.com
1779             Total number of UnlinkedFunctionExecutable: 33209
1780             Total number of non-empty parentScopeTDZVars: 174 (~0.5%)
1781
1782         - Data collected from amazon.com:
1783             Total number of UnlinkedFunctionExecutable: 15182
1784             Total number of non-empty parentScopeTDZVars: 166 (~1%)
1785
1786         - Data collected from facebook.com:
1787             Total number of UnlinkedFunctionExecutable: 54443
1788             Total number of non-empty parentScopeTDZVars: 269 (~0.4%)
1789
1790         - Data collected from netflix.com:
1791             Total number of UnlinkedFunctionExecutable: 39266
1792             Total number of non-empty parentScopeTDZVars: 97 (~0.2%)
1793
1794         Considering such numbers, this patch is moving `m_parentScopeTDZVariables`
1795         to RareData. This decreases sizeof(UnlinkedFunctionExecutable) by
1796         16 bytes. With this change, now UnlinkedFunctionExecutable constructors
1797         receives an `Optional<VariableEnvironmentMap::Handle>` and only stores
1798         it when `value != WTF::nullopt`. We also changed
1799         UnlinkedFunctionExecutable::parentScopeTDZVariables() and it returns
1800         `VariableEnvironment()` whenever the Executable doesn't have RareData,
1801         or VariableEnvironmentMap::Handle is unitialized. This is required
1802         because RareData is instantiated when any of its field is stored and
1803         we can have an unitialized `Handle` even on cases when parentScopeTDZVariables
1804         is `WTF::nullopt`.
1805
1806         Results on memory usage on JetStrem2 is neutral.
1807
1808             Mean of memory peak on ToT: 4258633728 bytes (confidence interval: 249720072.95)
1809             Mean of memory peak on Changes: 4367325184 bytes (confidence interval: 321285583.61)
1810
1811         * builtins/BuiltinExecutables.cpp:
1812         (JSC::BuiltinExecutables::createExecutable):
1813         * bytecode/UnlinkedFunctionExecutable.cpp:
1814         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1815         * bytecode/UnlinkedFunctionExecutable.h:
1816         * bytecompiler/BytecodeGenerator.cpp:
1817         (JSC::BytecodeGenerator::getVariablesUnderTDZ):
1818
1819         BytecodeGenerator::getVariablesUnderTDZ now also caches if m_cachedVariablesUnderTDZ
1820         is empty, so we can properly return `WTF::nullopt` without the
1821         reconstruction of a VariableEnvironment to check if it is empty.
1822
1823         * bytecompiler/BytecodeGenerator.h:
1824         (JSC::BytecodeGenerator::makeFunction):
1825         * parser/VariableEnvironment.h:
1826         (JSC::VariableEnvironment::isEmpty const):
1827         * runtime/CachedTypes.cpp:
1828         (JSC::CachedCompactVariableMapHandle::decode const):
1829
1830         It returns an unitialized Handle when there is no
1831         CompactVariableEnvironment. This can happen when RareData is ensured
1832         because of another field.
1833
1834         (JSC::CachedFunctionExecutableRareData::encode):
1835         (JSC::CachedFunctionExecutableRareData::decode const):
1836         (JSC::CachedFunctionExecutable::encode):
1837         (JSC::CachedFunctionExecutable::decode const):
1838         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1839         * runtime/CodeCache.cpp:
1840
1841         Instead of creating a dummyVariablesUnderTDZ, we simply pass
1842         WTF::nullopt.
1843
1844         (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
1845
1846 2019-04-04  Tadeu Zagallo  <tzagallo@apple.com>
1847
1848         Cache bytecode for jsc.cpp helpers and fix CachedStringImpl
1849         https://bugs.webkit.org/show_bug.cgi?id=196409
1850
1851         Reviewed by Saam Barati.
1852
1853         Some of the helpers in jsc.cpp, such as `functionRunString`, were stll using
1854         using `makeSource` instead of `jscSource`, which does not use the ShellSourceProvider
1855         and therefore does not write the bytecode cache to disk.
1856
1857         Changing that revealed a bug in bytecode cache. The Encoder keeps a mapping
1858         of pointers to offsets of already cached objects, in order to avoid caching
1859         the same object twice. Similarly, the Decoder keeps a mapping from offsets
1860         to pointers, in order to avoid creating multiple objects in memory for the
1861         same cached object. The following was happening:
1862         1) A StringImpl* S was cached as CachedPtr<CachedStringImpl> at offset O. We add
1863         an entry in the Encoder mapping that S has already been encoded at O.
1864         2) We cache StringImpl* S again, but now as CachedPtr<CachedUniquedStringImpl>.
1865         We find an entry in the Encoder mapping for S, and return the offset O. However,
1866         the object cached at O is a CachedPtr<CachedStringImpl> (i.e. not Uniqued).
1867
1868         3) When decoding, there are 2 possibilities:
1869         3.1) We find S for the first time through a CachedPtr<CachedStringImpl>. In
1870         this case, everything works as expected since we add an entry in the decoder
1871         mapping from the offset O to the decoded StringImpl* S. The next time we find
1872         S through the uniqued version, we'll return the already decoded S.
1873         3.2) We find S through a CachedPtr<CachedUniquedStringImpl>. Now we have a
1874         problem, since the CachedPtr has the offset of a CachedStringImpl (not uniqued),
1875         which has a different shape and we crash.
1876
1877         We fix this by making CachedStringImpl and CachedUniquedStringImpl share the
1878         same implementation. Since it doesn't matter whether a string is uniqued for
1879         encoding, and we always decode strings as uniqued either way, they can be used
1880         interchangeably.
1881
1882         * jsc.cpp:
1883         (functionRunString):
1884         (functionLoadString):
1885         (functionDollarAgentStart):
1886         (functionCheckModuleSyntax):
1887         (runInteractive):
1888         * runtime/CachedTypes.cpp:
1889         (JSC::CachedUniquedStringImplBase::decode const):
1890         (JSC::CachedFunctionExecutable::rareData const):
1891         (JSC::CachedCodeBlock::rareData const):
1892         (JSC::CachedFunctionExecutable::encode):
1893         (JSC::CachedCodeBlock<CodeBlockType>::encode):
1894         (JSC::CachedUniquedStringImpl::encode): Deleted.
1895         (JSC::CachedUniquedStringImpl::decode const): Deleted.
1896         (JSC::CachedStringImpl::encode): Deleted.
1897         (JSC::CachedStringImpl::decode const): Deleted.
1898
1899 2019-04-04  Tadeu Zagallo  <tzagallo@apple.com>
1900
1901         UnlinkedCodeBlock constructor from cache should initialize m_didOptimize
1902         https://bugs.webkit.org/show_bug.cgi?id=196396
1903
1904         Reviewed by Saam Barati.
1905
1906         The UnlinkedCodeBlock constructor in CachedTypes was missing the initialization
1907         for m_didOptimize, which leads to crashes in CodeBlock::thresholdForJIT.
1908
1909         * runtime/CachedTypes.cpp:
1910         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
1911
1912 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
1913
1914         Unreviewed, rolling in r243843 with the build fix
1915         https://bugs.webkit.org/show_bug.cgi?id=196586
1916
1917         * runtime/Options.cpp:
1918         (JSC::recomputeDependentOptions):
1919         * runtime/Options.h:
1920         * runtime/RandomizingFuzzerAgent.cpp:
1921         (JSC::RandomizingFuzzerAgent::getPrediction):
1922
1923 2019-04-03  Ryan Haddad  <ryanhaddad@apple.com>
1924
1925         Unreviewed, rolling out r243843.
1926
1927         Broke CLoop and Windows builds.
1928
1929         Reverted changeset:
1930
1931         "[JSC] Add dump feature for RandomizingFuzzerAgent"
1932         https://bugs.webkit.org/show_bug.cgi?id=196586
1933         https://trac.webkit.org/changeset/243843
1934
1935 2019-04-03  Robin Morisset  <rmorisset@apple.com>
1936
1937         B3 should use associativity to optimize expression trees
1938         https://bugs.webkit.org/show_bug.cgi?id=194081
1939
1940         Reviewed by Filip Pizlo.
1941
1942         This patch adds a new B3 pass, that tries to find and optimize expression trees made purely of any one associative and commutative operator (Add/Mul/BitOr/BitAnd/BitXor).
1943         The pass only runs in O2, and runs once, after lowerMacros and just before a run of B3ReduceStrength (which helps clean up the dead code it tends to leave behind).
1944         I had to separate killDeadCode out of B3ReduceStrength (as a new B3EliminateDeadCode pass) to run it before B3OptimizeAssociativeExpressionTrees, as otherwise it is stopped by high use counts
1945         inherited from CSE.
1946         This extra run of DCE is by itself a win, most notably on microbenchmarks/instanceof-always-hit-two (1.5x faster), and on microbenchmarks/licm-dragons(-out-of-bounds) (both get 1.16x speedup).
1947         I suspect it is because it runs between CSE and tail-dedup, and as a result allows a lot more tail-dedup to occur.
1948
1949         The pass is currently extremely conservative, not trying anything if it would cause _any_ code duplication.
1950         For this purpose, it starts by computing use counts for the potentially interesting nodes (those with the right opcodes), and segregate them into expression trees.
1951         The root of an expression tree is a node that is either used in multiple places, or is used by a value with a different opcode.
1952         The leaves of an expression tree are nodes that are either used in multiple places, or have a different opcode.
1953         All constant leaves of a tree are combined, as well as all leaves that are identical. What remains is then laid out into a balanced binary tree, hopefully maximizing ILP.
1954
1955         This optimization was implemented as a stand-alone pass and not as part of B3ReduceStrength mostly because it needs use counts to avoid code duplication.
1956         It also benefits from finding all tree roots first, and not trying to repeatedly optimize subtrees.
1957
1958         I added several tests to testB3 with varying patterns of trees. It is also tested in a less focused way by lots of older tests.
1959
1960         In the future this pass could be expanded to allow some bounded amount of code duplication, and merging more leaves (e.g. Mul(a, 3) and a in an Add tree, into Mul(a, 4))
1961         The latter will need exposing the peephole optimizations out of B3ReduceStrength to avoid duplicating code.
1962
1963         * JavaScriptCore.xcodeproj/project.pbxproj:
1964         * Sources.txt:
1965         * b3/B3Common.cpp:
1966         (JSC::B3::shouldDumpIR):
1967         (JSC::B3::shouldDumpIRAtEachPhase):
1968         * b3/B3Common.h:
1969         * b3/B3EliminateDeadCode.cpp: Added.
1970         (JSC::B3::EliminateDeadCode::run):
1971         (JSC::B3::eliminateDeadCode):
1972         * b3/B3EliminateDeadCode.h: Added.
1973         (JSC::B3::EliminateDeadCode::EliminateDeadCode):
1974         * b3/B3Generate.cpp:
1975         (JSC::B3::generateToAir):
1976         * b3/B3OptimizeAssociativeExpressionTrees.cpp: Added.
1977         (JSC::B3::OptimizeAssociativeExpressionTrees::OptimizeAssociativeExpressionTrees):
1978         (JSC::B3::OptimizeAssociativeExpressionTrees::neutralElement):
1979         (JSC::B3::OptimizeAssociativeExpressionTrees::isAbsorbingElement):
1980         (JSC::B3::OptimizeAssociativeExpressionTrees::combineConstants):
1981         (JSC::B3::OptimizeAssociativeExpressionTrees::emitValue):
1982         (JSC::B3::OptimizeAssociativeExpressionTrees::optimizeRootedTree):
1983         (JSC::B3::OptimizeAssociativeExpressionTrees::run):
1984         (JSC::B3::optimizeAssociativeExpressionTrees):
1985         * b3/B3OptimizeAssociativeExpressionTrees.h: Added.
1986         * b3/B3ReduceStrength.cpp:
1987         * b3/B3Value.cpp:
1988         (JSC::B3::Value::replaceWithIdentity):
1989         * b3/testb3.cpp:
1990         (JSC::B3::testBitXorTreeArgs):
1991         (JSC::B3::testBitXorTreeArgsEven):
1992         (JSC::B3::testBitXorTreeArgImm):
1993         (JSC::B3::testAddTreeArg32):
1994         (JSC::B3::testMulTreeArg32):
1995         (JSC::B3::testBitAndTreeArg32):
1996         (JSC::B3::testBitOrTreeArg32):
1997         (JSC::B3::run):
1998
1999 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
2000
2001         [JSC] Add dump feature for RandomizingFuzzerAgent
2002         https://bugs.webkit.org/show_bug.cgi?id=196586
2003
2004         Reviewed by Saam Barati.
2005
2006         Towards deterministic tests for the results from randomizing fuzzer agent, this patch adds Options::dumpRandomizingFuzzerAgentPredictions, which dumps the generated types.
2007         The results is like this.
2008
2009             getPrediction name:(#C2q9xD),bytecodeIndex:(22),original:(Array),generated:(OtherObj|Array|Float64Array|BigInt|NonIntAsDouble)
2010             getPrediction name:(makeUnwriteableUnconfigurableObject#AiEJv1),bytecodeIndex:(14),original:(OtherObj),generated:(Final|Uint8Array|Float64Array|SetObject|WeakSetObject|BigInt|NonIntAsDouble)
2011
2012         * runtime/Options.cpp:
2013         (JSC::recomputeDependentOptions):
2014         * runtime/Options.h:
2015         * runtime/RandomizingFuzzerAgent.cpp:
2016         (JSC::RandomizingFuzzerAgent::getPrediction):
2017
2018 2019-04-03  Myles C. Maxfield  <mmaxfield@apple.com>
2019
2020         -apple-trailing-word is needed for browser detection
2021         https://bugs.webkit.org/show_bug.cgi?id=196575
2022
2023         Unreviewed.
2024
2025         * Configurations/FeatureDefines.xcconfig:
2026
2027 2019-04-03  Michael Saboff  <msaboff@apple.com>
2028
2029         REGRESSION (r243642): com.apple.JavaScriptCore crash in JSC::RegExpObject::execInline
2030         https://bugs.webkit.org/show_bug.cgi?id=196477
2031
2032         Reviewed by Keith Miller.
2033
2034         The problem here is that when we advance the index by 2 for a character class that only
2035         has non-BMP characters, we might go past the end of the string.  This can happen for
2036         greedy counted character classes that are part of a alternative where there is one
2037         character to match after the greedy non-BMP character class.
2038
2039         The "do we have string left to match" check at the top of the JIT loop for the counted
2040         character class checks to see if index is not equal to the string length.  For non-BMP
2041         character classes, we need to check to see if there are at least 2 characters left.
2042         Therefore we now temporarily add 1 to the current index before comparing.  This checks
2043         to see if there are iat least 2 characters left to match, instead of 1.
2044
2045         * yarr/YarrJIT.cpp:
2046         (JSC::Yarr::YarrGenerator::generateCharacterClassGreedy):
2047         (JSC::Yarr::YarrGenerator::backtrackCharacterClassNonGreedy):
2048
2049 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
2050
2051         [JSC] Exception verification crash on operationArrayIndexOfValueInt32OrContiguous
2052         https://bugs.webkit.org/show_bug.cgi?id=196574
2053
2054         Reviewed by Saam Barati.
2055
2056         This patch adds missing exception check in operationArrayIndexOfValueInt32OrContiguous.
2057
2058         * dfg/DFGOperations.cpp:
2059
2060 2019-04-03  Don Olmstead  <don.olmstead@sony.com>
2061
2062         [CMake][WTF] Mirror XCode header directories
2063         https://bugs.webkit.org/show_bug.cgi?id=191662
2064
2065         Reviewed by Konstantin Tokarev.
2066
2067         Use WTFFramework as a dependency and include frameworks/WTF.cmake for AppleWin internal
2068         builds.
2069
2070         * CMakeLists.txt:
2071         * shell/CMakeLists.txt:
2072
2073 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
2074
2075         [JSC] Add FuzzerAgent, which has a hooks to get feedback & inject fuzz data into JSC
2076         https://bugs.webkit.org/show_bug.cgi?id=196530
2077
2078         Reviewed by Saam Barati.
2079
2080         This patch adds FuzzerAgent interface and simple RandomizingFuzzerAgent to JSC.
2081         This RandomizingFuzzerAgent returns random SpeculatedType for value profiling to find
2082         the issues in JSC. The seed for randomization can be specified by seedOfRandomizingFuzzerAgent.
2083
2084         I ran this with seedOfRandomizingFuzzerAgent=1 last night and it finds 3 failures in the current JSC tests,
2085         they should be fixed in subsequent patches.
2086
2087         * CMakeLists.txt:
2088         * JavaScriptCore.xcodeproj/project.pbxproj:
2089         * Sources.txt:
2090         * dfg/DFGByteCodeParser.cpp:
2091         (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit):
2092         * runtime/FuzzerAgent.cpp: Added.
2093         (JSC::FuzzerAgent::~FuzzerAgent):
2094         (JSC::FuzzerAgent::getPrediction):
2095         * runtime/FuzzerAgent.h: Added.
2096         * runtime/JSGlobalObjectFunctions.cpp:
2097         * runtime/Options.h:
2098         * runtime/RandomizingFuzzerAgent.cpp: Added.
2099         (JSC::RandomizingFuzzerAgent::RandomizingFuzzerAgent):
2100         (JSC::RandomizingFuzzerAgent::getPrediction):
2101         * runtime/RandomizingFuzzerAgent.h: Added.
2102         * runtime/RegExpCachedResult.h:
2103         * runtime/RegExpGlobalData.cpp:
2104         * runtime/VM.cpp:
2105         (JSC::VM::VM):
2106         * runtime/VM.h:
2107         (JSC::VM::fuzzerAgent const):
2108         (JSC::VM::setFuzzerAgent):
2109
2110 2019-04-03  Myles C. Maxfield  <mmaxfield@apple.com>
2111
2112         Remove support for -apple-trailing-word
2113         https://bugs.webkit.org/show_bug.cgi?id=196525
2114
2115         Reviewed by Zalan Bujtas.
2116
2117         This CSS property is nonstandard and not used.
2118
2119         * Configurations/FeatureDefines.xcconfig:
2120
2121 2019-04-03  Joseph Pecoraro  <pecoraro@apple.com>
2122
2123         Web Inspector: Remote Inspector indicate callback should always happen on the main thread
2124         https://bugs.webkit.org/show_bug.cgi?id=196513
2125         <rdar://problem/49498284>
2126
2127         Reviewed by Devin Rousso.
2128
2129         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
2130         (Inspector::RemoteInspector::receivedIndicateMessage):
2131         When we have a WebThread, don't just run on the WebThread,
2132         run on the MainThread with the WebThreadLock.
2133
2134 2019-04-02  Michael Saboff  <msaboff@apple.com>
2135
2136         Crash in Options::setOptions() using --configFile option and libgmalloc
2137         https://bugs.webkit.org/show_bug.cgi?id=196506
2138
2139         Reviewed by Keith Miller.
2140
2141         Changed to call CString::data() while making the call to Options::setOptions().  This keeps
2142         the implicit CString temporary alive until after setOptions() returns.
2143
2144         * runtime/ConfigFile.cpp:
2145         (JSC::ConfigFile::parse):
2146
2147 2019-04-02  Fujii Hironori  <Hironori.Fujii@sony.com>
2148
2149         [CMake] WEBKIT_MAKE_FORWARDING_HEADERS shouldn't use POST_BUILD to copy generated headers
2150         https://bugs.webkit.org/show_bug.cgi?id=182757
2151
2152         Reviewed by Don Olmstead.
2153
2154         * CMakeLists.txt: Do not use DERIVED_SOURCE_DIRECTORIES parameter
2155         of WEBKIT_MAKE_FORWARDING_HEADERS. Added generated headers to
2156         JavaScriptCore_PRIVATE_FRAMEWORK_HEADERS.
2157
2158 2019-04-02  Saam barati  <sbarati@apple.com>
2159
2160         Add a ValueRepReduction phase
2161         https://bugs.webkit.org/show_bug.cgi?id=196234
2162
2163         Reviewed by Filip Pizlo.
2164
2165         This patch adds a ValueRepReduction phase. The main idea here is
2166         to try to reduce DoubleRep(RealNumberUse:ValueRep(DoubleRepUse:@x))
2167         to just be @x. This patch handles such above strengh reduction rules
2168         as long as we prove that all users of the ValueRep can be converted
2169         to using the incoming double value. That way we prevent introducing
2170         a parallel live range for the double value.
2171         
2172         This patch tracks the uses of the ValueRep through Phi variables,
2173         so we can convert entire Phi variables to being Double instead
2174         of JSValue if the Phi also has only double uses.
2175         
2176         This is implemented through a simple escape analysis. DoubleRep(RealNumberUse:)
2177         and OSR exit hints are not counted as escapes. All other uses are counted
2178         as escapes. Connected Phi graphs are converted to being Double only if the
2179         entire graph is ok with the result being Double.
2180         
2181         Some ways we could extend this phase in the future:
2182         - There are a lot of DoubleRep(NumberUse:@ValueRep(@x)) uses. This ensures
2183           that the result of the DoubleRep of @x is not impure NaN. We could
2184           handle this case if we introduced a PurifyNaN node and replace the DoubleRep
2185           with PurifyNaN(@x). Alternatively, we could see if certain users of this
2186           DoubleRep are okay with impure NaN flowing into them and we'd need to ensure
2187           their output type is always treated as if the input is impure NaN.
2188         - We could do sinking of ValueRep where we think it's profitable. So instead
2189           of an escape making it so we never represent the variable as a Double, we
2190           could make the escape reconstruct the JSValueRep where profitable.
2191         - We can extend this phase to handle Int52Rep if it's profitable.
2192         - We can opt other nodes into accepting incoming Doubles so we no longer
2193           treat them as escapes.
2194         
2195         This patch is somewhere between neutral and a 1% progression on JetStream 2.
2196
2197         * JavaScriptCore.xcodeproj/project.pbxproj:
2198         * Sources.txt:
2199         * dfg/DFGPlan.cpp:
2200         (JSC::DFG::Plan::compileInThreadImpl):
2201         * dfg/DFGValueRepReductionPhase.cpp: Added.
2202         (JSC::DFG::ValueRepReductionPhase::ValueRepReductionPhase):
2203         (JSC::DFG::ValueRepReductionPhase::run):
2204         (JSC::DFG::ValueRepReductionPhase::convertValueRepsToDouble):
2205         (JSC::DFG::performValueRepReduction):
2206         * dfg/DFGValueRepReductionPhase.h: Added.
2207         * runtime/Options.h:
2208
2209 2019-04-01  Yusuke Suzuki  <ysuzuki@apple.com>
2210
2211         [JSC] JSRunLoopTimer::Manager should be small
2212         https://bugs.webkit.org/show_bug.cgi?id=196425
2213
2214         Reviewed by Darin Adler.
2215
2216         Using very large Key or Value in HashMap potentially bloats memory since HashMap pre-allocates large size of
2217         memory ((sizeof(Key) + sizeof(Value)) * N) for its backing storage's array. Using std::unique_ptr<> for JSRunLoopTimer's
2218         PerVMData to keep HashMap's backing store size small.
2219
2220         * runtime/JSRunLoopTimer.cpp:
2221         (JSC::JSRunLoopTimer::Manager::timerDidFire):
2222         (JSC::JSRunLoopTimer::Manager::registerVM):
2223         (JSC::JSRunLoopTimer::Manager::scheduleTimer):
2224         (JSC::JSRunLoopTimer::Manager::cancelTimer):
2225         (JSC::JSRunLoopTimer::Manager::timeUntilFire):
2226         (JSC::JSRunLoopTimer::Manager::didChangeRunLoop):
2227         * runtime/JSRunLoopTimer.h:
2228
2229 2019-04-01  Stephan Szabo  <stephan.szabo@sony.com>
2230
2231         [PlayStation] Add initialization for JSC shell for PlayStation port
2232         https://bugs.webkit.org/show_bug.cgi?id=195411
2233
2234         Reviewed by Ross Kirsling.
2235
2236         Add ps options
2237
2238         * shell/PlatformPlayStation.cmake: Added.
2239         * shell/playstation/Initializer.cpp: Added.
2240         (initializer):
2241
2242 2019-04-01  Michael Catanzaro  <mcatanzaro@igalia.com>
2243
2244         Stop trying to support building JSC with clang 3.8
2245         https://bugs.webkit.org/show_bug.cgi?id=195947
2246         <rdar://problem/49069219>
2247
2248         Reviewed by Darin Adler.
2249
2250         It seems WebKit hasn't built with clang 3.8 in a while, no devs are using this compiler, we
2251         don't know how much effort it would be to make JSC work again, and it's making the code
2252         worse. Remove my hacks to support clang 3.8 from JSC.
2253
2254         * bindings/ScriptValue.cpp:
2255         (Inspector::jsToInspectorValue):
2256         * bytecode/GetterSetterAccessCase.cpp:
2257         (JSC::GetterSetterAccessCase::create):
2258         (JSC::GetterSetterAccessCase::clone const):
2259         * bytecode/InstanceOfAccessCase.cpp:
2260         (JSC::InstanceOfAccessCase::clone const):
2261         * bytecode/IntrinsicGetterAccessCase.cpp:
2262         (JSC::IntrinsicGetterAccessCase::clone const):
2263         * bytecode/ModuleNamespaceAccessCase.cpp:
2264         (JSC::ModuleNamespaceAccessCase::clone const):
2265         * bytecode/ProxyableAccessCase.cpp:
2266         (JSC::ProxyableAccessCase::clone const):
2267
2268 2019-03-31  Yusuke Suzuki  <ysuzuki@apple.com>
2269
2270         [JSC] Butterfly allocation from LargeAllocation should try "realloc" behavior if collector thread is not active
2271         https://bugs.webkit.org/show_bug.cgi?id=196160
2272
2273         Reviewed by Saam Barati.
2274
2275         "realloc" can be effective in terms of peak/current memory footprint when realloc succeeds because,
2276
2277         1. It does not allocate additional memory while expanding a vector
2278         2. It does not deallocate an old memory, just reusing the current memory by expanding, so that memory footprint is tight even before scavenging
2279
2280         We found that we can "realloc" large butterflies in certain conditions are met because,
2281
2282         1. If it goes to LargeAllocation, this memory region is never reused until GC sweeps it.
2283         2. Butterflies are owned by owner JSObjects, so we know the lifetime of Butterflies.
2284
2285         This patch attempts to use "realloc" onto butterflies if,
2286
2287         1. Butterflies are allocated in LargeAllocation kind
2288         2. Concurrent collector is not active
2289         3. Butterflies do not have property storage
2290
2291         The condition (2) is required to avoid deallocating butterflies while the concurrent collector looks into it. The condition (3) is
2292         also required to avoid deallocating butterflies while the concurrent compiler looks into it.
2293
2294         We also change LargeAllocation mechanism to using "malloc" and "free" instead of "posix_memalign". This allows us to use "realloc"
2295         safely in all the platforms. Since LargeAllocation uses alignment to distinguish LargeAllocation and MarkedBlock, we manually adjust
2296         16B alignment by allocating 8B more memory in "malloc".
2297
2298         Speedometer2 and JetStream2 are neutral. RAMification shows about 1% progression (even in some of JIT tests).
2299
2300         * heap/AlignedMemoryAllocator.h:
2301         * heap/CompleteSubspace.cpp:
2302         (JSC::CompleteSubspace::tryAllocateSlow):
2303         (JSC::CompleteSubspace::reallocateLargeAllocationNonVirtual):
2304         * heap/CompleteSubspace.h:
2305         * heap/FastMallocAlignedMemoryAllocator.cpp:
2306         (JSC::FastMallocAlignedMemoryAllocator::tryAllocateMemory):
2307         (JSC::FastMallocAlignedMemoryAllocator::freeMemory):
2308         (JSC::FastMallocAlignedMemoryAllocator::tryReallocateMemory):
2309         * heap/FastMallocAlignedMemoryAllocator.h:
2310         * heap/GigacageAlignedMemoryAllocator.cpp:
2311         (JSC::GigacageAlignedMemoryAllocator::tryAllocateMemory):
2312         (JSC::GigacageAlignedMemoryAllocator::freeMemory):
2313         (JSC::GigacageAlignedMemoryAllocator::tryReallocateMemory):
2314         * heap/GigacageAlignedMemoryAllocator.h:
2315         * heap/IsoAlignedMemoryAllocator.cpp:
2316         (JSC::IsoAlignedMemoryAllocator::tryAllocateMemory):
2317         (JSC::IsoAlignedMemoryAllocator::freeMemory):
2318         (JSC::IsoAlignedMemoryAllocator::tryReallocateMemory):
2319         * heap/IsoAlignedMemoryAllocator.h:
2320         * heap/LargeAllocation.cpp:
2321         (JSC::isAlignedForLargeAllocation):
2322         (JSC::LargeAllocation::tryCreate):
2323         (JSC::LargeAllocation::tryReallocate):
2324         (JSC::LargeAllocation::LargeAllocation):
2325         (JSC::LargeAllocation::destroy):
2326         * heap/LargeAllocation.h:
2327         (JSC::LargeAllocation::indexInSpace):
2328         (JSC::LargeAllocation::setIndexInSpace):
2329         (JSC::LargeAllocation::basePointer const):
2330         * heap/MarkedSpace.cpp:
2331         (JSC::MarkedSpace::sweepLargeAllocations):
2332         (JSC::MarkedSpace::prepareForConservativeScan):
2333         * heap/WeakSet.h:
2334         (JSC::WeakSet::isTriviallyDestructible const):
2335         * runtime/Butterfly.h:
2336         * runtime/ButterflyInlines.h:
2337         (JSC::Butterfly::reallocArrayRightIfPossible):
2338         * runtime/JSObject.cpp:
2339         (JSC::JSObject::ensureLengthSlow):
2340
2341 2019-03-31  Sam Weinig  <weinig@apple.com>
2342
2343         Remove more i386 specific configurations
2344         https://bugs.webkit.org/show_bug.cgi?id=196430
2345
2346         Reviewed by Alexey Proskuryakov.
2347
2348         * Configurations/FeatureDefines.xcconfig:
2349         ENABLE_WEB_AUTHN_macosx can now be enabled unconditionally on macOS.
2350
2351         * Configurations/ToolExecutable.xcconfig:
2352         ARC can be enabled unconditionally now.
2353
2354 2019-03-29  Yusuke Suzuki  <ysuzuki@apple.com>
2355
2356         [JSC] JSWrapperMap should not use Objective-C Weak map (NSMapTable with NSPointerFunctionsWeakMemory) for m_cachedObjCWrappers
2357         https://bugs.webkit.org/show_bug.cgi?id=196392
2358
2359         Reviewed by Saam Barati.
2360
2361         Weak representation in Objective-C is surprisingly costly in terms of memory. We can see that very easy program shows 10KB memory consumption due to
2362         this weak wrapper map in JavaScriptCore.framework. But we do not need this weak map since Objective-C JSValue has a dealloc. We can unregister itself
2363         from the map when it is deallocated without using Objective-C weak mechanism. And since Objective-C JSValue is tightly coupled to a specific JSContext,
2364         and wrapper map is created per JSContext, JSValue wrapper and actual JavaScriptCore value is one-on-one, and [JSValue dealloc] knows which JSContext's
2365         wrapper map holds itself.
2366
2367         1. We do not use Objective-C weak mechanism. We use WTF::HashSet instead. When JSValue is allocated, we register it to JSWrapperMap's HashSet. And unregister
2368            JSValue from this map when JSValue is deallocated.
2369         2. We use HashSet<JSValue> (logically) instead of HashMap<JSValueRef, JSValue> to keep JSValueRef and JSValue relationship. We can achieve it because JSValue
2370            holds JSValueRef inside it.
2371
2372         * API/JSContext.mm:
2373         (-[JSContext removeWrapper:]):
2374         * API/JSContextInternal.h:
2375         * API/JSValue.mm:
2376         (-[JSValue dealloc]):
2377         (-[JSValue initWithValue:inContext:]):
2378         * API/JSWrapperMap.h:
2379         * API/JSWrapperMap.mm:
2380         (WrapperKey::hashTableDeletedValue):
2381         (WrapperKey::WrapperKey):
2382         (WrapperKey::isHashTableDeletedValue const):
2383         (WrapperKey::Hash::hash):
2384         (WrapperKey::Hash::equal):
2385         (WrapperKey::Traits::isEmptyValue):
2386         (WrapperKey::Translator::hash):
2387         (WrapperKey::Translator::equal):
2388         (WrapperKey::Translator::translate):
2389         (-[JSWrapperMap initWithGlobalContextRef:]):
2390         (-[JSWrapperMap dealloc]):
2391         (-[JSWrapperMap objcWrapperForJSValueRef:inContext:]):
2392         (-[JSWrapperMap removeWrapper:]):
2393         * API/tests/testapi.mm:
2394         (testObjectiveCAPIMain):
2395
2396 2019-03-29  Robin Morisset  <rmorisset@apple.com>
2397
2398         B3ReduceStrength should know that Mul distributes over Add and Sub
2399         https://bugs.webkit.org/show_bug.cgi?id=196325
2400
2401         Reviewed by Michael Saboff.
2402
2403         In this patch I add the following patterns to B3ReduceStrength:
2404         - Turn this: Integer Neg(Mul(value, c))
2405           Into this: Mul(value, -c), as long as -c does not overflow
2406         - Turn these: Integer Mul(value, Neg(otherValue)) and Integer Mul(Neg(value), otherValue)
2407           Into this: Neg(Mul(value, otherValue))
2408         - For Op==Add or Sub, turn any of these:
2409              Op(Mul(x1, x2), Mul(x1, x3))
2410              Op(Mul(x2, x1), Mul(x1, x3))
2411              Op(Mul(x1, x2), Mul(x3, x1))
2412              Op(Mul(x2, x1), Mul(x3, x1))
2413           Into this: Mul(x1, Op(x2, x3))
2414
2415         Also includes a trivial change: a similar reduction for the distributivity of BitAnd over BitOr/BitXor now
2416         emits the arguments to BitAnd in the other order, to minimize the probability that we'll spend a full fixpoint step just to flip them.
2417
2418         * b3/B3ReduceStrength.cpp:
2419         * b3/testb3.cpp:
2420         (JSC::B3::testAddMulMulArgs):
2421         (JSC::B3::testMulArgNegArg):
2422         (JSC::B3::testMulNegArgArg):
2423         (JSC::B3::testNegMulArgImm):
2424         (JSC::B3::testSubMulMulArgs):
2425         (JSC::B3::run):
2426
2427 2019-03-29  Yusuke Suzuki  <ysuzuki@apple.com>
2428
2429         [JSC] Remove distancing for LargeAllocation
2430         https://bugs.webkit.org/show_bug.cgi?id=196335
2431
2432         Reviewed by Saam Barati.
2433
2434         In r230226, we removed distancing feature from our GC. This patch removes remaining distancing thing in LargeAllocation.
2435
2436         * heap/HeapCell.h:
2437         * heap/LargeAllocation.cpp:
2438         (JSC::LargeAllocation::tryCreate):
2439         * heap/MarkedBlock.h:
2440
2441 2019-03-29  Myles C. Maxfield  <mmaxfield@apple.com>
2442
2443         Delete WebMetal implementation in favor of WebGPU
2444         https://bugs.webkit.org/show_bug.cgi?id=195418
2445
2446         Reviewed by Dean Jackson.
2447
2448         * Configurations/FeatureDefines.xcconfig:
2449         * inspector/protocol/Canvas.json:
2450         * inspector/scripts/codegen/generator.py:
2451
2452 2019-03-29  Tadeu Zagallo  <tzagallo@apple.com>
2453
2454         Assertion failed in JSC::createError
2455         https://bugs.webkit.org/show_bug.cgi?id=196305
2456         <rdar://problem/49387382>
2457
2458         Reviewed by Saam Barati.
2459
2460         JSC::createError assumes that `errorDescriptionForValue` will either
2461         throw an exception or return a valid description string. However, that
2462         is not true if the value is a rope string and we successfully resolve it,
2463         but later fail to wrap the string in quotes with `tryMakeString`.
2464
2465         * runtime/ExceptionHelpers.cpp:
2466         (JSC::createError):
2467
2468 2019-03-29  Devin Rousso  <drousso@apple.com>
2469
2470         Web Inspector: add fast returns for instrumentation hooks that have no affect before a frontend is connected
2471         https://bugs.webkit.org/show_bug.cgi?id=196382
2472         <rdar://problem/49403417>
2473
2474         Reviewed by Joseph Pecoraro.
2475
2476         Ensure that all instrumentation hooks use `FAST_RETURN_IF_NO_FRONTENDS` or check that
2477         `developerExtrasEnabled`. There should be no activity to/from any inspector objects until
2478         developer extras are enabled.
2479
2480         * inspector/agents/InspectorConsoleAgent.cpp:
2481         (Inspector::InspectorConsoleAgent::startTiming):
2482         (Inspector::InspectorConsoleAgent::stopTiming):
2483         (Inspector::InspectorConsoleAgent::count):
2484         (Inspector::InspectorConsoleAgent::addConsoleMessage):
2485
2486 2019-03-29  Cathie Chen  <cathiechen@igalia.com>
2487
2488         Implement ResizeObserver.
2489         https://bugs.webkit.org/show_bug.cgi?id=157743
2490
2491         Reviewed by Simon Fraser.
2492
2493         Add ENABLE_RESIZE_OBSERVER.
2494
2495         * Configurations/FeatureDefines.xcconfig:
2496
2497 2019-03-28  Michael Saboff  <msaboff@apple.com>
2498
2499         [YARR] Precompute BMP / non-BMP status when constructing character classes
2500         https://bugs.webkit.org/show_bug.cgi?id=196296
2501
2502         Reviewed by Keith Miller.
2503
2504         Changed CharacterClass::m_hasNonBMPCharacters into a character width bit field which
2505         indicateis if the class includes characters from either BMP, non-BMP or both ranges.
2506         This allows the recognizing code to eliminate checks for the width of a matched
2507         characters when the class has only one width.  The character width is needed to
2508         determine if we advance 1 or 2 character.  Also, the pre-computed width of character
2509         classes that contains either all BMP or all non-BMP characters allows the parser to
2510         use fixed widths for terms using those character classes.  Changed both the code gen
2511         scripts and Yarr compiler to compute this bit field during the construction of
2512         character classes.
2513
2514         For JIT'ed code of character classes that contain either all BMP or all non-BMP
2515         characters, we can eliminate the generic check we were doing do compute how much
2516         to advance after sucessfully matching a character in the class.
2517
2518                 Generic isBMP check      BMP only            non-BMP only
2519                 --------------           --------------      --------------
2520                 inc %r9d                 inc %r9d            add $0x2, %r9d
2521                 cmp $0x10000, %eax
2522                 jl isBMP
2523                 cmp %edx, %esi
2524                 jz atEndOfString
2525                 inc %r9d
2526                 inc %esi
2527          isBMP:
2528
2529         For character classes that contained non-BMP characters, we were always generating
2530         the code in the left column.  The middle column is the code we generate for character
2531         classes that contain only BMP characters.  The right column is the code we now
2532         generate if the character class has only non-BMP characters.  In the fix width cases,
2533         we can eliminate both the isBMP check as well as the atEndOfString check.  The
2534         atEndOfstring check is eliminated since we know how many characters this character
2535         class requires and that check can be factored out to the beginning of the current
2536         alternative.  For character classes that contain both BMP and non-BMP characters,
2537         we still generate the generic left column.
2538
2539         This change is a ~8% perf progression on UniPoker and a ~2% improvement on RexBench
2540         as a whole.
2541
2542         * runtime/RegExp.cpp:
2543         (JSC::RegExp::matchCompareWithInterpreter):
2544         * runtime/RegExpInlines.h:
2545         (JSC::RegExp::matchInline):
2546         * yarr/YarrInterpreter.cpp:
2547         (JSC::Yarr::Interpreter::checkCharacterClassDontAdvanceInputForNonBMP):
2548         (JSC::Yarr::Interpreter::matchCharacterClass):
2549         * yarr/YarrJIT.cpp:
2550         (JSC::Yarr::YarrGenerator::optimizeAlternative):
2551         (JSC::Yarr::YarrGenerator::matchCharacterClass):
2552         (JSC::Yarr::YarrGenerator::advanceIndexAfterCharacterClassTermMatch):
2553         (JSC::Yarr::YarrGenerator::tryReadUnicodeCharImpl):
2554         (JSC::Yarr::YarrGenerator::generateCharacterClassOnce):
2555         (JSC::Yarr::YarrGenerator::generateCharacterClassFixed):
2556         (JSC::Yarr::YarrGenerator::generateCharacterClassGreedy):
2557         (JSC::Yarr::YarrGenerator::backtrackCharacterClassGreedy):
2558         (JSC::Yarr::YarrGenerator::generateCharacterClassNonGreedy):
2559         (JSC::Yarr::YarrGenerator::backtrackCharacterClassNonGreedy):
2560         (JSC::Yarr::YarrGenerator::generateEnter):
2561         (JSC::Yarr::YarrGenerator::YarrGenerator):
2562         (JSC::Yarr::YarrGenerator::compile):
2563         * yarr/YarrPattern.cpp:
2564         (JSC::Yarr::CharacterClassConstructor::CharacterClassConstructor):
2565         (JSC::Yarr::CharacterClassConstructor::reset):
2566         (JSC::Yarr::CharacterClassConstructor::charClass):
2567         (JSC::Yarr::CharacterClassConstructor::addSorted):
2568         (JSC::Yarr::CharacterClassConstructor::addSortedRange):
2569         (JSC::Yarr::CharacterClassConstructor::hasNonBMPCharacters):
2570         (JSC::Yarr::CharacterClassConstructor::characterWidths):
2571         (JSC::Yarr::PatternTerm::dump):
2572         (JSC::Yarr::anycharCreate):
2573         * yarr/YarrPattern.h:
2574         (JSC::Yarr::operator|):
2575         (JSC::Yarr::operator&):
2576         (JSC::Yarr::operator|=):
2577         (JSC::Yarr::CharacterClass::CharacterClass):
2578         (JSC::Yarr::CharacterClass::hasNonBMPCharacters):
2579         (JSC::Yarr::CharacterClass::hasOneCharacterSize):
2580         (JSC::Yarr::CharacterClass::hasOnlyNonBMPCharacters):
2581         (JSC::Yarr::PatternTerm::invert const):
2582         (JSC::Yarr::PatternTerm::invert): Deleted.
2583         * yarr/create_regex_tables:
2584         * yarr/generateYarrUnicodePropertyTables.py:
2585
2586 2019-03-28  Saam Barati  <sbarati@apple.com>
2587
2588         BackwardsGraph needs to consider back edges as the backward's root successor
2589         https://bugs.webkit.org/show_bug.cgi?id=195991
2590
2591         Reviewed by Filip Pizlo.
2592
2593         * b3/testb3.cpp:
2594         (JSC::B3::testInfiniteLoopDoesntCauseBadHoisting):
2595         (JSC::B3::run):
2596
2597 2019-03-28  Fujii Hironori  <Hironori.Fujii@sony.com>
2598
2599         Opcode.h(159,27): warning: adding 'unsigned int' to a string does not append to the string [-Wstring-plus-int]
2600         https://bugs.webkit.org/show_bug.cgi?id=196343
2601
2602         Reviewed by Saam Barati.
2603
2604         Clang reports a compilation warning and recommend '&PADDING_STRING[PADDING_STRING_LENGTH]'
2605         instead of 'PADDING_STRING + PADDING_STRING_LENGTH'.
2606
2607         * bytecode/Opcode.cpp:
2608         (JSC::padOpcodeName): Moved padOpcodeName from Opcode.h because
2609         this function is used only in Opcode.cpp. Changed macros
2610         PADDING_STRING and PADDING_STRING_LENGTH to simple variables.
2611         (JSC::compareOpcodePairIndices): Replaced pair with std::pair.
2612         * bytecode/Opcode.h:
2613         (JSC::padOpcodeName): Moved.
2614
2615 2019-03-28  Tadeu Zagallo  <tzagallo@apple.com>
2616
2617         CodeBlock::jettison() should disallow repatching its own calls
2618         https://bugs.webkit.org/show_bug.cgi?id=196359
2619         <rdar://problem/48973663>
2620
2621         Reviewed by Saam Barati.
2622
2623         CodeBlock::jettison() calls CommonData::invalidate, which replaces the `hlt`
2624         instruction with the jump to OSR exit. However, if the `hlt` was immediately
2625         followed by a call to the CodeBlock being jettisoned, we would write over the
2626         OSR exit address while unlinking all the incoming CallLinkInfos later in
2627         CodeBlock::jettison().
2628
2629         Change it so that we set a flag, `clearedByJettison`, in all the CallLinkInfos
2630         owned by the CodeBlock being jettisoned. If the flag is set, we will avoid
2631         repatching the call during unlinking. This is safe because this call will never
2632         be reachable again after the CodeBlock is jettisoned.
2633
2634         * bytecode/CallLinkInfo.cpp:
2635         (JSC::CallLinkInfo::CallLinkInfo):
2636         (JSC::CallLinkInfo::setCallee):
2637         (JSC::CallLinkInfo::clearCallee):
2638         (JSC::CallLinkInfo::setCodeBlock):
2639         (JSC::CallLinkInfo::clearCodeBlock):
2640         * bytecode/CallLinkInfo.h:
2641         (JSC::CallLinkInfo::clearedByJettison):
2642         (JSC::CallLinkInfo::setClearedByJettison):
2643         * bytecode/CodeBlock.cpp:
2644         (JSC::CodeBlock::jettison):
2645         * jit/Repatch.cpp:
2646         (JSC::revertCall):
2647
2648 2019-03-27  Yusuke Suzuki  <ysuzuki@apple.com>
2649
2650         [JSC] Drop VM and Context cache map in JavaScriptCore.framework
2651         https://bugs.webkit.org/show_bug.cgi?id=196341
2652
2653         Reviewed by Saam Barati.
2654
2655         Previously, we created Objective-C weak map to maintain JSVirtualMachine and JSContext wrappers corresponding to VM and JSGlobalObject.
2656         But Objective-C weak map is really memory costly. Even if the entry is only one, it consumes 2.5KB per weak map. Since we can modify
2657         JSC intrusively for JavaScriptCore.framework (and we already did it, like, holding JSWrapperMap in JSGlobalObject), we can just hold
2658         a pointer to a wrapper in VM and JSGlobalObject.
2659
2660         This patch adds void* members to VM and JSGlobalObject, which holds a non-strong reference to a wrapper. When a wrapper is gone, we
2661         clear this pointer too. This removes unnecessary two Objective-C weak maps, and save 5KB.
2662
2663         * API/JSContext.mm:
2664         (-[JSContext initWithVirtualMachine:]):
2665         (-[JSContext dealloc]):
2666         (-[JSContext initWithGlobalContextRef:]):
2667         (-[JSContext wrapperMap]):
2668         (+[JSContext contextWithJSGlobalContextRef:]):
2669         * API/JSVirtualMachine.mm:
2670         (-[JSVirtualMachine initWithContextGroupRef:]):
2671         (-[JSVirtualMachine dealloc]):
2672         (+[JSVirtualMachine virtualMachineWithContextGroupRef:]):
2673         (scanExternalObjectGraph):
2674         (scanExternalRememberedSet):
2675         (initWrapperCache): Deleted.
2676         (wrapperCache): Deleted.
2677         (+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]): Deleted.
2678         (+[JSVMWrapperCache wrapperForJSContextGroupRef:]): Deleted.
2679         (-[JSVirtualMachine contextForGlobalContextRef:]): Deleted.
2680         (-[JSVirtualMachine addContext:forGlobalContextRef:]): Deleted.
2681         * API/JSVirtualMachineInternal.h:
2682         * runtime/JSGlobalObject.h:
2683         (JSC::JSGlobalObject::setAPIWrapper):
2684         (JSC::JSGlobalObject::apiWrapper const):
2685         * runtime/VM.h:
2686
2687 2019-03-28  Tadeu Zagallo  <tzagallo@apple.com>
2688
2689         In-memory code cache should not share bytecode across domains
2690         https://bugs.webkit.org/show_bug.cgi?id=196321
2691
2692         Reviewed by Geoffrey Garen.
2693
2694         Use the SourceProvider's URL to make sure that the hosts match for the
2695         two SourceCodeKeys in operator==.
2696
2697         * parser/SourceCodeKey.h:
2698         (JSC::SourceCodeKey::host const):
2699         (JSC::SourceCodeKey::operator== const):
2700
2701 2019-03-28  Víctor Manuel Jáquez Leal  <vjaquez@igalia.com>
2702
2703         Silence lot of warnings when compiling with clang
2704         https://bugs.webkit.org/show_bug.cgi?id=196310
2705
2706         Reviewed by Michael Catanzaro.
2707
2708         Initialize variable with default constructor.
2709
2710         * API/glib/JSCOptions.cpp:
2711         (jsc_options_foreach):
2712
2713 2019-03-27  Saam Barati  <sbarati@apple.com>
2714
2715         validateOSREntryValue with Int52 should box the value being checked into double format
2716         https://bugs.webkit.org/show_bug.cgi?id=196313
2717         <rdar://problem/49306703>
2718
2719         Reviewed by Yusuke Suzuki.
2720
2721         * dfg/DFGOSREntry.cpp:
2722         (JSC::DFG::prepareOSREntry):
2723         * ftl/FTLLowerDFGToB3.cpp:
2724         (JSC::FTL::DFG::LowerDFGToB3::validateAIState):
2725
2726 2019-03-27  Yusuke Suzuki  <ysuzuki@apple.com>
2727
2728         [JSC] Owner of watchpoints should validate at GC finalizing phase
2729         https://bugs.webkit.org/show_bug.cgi?id=195827
2730
2731         Reviewed by Filip Pizlo.
2732
2733         This patch fixes JSC's watchpoint liveness issue by the following two policies.
2734
2735         1. Watchpoint should have owner cell, and "fire" operation should be gaurded with owner cell's isLive check.
2736
2737         Watchpoints should hold its owner cell, and fire procedure should be guarded by `owner->isLive()`.
2738         When the owner cell is destroyed, these watchpoints are destroyed too. But this destruction can
2739         be delayed due to incremental sweeper. So the following condition can happen.
2740
2741         When we have a watchpoint like the following.
2742
2743             class XXXWatchpoint {
2744                 ObjectPropertyCondition m_key;
2745                 JSCell* m_owner;
2746             };
2747
2748         Both m_key's cell and m_owner is now unreachable from the root. So eventually, m_owner cell's destructor
2749         is called and this watchpoint will be destroyed. But before that, m_key's cell can be destroyed. And this
2750         watchpoint's fire procedure can be called since m_owner's destructor is not called yet. In this situation,
2751         we encounter the destroyed cell held in m_key. This problem can be avoided if we guard fire procedure with
2752         `m_owner->isLive()`. Until the owner cell is destroyed, this guard avoids "fire" procedure execution. And
2753         once the destructor of m_owner is called, this watchpoint will be destroyed too.
2754
2755         2. Watchpoint liveness should be maintained by owner cell's unconditional finalizer
2756
2757         Watchpoints often hold weak references to the other cell (like, m_key in the above example). If we do not
2758         delete watchpoints with dead cells when these weak cells become dead, these watchpoints continue holding dead cells,
2759         and watchpoint's fire operation can use these dead cells accidentally. isLive / isStillLive check for these weak cells
2760         in fire operation is not useful. Because these dead cells can be reused to the other live cells eventually, and this
2761         isLive / isStillLive checks fail to see these cells are live if they are reused. Appropriate way is deleting watchpoints
2762         with dead cells when finalizing GC. In this patch, we do this in unconditional finalizers in owner cells of watchpoints.
2763         We already did this in CodeBlock etc. We add the same thing to StructureRareData which owns watchpoints for toString operations.
2764
2765         * JavaScriptCore.xcodeproj/project.pbxproj:
2766         * Sources.txt:
2767         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.h:
2768         (JSC::AdaptiveInferredPropertyValueWatchpointBase::StructureWatchpoint::StructureWatchpoint): Deleted.
2769         (JSC::AdaptiveInferredPropertyValueWatchpointBase::PropertyWatchpoint::PropertyWatchpoint): Deleted.
2770         * bytecode/CodeBlockJettisoningWatchpoint.h:
2771         (JSC::CodeBlockJettisoningWatchpoint::CodeBlockJettisoningWatchpoint): Deleted.
2772         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp:
2773         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::LLIntPrototypeLoadAdaptiveStructureWatchpoint):
2774         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal):
2775         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h:
2776         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::key const): Deleted.
2777         * bytecode/StructureStubClearingWatchpoint.cpp:
2778         (JSC::StructureStubClearingWatchpoint::fireInternal):
2779         (JSC::WatchpointsOnStructureStubInfo::isValid const):
2780         * bytecode/StructureStubClearingWatchpoint.h:
2781         (JSC::StructureStubClearingWatchpoint::StructureStubClearingWatchpoint): Deleted.
2782         * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp:
2783         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::isValid const):
2784         * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.h:
2785         * dfg/DFGAdaptiveStructureWatchpoint.cpp:
2786         (JSC::DFG::AdaptiveStructureWatchpoint::fireInternal):
2787         * dfg/DFGAdaptiveStructureWatchpoint.h:
2788         (JSC::DFG::AdaptiveStructureWatchpoint::key const): Deleted.
2789         * dfg/DFGDesiredWatchpoints.cpp:
2790         (JSC::DFG::ArrayBufferViewWatchpointAdaptor::add):
2791         * heap/Heap.cpp:
2792         (JSC::Heap::finalizeUnconditionalFinalizers):
2793         * llint/LLIntSlowPaths.cpp:
2794         (JSC::LLInt::setupGetByIdPrototypeCache):
2795         * runtime/ArrayBuffer.cpp:
2796         (JSC::ArrayBuffer::notifyIncommingReferencesOfTransfer):
2797         * runtime/ArrayBufferNeuteringWatchpointSet.cpp: Renamed from Source/JavaScriptCore/runtime/ArrayBufferNeuteringWatchpoint.cpp.
2798         (JSC::ArrayBufferNeuteringWatchpointSet::ArrayBufferNeuteringWatchpointSet):
2799         (JSC::ArrayBufferNeuteringWatchpointSet::destroy):
2800         (JSC::ArrayBufferNeuteringWatchpointSet::create):
2801         (JSC::ArrayBufferNeuteringWatchpointSet::createStructure):
2802         (JSC::ArrayBufferNeuteringWatchpointSet::fireAll):
2803         * runtime/ArrayBufferNeuteringWatchpointSet.h: Renamed from Source/JavaScriptCore/runtime/ArrayBufferNeuteringWatchpoint.h.
2804         * runtime/FunctionRareData.h:
2805         * runtime/JSGlobalObject.cpp:
2806         (JSC::JSGlobalObject::init):
2807         (JSC::JSGlobalObject::tryInstallArraySpeciesWatchpoint):
2808         * runtime/ObjectPropertyChangeAdaptiveWatchpoint.h:
2809         (JSC::ObjectPropertyChangeAdaptiveWatchpoint::ObjectPropertyChangeAdaptiveWatchpoint): Deleted.
2810         * runtime/StructureRareData.cpp:
2811         (JSC::StructureRareData::finalizeUnconditionally):
2812         * runtime/StructureRareData.h:
2813         * runtime/VM.cpp:
2814         (JSC::VM::VM):
2815
2816 2019-03-26  Saam Barati  <sbarati@apple.com>
2817
2818         FTL: Emit code to validate AI's state when running the compiled code
2819         https://bugs.webkit.org/show_bug.cgi?id=195924
2820         <rdar://problem/49003422>
2821
2822         Reviewed by Filip Pizlo.
2823
2824         This patch adds code that between the execution of each node that validates
2825         the types that AI proves. This option is too expensive to turn on for our
2826         regression testing, but we think it will be valuable in other types of running
2827         modes, such as when running with a fuzzer.
2828         
2829         This patch also adds options to only probabilistically run this validation
2830         after the execution of each node. As the probability is lowered, there is
2831         less of a perf hit.
2832         
2833         This patch just adds this validation in the FTL. A follow-up patch will land
2834         it in the DFG too: https://bugs.webkit.org/show_bug.cgi?id=196219
2835
2836         * ftl/FTLLowerDFGToB3.cpp:
2837         (JSC::FTL::DFG::LowerDFGToB3::LowerDFGToB3):
2838         (JSC::FTL::DFG::LowerDFGToB3::compileBlock):
2839         (JSC::FTL::DFG::LowerDFGToB3::validateAIState):
2840         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
2841         (JSC::FTL::DFG::LowerDFGToB3::lowJSValue):
2842         * runtime/Options.h:
2843
2844 2019-03-26  Tadeu Zagallo  <tzagallo@apple.com>
2845
2846         WebAssembly: Fix f32.min, f64.min and f64.max operations on NaN
2847         https://bugs.webkit.org/show_bug.cgi?id=196217
2848
2849         Reviewed by Saam Barati.
2850
2851         Generalize the fix for f32.max to properly handle NaN by doing an extra GreatherThan
2852         comparison in r243446 to all min and max float operations.
2853
2854         * wasm/WasmAirIRGenerator.cpp:
2855         (JSC::Wasm::AirIRGenerator::addOp<OpType::F32Min>):
2856         (JSC::Wasm::AirIRGenerator::addFloatingPointMinOrMax):
2857         (JSC::Wasm::AirIRGenerator::addOp<OpType::F32Max>):
2858         (JSC::Wasm::AirIRGenerator::addOp<OpType::F64Min>):
2859         (JSC::Wasm::AirIRGenerator::addOp<OpType::F64Max>):
2860         * wasm/wasm.json:
2861
2862 2019-03-26  Andy VanWagoner  <andy@vanwagoner.family>
2863
2864         Intl.DateTimeFormat should obey 2-digit hour
2865         https://bugs.webkit.org/show_bug.cgi?id=195974
2866
2867         Reviewed by Keith Miller.
2868
2869         * runtime/IntlDateTimeFormat.cpp:
2870         (JSC::IntlDateTimeFormat::initializeDateTimeFormat):
2871
2872 2019-03-25  Yusuke Suzuki  <ysuzuki@apple.com>
2873
2874         Heap::isMarked and friends should be instance methods
2875         https://bugs.webkit.org/show_bug.cgi?id=179988
2876
2877         Reviewed by Saam Barati.
2878
2879         Almost all the callers of Heap::isMarked have VM& reference. We should make Heap::isMarked instance function instead of static function
2880         so that we do not need to look up Heap from the cell.
2881
2882         * API/JSAPIWrapperObject.mm:
2883         (JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots):
2884         * API/JSMarkingConstraintPrivate.cpp:
2885         (JSC::isMarked):
2886         * API/glib/JSAPIWrapperObjectGLib.cpp:
2887         (JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots):
2888         * builtins/BuiltinExecutables.cpp:
2889         (JSC::BuiltinExecutables::finalizeUnconditionally):
2890         * bytecode/AccessCase.cpp:
2891         (JSC::AccessCase::visitWeak const):
2892         (JSC::AccessCase::propagateTransitions const):
2893         * bytecode/CallLinkInfo.cpp:
2894         (JSC::CallLinkInfo::visitWeak):
2895         * bytecode/CallLinkStatus.cpp:
2896         (JSC::CallLinkStatus::finalize):
2897         * bytecode/CallLinkStatus.h:
2898         * bytecode/CallVariant.cpp:
2899         (JSC::CallVariant::finalize):
2900         * bytecode/CallVariant.h:
2901         * bytecode/CodeBlock.cpp:
2902         (JSC::CodeBlock::shouldJettisonDueToWeakReference):
2903         (JSC::CodeBlock::shouldJettisonDueToOldAge):
2904         (JSC::shouldMarkTransition):
2905         (JSC::CodeBlock::propagateTransitions):
2906         (JSC::CodeBlock::determineLiveness):
2907         (JSC::CodeBlock::finalizeLLIntInlineCaches):
2908         (JSC::CodeBlock::finalizeUnconditionally):
2909         (JSC::CodeBlock::jettison):
2910         * bytecode/CodeBlock.h:
2911         * bytecode/ExecutableToCodeBlockEdge.cpp:
2912         (JSC::ExecutableToCodeBlockEdge::visitChildren):
2913         (JSC::ExecutableToCodeBlockEdge::finalizeUnconditionally):
2914         (JSC::ExecutableToCodeBlockEdge::runConstraint):
2915         * bytecode/GetByIdStatus.cpp:
2916         (JSC::GetByIdStatus::finalize):
2917         * bytecode/GetByIdStatus.h:
2918         * bytecode/GetByIdVariant.cpp:
2919         (JSC::GetByIdVariant::finalize):
2920         * bytecode/GetByIdVariant.h:
2921         * bytecode/InByIdStatus.cpp:
2922         (JSC::InByIdStatus::finalize):
2923         * bytecode/InByIdStatus.h:
2924         * bytecode/InByIdVariant.cpp:
2925         (JSC::InByIdVariant::finalize):
2926         * bytecode/InByIdVariant.h:
2927         * bytecode/ObjectPropertyCondition.cpp:
2928         (JSC::ObjectPropertyCondition::isStillLive const):
2929         * bytecode/ObjectPropertyCondition.h:
2930         * bytecode/ObjectPropertyConditionSet.cpp:
2931         (JSC::ObjectPropertyConditionSet::areStillLive const):
2932         * bytecode/ObjectPropertyConditionSet.h:
2933         * bytecode/PolymorphicAccess.cpp:
2934         (JSC::PolymorphicAccess::visitWeak const):
2935         * bytecode/PropertyCondition.cpp:
2936         (JSC::PropertyCondition::isStillLive const):
2937         * bytecode/PropertyCondition.h:
2938         * bytecode/PutByIdStatus.cpp:
2939         (JSC::PutByIdStatus::finalize):
2940         * bytecode/PutByIdStatus.h:
2941         * bytecode/PutByIdVariant.cpp:
2942         (JSC::PutByIdVariant::finalize):
2943         * bytecode/PutByIdVariant.h:
2944         * bytecode/RecordedStatuses.cpp:
2945         (JSC::RecordedStatuses::finalizeWithoutDeleting):
2946         (JSC::RecordedStatuses::finalize):
2947         * bytecode/RecordedStatuses.h:
2948         * bytecode/StructureSet.cpp:
2949         (JSC::StructureSet::isStillAlive const):
2950         * bytecode/StructureSet.h:
2951         * bytecode/StructureStubInfo.cpp:
2952         (JSC::StructureStubInfo::visitWeakReferences):
2953         * dfg/DFGPlan.cpp:
2954         (JSC::DFG::Plan::finalizeInGC):
2955         (JSC::DFG::Plan::isKnownToBeLiveDuringGC):
2956         * heap/GCIncomingRefCounted.h:
2957         * heap/GCIncomingRefCountedInlines.h:
2958         (JSC::GCIncomingRefCounted<T>::filterIncomingReferences):
2959         * heap/GCIncomingRefCountedSet.h:
2960         * heap/GCIncomingRefCountedSetInlines.h:
2961         (JSC::GCIncomingRefCountedSet<T>::lastChanceToFinalize):
2962         (JSC::GCIncomingRefCountedSet<T>::sweep):
2963         (JSC::GCIncomingRefCountedSet<T>::removeAll): Deleted.
2964         (JSC::GCIncomingRefCountedSet<T>::removeDead): Deleted.
2965         * heap/Heap.cpp:
2966         (JSC::Heap::addToRememberedSet):
2967         (JSC::Heap::runEndPhase):
2968         (JSC::Heap::sweepArrayBuffers):
2969         (JSC::Heap::addCoreConstraints):
2970         * heap/Heap.h:
2971         * heap/HeapInlines.h:
2972         (JSC::Heap::isMarked):
2973         * heap/HeapSnapshotBuilder.cpp:
2974         (JSC::HeapSnapshotBuilder::appendNode):
2975         * heap/SlotVisitor.cpp:
2976         (JSC::SlotVisitor::appendToMarkStack):
2977         (JSC::SlotVisitor::visitChildren):
2978         * jit/PolymorphicCallStubRoutine.cpp:
2979         (JSC::PolymorphicCallStubRoutine::visitWeak):
2980         * runtime/ErrorInstance.cpp:
2981         (JSC::ErrorInstance::finalizeUnconditionally):
2982         * runtime/InferredValueInlines.h:
2983         (JSC::InferredValue::finalizeUnconditionally):
2984         * runtime/StackFrame.h:
2985         (JSC::StackFrame::isMarked const):
2986         * runtime/Structure.cpp:
2987         (JSC::Structure::isCheapDuringGC):
2988         (JSC::Structure::markIfCheap):
2989         * runtime/Structure.h:
2990         * runtime/TypeProfiler.cpp:
2991         (JSC::TypeProfiler::invalidateTypeSetCache):
2992         * runtime/TypeProfiler.h:
2993         * runtime/TypeSet.cpp:
2994         (JSC::TypeSet::invalidateCache):
2995         * runtime/TypeSet.h:
2996         * runtime/WeakMapImpl.cpp:
2997         (JSC::WeakMapImpl<WeakMapBucket<WeakMapBucketDataKeyValue>>::visitOutputConstraints):
2998         * runtime/WeakMapImplInlines.h:
2999         (JSC::WeakMapImpl<WeakMapBucket>::finalizeUnconditionally):
3000
3001 2019-03-25  Keith Miller  <keith_miller@apple.com>
3002
3003         ASSERTION FAILED: m_op == CompareStrictEq in JSC::DFG::Node::convertToCompareEqPtr(JSC::DFG::FrozenValue *, JSC::DFG::Edge)
3004         https://bugs.webkit.org/show_bug.cgi?id=196176
3005
3006         Reviewed by Saam Barati.
3007
3008         convertToCompareEqPtr should allow for either CompareStrictEq or
3009         the SameValue DFG node. This fixes the old assertion that only
3010         allowed CompareStrictEq.
3011
3012         * dfg/DFGNode.h:
3013         (JSC::DFG::Node::convertToCompareEqPtr):
3014
3015 2019-03-25  Tadeu Zagallo  <tzagallo@apple.com>
3016
3017         WebAssembly: f32.max with NaN generates incorrect result
3018         https://bugs.webkit.org/show_bug.cgi?id=175691
3019         <rdar://problem/33952228>
3020
3021         Reviewed by Saam Barati.
3022
3023         Fix the B3 and Air compilation for f32.max. In order to handle the NaN
3024         case, we need an extra GreaterThan comparison on top of the existing
3025         Equal and LessThan ones.
3026
3027         * wasm/WasmAirIRGenerator.cpp:
3028         (JSC::Wasm::AirIRGenerator::addOp<OpType::F32Max>):
3029         * wasm/wasm.json:
3030
3031 2019-03-25  Yusuke Suzuki  <ysuzuki@apple.com>
3032
3033         Unreviewed, speculative fix for CLoop build on CPU(UNKNOWN)
3034         https://bugs.webkit.org/show_bug.cgi?id=195982
3035
3036         * jit/ExecutableAllocator.h:
3037         (JSC::ExecutableAllocator::initializeUnderlyingAllocator):
3038
3039 2019-03-25  Gyuyoung Kim  <gyuyoung.kim@webkit.org>
3040
3041         Remove NavigatorContentUtils in WebCore/Modules
3042         https://bugs.webkit.org/show_bug.cgi?id=196070
3043
3044         Reviewed by Alex Christensen.
3045
3046         NavigatorContentUtils was to support the custom scheme spec [1].
3047         However, in WebKit side, no port has supported the feature in
3048         WebKit layer after EFL port was removed. So there has been the
3049         only IDL implementation of the NavigatorContentUtils in WebCore.
3050         So we don't need to keep the implementation in WebCore anymore.
3051
3052         [1] https://html.spec.whatwg.org/multipage/system-state.html#custom-handlers
3053
3054         * Configurations/FeatureDefines.xcconfig:
3055
3056 2019-03-23  Mark Lam  <mark.lam@apple.com>
3057
3058         Rolling out r243032 and r243071 because the fix is incorrect.
3059         https://bugs.webkit.org/show_bug.cgi?id=195892
3060         <rdar://problem/48981239>
3061
3062         Not reviewed.
3063
3064         The fix is incorrect: it relies on being able to determine liveness of an object
3065         in an ObjectPropertyCondition based on the state of the object's MarkedBit.
3066         However, there's no guarantee that GC has run and that the MarkedBit is already
3067         set even if the object is live.  As a result, we may not re-install adaptive
3068         watchpoints based on presumed dead objects which are actually live.
3069
3070         I'm rolling this out, and will implement a more comprehensive fix to handle
3071         watchpoint liveness later.
3072
3073         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp:
3074         (JSC::AdaptiveInferredPropertyValueWatchpointBase::fire):
3075         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp:
3076         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal):
3077         * bytecode/ObjectPropertyCondition.cpp:
3078         (JSC::ObjectPropertyCondition::dumpInContext const):
3079         * bytecode/StructureStubClearingWatchpoint.cpp:
3080         (JSC::StructureStubClearingWatchpoint::fireInternal):
3081         * dfg/DFGAdaptiveStructureWatchpoint.cpp:
3082         (JSC::DFG::AdaptiveStructureWatchpoint::fireInternal):
3083         * runtime/StructureRareData.cpp:
3084         (JSC::ObjectToStringAdaptiveStructureWatchpoint::fireInternal):
3085
3086 2019-03-23  Keith Miller  <keith_miller@apple.com>
3087
3088         Refactor clz/ctz and fix getLSBSet.
3089         https://bugs.webkit.org/show_bug.cgi?id=196162
3090
3091         Reviewed by Saam Barati.
3092
3093         Refactor references of clz32/64 and ctz32 to use clz and ctz,
3094         respectively.
3095
3096         * dfg/DFGAbstractInterpreterInlines.h:
3097         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3098         * dfg/DFGOperations.cpp:
3099         * runtime/JSBigInt.cpp:
3100         (JSC::JSBigInt::digitDiv):
3101         (JSC::JSBigInt::absoluteDivWithBigIntDivisor):
3102         (JSC::JSBigInt::calculateMaximumCharactersRequired):
3103         (JSC::JSBigInt::toStringBasePowerOfTwo):
3104         (JSC::JSBigInt::compareToDouble):
3105         * runtime/MathObject.cpp:
3106         (JSC::mathProtoFuncClz32):
3107
3108 2019-03-23  Yusuke Suzuki  <ysuzuki@apple.com>
3109
3110         [JSC] Shrink sizeof(RegExp)
3111         https://bugs.webkit.org/show_bug.cgi?id=196133
3112
3113         Reviewed by Mark Lam.
3114
3115         Some applications have many RegExp cells. But RegExp cells are very large (144B).
3116         This patch reduces the size from 144B to 48B by,
3117
3118         1. Allocate Yarr::YarrCodeBlock in non-GC heap. We can avoid this allocation if JIT is disabled.
3119         2. m_captureGroupNames and m_namedGroupToParenIndex are moved to RareData. They are only used when RegExp has named capture groups.
3120
3121         * runtime/RegExp.cpp:
3122         (JSC::RegExp::finishCreation):
3123         (JSC::RegExp::estimatedSize):
3124         (JSC::RegExp::compile):
3125         (JSC::RegExp::matchConcurrently):
3126         (JSC::RegExp::compileMatchOnly):
3127         (JSC::RegExp::deleteCode):
3128         (JSC::RegExp::printTraceData):
3129         * runtime/RegExp.h:
3130         * runtime/RegExpInlines.h:
3131         (JSC::RegExp::hasCodeFor):
3132         (JSC::RegExp::matchInline):
3133         (JSC::RegExp::hasMatchOnlyCodeFor):
3134
3135 2019-03-22  Keith Rollin  <krollin@apple.com>
3136
3137         Enable ThinLTO support in Production builds
3138         https://bugs.webkit.org/show_bug.cgi?id=190758
3139         <rdar://problem/45413233>
3140
3141         Reviewed by Daniel Bates.
3142
3143         Tweak JavaScriptCore's Base.xcconfig to be more in-line with other
3144         .xcconfig files with regards to LTO settings. However, don't actually
3145         enable LTO for JavaScriptCore. LTO is not enabled for JavaScriptCore
3146         due to <rdar://problem/24543547>.
3147
3148         * Configurations/Base.xcconfig:
3149
3150 2019-03-22  Mark Lam  <mark.lam@apple.com>
3151
3152         Placate exception check validation in genericTypedArrayViewProtoFuncLastIndexOf().
3153         https://bugs.webkit.org/show_bug.cgi?id=196154
3154         <rdar://problem/49145307>
3155
3156         Reviewed by Filip Pizlo.
3157
3158         * runtime/JSGenericTypedArrayViewPrototypeFunctions.h:
3159         (JSC::genericTypedArrayViewProtoFuncLastIndexOf):
3160
3161 2019-03-22  Mark Lam  <mark.lam@apple.com>
3162
3163         Placate exception check validation in constructJSWebAssemblyLinkError().
3164         https://bugs.webkit.org/show_bug.cgi?id=196152
3165         <rdar://problem/49145257>
3166
3167         Reviewed by Michael Saboff.
3168
3169         * wasm/js/WebAssemblyLinkErrorConstructor.cpp:
3170         (JSC::constructJSWebAssemblyLinkError):
3171
3172 2019-03-22  Timothy Hatcher  <timothy@apple.com>
3173
3174         Change macosx() to macos() in WK_API... and JSC_API... macros.
3175         https://bugs.webkit.org/show_bug.cgi?id=196106
3176
3177         Reviewed by Brian Burg.
3178
3179         * API/JSBasePrivate.h:
3180         * API/JSContext.h:
3181         * API/JSContextPrivate.h:
3182         * API/JSContextRef.h:
3183         * API/JSContextRefInternal.h:
3184         * API/JSContextRefPrivate.h:
3185         * API/JSManagedValue.h:
3186         * API/JSObjectRef.h:
3187         * API/JSObjectRefPrivate.h:
3188         * API/JSRemoteInspector.h:
3189         * API/JSScript.h:
3190         * API/JSTypedArray.h:
3191         * API/JSValue.h:
3192         * API/JSValuePrivate.h:
3193         * API/JSValueRef.h:
3194         * API/JSVirtualMachinePrivate.h:
3195
3196 2019-03-22  Yusuke Suzuki  <ysuzuki@apple.com>
3197
3198         Unreviewed, build fix for Windows
3199         https://bugs.webkit.org/show_bug.cgi?id=196122
3200
3201         * runtime/FunctionExecutable.cpp:
3202
3203 2019-03-21  Yusuke Suzuki  <ysuzuki@apple.com>
3204
3205         [JSC] Shrink sizeof(FunctionExecutable) by 16bytes
3206         https://bugs.webkit.org/show_bug.cgi?id=196122
3207
3208         Reviewed by Saam Barati.
3209
3210         This patch reduces sizeof(FunctionExecutable) by 16 bytes.
3211
3212         1. ScriptExecutable::m_numParametersForCall and ScriptExecutable::m_numParametersForConstruct are not used in a meaningful way. Removed them.
3213         2. ScriptExecutable::m_lastLine and ScriptExecutable::m_endColumn can be calculated from UnlinkedFunctionExecutable. So FunctionExecutable does not need to hold it.
3214            This patch adds GlobalExecutable, which are non-function ScriptExecutables, and move m_lastLine and m_endColumn to this class.
3215         3. FunctionExecutable still needs to have the feature overriding m_lastLine and m_endColumn. We move overridden data in FunctionExecutable::RareData.
3216
3217         * CMakeLists.txt:
3218         * JavaScriptCore.xcodeproj/project.pbxproj:
3219         * Sources.txt:
3220         * bytecode/UnlinkedFunctionExecutable.cpp:
3221         (JSC::UnlinkedFunctionExecutable::link):
3222         * runtime/EvalExecutable.cpp:
3223         (JSC::EvalExecutable::EvalExecutable):
3224         * runtime/EvalExecutable.h:
3225         * runtime/FunctionExecutable.cpp:
3226         (JSC::FunctionExecutable::FunctionExecutable):
3227         (JSC::FunctionExecutable::ensureRareDataSlow):
3228         (JSC::FunctionExecutable::overrideInfo):
3229         * runtime/FunctionExecutable.h:
3230         * runtime/GlobalExecutable.cpp: Copied from Source/JavaScriptCore/tools/FunctionOverrides.h.
3231         * runtime/GlobalExecutable.h: Copied from Source/JavaScriptCore/tools/FunctionOverrides.h.
3232         (JSC::GlobalExecutable::lastLine const):
3233         (JSC::GlobalExecutable::endColumn const):
3234         (JSC::GlobalExecutable::recordParse):
3235         (JSC::GlobalExecutable::GlobalExecutable):
3236         * runtime/ModuleProgramExecutable.cpp:
3237         (JSC::ModuleProgramExecutable::ModuleProgramExecutable):
3238         * runtime/ModuleProgramExecutable.h:
3239         * runtime/ProgramExecutable.cpp:
3240         (JSC::ProgramExecutable::ProgramExecutable):
3241         * runtime/ProgramExecutable.h:
3242         * runtime/ScriptExecutable.cpp:
3243         (JSC::ScriptExecutable::clearCode):
3244         (JSC::ScriptExecutable::installCode):
3245         (JSC::ScriptExecutable::hasClearableCode const):
3246         (JSC::ScriptExecutable::newCodeBlockFor):
3247         (JSC::ScriptExecutable::typeProfilingEndOffset const):
3248         (JSC::ScriptExecutable::recordParse):
3249         (JSC::ScriptExecutable::lastLine const):
3250         (JSC::ScriptExecutable::endColumn const):
3251         * runtime/ScriptExecutable.h:
3252         (JSC::ScriptExecutable::hasJITCodeForCall const):
3253         (JSC::ScriptExecutable::hasJITCodeForConstruct const):
3254         (JSC::ScriptExecutable::recordParse):
3255         (JSC::ScriptExecutable::lastLine const): Deleted.
3256         (JSC::ScriptExecutable::endColumn const): Deleted.
3257         * tools/FunctionOverrides.h:
3258
3259 2019-03-21  Yusuke Suzuki  <ysuzuki@apple.com>
3260
3261         [JSC] Shrink sizeof(RegExpObject)
3262         https://bugs.webkit.org/show_bug.cgi?id=196130
3263
3264         Reviewed by Saam Barati.
3265
3266         sizeof(RegExpObject) is 48B due to one bool flag. We should compress this flag into lower bit of RegExp* field so that we can make RegExpObject 32B.
3267         It saves memory footprint 1.3% in RAMification's regexp.
3268
3269         * dfg/DFGSpeculativeJIT.cpp:
3270         (JSC::DFG::SpeculativeJIT::compileNewRegexp):
3271         (JSC::DFG::SpeculativeJIT::compileSetRegExpObjectLastIndex):
3272         * ftl/FTLAbstractHeapRepository.h:
3273         * ftl/FTLLowerDFGToB3.cpp:
3274         (JSC::FTL::DFG::LowerDFGToB3::compileNewRegexp):
3275         (JSC::FTL::DFG::LowerDFGToB3::compileSetRegExpObjectLastIndex):
3276         * runtime/RegExpObject.cpp:
3277         (JSC::RegExpObject::RegExpObject):
3278         (JSC::RegExpObject::visitChildren):
3279         (JSC::RegExpObject::getOwnPropertySlot):
3280         (JSC::RegExpObject::defineOwnProperty):
3281         * runtime/RegExpObject.h:
3282
3283 2019-03-21  Tomas Popela  <tpopela@redhat.com>
3284
3285         [JSC] Fix build after r243232 on unsupported 64bit architectures
3286         https://bugs.webkit.org/show_bug.cgi?id=196072
3287
3288         Reviewed by Keith Miller.
3289
3290         As Keith suggested we already expect 16 free bits at the top of any
3291         pointer for JSValue even for the unsupported 64 bit arches.
3292
3293         * bytecode/CodeOrigin.h:
3294
3295 2019-03-21  Mark Lam  <mark.lam@apple.com>
3296
3297         Remove an invalid assertion in DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNullOrUndefined().
3298         https://bugs.webkit.org/show_bug.cgi?id=196116
3299         <rdar://problem/48976951>
3300
3301         Reviewed by Filip Pizlo.
3302
3303         The DFG backend should not make assumptions about what optimizations the front end
3304         will or will not do.  The assertion asserts that the operand cannot be known to be
3305         a cell.  However, it is not guaranteed that the front end will fold away this case.
3306         Also, the DFG backend is perfectly capable of generating code to handle the case
3307         where the operand is a cell.
3308
3309         The attached test case demonstrates a case where the operand can be a known cell.
3310         The test needs to be run with the concurrent JIT and GC, and is racy.  It used to
3311         trip up this assertion about once every 10 runs or so.
3312
3313         * dfg/DFGSpeculativeJIT64.cpp:
3314         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNullOrUndefined):
3315
3316 2019-03-21  Tadeu Zagallo  <tzagallo@apple.com>
3317
3318         JSC::createError should clear exception thrown by errorDescriptionForValue
3319         https://bugs.webkit.org/show_bug.cgi?id=196089
3320
3321         Reviewed by Mark Lam.
3322
3323         errorDescriptionForValue returns a nullString in case of failure, but it
3324         might also throw an OOM exception when resolving a rope string. We need
3325         to clear any potential exceptions thrown by errorDescriptionForValue
3326         before returning the OOM from JSC::createError.
3327