ebe30bead0dd6e9ba20bbb9e181173fc99e4c8ef
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2017-06-24  Yusuke Suzuki  <utatane.tea@gmail.com>
2
3         [JSC] Clean up Object.entries implementation
4         https://bugs.webkit.org/show_bug.cgi?id=173759
5
6         Reviewed by Sam Weinig.
7
8         This patch cleans up Object.entries implementation.
9         We drop unused private functions. And we merge the
10         implementation into Object.entries.
11
12         It slightly speeds up Object.entries speed.
13
14                                      baseline                  patched
15
16             object-entries      148.0101+-5.6627          142.1877+-4.8661          might be 1.0409x faster
17
18
19         * builtins/BuiltinNames.h:
20         * builtins/ObjectConstructor.js:
21         (entries):
22         (globalPrivate.enumerableOwnProperties): Deleted.
23         * runtime/JSGlobalObject.cpp:
24         (JSC::JSGlobalObject::init):
25         * runtime/ObjectConstructor.cpp:
26         (JSC::ownEnumerablePropertyKeys): Deleted.
27         * runtime/ObjectConstructor.h:
28
29 2017-06-24  Joseph Pecoraro  <pecoraro@apple.com>
30
31         Remove Reflect.enumerate
32         https://bugs.webkit.org/show_bug.cgi?id=173806
33
34         Reviewed by Yusuke Suzuki.
35
36         * CMakeLists.txt:
37         * JavaScriptCore.xcodeproj/project.pbxproj:
38         * inspector/JSInjectedScriptHost.cpp:
39         (Inspector::JSInjectedScriptHost::subtype):
40         (Inspector::JSInjectedScriptHost::getInternalProperties):
41         (Inspector::JSInjectedScriptHost::iteratorEntries):
42         * runtime/JSGlobalObject.cpp:
43         (JSC::JSGlobalObject::init):
44         (JSC::JSGlobalObject::visitChildren):
45         * runtime/JSPropertyNameIterator.cpp: Removed.
46         * runtime/JSPropertyNameIterator.h: Removed.
47         * runtime/ReflectObject.cpp:
48         (JSC::reflectObjectEnumerate): Deleted.
49
50 2017-06-23  Keith Miller  <keith_miller@apple.com>
51
52         Switch VMTraps to use halt instructions rather than breakpoint instructions
53         https://bugs.webkit.org/show_bug.cgi?id=173677
54         <rdar://problem/32178892>
55
56         Reviewed by JF Bastien.
57
58         Using the breakpoint instruction for VMTraps caused issues with lldb.
59         Since we only need some way to stop execution we can, in theory, use
60         any exceptioning instruction we want. I went with the halt instruction
61         on X86 since that is the only one byte instruction that does not
62         breakpoint (in my tests both 0xf1 and 0xd6 produced EXC_BREAKPOINT).
63         On ARM we use the data cache clearing instruction with the zero register,
64         which triggers a segmentation fault.
65
66         Also, update the platform code to only use signaling VMTraps
67         on where we have an appropriate instruction (x86 and ARM64).
68
69         * API/tests/ExecutionTimeLimitTest.cpp:
70         (testExecutionTimeLimit):
71         * assembler/ARM64Assembler.h:
72         (JSC::ARM64Assembler::replaceWithVMHalt):
73         (JSC::ARM64Assembler::dataCacheZeroVirtualAddress):
74         (JSC::ARM64Assembler::replaceWithBkpt): Deleted.
75         * assembler/ARMAssembler.h:
76         (JSC::ARMAssembler::replaceWithBkpt): Deleted.
77         * assembler/ARMv7Assembler.h:
78         (JSC::ARMv7Assembler::replaceWithBkpt): Deleted.
79         * assembler/MIPSAssembler.h:
80         (JSC::MIPSAssembler::replaceWithBkpt): Deleted.
81         * assembler/MacroAssemblerARM.h:
82         (JSC::MacroAssemblerARM::replaceWithBreakpoint): Deleted.
83         * assembler/MacroAssemblerARM64.h:
84         (JSC::MacroAssemblerARM64::replaceWithVMHalt):
85         (JSC::MacroAssemblerARM64::replaceWithBreakpoint): Deleted.
86         * assembler/MacroAssemblerARMv7.h:
87         (JSC::MacroAssemblerARMv7::storeFence):
88         (JSC::MacroAssemblerARMv7::replaceWithBreakpoint): Deleted.
89         * assembler/MacroAssemblerMIPS.h:
90         (JSC::MacroAssemblerMIPS::replaceWithBreakpoint): Deleted.
91         * assembler/MacroAssemblerX86Common.h:
92         (JSC::MacroAssemblerX86Common::replaceWithVMHalt):
93         (JSC::MacroAssemblerX86Common::replaceWithBreakpoint): Deleted.
94         * assembler/X86Assembler.h:
95         (JSC::X86Assembler::replaceWithHlt):
96         (JSC::X86Assembler::replaceWithInt3): Deleted.
97         * dfg/DFGJumpReplacement.cpp:
98         (JSC::DFG::JumpReplacement::installVMTrapBreakpoint):
99         * runtime/VMTraps.cpp:
100         (JSC::SignalContext::SignalContext):
101         (JSC::installSignalHandler):
102         (JSC::SignalContext::adjustPCToPointToTrappingInstruction): Deleted.
103         * wasm/WasmFaultSignalHandler.cpp:
104         (JSC::Wasm::enableFastMemory):
105
106 2017-06-22  Saam Barati  <sbarati@apple.com>
107
108         The lowering of Identity in the DFG backend needs to use ManualOperandSpeculation
109         https://bugs.webkit.org/show_bug.cgi?id=173743
110         <rdar://problem/32932536>
111
112         Reviewed by Mark Lam.
113
114         The code always manually speculates, however, we weren't specifying
115         ManualOperandSpeculation when creating a JSValueOperand. This would
116         fire an assertion in JSValueOperand construction for a node like:
117         Identity(String:@otherNode)
118         
119         I spent about 45 minutes trying to craft a test and came up
120         empty. However, this fixes a debug assertion on an internal
121         Apple website.
122
123         * dfg/DFGSpeculativeJIT32_64.cpp:
124         (JSC::DFG::SpeculativeJIT::compile):
125         * dfg/DFGSpeculativeJIT64.cpp:
126         (JSC::DFG::SpeculativeJIT::compile):
127
128 2017-06-22  Saam Barati  <sbarati@apple.com>
129
130         ValueRep(DoubleRep(@v)) can not simply convert to @v
131         https://bugs.webkit.org/show_bug.cgi?id=173687
132         <rdar://problem/32855563>
133
134         Reviewed by Mark Lam.
135
136         Consider this IR:
137          block#x
138           p: Phi() // int32 and double flows into this phi from various control flow
139           d: DoubleRep(@p)
140           some uses of @d here
141           v: ValueRep(DoubleRepUse:@d)
142           a: NewArrayWithSize(Int32:@v)
143           some more nodes here ...
144         
145         Because the flow of ValueRep(DoubleRep(@p)) will not produce an Int32,
146         AI proves that the Int32 check will fail. Constant folding phase removes
147         all nodes after @a and inserts an Unreachable after the NewArrayWithSize node.
148         
149         The IR then looks like this:
150         block#x
151           p: Phi() // int32 and double flows into this phi from various control flow
152           d: DoubleRep(@p)
153           some uses of @d here
154           v: ValueRep(DoubleRepUse:@d)
155           a: NewArrayWithSize(Int32:@v)
156           Unreachable
157         
158         However, there was a strength reduction rule that tries eliminate redundant
159         conversions. It used to convert the program to:
160         block#x
161           p: Phi() // int32 and double flows into this phi from various control flow
162           d: DoubleRep(@p)
163           some uses of @d here
164           a: NewArrayWithSize(Int32:@p)
165           Unreachable
166         
167         However, at runtime, @p will actually be an Int32, so @a will not OSR exit,
168         and we'll crash. This patch removes this strength reduction rule since it
169         does not maintain what would have happened if we executed the program before
170         the rule.
171         
172         This rule is also wrong for other types of programs (I'm not sure we'd
173         actually emit this code, but if such IR were generated, we would previously
174         optimize it incorrectly):
175         @a: Constant(JSTrue)
176         @b: DoubleRep(@a)
177         @c: ValueRep(@b)
178         @d: use(@c)
179         
180         However, the strength reduction rule would've transformed this into:
181         @a: Constant(JSTrue)
182         @d: use(@a)
183         
184         And this would be wrong because node @c before the transformation would
185         have produced the JSValue jsNumber(1.0).
186         
187         This patch was neutral in the benchmark run I did.
188
189         * dfg/DFGStrengthReductionPhase.cpp:
190         (JSC::DFG::StrengthReductionPhase::handleNode):
191
192 2017-06-22  JF Bastien  <jfbastien@apple.com>
193
194         ARM64: doubled executable memory limit from 32MiB to 64MiB
195         https://bugs.webkit.org/show_bug.cgi?id=173734
196         <rdar://problem/32932407>
197
198         Reviewed by Oliver Hunt.
199
200         Some WebAssembly programs stress the amount of memory we have
201         available, especially when we consider tiering (BBQ never dies,
202         and is bigger that OMG). Tiering to OMG just piles on more memory,
203         and we're also competing with JavaScript.
204
205         * jit/ExecutableAllocator.h:
206
207 2017-06-22  Joseph Pecoraro  <pecoraro@apple.com>
208
209         Web Inspector: Pausing with a deep call stack can be very slow, avoid eagerly generating object previews
210         https://bugs.webkit.org/show_bug.cgi?id=173698
211
212         Reviewed by Matt Baker.
213
214         When pausing in a deep call stack the majority of the time spent in JavaScriptCore
215         when preparing Inspector pause information is spent generating object previews for
216         the `thisObject` of each of the call frames. In some cases, this could be more
217         than 95% of the time generating pause information. In the common case, only one of
218         these (the top frame) will ever be seen by users. This change avoids eagerly
219         generating object previews up front and let the frontend request previews if they
220         are needed.
221
222         This introduces the `Runtime.getPreview` protocol command. This can be used to:
223
224             - Get a preview for a RemoteObject that did not have a preview but could.
225             - Update a preview for a RemoteObject that had a preview.
226
227         This patch only uses it for the first case, but the second is valid and may be
228         something we want to do in the future.
229
230         * inspector/protocol/Runtime.json:
231         A new command to get an up to date preview for an object.
232
233         * inspector/InjectedScript.h:
234         * inspector/InjectedScript.cpp:
235         (Inspector::InjectedScript::getPreview):
236         * inspector/agents/InspectorRuntimeAgent.cpp:
237         (Inspector::InspectorRuntimeAgent::getPreview):
238         * inspector/agents/InspectorRuntimeAgent.h:
239         Plumbing for the new command.
240
241         * inspector/InjectedScriptSource.js:
242         (InjectedScript.prototype.getPreview):
243         Implementation just uses the existing helper.
244
245         (InjectedScript.CallFrameProxy):
246         Do not generate a preview for the this object as it may not be shown.
247         Let the frontend request a preview if it wants or needs one.
248
249 2017-06-22  Joseph Pecoraro  <pecoraro@apple.com>
250
251         Web Inspector: Remove stale "rawScopes" concept that was never available in JSC
252         https://bugs.webkit.org/show_bug.cgi?id=173686
253
254         Reviewed by Mark Lam.
255
256         * inspector/InjectedScript.cpp:
257         (Inspector::InjectedScript::functionDetails):
258         * inspector/InjectedScriptSource.js:
259         (InjectedScript.prototype.functionDetails):
260         * inspector/JSInjectedScriptHost.cpp:
261         (Inspector::JSInjectedScriptHost::functionDetails):
262
263 2017-06-22  Yusuke Suzuki  <utatane.tea@gmail.com>
264
265         [JSC] Object.values should be implemented in C++
266         https://bugs.webkit.org/show_bug.cgi?id=173703
267
268         Reviewed by Sam Weinig.
269
270         As the same to Object.assign, Object.values() is also inherently polymorphic.
271         And allocating JSString / Symbol for Identifier and JSArray for Object.keys()
272         result is costly.
273
274         In this patch, we implement Object.values() in C++. It can avoid above allocations.
275         Furthermore, by using `slot.isTaintedByOpaqueObject()` information, we can skip
276         non-observable JSObject::get() calls.
277
278         This improves performance by 2.49x. And also now Object.values() beats
279         Object.keys(object).map(key => object[key]) implementation.
280
281                                              baseline                  patched
282
283             object-values               132.1551+-3.7209     ^     53.1254+-1.6139        ^ definitely 2.4876x faster
284             object-keys-map-values       78.2008+-2.1378     ?     78.9078+-2.2121        ?
285
286         * builtins/ObjectConstructor.js:
287         (values): Deleted.
288         * runtime/ObjectConstructor.cpp:
289         (JSC::objectConstructorValues):
290
291 2017-06-21  Saam Barati  <sbarati@apple.com>
292
293         ArrayPrototype.map builtin declares a var it does not use
294         https://bugs.webkit.org/show_bug.cgi?id=173685
295
296         Reviewed by Keith Miller.
297
298         * builtins/ArrayPrototype.js:
299         (map):
300
301 2017-06-21  Saam Barati  <sbarati@apple.com>
302
303         eval virtual call is incorrect in the baseline JIT
304         https://bugs.webkit.org/show_bug.cgi?id=173587
305         <rdar://problem/32867897>
306
307         Reviewed by Michael Saboff.
308
309         When making a virtual call for call_eval, e.g, when the thing
310         we're calling isn't actually eval, we end up calling the caller
311         instead of the callee. This is clearly wrong. The code ends up
312         issuing a load for the Callee in the callers frame instead of
313         the callee we're calling. The fix is simple, we just need to
314         load the real callee. Only the 32-bit baseline JIT had this bug.
315
316         * jit/JITCall32_64.cpp:
317         (JSC::JIT::compileCallEvalSlowCase):
318
319 2017-06-21  Joseph Pecoraro  <pecoraro@apple.com>
320
321         Web Inspector: Using "break on all exceptions" when throwing stack overflow hangs inspector
322         https://bugs.webkit.org/show_bug.cgi?id=172432
323         <rdar://problem/29870873>
324
325         Reviewed by Saam Barati.
326
327         Avoid pausing on StackOverflow and OutOfMemory errors to avoid a hang.
328         We will proceed to improve debugging of these cases in the follow-up bugs.
329
330         * debugger/Debugger.cpp:
331         (JSC::Debugger::exception):
332         Ignore pausing on these errors.
333
334         * runtime/ErrorInstance.h:
335         (JSC::ErrorInstance::setStackOverflowError):
336         (JSC::ErrorInstance::isStackOverflowError):
337         (JSC::ErrorInstance::setOutOfMemoryError):
338         (JSC::ErrorInstance::isOutOfMemoryError):
339         * runtime/ExceptionHelpers.cpp:
340         (JSC::createStackOverflowError):
341         * runtime/Error.cpp:
342         (JSC::createOutOfMemoryError):
343         Mark these kinds of errors.
344
345 2017-06-21  Saam Barati  <sbarati@apple.com>
346
347         Make it clear that regenerating ICs are holding the CodeBlock's lock by passing the locker as a parameter
348         https://bugs.webkit.org/show_bug.cgi?id=173609
349
350         Reviewed by Keith Miller.
351
352         This patch makes many of the IC generating functions require a locker as
353         a parameter. We do this in other places in JSC to indicate that
354         a particular API is only valid while a particular lock is held.
355         This is the case when generating ICs. This patch just makes it
356         explicit in the IC generating interface.
357
358         * bytecode/PolymorphicAccess.cpp:
359         (JSC::PolymorphicAccess::addCases):
360         (JSC::PolymorphicAccess::addCase):
361         (JSC::PolymorphicAccess::commit):
362         (JSC::PolymorphicAccess::regenerate):
363         * bytecode/PolymorphicAccess.h:
364         * bytecode/StructureStubInfo.cpp:
365         (JSC::StructureStubInfo::addAccessCase):
366         (JSC::StructureStubInfo::initStub): Deleted.
367         * bytecode/StructureStubInfo.h:
368         * jit/Repatch.cpp:
369         (JSC::tryCacheGetByID):
370         (JSC::repatchGetByID):
371         (JSC::tryCachePutByID):
372         (JSC::repatchPutByID):
373         (JSC::tryRepatchIn):
374         (JSC::repatchIn):
375
376 2017-06-20  Myles C. Maxfield  <mmaxfield@apple.com>
377
378         Disable font variations on macOS Sierra and iOS 10
379         https://bugs.webkit.org/show_bug.cgi?id=173618
380         <rdar://problem/32879164>
381
382         Reviewed by Jon Lee.
383
384         * Configurations/FeatureDefines.xcconfig:
385
386 2017-06-20  Keith Miller  <keith_miller@apple.com>
387
388         Fix leak of ModuleInformations in BBQPlan constructors.
389         https://bugs.webkit.org/show_bug.cgi?id=173577
390
391         Reviewed by Saam Barati.
392
393         This patch fixes a leak in the BBQPlan constructiors. Previously,
394         the plans were calling makeRef on the newly constructed objects.
395         This patch fixes the issue and uses adoptRef instead. Additionally,
396         an old, incorrect, attempt to fix the leak is removed.
397
398         * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm:
399         (Inspector::RemoteInspectorXPCConnection::RemoteInspectorXPCConnection):
400         * jit/JITWorklist.cpp:
401         (JSC::JITWorklist::Thread::Thread):
402         * runtime/PromiseDeferredTimer.cpp:
403         (JSC::PromiseDeferredTimer::addPendingPromise):
404         * runtime/VM.cpp:
405         (JSC::VM::VM):
406         * wasm/WasmBBQPlan.cpp:
407         (JSC::Wasm::BBQPlan::BBQPlan):
408         * wasm/WasmPlan.cpp:
409         (JSC::Wasm::Plan::Plan):
410
411 2017-06-20  Devin Rousso  <drousso@apple.com>
412
413         Web Inspector: Send context attributes for tracked canvases
414         https://bugs.webkit.org/show_bug.cgi?id=173327
415
416         Reviewed by Joseph Pecoraro.
417
418         * inspector/protocol/Canvas.json:
419         Add ContextAttributes object type that is optionally used for WebGL canvases.
420
421 2017-06-20  Konstantin Tokarev  <annulen@yandex.ru>
422
423         Remove excessive include directives from WTF
424         https://bugs.webkit.org/show_bug.cgi?id=173553
425
426         Reviewed by Saam Barati.
427
428         * profiler/ProfilerDatabase.cpp: Added missing include directive.
429         * runtime/SamplingProfiler.cpp: Ditto.
430
431 2017-06-20  Oleksandr Skachkov  <gskachkov@gmail.com>
432
433         Revert changes in bug#160417 about extending `null` not being a derived class
434         https://bugs.webkit.org/show_bug.cgi?id=169293
435
436         Reviewed by Saam Barati.
437
438         Reverted changes in bug#160417 about extending `null` not being a derived class 
439         according to changes in spec:
440         https://github.com/tc39/ecma262/commit/c57ef95c45a371f9c9485bb1c3881dbdc04524a2
441
442         * builtins/BuiltinNames.h:
443         * bytecompiler/BytecodeGenerator.cpp:
444         (JSC::BytecodeGenerator::BytecodeGenerator):
445         (JSC::BytecodeGenerator::emitReturn):
446         * bytecompiler/NodesCodegen.cpp:
447         (JSC::ClassExprNode::emitBytecode):
448
449 2017-06-20  Saam Barati  <sbarati@apple.com>
450
451         repatchIn needs to lock the CodeBlock's lock
452         https://bugs.webkit.org/show_bug.cgi?id=173573
453
454         Reviewed by Yusuke Suzuki.
455
456         CodeBlock::propagateTransitions and CodeBlock::visitWeakly grab the CodeBlock's
457         lock before modifying the StructureStubInfo/PolymorphicAccess. When regenerating
458         an IC, we must hold the CodeBlock's to prevent the executing thread from racing
459         with the marking thread. repatchIn was not grabbing the lock. I haven't been
460         able to get it to crash, but this is needed for the same reasons that get and put IC
461         regeneration grab the lock.
462
463         * jit/Repatch.cpp:
464         (JSC::repatchIn):
465
466 2017-06-19  Devin Rousso  <drousso@apple.com>
467
468         Web Inspector: create canvas content view and details sidebar panel
469         https://bugs.webkit.org/show_bug.cgi?id=138941
470         <rdar://problem/19051672>
471
472         Reviewed by Joseph Pecoraro.
473
474         * inspector/protocol/Canvas.json:
475          - Add an optional `nodeId` attribute to the `Canvas` type.
476          - Add `requestNode` command for getting the node id of the backing canvas element.
477          - Add `requestContent` command for getting the current image content of the canvas.
478
479 2017-06-19  Yusuke Suzuki  <utatane.tea@gmail.com>
480
481         Unreviewed, build fix for ARM
482
483         * assembler/MacroAssemblerARM.h:
484         (JSC::MacroAssemblerARM::internalCompare32):
485
486 2017-06-13  Yusuke Suzuki  <utatane.tea@gmail.com>
487
488         [DFG] More ArrayIndexOf fixups for various types
489         https://bugs.webkit.org/show_bug.cgi?id=173176
490
491         Reviewed by Saam Barati.
492
493         This patch further expands coverage of ArrayIndexOf optimization in DFG and FTL.
494
495         1. We attempt to fold ArrayIndexOf to constant (-1) if we know that its array
496         never contains the given search value.
497
498         2. We support Symbol and Other specialization additionally. Especially, Other is
499         useful because null/undefined can be used as a sentinel value.
500
501         One interesting thing is that Array.prototype.indexOf does not consider holes as
502         undefineds. Thus,
503
504             var array = [,,,,,,,];
505             array.indexOf(undefined); // => -1
506
507         This can be trivially achieved in JSC because Empty and Undefined are different values.
508
509         * dfg/DFGFixupPhase.cpp:
510         (JSC::DFG::FixupPhase::fixupNode):
511         (JSC::DFG::FixupPhase::fixupArrayIndexOf):
512         * dfg/DFGSpeculativeJIT.cpp:
513         (JSC::DFG::SpeculativeJIT::compileArrayIndexOf):
514         (JSC::DFG::SpeculativeJIT::speculateOther):
515         * dfg/DFGSpeculativeJIT.h:
516         * ftl/FTLLowerDFGToB3.cpp:
517         (JSC::FTL::DFG::LowerDFGToB3::compileArrayIndexOf):
518
519 2017-06-19  Caio Lima  <ticaiolima@gmail.com>
520
521         [ARMv6][DFG] ARM MacroAssembler is always emitting cmn when immediate is 0
522         https://bugs.webkit.org/show_bug.cgi?id=172972
523
524         Reviewed by Mark Lam.
525
526         We are changing internalCompare32 implementation in ARM
527         MacroAssembler to emit "cmp" when the "right.value" is 0.
528         It is generating wrong comparison cases, since the
529         semantics of cmn is opposite of cmp[1]. One case that it's breaking is
530         "branch32(MacroAssembler::Above, gpr, TrustedImm32(0))", where ends
531         resulting in following assembly code:
532
533         ```
534         cmn $r0, #0
535         bhi <address>
536         ```
537
538         However, as cmn is similar to "adds", it will never take the branch
539         when $r0 > 0. In that case, the correct opcode is "cmp". With this
540         patch we will fix current broken tests that uses
541         "branch32(MacroAssembler::Above, gpr, TrustedImm32(0))",
542         such as ForwardVarargs, Spread and GetRestLength.
543
544         [1] - http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cihiddid.html
545
546         * assembler/MacroAssemblerARM.h:
547         (JSC::MacroAssemblerARM::internalCompare32):
548
549 2017-06-19  Joseph Pecoraro  <pecoraro@apple.com>
550
551         test262: Completion values for control flow do not match the spec
552         https://bugs.webkit.org/show_bug.cgi?id=171265
553
554         Reviewed by Saam Barati.
555
556         * bytecompiler/BytecodeGenerator.h:
557         (JSC::BytecodeGenerator::shouldBeConcernedWithCompletionValue):
558         When we care about having proper completion values (global code
559         in programs, modules, and eval) insert undefined results for
560         control flow statements.
561
562         * bytecompiler/NodesCodegen.cpp:
563         (JSC::SourceElements::emitBytecode):
564         Reduce writing a default `undefined` value to the completion result to
565         only once before the last statement we know will produce a value.
566
567         (JSC::IfElseNode::emitBytecode):
568         (JSC::WithNode::emitBytecode):
569         (JSC::WhileNode::emitBytecode):
570         (JSC::ForNode::emitBytecode):
571         (JSC::ForInNode::emitBytecode):
572         (JSC::ForOfNode::emitBytecode):
573         (JSC::SwitchNode::emitBytecode):
574         Insert an undefined to handle cases where code may break out of an
575         if/else or with statement (break/continue).
576
577         (JSC::TryNode::emitBytecode):
578         Same handling for break cases. Also, finally block statement completion
579         values are always ignored for the try statement result.
580
581         (JSC::ClassDeclNode::emitBytecode):
582         Class declarations, like function declarations, produce an empty result.
583
584         * parser/Nodes.cpp:
585         (JSC::SourceElements::lastStatement):
586         (JSC::SourceElements::hasCompletionValue):
587         (JSC::SourceElements::hasEarlyBreakOrContinue):
588         (JSC::BlockNode::lastStatement):
589         (JSC::BlockNode::singleStatement):
590         (JSC::BlockNode::hasCompletionValue):
591         (JSC::BlockNode::hasEarlyBreakOrContinue):
592         (JSC::ScopeNode::singleStatement):
593         (JSC::ScopeNode::hasCompletionValue):
594         (JSC::ScopeNode::hasEarlyBreakOrContinue):
595         The only non-trivial cases need to loop through their list of statements
596         to determine if this has a completion value or not. Likewise for
597         determining if there is an early break / continue, meaning a break or
598         continue statement with no preceding statement that has a completion value.
599
600         * parser/Nodes.h:
601         (JSC::StatementNode::next):
602         (JSC::StatementNode::hasCompletionValue):
603         Helper to check if a statement nodes produces a completion value or not.
604
605 2017-06-19  Adrian Perez de Castro  <aperez@igalia.com>
606
607         Missing <functional> includes make builds fail with GCC 7.x
608         https://bugs.webkit.org/show_bug.cgi?id=173544
609
610         Unreviewed gardening.
611
612         Fix compilation with GCC 7.
613
614         * API/tests/CompareAndSwapTest.cpp:
615         * runtime/VMEntryScope.h:
616
617 2017-06-17  Keith Miller  <keith_miller@apple.com>
618
619         ArrayBuffer constructor needs to create subclass structures before its buffer
620         https://bugs.webkit.org/show_bug.cgi?id=173510
621
622         Reviewed by Yusuke Suzuki.
623
624         * runtime/JSArrayBufferConstructor.cpp:
625         (JSC::constructArrayBuffer):
626
627 2017-06-17  Keith Miller  <keith_miller@apple.com>
628
629         ArrayPrototype methods should use JSValue::toLength for non-Arrays.
630         https://bugs.webkit.org/show_bug.cgi?id=173506
631
632         Reviewed by Ryosuke Niwa.
633
634         This patch changes the result of unshift if old length +
635         unshift.arguments.length > (2 ** 53) - 1 to be a type error. Also,
636         the getLength function, which was always incorrect to use, has
637         been removed. Additionally, some cases where we were using a
638         constant for (2 ** 53) - 1 have been replaced with
639         maxSafeInteger()
640
641         * interpreter/Interpreter.cpp:
642         (JSC::sizeOfVarargs):
643         * runtime/ArrayPrototype.cpp:
644         (JSC::arrayProtoFuncToLocaleString):
645         (JSC::arrayProtoFuncPop):
646         (JSC::arrayProtoFuncPush):
647         (JSC::arrayProtoFuncReverse):
648         (JSC::arrayProtoFuncShift):
649         (JSC::arrayProtoFuncSlice):
650         (JSC::arrayProtoFuncSplice):
651         (JSC::arrayProtoFuncUnShift):
652         (JSC::arrayProtoFuncIndexOf):
653         (JSC::arrayProtoFuncLastIndexOf):
654         * runtime/JSArrayInlines.h:
655         (JSC::getLength): Deleted.
656         * runtime/JSCJSValue.cpp:
657         (JSC::JSValue::toLength):
658         * runtime/NumberConstructor.cpp:
659         (JSC::numberConstructorFuncIsSafeInteger):
660
661 2017-06-16  Matt Baker  <mattbaker@apple.com>
662
663         Web Inspector: Instrument 2D/WebGL canvas contexts in the backend
664         https://bugs.webkit.org/show_bug.cgi?id=172623
665         <rdar://problem/32415986>
666
667         Reviewed by Devin Rousso and Joseph Pecoraro.
668
669         This patch adds a basic Canvas protocol. It includes Canvas and related
670         types and events for monitoring the lifetime of canvases in the page.
671
672         * CMakeLists.txt:
673         * DerivedSources.make:
674         * inspector/protocol/Canvas.json: Added.
675
676         * inspector/scripts/codegen/generator.py:
677         (Generator.stylized_name_for_enum_value):
678         Add special handling for Canvas.ContextType protocol enumeration,
679         so that "canvas-2d" and "webgl" map to `Canvas2D` and `WebGL`.
680
681 2017-06-16  Wenson Hsieh  <wenson_hsieh@apple.com>
682
683         [iOS DnD] Upstream iOS drag and drop implementation into OpenSource WebKit
684         https://bugs.webkit.org/show_bug.cgi?id=173366
685         <rdar://problem/32767014>
686
687         Reviewed by Tim Horton.
688
689         Introduce ENABLE_DATA_INTERACTION and ENABLE_DRAG_SUPPORT to FeatureDefines.xcconfig.
690
691         * Configurations/FeatureDefines.xcconfig:
692
693 2017-06-16  Yusuke Suzuki  <utatane.tea@gmail.com>
694
695         [JSC] Add fast path for Object.assign
696         https://bugs.webkit.org/show_bug.cgi?id=173416
697
698         Reviewed by Mark Lam.
699
700         In Object.assign implementation, we need to ensure that given key is still enumerable own key.
701         This seems duplicate look up. And we want to avoid this. However, we still need to perform this
702         check in the face of Proxy. Proxy can observe that this check is done correctly.
703
704         In almost all the cases, the above check is duplicate to the subsequent [[Get]] operation.
705         In this patch, we perform this check. But at that time, we investigate `isTaintedByOpaqueObject()`.
706         If it is false, we can say that getOwnPropertySlot is pure. In that case, we can just retrieve the
707         value by calling `slot.getValue()`.
708
709         This further improves performance of Object.assign.
710
711                                         baseline                  patched
712
713             object-assign.es6      363.6706+-6.4381     ^    324.1769+-6.9624        ^ definitely 1.1218x faster
714
715         * runtime/ObjectConstructor.cpp:
716         (JSC::objectConstructorAssign):
717
718 2017-06-16  Michael Saboff  <msaboff@apple.com>
719
720         Intermittent crash running Internal/Tests/InternalJSTests/Regress/radar-24300617.js
721         https://bugs.webkit.org/show_bug.cgi?id=173488
722
723         Reviewed by Filip Pizlo.
724
725         ClonedArguments lazily sets its callee and interator properties and it used its own inline
726         code to initialize its butterfly.  This means that these lazily set properties can have
727         bogus values in those slots.  Instead, let's use the standard BUtterfly:tryCreate() method
728         to create the butterfly as it clears out of line properties.
729
730         * runtime/ClonedArguments.cpp:
731         (JSC::ClonedArguments::createEmpty):
732
733 2017-06-16  Mark Lam  <mark.lam@apple.com>
734
735         Interpreter methods for mapping between Opcode and OpcodeID need not be instance methods.
736         https://bugs.webkit.org/show_bug.cgi?id=173491
737
738         Reviewed by Keith Miller.
739
740         The implementation are based on static data. There's no need to get the
741         interpreter instance. Hence, we can make these methods static and avoid doing
742         unnecessary work to compute the interpreter this pointer.
743
744         Also removed the unused isCallBytecode method.
745
746         * bytecode/BytecodeBasicBlock.cpp:
747         (JSC::BytecodeBasicBlock::computeImpl):
748         * bytecode/BytecodeDumper.cpp:
749         (JSC::BytecodeDumper<Block>::printGetByIdOp):
750         (JSC::BytecodeDumper<Block>::printGetByIdCacheStatus):
751         (JSC::BytecodeDumper<Block>::dumpBytecode):
752         (JSC::BytecodeDumper<Block>::dumpBlock):
753         * bytecode/BytecodeLivenessAnalysis.cpp:
754         (JSC::BytecodeLivenessAnalysis::dumpResults):
755         * bytecode/BytecodeLivenessAnalysisInlines.h:
756         (JSC::BytecodeLivenessPropagation<DerivedAnalysis>::stepOverInstruction):
757         * bytecode/BytecodeRewriter.cpp:
758         (JSC::BytecodeRewriter::adjustJumpTargetsInFragment):
759         * bytecode/CallLinkStatus.cpp:
760         (JSC::CallLinkStatus::computeFromLLInt):
761         * bytecode/CodeBlock.cpp:
762         (JSC::CodeBlock::finishCreation):
763         (JSC::CodeBlock::propagateTransitions):
764         (JSC::CodeBlock::finalizeLLIntInlineCaches):
765         (JSC::CodeBlock::hasOpDebugForLineAndColumn):
766         (JSC::CodeBlock::usesOpcode):
767         (JSC::CodeBlock::valueProfileForBytecodeOffset):
768         (JSC::CodeBlock::arithProfileForPC):
769         (JSC::CodeBlock::insertBasicBlockBoundariesForControlFlowProfiler):
770         * bytecode/PreciseJumpTargets.cpp:
771         (JSC::getJumpTargetsForBytecodeOffset):
772         (JSC::computePreciseJumpTargetsInternal):
773         (JSC::findJumpTargetsForBytecodeOffset):
774         * bytecode/PreciseJumpTargetsInlines.h:
775         (JSC::extractStoredJumpTargetsForBytecodeOffset):
776         * bytecode/UnlinkedCodeBlock.cpp:
777         (JSC::UnlinkedCodeBlock::applyModification):
778         * dfg/DFGByteCodeParser.cpp:
779         (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit):
780         (JSC::DFG::ByteCodeParser::parseBlock):
781         * dfg/DFGCapabilities.cpp:
782         (JSC::DFG::capabilityLevel):
783         * interpreter/Interpreter.cpp:
784         (JSC::Interpreter::Interpreter):
785         (JSC::Interpreter::isOpcode):
786         (): Deleted.
787         * interpreter/Interpreter.h:
788         (JSC::Interpreter::getOpcode): Deleted.
789         (JSC::Interpreter::getOpcodeID): Deleted.
790         (JSC::Interpreter::isCallBytecode): Deleted.
791         * interpreter/InterpreterInlines.h:
792         (JSC::Interpreter::getOpcode):
793         (JSC::Interpreter::getOpcodeID):
794         * jit/JIT.cpp:
795         (JSC::JIT::privateCompileMainPass):
796         (JSC::JIT::privateCompileSlowCases):
797         * jit/JITOpcodes.cpp:
798         (JSC::JIT::emitNewFuncCommon):
799         (JSC::JIT::emitNewFuncExprCommon):
800         * jit/JITPropertyAccess.cpp:
801         (JSC::JIT::emitSlow_op_put_by_val):
802         (JSC::JIT::privateCompilePutByVal):
803         * jit/JITPropertyAccess32_64.cpp:
804         (JSC::JIT::emitSlow_op_put_by_val):
805         * llint/LLIntSlowPaths.cpp:
806         (JSC::LLInt::llint_trace_operand):
807         (JSC::LLInt::llint_trace_value):
808         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
809         * profiler/ProfilerBytecodeSequence.cpp:
810         (JSC::Profiler::BytecodeSequence::BytecodeSequence):
811
812 2017-06-16  Matt Lewis  <jlewis3@apple.com>
813
814         Unreviewed, rolling out r218376.
815
816         The patch cause multiple Layout Test Crashes.
817
818         Reverted changeset:
819
820         "Web Inspector: Instrument 2D/WebGL canvas contexts in the
821         backend"
822         https://bugs.webkit.org/show_bug.cgi?id=172623
823         http://trac.webkit.org/changeset/218376
824
825 2017-06-16  Konstantin Tokarev  <annulen@yandex.ru>
826
827         REGRESSION(r166799): LogsPageMessagesToSystemConsoleEnabled corrupts non-ASCII characters
828         https://bugs.webkit.org/show_bug.cgi?id=173470
829
830         Reviewed by Joseph Pecoraro.
831
832         ConsoleClient::printConsoleMessageWithArguments() incorrectly uses
833         const char* overload of StringBuilder::append() that assummes Latin1
834         encoding, not UTF8.
835
836         * runtime/ConsoleClient.cpp:
837         (JSC::ConsoleClient::printConsoleMessageWithArguments):
838
839 2017-06-15  Mark Lam  <mark.lam@apple.com>
840
841         Add a JSRunLoopTimer registry in VM.
842         https://bugs.webkit.org/show_bug.cgi?id=173429
843         <rdar://problem/31287961>
844
845         Reviewed by Filip Pizlo.
846
847         This way, we can be sure we've got every JSRunLoopTimer instance covered if we
848         need to change their run loop (e.g. when setting to the WebThread's run loop).
849
850         * heap/Heap.cpp:
851         (JSC::Heap::Heap):
852         (JSC::Heap::setRunLoop): Deleted.
853         * heap/Heap.h:
854         (JSC::Heap::runLoop): Deleted.
855         * runtime/JSRunLoopTimer.cpp:
856         (JSC::JSRunLoopTimer::JSRunLoopTimer):
857         (JSC::JSRunLoopTimer::setRunLoop):
858         (JSC::JSRunLoopTimer::~JSRunLoopTimer):
859         * runtime/VM.cpp:
860         (JSC::VM::VM):
861         (JSC::VM::registerRunLoopTimer):
862         (JSC::VM::unregisterRunLoopTimer):
863         (JSC::VM::setRunLoop):
864         * runtime/VM.h:
865         (JSC::VM::runLoop):
866
867 2017-06-15  Joseph Pecoraro  <pecoraro@apple.com>
868
869         [Cocoa] Modernize some internal initializers to use instancetype instead of id
870         https://bugs.webkit.org/show_bug.cgi?id=173112
871
872         Reviewed by Wenson Hsieh.
873
874         * API/JSContextInternal.h:
875         * API/JSWrapperMap.h:
876         * API/JSWrapperMap.mm:
877         (-[JSObjCClassInfo initForClass:]):
878         (-[JSWrapperMap initWithGlobalContextRef:]):
879
880 2017-06-15  Matt Baker  <mattbaker@apple.com>
881
882         Web Inspector: Instrument 2D/WebGL canvas contexts in the backend
883         https://bugs.webkit.org/show_bug.cgi?id=172623
884         <rdar://problem/32415986>
885
886         Reviewed by Devin Rousso.
887
888         This patch adds a basic Canvas protocol. It includes Canvas and related
889         types and events for monitoring the lifetime of canvases in the page.
890
891         * CMakeLists.txt:
892         * DerivedSources.make:
893         * inspector/protocol/Canvas.json: Added.
894
895         * inspector/scripts/codegen/generator.py:
896         (Generator.stylized_name_for_enum_value):
897         Add special handling for Canvas.ContextType protocol enumeration,
898         so that "canvas-2d" and "webgl" map to `Canvas2D` and `WebGL`.
899
900 2017-06-15  Keith Miller  <keith_miller@apple.com>
901
902         Add logging to MachineStackMarker to try to diagnose crashes in the wild
903         https://bugs.webkit.org/show_bug.cgi?id=173427
904
905         Reviewed by Mark Lam.
906
907         This patch adds some logging to the MachineStackMarker constructor
908         to help figure out where we are seeing crashes. Since macOS does
909         not support os_log_info my hope is that if we set all the callee
910         save registers before making any calls in the C++ code we can
911         figure out which calls is the source of the crash. We also, set
912         all the caller save registers before returning in case some
913         weirdness is happening in the Heap constructor.
914
915         This logging should not matter from a performance perspective. We
916         only create MachineStackMarkers when we are creating a new VM,
917         which is already expensive.
918
919         * heap/MachineStackMarker.cpp:
920         (JSC::MachineThreads::MachineThreads):
921
922 2017-06-15  Yusuke Suzuki  <utatane.tea@gmail.com>
923
924         [JSC] Implement Object.assign in C++
925         https://bugs.webkit.org/show_bug.cgi?id=173414
926
927         Reviewed by Saam Barati.
928
929         Implementing Object.assign in JS is not so good compared to C++ version because,
930
931         1. JS version allocates JS array for object own keys. And we allocate JSString / Symbol for each key.
932         But basically, they can be handled as UniquedStringImpl in C++. Allocating these cells are wasteful.
933
934         2. While implementing builtins in JS offers some good type speculation chances, Object.assign is inherently super polymorphic.
935         So JS's type profile doesn't help well.
936
937         3. We have a chance to introduce various fast path for Object.assign in C++.
938
939         This patch moves implementation from JS to C++. It achieves the above (1) and (2). (3) is filed in [1].
940
941         We can see 1.65x improvement in SixSpeed object-assign.es6.
942
943                                     baseline                  patched
944
945         object-assign.es6      643.3253+-8.0521     ^    389.1075+-8.8840        ^ definitely 1.6533x faster
946
947         [1]: https://bugs.webkit.org/show_bug.cgi?id=173416
948
949         * builtins/ObjectConstructor.js:
950         (entries):
951         (assign): Deleted.
952         * runtime/JSCJSValueInlines.h:
953         (JSC::JSValue::putInline):
954         * runtime/JSCell.h:
955         * runtime/JSCellInlines.h:
956         (JSC::JSCell::putInline):
957         * runtime/JSObject.cpp:
958         (JSC::JSObject::put):
959         * runtime/JSObject.h:
960         * runtime/JSObjectInlines.h:
961         (JSC::JSObject::putInlineForJSObject):
962         (JSC::JSObject::putInline): Deleted.
963         * runtime/ObjectConstructor.cpp:
964         (JSC::objectConstructorAssign):
965
966 2017-06-14  Dan Bernstein  <mitz@apple.com>
967
968         [Cocoa] Objective-C class whose name begins with an underscore can’t be exported to JavaScript
969         https://bugs.webkit.org/show_bug.cgi?id=168578
970
971         Reviewed by Geoff Garen.
972
973         * API/JSWrapperMap.mm:
974         (allocateConstructorForCustomClass): Updated for change to forEachProtocolImplementingProtocol.
975         (-[JSObjCClassInfo allocateConstructorAndPrototype]): Ditto.
976         (-[JSWrapperMap classInfoForClass:]): If the class name begins with an underscore, check if
977           it defines conformance to a JSExport-derived protocol and if so, avoid using the
978           superclass as a substitute as we’d normally do.
979
980         * API/ObjcRuntimeExtras.h:
981         (forEachProtocolImplementingProtocol): Added a "stop" argument to the block to let callers
982           bail out.
983
984         * API/tests/JSExportTests.mm:
985         (+[JSExportTests classNamePrefixedWithUnderscoreTest]): New test for this.
986         (runJSExportTests): Run new test.
987
988 2017-06-14  Yusuke Suzuki  <utatane.tea@gmail.com>
989
990         Unreviewed, suppress invalid register alloation validation assertion in 32 bit part 2
991         https://bugs.webkit.org/show_bug.cgi?id=172421
992
993         * dfg/DFGSpeculativeJIT.cpp:
994         (JSC::DFG::SpeculativeJIT::compileArrayIndexOf):
995
996 2017-06-14  Claudio Saavedra  <csaavedra@igalia.com>
997
998         REGRESSION: 15 new jsc failures in WPE and GTK+
999         https://bugs.webkit.org/show_bug.cgi?id=173349
1000
1001         Reviewed by JF Bastien.
1002
1003         Recent changes to generateWasm.py are not accounted for from
1004         CMake, which leads to WasmOps.h not being regenerated in partial
1005         builds. Make generateWasm.py an additional dependency.
1006         * CMakeLists.txt:
1007
1008 2017-06-13  Joseph Pecoraro  <pecoraro@apple.com>
1009
1010         Debugger has unexpected effect on program correctness
1011         https://bugs.webkit.org/show_bug.cgi?id=172683
1012
1013         Reviewed by Saam Barati.
1014
1015         * inspector/InjectedScriptSource.js:
1016         (InjectedScript.RemoteObject.prototype._appendPropertyPreviews):
1017         (InjectedScript.RemoteObject.prototype._isPreviewableObjectInternal):
1018         (BasicCommandLineAPI):
1019         Eliminate for..of use with Arrays from InjectedScriptSource as it can be observable.
1020         We still use it for Set / Map iteration which we can eliminate when moving to builtins.
1021
1022 2017-06-13  JF Bastien  <jfbastien@apple.com>
1023
1024         WebAssembly: fix erroneous signature comment
1025         https://bugs.webkit.org/show_bug.cgi?id=173334
1026
1027         Reviewed by Keith Miller.
1028
1029         * wasm/WasmSignature.h:
1030
1031 2017-06-13  Michael Saboff  <msaboff@apple.com>
1032
1033         Refactor AbsenceOfSetter to AbsenceOfSetEffects
1034         https://bugs.webkit.org/show_bug.cgi?id=173322
1035
1036         Reviewed by Filip Pizlo.
1037
1038         * bytecode/ObjectPropertyCondition.h:
1039         (JSC::ObjectPropertyCondition::absenceOfSetEffectWithoutBarrier):
1040         (JSC::ObjectPropertyCondition::absenceOfSetEffect):
1041         (JSC::ObjectPropertyCondition::absenceOfSetterWithoutBarrier): Deleted.
1042         (JSC::ObjectPropertyCondition::absenceOfSetter): Deleted.
1043         * bytecode/ObjectPropertyConditionSet.cpp:
1044         (JSC::generateConditionsForPropertySetterMiss):
1045         (JSC::generateConditionsForPropertySetterMissConcurrently):
1046         * bytecode/PropertyCondition.cpp:
1047         (JSC::PropertyCondition::dumpInContext):
1048         (JSC::PropertyCondition::isStillValidAssumingImpurePropertyWatchpoint):
1049         (JSC::PropertyCondition::isStillValid):
1050         (WTF::printInternal):
1051         * bytecode/PropertyCondition.h:
1052         (JSC::PropertyCondition::absenceOfSetEffectWithoutBarrier):
1053         (JSC::PropertyCondition::absenceOfSetEffect):
1054         (JSC::PropertyCondition::hasPrototype):
1055         (JSC::PropertyCondition::hash):
1056         (JSC::PropertyCondition::operator==):
1057         (JSC::PropertyCondition::absenceOfSetterWithoutBarrier): Deleted.
1058         (JSC::PropertyCondition::absenceOfSetter): Deleted.
1059
1060 2017-06-13  JF Bastien  <jfbastien@apple.com>
1061
1062         WebAssembly: import updated spec tests
1063         https://bugs.webkit.org/show_bug.cgi?id=173287
1064         <rdar://problem/32725975>
1065
1066         Reviewed by Saam Barati.
1067
1068         Import spec tests as of 31c641cc15f2aedbec2fa45a5185f68416df578b,
1069         with a few modifications so things work.
1070
1071         Fix a bunch of bugs found through this process, and punt a few tests (which I
1072         marked as blocked by this bug).
1073
1074         Fixes:
1075
1076         Fix load / store alignment: r216908 erroneously implemented it as bit alignment
1077         instead of byte alignment. It was also missing memory-alignment.js despite it
1078         being in the ChangeLog, so add it too. This allows spec-test/align.wast.js to
1079         pass.
1080
1081         Tables can be imported or in a section. There can be only one, but sections can
1082         be empty. An Elements section can exist if there's no Table, as long as it is
1083         also empty.
1084
1085         Memories can be imported or in a section. There can be only one, but sections
1086         can be empty. A Data section can exist if there's no Memory, as long as it is
1087         also empty.
1088
1089         Prototypes: stringify without .prototype. in the string.
1090
1091         WebAssembly.Table.prototype.grow was plain wrong: it takes a delta parameter,
1092         not a final size, and throws a RangeError on failure, not a TypeError.
1093
1094         Fix compile / instantiate so the reject the promise if given an argument of the
1095         wrong type (instead of failing instantly).
1096
1097         Fix async on neuter test.
1098
1099         Element section shouldn't affect any Table if any of the elements are out of
1100         bounds. We need to process it in two passes.
1101
1102         Segment section shouldn't affect any Data if any of the segments are out of
1103         bounds. We need to process it in two passes.
1104
1105         Empty data segments are valid, but only when there is no memory. Their index
1106         still gets validated, and has to be zero.
1107
1108         Punts:
1109
1110         Error messages with context, the test seems overly restrictive but this is
1111         minor.
1112
1113         compile/instantiate/validate property descriptors.
1114
1115         UTF-8 bugs.
1116
1117         Temporarily disable NaN tests. We need to go back and implement the following
1118         semantics: https://github.com/WebAssembly/spec/pull/414 This doesn't matter as
1119         much as getting all the other tests passing.
1120
1121         Worth noting for NaNs: f64.no_fold_mul_one (also a NaN test) as well as
1122         no_fold_promote_demote (an interesting corner case which we get wrong). mul by
1123         one is (assert_return (invoke \"f64.no_fold_mul_one\" (i64.const
1124         0x7ff4000000000000)) (i64.const 0x7ff8000000000000)) which means converting sNaN
1125         to qNaN, and promote/demote is (assert_return (invoke \"no_fold_promote_demote\"
1126         (i32.const 0x7fa00000)) (i32.const 0x7fc00000)) which is the same. I'm not sure
1127         why they're not allowed.
1128
1129         * wasm/WasmB3IRGenerator.cpp:
1130         * wasm/WasmFunctionParser.h:
1131         * wasm/WasmModuleParser.cpp:
1132         * wasm/WasmModuleParser.h:
1133         * wasm/WasmParser.h:
1134         (JSC::Wasm::Parser<SuccessType>::consumeUTF8String):
1135         * wasm/generateWasm.py:
1136         (memoryLog2Alignment):
1137         * wasm/js/JSWebAssemblyTable.cpp:
1138         (JSC::JSWebAssemblyTable::grow):
1139         * wasm/js/JSWebAssemblyTable.h:
1140         * wasm/js/WebAssemblyCompileErrorPrototype.cpp:
1141         * wasm/js/WebAssemblyInstancePrototype.cpp:
1142         * wasm/js/WebAssemblyLinkErrorPrototype.cpp:
1143         * wasm/js/WebAssemblyMemoryPrototype.cpp:
1144         * wasm/js/WebAssemblyModulePrototype.cpp:
1145         * wasm/js/WebAssemblyModuleRecord.cpp:
1146         (JSC::WebAssemblyModuleRecord::evaluate):
1147         * wasm/js/WebAssemblyPrototype.cpp:
1148         (JSC::webAssemblyCompileFunc):
1149         (JSC::resolve):
1150         (JSC::instantiate):
1151         (JSC::compileAndInstantiate):
1152         (JSC::webAssemblyInstantiateFunc):
1153         * wasm/js/WebAssemblyRuntimeErrorPrototype.cpp:
1154         * wasm/js/WebAssemblyTablePrototype.cpp:
1155         (JSC::webAssemblyTableProtoFuncGrow):
1156
1157 2017-06-13  Michael Saboff  <msaboff@apple.com>
1158
1159         DFG doesn't properly handle a property that is change to read only in a prototype
1160         https://bugs.webkit.org/show_bug.cgi?id=173321
1161
1162         Reviewed by Filip Pizlo.
1163
1164         We need to check for ReadOnly as well as a not being a Setter when checking
1165         an AbsenceOfSetter.
1166
1167         * bytecode/PropertyCondition.cpp:
1168         (JSC::PropertyCondition::isStillValidAssumingImpurePropertyWatchpoint):
1169
1170 2017-06-13  Daniel Bates  <dabates@apple.com>
1171
1172         Implement W3C Secure Contexts Draft Specification
1173         https://bugs.webkit.org/show_bug.cgi?id=158121
1174         <rdar://problem/26012994>
1175
1176         Reviewed by Brent Fulgham.
1177
1178         Part 4
1179
1180         Adds isSecureContext to the list of common identifiers as needed to support
1181         toggling its exposure from a runtime enabled feature flag.
1182
1183         * runtime/CommonIdentifiers.h:
1184
1185 2017-06-13  Don Olmstead  <don.olmstead@sony.com>
1186
1187         [JSC] Remove redundant includes in config.h
1188         https://bugs.webkit.org/show_bug.cgi?id=173294
1189
1190         Reviewed by Alex Christensen.
1191
1192         * config.h:
1193
1194 2017-06-12  Saam Barati  <sbarati@apple.com>
1195
1196         We should not claim that SpecEmpty is filtered out of cell checks on 64 bit platforms
1197         https://bugs.webkit.org/show_bug.cgi?id=172957
1198         <rdar://problem/32602704>
1199
1200         Reviewed by Filip Pizlo.
1201
1202         Consider this program:
1203         ```
1204         block#1:
1205         n: GetClosureVar(..., |this|) // this will load empty JSValue()
1206         SetLocal(Cell:@n, locFoo) // Cell check succeeds because JSValue() looks like a cell
1207         Branch(#2, #3)
1208         
1209         Block#3:
1210         x: GetLocal(locFoo)
1211         y: CheckNotEmpty(@x)
1212         ```
1213         
1214         If we claim that a cell check filters out the empty value, we will
1215         incorrectly eliminate the CheckNotEmpty node @y. This patch fixes AI,
1216         FTLLowerDFGToB3, and DFGSpeculativeJIT to no longer make this claim.
1217         
1218         On 64 bit platforms:
1219         - Cell use kind *now allows* the empty value to pass through.
1220         - CellOrOther use kind *now allows* for the empty value to pass through
1221         - NotCell use kind *no longer allows* the empty value to pass through.
1222
1223         * assembler/CPU.h:
1224         (JSC::isARMv7IDIVSupported):
1225         (JSC::isARM64):
1226         (JSC::isX86):
1227         (JSC::isX86_64):
1228         (JSC::is64Bit):
1229         (JSC::is32Bit):
1230         (JSC::isMIPS):
1231         Make these functions constexpr so we can use them in static variable assignment.
1232
1233         * bytecode/SpeculatedType.h:
1234         * dfg/DFGSpeculativeJIT.cpp:
1235         (JSC::DFG::SpeculativeJIT::compileValueToInt32):
1236         (JSC::DFG::SpeculativeJIT::compileDoubleRep):
1237         (JSC::DFG::SpeculativeJIT::compileLogicalNotStringOrOther):
1238         (JSC::DFG::SpeculativeJIT::emitStringOrOtherBranch):
1239         (JSC::DFG::SpeculativeJIT::speculateCell):
1240         (JSC::DFG::SpeculativeJIT::speculateCellOrOther):
1241         (JSC::DFG::SpeculativeJIT::speculateObjectOrOther):
1242         (JSC::DFG::SpeculativeJIT::speculateString):
1243         (JSC::DFG::SpeculativeJIT::speculateStringOrOther):
1244         (JSC::DFG::SpeculativeJIT::speculateSymbol):
1245         (JSC::DFG::SpeculativeJIT::speculateNotCell):
1246         * dfg/DFGSpeculativeJIT32_64.cpp:
1247         * dfg/DFGSpeculativeJIT64.cpp:
1248         (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
1249         (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality):
1250         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality):
1251         (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot):
1252         (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch):
1253         * dfg/DFGUseKind.h:
1254         (JSC::DFG::typeFilterFor):
1255         * ftl/FTLLowerDFGToB3.cpp:
1256         (JSC::FTL::DFG::LowerDFGToB3::compileDoubleRep):
1257         (JSC::FTL::DFG::LowerDFGToB3::numberOrNotCellToInt32):
1258         (JSC::FTL::DFG::LowerDFGToB3::compareEqObjectOrOtherToObject):
1259         (JSC::FTL::DFG::LowerDFGToB3::boolify):
1260         (JSC::FTL::DFG::LowerDFGToB3::equalNullOrUndefined):
1261         (JSC::FTL::DFG::LowerDFGToB3::lowCell):
1262         (JSC::FTL::DFG::LowerDFGToB3::lowNotCell):
1263         (JSC::FTL::DFG::LowerDFGToB3::isCellOrMisc):
1264         (JSC::FTL::DFG::LowerDFGToB3::isNotCellOrMisc):
1265         (JSC::FTL::DFG::LowerDFGToB3::isNotCell):
1266         (JSC::FTL::DFG::LowerDFGToB3::isCell):
1267         (JSC::FTL::DFG::LowerDFGToB3::speculateCellOrOther):
1268         (JSC::FTL::DFG::LowerDFGToB3::speculateObjectOrOther):
1269         (JSC::FTL::DFG::LowerDFGToB3::speculateString):
1270         (JSC::FTL::DFG::LowerDFGToB3::speculateStringOrOther):
1271         (JSC::FTL::DFG::LowerDFGToB3::speculateSymbol):
1272
1273 2017-06-12  Yusuke Suzuki  <utatane.tea@gmail.com>
1274
1275         Unreviewed, suppress invalid register alloation validation assertion in 32 bit
1276         https://bugs.webkit.org/show_bug.cgi?id=172421
1277
1278         * dfg/DFGSpeculativeJIT.cpp:
1279         (JSC::DFG::SpeculativeJIT::compileArrayIndexOf):
1280
1281 2017-06-12  Oleksandr Skachkov  <gskachkov@gmail.com>
1282
1283         We incorrectly allow escaped characters in keyword tokens
1284         https://bugs.webkit.org/show_bug.cgi?id=171310
1285
1286         Reviewed by Yusuke Suzuki.
1287
1288         According spec it is not allow to use escaped characters in 
1289         keywords. https://tc39.github.io/ecma262/#sec-reserved-words
1290         Current patch implements this requirements.
1291
1292
1293         * parser/Lexer.cpp:
1294         (JSC::Lexer<CharacterType>::parseIdentifierSlowCase):
1295         * parser/Parser.cpp:
1296         (JSC::Parser<LexerType>::printUnexpectedTokenText):
1297         * parser/ParserTokens.h:
1298
1299 2017-06-12  Yusuke Suzuki  <utatane.tea@gmail.com>
1300
1301         Unreviewed, add branch64(Cond, BaseIndex, RegisterID) for ARM64
1302         https://bugs.webkit.org/show_bug.cgi?id=172421
1303
1304         * assembler/MacroAssemblerARM64.h:
1305         (JSC::MacroAssemblerARM64::branch64):
1306         (JSC::MacroAssemblerARM64::branchPtr):
1307
1308 2017-06-12  Commit Queue  <commit-queue@webkit.org>
1309
1310         Unreviewed, rolling out r218093.
1311         https://bugs.webkit.org/show_bug.cgi?id=173259
1312
1313         Break builds (Requested by yusukesuzuki on #webkit).
1314
1315         Reverted changeset:
1316
1317         "Unreviewed, build fix for ARM64"
1318         https://bugs.webkit.org/show_bug.cgi?id=172421
1319         http://trac.webkit.org/changeset/218093
1320
1321 2017-06-12  Yusuke Suzuki  <utatane.tea@gmail.com>
1322
1323         Unreviewed, build fix for ARM64
1324         https://bugs.webkit.org/show_bug.cgi?id=172421
1325
1326         * dfg/DFGSpeculativeJIT.cpp:
1327         (JSC::DFG::SpeculativeJIT::compileArrayIndexOf):
1328
1329 2017-06-09  Yusuke Suzuki  <utatane.tea@gmail.com>
1330
1331         [DFG] Add ArrayIndexOf intrinsic
1332         https://bugs.webkit.org/show_bug.cgi?id=172421
1333
1334         Reviewed by Saam Barati.
1335
1336         This patch introduces ArrayIndexOfInstrinsic for DFG and FTL optimizations.
1337         We emit array check and go fast path if the array is Array::Int32, Array::Double
1338         or Array::Continugous. In addition, for Array::Int32 and Array::Double case,
1339         we have inlined fast paths.
1340
1341         With updated ARES-6 Babylon,
1342
1343         Before
1344             firstIteration:     45.76 +- 3.87 ms
1345             averageWorstCase:   24.41 +- 2.17 ms
1346             steadyState:        8.01 +- 0.22 ms
1347         After
1348             firstIteration:     45.64 +- 4.23 ms
1349             averageWorstCase:   23.03 +- 3.34 ms
1350             steadyState:        7.33 +- 0.34 ms
1351
1352         In SixSpeed.
1353                                          baseline                  patched
1354
1355             map-set-lookup.es5      734.4701+-10.4383    ^    102.0968+-2.6357        ^ definitely 7.1939x faster
1356             map-set.es5              41.1396+-1.0558     ^     33.1916+-0.7986        ^ definitely 1.2395x faster
1357             map-set-object.es5       62.8317+-1.2518     ^     45.6944+-0.8369        ^ definitely 1.3750x faster
1358
1359         * dfg/DFGAbstractInterpreterInlines.h:
1360         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1361         * dfg/DFGByteCodeParser.cpp:
1362         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
1363         * dfg/DFGClobberize.h:
1364         (JSC::DFG::clobberize):
1365         * dfg/DFGDoesGC.cpp:
1366         (JSC::DFG::doesGC):
1367         * dfg/DFGFixupPhase.cpp:
1368         (JSC::DFG::FixupPhase::fixupNode):
1369         * dfg/DFGNode.h:
1370         (JSC::DFG::Node::hasArrayMode):
1371         * dfg/DFGNodeType.h:
1372         * dfg/DFGOperations.cpp:
1373         * dfg/DFGOperations.h:
1374         * dfg/DFGPredictionPropagationPhase.cpp:
1375         * dfg/DFGSafeToExecute.h:
1376         (JSC::DFG::safeToExecute):
1377         * dfg/DFGSpeculativeJIT.cpp:
1378         (JSC::DFG::SpeculativeJIT::compileArrayIndexOf):
1379         (JSC::DFG::SpeculativeJIT::speculateObject):
1380         * dfg/DFGSpeculativeJIT.h:
1381         (JSC::DFG::SpeculativeJIT::callOperation):
1382         * dfg/DFGSpeculativeJIT32_64.cpp:
1383         (JSC::DFG::SpeculativeJIT::compile):
1384         * dfg/DFGSpeculativeJIT64.cpp:
1385         (JSC::DFG::SpeculativeJIT::compile):
1386         (JSC::DFG::SpeculativeJIT::speculateInt32):
1387         * ftl/FTLCapabilities.cpp:
1388         (JSC::FTL::canCompile):
1389         * ftl/FTLLowerDFGToB3.cpp:
1390         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
1391         (JSC::FTL::DFG::LowerDFGToB3::compileArrayIndexOf):
1392         * jit/JITOperations.h:
1393         * runtime/ArrayPrototype.cpp:
1394         (JSC::ArrayPrototype::finishCreation):
1395         * runtime/Intrinsic.cpp:
1396         (JSC::intrinsicName):
1397         * runtime/Intrinsic.h:
1398
1399 2017-06-11  Keith Miller  <keith_miller@apple.com>
1400
1401         TypedArray constructor with string shouldn't throw
1402         https://bugs.webkit.org/show_bug.cgi?id=173181
1403
1404         Reviewed by JF Bastien.
1405
1406         We should be coercing primitive arguments to numbers in the various
1407         TypedArray constructors.
1408
1409         * runtime/JSGenericTypedArrayViewConstructorInlines.h:
1410         (JSC::constructGenericTypedArrayViewWithArguments):
1411
1412 2017-06-11  Yusuke Suzuki  <utatane.tea@gmail.com>
1413
1414         [WTF] Make ThreadMessage portable
1415         https://bugs.webkit.org/show_bug.cgi?id=172073
1416
1417         Reviewed by Keith Miller.
1418
1419         * runtime/MachineContext.h:
1420         (JSC::MachineContext::stackPointer):
1421         * tools/CodeProfiling.cpp:
1422         (JSC::profilingTimer):
1423
1424 2017-06-11  Yusuke Suzuki  <utatane.tea@gmail.com>
1425
1426         [JSC] Shrink Structure size
1427         https://bugs.webkit.org/show_bug.cgi?id=173239
1428
1429         Reviewed by Mark Lam.
1430
1431         We find that the size of our Structure is slightly enlarged due to paddings.
1432         By changing the order of members, we can reduce the size from 120 to 112.
1433         This is good because 120 and 112 are categorized into different size classes.
1434         For 120, we allocate 128 bytes. And for 112, we allocate 112 bytes.
1435         We now save 16 bytes per Structure for free.
1436
1437         * runtime/ConcurrentJSLock.h:
1438         * runtime/Structure.cpp:
1439         (JSC::Structure::Structure):
1440         * runtime/Structure.h:
1441
1442 2017-06-11  Konstantin Tokarev  <annulen@yandex.ru>
1443
1444         Unreviewed, attempt to fix JSC tests on Win after r217771
1445
1446         * jsc.cpp:
1447         (currentWorkingDirectory): buffer is not NULL-terminated
1448
1449 2017-06-10  Yusuke Suzuki  <utatane.tea@gmail.com>
1450
1451         [WTF] Add RegisteredSymbolImpl
1452         https://bugs.webkit.org/show_bug.cgi?id=173230
1453
1454         Reviewed by Mark Lam.
1455
1456         * runtime/SymbolConstructor.cpp:
1457         (JSC::symbolConstructorKeyFor):
1458
1459 2017-06-10  Dan Bernstein  <mitz@apple.com>
1460
1461         Reverted r218056 because it made the IDE reindex constantly.
1462
1463         * Configurations/DebugRelease.xcconfig:
1464
1465 2017-06-10  Dan Bernstein  <mitz@apple.com>
1466
1467         [Xcode] With Xcode 9 developer beta, everything rebuilds when switching between command-line and IDE
1468         https://bugs.webkit.org/show_bug.cgi?id=173223
1469
1470         Reviewed by Sam Weinig.
1471
1472         The rebuilds were happening due to a difference in the compiler options that the IDE and
1473         xcodebuild were specifying. Only the IDE was passing the -index-store-path option. To make
1474         xcodebuild pass that option, too, set CLANG_INDEX_STORE_ENABLE to YES if it is unset, and
1475         specify an appropriate path in CLANG_INDEX_STORE_PATH.
1476
1477         * Configurations/DebugRelease.xcconfig:
1478
1479 2017-06-10  Yusuke Suzuki  <utatane.tea@gmail.com>
1480
1481         [JSC] Update RegExp.prototype.[@@search]] implementation according to the latest spec
1482         https://bugs.webkit.org/show_bug.cgi?id=173227
1483
1484         Reviewed by Mark Lam.
1485
1486         The latest spec introduces slight change to RegExp.prototype.[@@search].
1487         This patch applies this change. Basically, this change is done in the slow path of
1488         the RegExp.prototype[@@search].
1489         https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search
1490
1491         * builtins/RegExpPrototype.js:
1492         (search):
1493
1494 2017-06-09  Chris Dumez  <cdumez@apple.com>
1495
1496         Update Thread::create() to take in a WTF::Function instead of a std::function
1497         https://bugs.webkit.org/show_bug.cgi?id=173175
1498
1499         Reviewed by Mark Lam.
1500
1501         * API/tests/CompareAndSwapTest.cpp:
1502         (testCompareAndSwap):
1503
1504 2017-06-09  Yusuke Suzuki  <utatane.tea@gmail.com>
1505
1506         [DFG] Add verboseDFGOSRExit
1507         https://bugs.webkit.org/show_bug.cgi?id=173156
1508
1509         Reviewed by Saam Barati.
1510
1511         This patch adds verboseDFGOSRExit which is similar to verboseFTLOSRExit.
1512
1513         * dfg/DFGOSRExitCompiler.cpp:
1514         * runtime/Options.h:
1515
1516 2017-06-09  Guillaume Emont  <guijemont@igalia.com>
1517
1518         [JSC][MIPS] Add MacroAssemblerMIPS::xor32(Address, RegisterID) implementation
1519         https://bugs.webkit.org/show_bug.cgi?id=173170
1520
1521         Reviewed by Yusuke Suzuki.
1522
1523         MIPS does not build since r217711 because it is missing this
1524         implementation. This patch fixes the build.
1525
1526         * assembler/MacroAssemblerMIPS.h:
1527         (JSC::MacroAssemblerMIPS::xor32):
1528
1529 2017-06-09  Yusuke Suzuki  <utatane.tea@gmail.com>
1530
1531         [JSC] FTL does not require dlfcn
1532         https://bugs.webkit.org/show_bug.cgi?id=173143
1533
1534         Reviewed by Darin Adler.
1535
1536         We no longer use LLVM library. Thus, dlfcn.h is not necessary.
1537         Also, ProcessID is not used in FTLLowerDFGToB3.cpp.
1538
1539         * ftl/FTLLowerDFGToB3.cpp:
1540
1541 2017-06-09  Yusuke Suzuki  <utatane.tea@gmail.com>
1542
1543         [DFG] Add --verboseDFGFailure
1544         https://bugs.webkit.org/show_bug.cgi?id=173155
1545
1546         Reviewed by Sam Weinig.
1547
1548         Similar to verboseFTLFailure, JSC should have verboseDFGFailure flag to show DFG failures quickly.
1549
1550         * dfg/DFGCapabilities.cpp:
1551         (JSC::DFG::verboseCapabilities):
1552         (JSC::DFG::debugFail):
1553         * runtime/Options.cpp:
1554         (JSC::recomputeDependentOptions):
1555         * runtime/Options.h:
1556
1557 2017-06-09  Yusuke Suzuki  <utatane.tea@gmail.com>
1558
1559         [JSC] Drop OS(DARWIN) for VM_TAG_FOR_WEBASSEMBLY_MEMORY
1560         https://bugs.webkit.org/show_bug.cgi?id=173147
1561
1562         Reviewed by JF Bastien.
1563
1564         Because this value becomes -1 in non-Darwin environments.
1565         Thus, we do not need to use OS(DARWIN) here.
1566
1567         * wasm/WasmMemory.cpp:
1568
1569 2017-06-09  Daewoong Jang  <daewoong.jang@navercorp.com>
1570
1571         Reduce compiler warnings
1572         https://bugs.webkit.org/show_bug.cgi?id=172078
1573
1574         Reviewed by Yusuke Suzuki.
1575
1576         * runtime/IntlDateTimeFormat.h:
1577
1578 2017-06-08  Joseph Pecoraro  <pecoraro@apple.com>
1579
1580         [Cocoa] JSWrapperMap leaks for all JSContexts
1581         https://bugs.webkit.org/show_bug.cgi?id=173110
1582         <rdar://problem/32602198>
1583
1584         Reviewed by Geoffrey Garen.
1585
1586         * API/JSContext.mm:
1587         (-[JSContext ensureWrapperMap]):
1588         Ensure this allocation gets released.
1589
1590 2017-06-08  Filip Pizlo  <fpizlo@apple.com>
1591
1592         REGRESSION: js/dom/prototype-chain-caching-with-impure-get-own-property-slot-traps-5.html has a flaky failure
1593         https://bugs.webkit.org/show_bug.cgi?id=161156
1594
1595         Reviewed by Saam Barati.
1596         
1597         Since LLInt does not register impure property watchpoints for self property accesses, it
1598         shouldn't try to cache accesses that require a watchpoint.
1599         
1600         This manifested as a flaky failure because the test would fire the watchpoint after we had
1601         usually already tiered up. Without concurrent JIT, we would have always tiered up before
1602         getting to the bad case. With concurrent JIT, we would sometimes not tier up by that time. This
1603         also adds a test that deterministically failed in LLInt without this change; it does so by just
1604         running a lot shorter.
1605
1606         * llint/LLIntSlowPaths.cpp:
1607         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
1608
1609 2017-06-08  Keith Miller  <keith_miller@apple.com>
1610
1611         WebAssembly: We should only create wrappers for functions that can be exported
1612         https://bugs.webkit.org/show_bug.cgi?id=173088
1613
1614         Reviewed by Saam Barati.
1615
1616         This patch makes it so we only create wrappers for WebAssembly functions that
1617         can actually be exported. It appears to be a ~2.5% speedup on WasmBench compile times.
1618
1619         This patch also removes most of the old testWasmModuleFunctions api from the jsc CLI.
1620         Most of the tests were duplicates of ones in the spec-tests directory. The others I
1621         have converted to use the normal API.
1622
1623         * jsc.cpp:
1624         (GlobalObject::finishCreation):
1625         (valueWithTypeOfWasmValue): Deleted.
1626         (box): Deleted.
1627         (callWasmFunction): Deleted.
1628         (functionTestWasmModuleFunctions): Deleted.
1629         * wasm/WasmB3IRGenerator.cpp:
1630         (JSC::Wasm::B3IRGenerator::B3IRGenerator):
1631         (JSC::Wasm::createJSToWasmWrapper):
1632         (JSC::Wasm::parseAndCompile):
1633         * wasm/WasmB3IRGenerator.h:
1634         * wasm/WasmBBQPlan.cpp:
1635         (JSC::Wasm::BBQPlan::prepare):
1636         (JSC::Wasm::BBQPlan::compileFunctions):
1637         (JSC::Wasm::BBQPlan::complete):
1638         * wasm/WasmBBQPlan.h:
1639         * wasm/WasmBBQPlanInlines.h:
1640         (JSC::Wasm::BBQPlan::initializeCallees):
1641         * wasm/WasmCodeBlock.cpp:
1642         (JSC::Wasm::CodeBlock::CodeBlock):
1643         * wasm/WasmCodeBlock.h:
1644         (JSC::Wasm::CodeBlock::jsEntrypointCalleeFromFunctionIndexSpace):
1645         * wasm/WasmFormat.h:
1646         * wasm/WasmOMGPlan.cpp:
1647         (JSC::Wasm::OMGPlan::work):
1648
1649 2017-06-07  JF Bastien  <jfbastien@apple.com>
1650
1651         WebAssembly: test imports and exports with 16-bit characters
1652         https://bugs.webkit.org/show_bug.cgi?id=165977
1653         <rdar://problem/29760130>
1654
1655         Reviewed by Saam Barati.
1656
1657         Add the missing UTF-8 conversions. Improve import failure error
1658         messages, otherwise it's hard to figure out which import is wrong.
1659
1660         * wasm/js/JSWebAssemblyInstance.cpp:
1661         (JSC::JSWebAssemblyInstance::create):
1662         * wasm/js/WebAssemblyModuleRecord.cpp:
1663         (JSC::WebAssemblyModuleRecord::finishCreation):
1664         (JSC::WebAssemblyModuleRecord::link):
1665
1666 2017-06-07  Devin Rousso  <drousso@apple.com>
1667
1668         Web Inspector: Add ContextMenu item to log WebSocket object to console
1669         https://bugs.webkit.org/show_bug.cgi?id=172878
1670
1671         Reviewed by Joseph Pecoraro.
1672
1673         * inspector/protocol/Network.json:
1674         Add resolveWebSocket command.
1675
1676 2017-06-07  Jon Davis  <jond@apple.com>
1677
1678         Update feature status for features Supported In Preview
1679         https://bugs.webkit.org/show_bug.cgi?id=173071
1680
1681         Reviewed by Darin Adler.
1682
1683         Updated Media Capture and Streams, Performance Observer, Resource Timing Level 2,
1684         User Timing Level 2, Web Cryptography API, WebGL 2, WebRTC.
1685
1686         * features.json:
1687
1688 2017-06-07  Saam Barati  <sbarati@apple.com>
1689
1690         Assertion failure in com.apple.WebKit.WebContent.Development in com.apple.JavaScriptCore: JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNullOrUndefined + 141
1691         https://bugs.webkit.org/show_bug.cgi?id=172673
1692         <rdar://problem/32250144>
1693
1694         Reviewed by Mark Lam.
1695
1696         This patch simply removes this assertion. It's faulty because it
1697         races with the main thread when doing concurrent compilation.
1698         
1699         Consider a program with:
1700         - a FrozenValue over an object O and Structure S1. S1 starts off as dfgWatchable() being true.
1701         - Structure S2
1702         
1703         The DFG IR is like so:
1704           a: JSConstant(O) // FrozenValue {O, S1}
1705           b: CheckStructure(@a, S2)
1706           c: ToThis(@a)
1707           d: CheckEq(@c, nullConstant)
1708           Branch(@d)
1709         
1710         The AbstractValue for @a will start off as having a finite structure because S1 is dfgWatchable().
1711         When running AI, we'll notice that node @b will OSR exit, so nodes after
1712         @b are unreachable. Later in the compilation, S1 is no longer dfgWatchable().
1713         Now, when running AI, @a will have Top for its structure set. No longer will
1714         we think @b exits.
1715         
1716         The DFG backend asserts that under such a situation, we should have simplified
1717         the CheckEq to false. However, this is a racy thing to assert, since the
1718         transition from dfgWatchable() to !dfgWatchable() can happen right before we
1719         enter the backend. Hence, this assertion is not valid.
1720         
1721         (Note, the generated code for the above program will never actually execute.
1722         Since we noticed S1 as dfgWatchable(), we make the compilation dependent on
1723         S1 not transitioning. S1 transitions, so we won't actually run the code that
1724         gets compiled.)
1725
1726         * dfg/DFGSpeculativeJIT64.cpp:
1727         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNullOrUndefined):
1728
1729 2017-06-07  Yusuke Suzuki  <utatane.tea@gmail.com>
1730
1731         [JSC] has_generic_property never accepts non-String
1732         https://bugs.webkit.org/show_bug.cgi?id=173057
1733
1734         Reviewed by Darin Adler.
1735
1736         We never pass non-String value to has_generic_property bytecode.
1737
1738         * runtime/CommonSlowPaths.cpp:
1739         (JSC::SLOW_PATH_DECL):
1740
1741 2017-06-06  Fujii Hironori  <Hironori.Fujii@sony.com>
1742
1743         [Win][x86-64] Some callee saved registers aren't preserved
1744         https://bugs.webkit.org/show_bug.cgi?id=171266
1745
1746         Reviewed by Saam Barati.
1747
1748         * jit/RegisterSet.cpp:
1749         (JSC::RegisterSet::calleeSaveRegisters): Added edi and esi for X86_64 Windows.
1750
1751 2017-06-06  Mark Lam  <mark.lam@apple.com>
1752
1753         Contiguous storage butterfly length should not exceed MAX_STORAGE_VECTOR_LENGTH.
1754         https://bugs.webkit.org/show_bug.cgi?id=173035
1755         <rdar://problem/32554593>
1756
1757         Reviewed by Geoffrey Garen and Filip Pizlo.
1758
1759         Also added and fixed up some assertions.
1760
1761         * runtime/ArrayConventions.h:
1762         * runtime/JSArray.cpp:
1763         (JSC::JSArray::setLength):
1764         * runtime/JSObject.cpp:
1765         (JSC::JSObject::createInitialIndexedStorage):
1766         (JSC::JSObject::ensureLengthSlow):
1767         (JSC::JSObject::reallocateAndShrinkButterfly):
1768         * runtime/JSObject.h:
1769         (JSC::JSObject::ensureLength):
1770         * runtime/RegExpObject.cpp:
1771         (JSC::collectMatches):
1772         * runtime/RegExpPrototype.cpp:
1773         (JSC::regExpProtoFuncSplitFast):
1774
1775 2017-06-06  Saam Barati  <sbarati@apple.com>
1776
1777         Make sure we restore SP when doing calls that could be to JS
1778         https://bugs.webkit.org/show_bug.cgi?id=172946
1779         <rdar://problem/32579026>
1780
1781         Reviewed by JF Bastien.
1782
1783         I was worried that there was a bug where we'd call JS, JS would tail call,
1784         and we'd end up with a bogus SP. However, this bug does not exist since wasm
1785         always calls to JS through a stub, and the stub treats SP as a callee save.
1786         
1787         I wrote a test for this, and also made a note that this is the needed ABI.
1788
1789         * wasm/WasmBinding.cpp:
1790         (JSC::Wasm::wasmToJs):
1791
1792 2017-06-06  Keith Miller  <keith_miller@apple.com>
1793
1794         OMG tier up checks should be a patchpoint
1795         https://bugs.webkit.org/show_bug.cgi?id=172944
1796
1797         Reviewed by Saam Barati.
1798
1799         Tier up checks in BBQ should be done as a patchpoint rather than individual B3 opcodes.
1800         In order to reduce code generated out of line in each function. We generate a single stub
1801         that pushes all the callee-saves. This looks like a 5-10% compile time speedup.
1802
1803         * wasm/WasmB3IRGenerator.cpp:
1804         (JSC::Wasm::B3IRGenerator::B3IRGenerator):
1805         (JSC::Wasm::B3IRGenerator::emitTierUpCheck):
1806         (JSC::Wasm::B3IRGenerator::addLoop):
1807         * wasm/WasmThunks.cpp:
1808         (JSC::Wasm::triggerOMGTierUpThunkGenerator):
1809         * wasm/WasmThunks.h:
1810
1811 2017-06-06  Darin Adler  <darin@apple.com>
1812
1813         Cut down use of WTF_ARRAY_LENGTH
1814         https://bugs.webkit.org/show_bug.cgi?id=172997
1815
1816         Reviewed by Chris Dumez.
1817
1818         * parser/Lexer.cpp:
1819         (JSC::singleEscape): Use WTF_ARRAY_LENGTH instead of ARRAY_SIZE.
1820
1821         * runtime/NumberPrototype.cpp:
1822         (JSC::toStringWithRadix): Use std::end instead of WTF_ARRAY_LENGTH.
1823
1824 2017-06-06  Konstantin Tokarev  <annulen@yandex.ru>
1825
1826         Add missing <functional> includes
1827         https://bugs.webkit.org/show_bug.cgi?id=173017
1828
1829         Patch by Thiago Macieira <thiago.macieira@intel.com>
1830         Reviewed by Yusuke Suzuki.
1831
1832         This patch fixes compilation with GCC 7.
1833
1834         * inspector/InspectorBackendDispatcher.h:
1835
1836 2017-06-06  Filip Pizlo  <fpizlo@apple.com>
1837
1838         Unreviewed, fix 32-bit build.
1839
1840         * jit/JITOpcodes.cpp:
1841         (JSC::JIT::emit_op_unreachable):
1842
1843 2017-06-06  Joseph Pecoraro  <pecoraro@apple.com>
1844
1845         Unreviewed rollout r217807. Caused a test to crash.
1846
1847         * heap/HeapSnapshotBuilder.cpp:
1848         (JSC::HeapSnapshotBuilder::buildSnapshot):
1849         (JSC::HeapSnapshotBuilder::json):
1850         (): Deleted.
1851         * heap/HeapSnapshotBuilder.h:
1852         * runtime/JSObject.cpp:
1853         (JSC::JSObject::calculatedClassName):
1854
1855 2017-06-06  Filip Pizlo  <fpizlo@apple.com>
1856
1857         index out of bound in bytecodebasicblock
1858         https://bugs.webkit.org/show_bug.cgi?id=172963
1859
1860         Reviewed by Saam Barati and Mark Lam.
1861         
1862         We were leaving an unterminated basic block when generating CodeForCall for a class
1863         constructor. This was mostly benign since that unterminated block was not reachable, but it
1864         does cause an ASSERT.
1865         
1866         This fixes the issue by appending op_unreachable to that block. I added op_unreachable because
1867         this really is the cleanest and most idiomatic way to solve this problem, so even though it
1868         makes the change bigger it's probabably worth it.
1869
1870         * bytecode/BytecodeDumper.cpp:
1871         (JSC::BytecodeDumper<Block>::dumpBytecode):
1872         * bytecode/BytecodeList.json:
1873         * bytecode/BytecodeUseDef.h:
1874         (JSC::computeUsesForBytecodeOffset):
1875         (JSC::computeDefsForBytecodeOffset):
1876         * bytecode/Opcode.h:
1877         (JSC::isTerminal):
1878         * bytecompiler/BytecodeGenerator.cpp:
1879         (JSC::BytecodeGenerator::generate):
1880         (JSC::BytecodeGenerator::emitUnreachable):
1881         * bytecompiler/BytecodeGenerator.h:
1882         * dfg/DFGByteCodeParser.cpp:
1883         (JSC::DFG::ByteCodeParser::parseBlock):
1884         * dfg/DFGCapabilities.cpp:
1885         (JSC::DFG::capabilityLevel):
1886         * ftl/FTLLowerDFGToB3.cpp:
1887         (JSC::FTL::DFG::LowerDFGToB3::compileUnreachable):
1888         * jit/JIT.cpp:
1889         (JSC::JIT::privateCompileMainPass):
1890         * jit/JIT.h:
1891         * jit/JITOpcodes.cpp:
1892         (JSC::JIT::emit_op_unreachable):
1893         * llint/LowLevelInterpreter.asm:
1894         * runtime/CommonSlowPaths.cpp:
1895         (JSC::SLOW_PATH_DECL):
1896         * runtime/CommonSlowPaths.h:
1897
1898 2017-06-06  Ryan Haddad  <ryanhaddad@apple.com>
1899
1900         Unreviewed, rolling out r217812.
1901
1902         This change caused test failures on arm64.
1903
1904         Reverted changeset:
1905
1906         "OMG tier up checks should be a patchpoint"
1907         https://bugs.webkit.org/show_bug.cgi?id=172944
1908         http://trac.webkit.org/changeset/217812
1909
1910 2017-06-06  Carlos Garcia Campos  <cgarcia@igalia.com>
1911
1912         [WPE] Enable remote inspector
1913         https://bugs.webkit.org/show_bug.cgi?id=172971
1914
1915         Reviewed by Žan Doberšek.
1916
1917         We can just build the current glib remote inspector, without adding a frontend implementation and using a
1918         WebKitGTK+ browser as frontend for now.
1919
1920         * PlatformWPE.cmake: Add remote inspector files to compilation.
1921         * inspector/remote/glib/RemoteInspectorUtils.cpp:
1922         (Inspector::backendCommands): Load the inspector resources library.
1923
1924 2017-06-06  Carlos Garcia Campos  <cgarcia@igalia.com>
1925
1926         [GLIB] Make remote inspector DBus protocol common to all glib based ports
1927         https://bugs.webkit.org/show_bug.cgi?id=172970
1928
1929         Reviewed by Žan Doberšek.
1930
1931         We are currently using "webkitgtk" in the names of DBus interfaces and object paths inside an ifdef with the
1932         idea that other ports could use their own names. However, the protocol is the same, so we could use the same
1933         names and make all glib based ports compatible to each other. This way we could use the GTK+ MiniBrowser to
1934         debug WPE, without having to implement the frontend part in WPE yet.
1935
1936         * inspector/remote/glib/RemoteInspectorGlib.cpp: Use webkit instead of webkitgtk and reomve platform idfeds.
1937         * inspector/remote/glib/RemoteInspectorServer.cpp: Ditto.
1938
1939 2017-06-06  Carlos Garcia Campos  <cgarcia@igalia.com>
1940
1941         [GTK] Web Process deadlock when closing the remote inspector frontend
1942         https://bugs.webkit.org/show_bug.cgi?id=172973
1943
1944         Reviewed by Žan Doberšek.
1945
1946         We are taking the remote inspector mutex twice. First close message is received, and receivedCloseMessage()
1947         takes the mutex. Then RemoteConnectionToTarget::close() is called that, when connected, calls
1948         PageDebuggable::disconnect() that ends up calling RemoteInspector::updateTarget() that also takes the remote
1949         inspector mutex. We should release the mutex before calling RemoteConnectionToTarget::close().
1950
1951         * inspector/remote/glib/RemoteInspectorGlib.cpp:
1952         (Inspector::RemoteInspector::receivedCloseMessage):
1953
1954 2017-06-05  Saam Barati  <sbarati@apple.com>
1955
1956         Try to fix features.json by adding an ESNext section.
1957
1958         Unreviewed.
1959
1960         * features.json:
1961
1962 2017-06-05  David Kilzer  <ddkilzer@apple.com>
1963
1964         Follow-up: Update JSC's features.json
1965         https://bugs.webkit.org/show_bug.cgi?id=172942
1966
1967         Rubber-stamped by Jon Davis.
1968
1969         * features.json: Change "Supported in preview" to
1970         "Supported" to try to fix <https://webkit.org/status/>.
1971
1972 2017-06-05  Saam Barati  <sbarati@apple.com>
1973
1974         We don't properly parse init_expr when the opcode is an unexpected opcode
1975         https://bugs.webkit.org/show_bug.cgi?id=172945
1976
1977         Reviewed by JF Bastien.
1978
1979         The bug is a simple typo. It should use the constant
1980         `true` instead of `false` when invoking the WASM_PARSER_FAIL_IF
1981         macro. This failure is already caught by spec tests that fail
1982         on arm64 devices.
1983
1984         * wasm/WasmModuleParser.cpp:
1985
1986 2017-06-05  Keith Miller  <keith_miller@apple.com>
1987
1988         OMG tier up checks should be a patchpoint
1989         https://bugs.webkit.org/show_bug.cgi?id=172944
1990
1991         Reviewed by Saam Barati.
1992
1993         Tier up checks in BBQ should be done as a patchpoint rather than individual B3 opcodes.
1994         In order to reduce code generated out of line in each function. We generate a single stub
1995         that pushes all the callee-saves. This looks like a 5-10% compile time speedup.
1996
1997         * wasm/WasmB3IRGenerator.cpp:
1998         (JSC::Wasm::B3IRGenerator::B3IRGenerator):
1999         (JSC::Wasm::B3IRGenerator::emitTierUpCheck):
2000         (JSC::Wasm::B3IRGenerator::addLoop):
2001         * wasm/WasmThunks.cpp:
2002         (JSC::Wasm::triggerOMGTierUpThunkGenerator):
2003         * wasm/WasmThunks.h:
2004
2005 2017-06-05  Joseph Pecoraro  <pecoraro@apple.com>
2006
2007         Remove unused VM members
2008         https://bugs.webkit.org/show_bug.cgi?id=172941
2009
2010         Reviewed by Mark Lam.
2011
2012         * runtime/HashMapImpl.h:
2013         (JSC::HashMapImpl::selectStructure): Deleted.
2014         * runtime/VM.cpp:
2015         (JSC::VM::VM):
2016         * runtime/VM.h:
2017
2018 2017-06-05  Joseph Pecoraro  <pecoraro@apple.com>
2019
2020         Web Inspector: Improve ES6 Class instances in Heap Snapshot instances view
2021         https://bugs.webkit.org/show_bug.cgi?id=172848
2022         <rdar://problem/25709212>
2023
2024         Reviewed by Saam Barati.
2025
2026         * heap/HeapSnapshotBuilder.h:
2027         * heap/HeapSnapshotBuilder.cpp:
2028         Update the snapshot version. Change the node's 0 | 1 internal value
2029         to be a 32bit bit flag. This is nice in that it is both compatible
2030         with the previous snapshot version and the same size. We can use more
2031         flags in the future.
2032
2033         (JSC::HeapSnapshotBuilder::json):
2034         In cases where the classInfo gives us "Object" check for a better
2035         class name by checking (o).__proto__.constructor.name. We avoid this
2036         check in cases where (o).hasOwnProperty("constructor") which is the
2037         case for most Foo.prototype objects. Otherwise this would get the
2038         name of the Foo superclass for the Foo.prototype object.
2039
2040         * runtime/JSObject.cpp:
2041         (JSC::JSObject::calculatedClassName):
2042         Handle some possible edge cases that were not handled before. Such
2043         as a JSObject without a GlobalObject, and an object which doesn't
2044         have a default getPrototype. Try to make the code a little clearer.
2045
2046 2017-06-05  Saam Barati  <sbarati@apple.com>
2047
2048         Update JSC's features.json
2049         https://bugs.webkit.org/show_bug.cgi?id=172942
2050
2051         Rubber stamped by Mark Lam.
2052
2053         * features.json:
2054
2055 2017-06-04  Konstantin Tokarev  <annulen@yandex.ru>
2056
2057         Fix build of Windows-specific code with ICU 59.1
2058         https://bugs.webkit.org/show_bug.cgi?id=172729
2059
2060         Reviewed by Darin Adler.
2061
2062         Fix conversions from WTF::String to wchar_t* and vice versa.
2063
2064         * jsc.cpp:
2065         (currentWorkingDirectory):
2066         (fetchModuleFromLocalFileSystem):
2067         * runtime/DateConversion.cpp:
2068         (JSC::formatDateTime):
2069
2070 2017-06-04  Yusuke Suzuki  <utatane.tea@gmail.com>
2071
2072         [JSC] Drop unnecessary USE(CF) guard for getenv
2073         https://bugs.webkit.org/show_bug.cgi?id=172903
2074
2075         Reviewed by Sam Weinig.
2076
2077         getenv is not related to USE(CF) and OS(UNIX). It seems that this
2078         ifdef only hits in WinCairo, but WinCairo can use getenv.
2079         Moreover, in VM::VM, we already use getenv without any ifdef guard.
2080
2081         This patch just drops it.
2082
2083         * runtime/VM.cpp:
2084         (JSC::enableAssembler):
2085
2086 2017-06-04  Yusuke Suzuki  <utatane.tea@gmail.com>
2087
2088         [JSC] Drop OS(DARWIN) for uintptr_t type conflict
2089         https://bugs.webkit.org/show_bug.cgi?id=172904
2090
2091         Reviewed by Sam Weinig.
2092
2093         In non-Darwin environment, uintptr_t may have the same type
2094         to uint64_t. We avoided the compile error by using OS(DARWIN).
2095         But, since it depends on cstdint implementaion rather than OS, it is flaky.
2096         Instead, we just use template parameter IntegralType.
2097         And we describe the type constraint in a SFINAE manner.
2098
2099         * dfg/DFGOpInfo.h:
2100         (JSC::DFG::OpInfo::OpInfo):
2101
2102 2017-06-03  Csaba Osztrogonác  <ossy@webkit.org>
2103
2104         [ARM] Unreviewed buildfix after r217711.
2105
2106         * assembler/MacroAssemblerARM.h:
2107         (JSC::MacroAssemblerARM::xor32):
2108
2109 2017-06-02  Yusuke Suzuki  <utatane.tea@gmail.com>
2110
2111         ASSERTION FAILED: "We should only declare a function as a lexically scoped variable in scopes where var declarations aren't allowed. ..." for function redeclaration with async function module export
2112         https://bugs.webkit.org/show_bug.cgi?id=168844
2113
2114         Reviewed by Saam Barati.
2115
2116         As the same to the exported function declaration, we should set statementDepth = 1 for exported async function declaration.
2117
2118         * parser/Parser.cpp:
2119         (JSC::DepthManager::DepthManager):
2120         (JSC::Parser<LexerType>::parseExportDeclaration):
2121         * parser/Parser.h:
2122         (JSC::Parser::DepthManager::DepthManager): Deleted.
2123         (JSC::Parser::DepthManager::~DepthManager): Deleted.
2124
2125 2017-06-02  Keith Miller  <keith_miller@apple.com>
2126
2127         Defer installing mach breakpoint handler until watchdog is actually called
2128         https://bugs.webkit.org/show_bug.cgi?id=172885
2129
2130         Reviewed by Saam Barati.
2131
2132         Eagerly installing the mach breakpoint handler causes issues with Xcode GUI debugging.
2133         This hides the issue, so it won't occur as often.
2134
2135         * runtime/VMTraps.cpp:
2136         (JSC::VMTraps::SignalSender::send):
2137         (JSC::VMTraps::VMTraps): Deleted.
2138         * runtime/VMTraps.h:
2139
2140 2017-06-02  Filip Pizlo  <fpizlo@apple.com>
2141
2142         Atomics.load and Atomics.store need to be fully fenced
2143         https://bugs.webkit.org/show_bug.cgi?id=172844
2144
2145         Reviewed by Keith Miller.
2146         
2147         Implement fully fenced loads and stores in FTL using AtomicXchgAdd(0, ptr) for the load and
2148         AtomicXchg(value, ptr) for the store.
2149         
2150         DFG needed no changes because it implements all atomics using a CAS loop.
2151         
2152         AtomicsObject.cpp now uses new Atomic<> API for fully fences loads and stores.
2153         
2154         Prior to this change, we used half fences (acquire/release) for atomic loads and stores. This
2155         is not correct according to my current understanding of the SAB memory model, which requires
2156         that atomic operations are SC with respect to everything not just other atomics.
2157
2158         * ftl/FTLLowerDFGToB3.cpp:
2159         (JSC::FTL::DFG::LowerDFGToB3::compileAtomicsReadModifyWrite):
2160         * ftl/FTLOutput.cpp:
2161         (JSC::FTL::Output::atomicWeakCAS):
2162         * ftl/FTLOutput.h:
2163         * runtime/AtomicsObject.cpp:
2164
2165 2017-06-02  Ryan Haddad  <ryanhaddad@apple.com>
2166
2167         Unreviewed, attempt to fix the iOS build after r217711.
2168
2169         * assembler/MacroAssemblerARM64.h:
2170         (JSC::MacroAssemblerARM64::xor32):
2171         (JSC::MacroAssemblerARM64::xor64):
2172
2173 2017-06-01  Filip Pizlo  <fpizlo@apple.com>
2174
2175         GC should use scrambled free-lists
2176         https://bugs.webkit.org/show_bug.cgi?id=172793
2177
2178         Reviewed by Mark Lam.
2179         
2180         Previously, our bump'n'pop allocator would use a conventional linked-list for the free-list.
2181         The linked-list would be threaded through free memory, as is the usual convention.
2182         
2183         This scrambles the next pointers of that free-list. It also scrambles the head pointer, because
2184         this leads to a more natural fast-path structure and saves one register on ARM64.
2185         
2186         The secret with which pointers are scrambled is per-allocator. Allocators choose a new secret
2187         every time they do a sweep-to-pop.
2188         
2189         This doesn't change the behavior of the bump part of bump'n'pop, but it does refactor the code
2190         quite a bit. Previously, there were four copies of the allocator fast path: two in
2191         MarkedAllocatorInlines.h, one in MarkedAllocator.cpp, and one in AssemblyHelpers.h. The JIT one
2192         was obviously different-looking, but the other three were almost identical. This moves all of
2193         that logic into FreeList. There are now just two copies of the allocator: FreeListInlines.h and
2194         AssemblyHelpers.h.
2195         
2196         This appears to be just as fast as our previously allocator.
2197
2198         * JavaScriptCore.xcodeproj/project.pbxproj:
2199         * heap/FreeList.cpp:
2200         (JSC::FreeList::FreeList):
2201         (JSC::FreeList::~FreeList):
2202         (JSC::FreeList::clear):
2203         (JSC::FreeList::initializeList):
2204         (JSC::FreeList::initializeBump):
2205         (JSC::FreeList::contains):
2206         (JSC::FreeList::dump):
2207         * heap/FreeList.h:
2208         (JSC::FreeList::allocationWillFail):
2209         (JSC::FreeList::originalSize):
2210         (JSC::FreeList::addressOfList):
2211         (JSC::FreeList::offsetOfBlock):
2212         (JSC::FreeList::offsetOfList):
2213         (JSC::FreeList::offsetOfIndex):
2214         (JSC::FreeList::offsetOfPayloadEnd):
2215         (JSC::FreeList::offsetOfRemaining):
2216         (JSC::FreeList::offsetOfOriginalSize):
2217         (JSC::FreeList::FreeList): Deleted.
2218         (JSC::FreeList::list): Deleted.
2219         (JSC::FreeList::bump): Deleted.
2220         (JSC::FreeList::operator==): Deleted.
2221         (JSC::FreeList::operator!=): Deleted.
2222         (JSC::FreeList::operator bool): Deleted.
2223         * heap/FreeListInlines.h: Added.
2224         (JSC::FreeList::addFreeCell):
2225         (JSC::FreeList::allocate):
2226         (JSC::FreeList::forEach):
2227         (JSC::FreeList::toOffset):
2228         (JSC::FreeList::fromOffset):
2229         * heap/IncrementalSweeper.cpp:
2230         (JSC::IncrementalSweeper::sweepNextBlock):
2231         * heap/MarkedAllocator.cpp:
2232         (JSC::MarkedAllocator::MarkedAllocator):
2233         (JSC::MarkedAllocator::didConsumeFreeList):
2234         (JSC::MarkedAllocator::tryAllocateWithoutCollecting):
2235         (JSC::MarkedAllocator::tryAllocateIn):
2236         (JSC::MarkedAllocator::allocateSlowCaseImpl):
2237         (JSC::MarkedAllocator::stopAllocating):
2238         (JSC::MarkedAllocator::prepareForAllocation):
2239         (JSC::MarkedAllocator::resumeAllocating):
2240         (JSC::MarkedAllocator::sweep):
2241         (JSC::MarkedAllocator::setFreeList): Deleted.
2242         * heap/MarkedAllocator.h:
2243         (JSC::MarkedAllocator::freeList):
2244         (JSC::MarkedAllocator::isFreeListedCell): Deleted.
2245         * heap/MarkedAllocatorInlines.h:
2246         (JSC::MarkedAllocator::isFreeListedCell):
2247         (JSC::MarkedAllocator::tryAllocate):
2248         (JSC::MarkedAllocator::allocate):
2249         * heap/MarkedBlock.cpp:
2250         (JSC::MarkedBlock::Handle::stopAllocating):
2251         (JSC::MarkedBlock::Handle::lastChanceToFinalize):
2252         (JSC::MarkedBlock::Handle::resumeAllocating):
2253         (JSC::MarkedBlock::Handle::zap):
2254         (JSC::MarkedBlock::Handle::sweep):
2255         (JSC::MarkedBlock::Handle::isFreeListedCell):
2256         (JSC::MarkedBlock::Handle::forEachFreeCell): Deleted.
2257         * heap/MarkedBlock.h:
2258         * heap/MarkedBlockInlines.h:
2259         (JSC::MarkedBlock::Handle::specializedSweep):
2260         (JSC::MarkedBlock::Handle::finishSweepKnowingSubspace):
2261         (JSC::MarkedBlock::Handle::isFreeListedCell): Deleted.
2262         * heap/Subspace.cpp:
2263         (JSC::Subspace::finishSweep):
2264         * heap/Subspace.h:
2265         * jit/AssemblyHelpers.h:
2266         (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):
2267         * runtime/JSDestructibleObjectSubspace.cpp:
2268         (JSC::JSDestructibleObjectSubspace::finishSweep):
2269         * runtime/JSDestructibleObjectSubspace.h:
2270         * runtime/JSSegmentedVariableObjectSubspace.cpp:
2271         (JSC::JSSegmentedVariableObjectSubspace::finishSweep):
2272         * runtime/JSSegmentedVariableObjectSubspace.h:
2273         * runtime/JSStringSubspace.cpp:
2274         (JSC::JSStringSubspace::finishSweep):
2275         * runtime/JSStringSubspace.h:
2276         * wasm/js/JSWebAssemblyCodeBlockSubspace.cpp:
2277         (JSC::JSWebAssemblyCodeBlockSubspace::finishSweep):
2278         * wasm/js/JSWebAssemblyCodeBlockSubspace.h:
2279
2280 2017-06-02  Yusuke Suzuki  <utatane.tea@gmail.com>
2281
2282         [JSC] Use @globalPrivate for concatSlowPath
2283         https://bugs.webkit.org/show_bug.cgi?id=172802
2284
2285         Reviewed by Darin Adler.
2286
2287         Use @globalPrivate instead of manually putting it to JSGlobalObject.
2288
2289         * builtins/ArrayPrototype.js:
2290         (concatSlowPath): Deleted.
2291         * runtime/JSGlobalObject.cpp:
2292         (JSC::JSGlobalObject::init):
2293
2294 2017-06-01  Andy Estes  <aestes@apple.com>
2295
2296         REGRESSION (r217626): ENABLE_APPLE_PAY_SESSION_V3 was disabled by mistake
2297         https://bugs.webkit.org/show_bug.cgi?id=172828
2298
2299         Reviewed by Beth Dakin.
2300
2301         * Configurations/FeatureDefines.xcconfig:
2302
2303 2017-06-01  Keith Miller  <keith_miller@apple.com>
2304
2305         Undo rollout in r217638 with bug fix
2306         https://bugs.webkit.org/show_bug.cgi?id=172824
2307
2308         Unreviewed, reland patch with unused set_state code removed.
2309
2310         * API/tests/ExecutionTimeLimitTest.cpp:
2311         (dispatchTermitateCallback):
2312         (testExecutionTimeLimit):
2313         * runtime/JSLock.cpp:
2314         (JSC::JSLock::didAcquireLock):
2315         * runtime/Options.cpp:
2316         (JSC::overrideDefaults):
2317         (JSC::Options::initialize):
2318         * runtime/Options.h:
2319         * runtime/VMTraps.cpp:
2320         (JSC::SignalContext::SignalContext):
2321         (JSC::SignalContext::adjustPCToPointToTrappingInstruction):
2322         (JSC::installSignalHandler):
2323         (JSC::VMTraps::SignalSender::send):
2324         * tools/SigillCrashAnalyzer.cpp:
2325         (JSC::SignalContext::SignalContext):
2326         (JSC::SignalContext::dump):
2327         (JSC::installCrashHandler):
2328         * wasm/WasmBBQPlan.cpp:
2329         (JSC::Wasm::BBQPlan::compileFunctions):
2330         * wasm/WasmFaultSignalHandler.cpp:
2331         (JSC::Wasm::trapHandler):
2332         (JSC::Wasm::enableFastMemory):
2333         * wasm/WasmMachineThreads.cpp:
2334         (JSC::Wasm::resetInstructionCacheOnAllThreads):
2335
2336 2017-06-01  Guillaume Emont  <guijemont@igalia.com>
2337
2338         [JSC][MIPS] SamplingProfiler::timerLoop() sleeps for 4000+ seconds
2339         https://bugs.webkit.org/show_bug.cgi?id=172800
2340
2341         Reviewed by Saam Barati.
2342
2343         This fixes a static_cast<uint64_t> by making it a cast to int64_t
2344         instead, which looks like the original intent. This fixes the
2345         sampling-profiler tests in JSTests/stress.
2346
2347         * runtime/SamplingProfiler.cpp:
2348         (JSC::SamplingProfiler::timerLoop):
2349
2350 2017-06-01  Tomas Popela  <tpopela@redhat.com>, Mark Lam  <mark.lam@apple.com>
2351
2352         RELEASE_ASSERT_NOT_REACHED() in InferredType::kindForFlags() on Big-Endians
2353         https://bugs.webkit.org/show_bug.cgi?id=170945
2354
2355         Reviewed by Mark Lam.
2356
2357         Re-define PutByIdFlags as a int32_t enum explicitly because it is
2358         stored as an int32_t value in UnlinkedInstruction.  This prevents
2359         a bug on 64-bit big endian architectures where the word order is
2360         inverted (when we convert the UnlinkedInstruction into a CodeBlock
2361         Instruction), resulting in the PutByIdFlags value not being stored in
2362         the 32-bit word that the rest of the code expects it to be in.
2363
2364         * bytecode/PutByIdFlags.h:
2365
2366 2017-05-31  Yusuke Suzuki  <utatane.tea@gmail.com>
2367
2368         [JSC] Implement String.prototype.concat in JS builtins
2369         https://bugs.webkit.org/show_bug.cgi?id=172798
2370
2371         Reviewed by Sam Weinig.
2372
2373         Since we have highly effective + operation for strings,
2374         implementing String.prototype.concat in JS simplifies the
2375         implementation and improves performance by using speculated
2376         types.
2377
2378         Added microbenchmarks show performance improvement.
2379
2380         string-concat-long-convert     1063.2787+-12.9101    ^    109.0855+-2.8083        ^ definitely 9.7472x faster
2381         string-concat-convert          1111.1366+-12.2363    ^     99.3402+-1.9874        ^ definitely 11.1852x faster
2382         string-concat                   131.7377+-3.8359     ^     54.3949+-0.9580        ^ definitely 2.4219x faster
2383         string-concat-long               79.4726+-1.9644     ^     64.6301+-1.4941        ^ definitely 1.2297x faster
2384
2385         * builtins/StringPrototype.js:
2386         (globalPrivate.stringConcatSlowPath):
2387         (concat):
2388         * runtime/StringPrototype.cpp:
2389         (JSC::StringPrototype::finishCreation):
2390         (JSC::stringProtoFuncConcat): Deleted.
2391
2392 2017-05-31  Mark Lam  <mark.lam@apple.com>
2393
2394         Remove overrides of visitChildren() that do not add any functionality.
2395         https://bugs.webkit.org/show_bug.cgi?id=172789
2396         <rdar://problem/32500865>
2397
2398         Reviewed by Andreas Kling.
2399
2400         * bytecode/UnlinkedModuleProgramCodeBlock.cpp:
2401         (JSC::UnlinkedModuleProgramCodeBlock::visitChildren): Deleted.
2402         * bytecode/UnlinkedModuleProgramCodeBlock.h:
2403         * bytecode/UnlinkedProgramCodeBlock.cpp:
2404         (JSC::UnlinkedProgramCodeBlock::visitChildren): Deleted.
2405         * bytecode/UnlinkedProgramCodeBlock.h:
2406         * wasm/js/WebAssemblyFunction.cpp:
2407         (JSC::WebAssemblyFunction::visitChildren): Deleted.
2408         * wasm/js/WebAssemblyFunction.h:
2409         * wasm/js/WebAssemblyInstanceConstructor.cpp:
2410         (JSC::WebAssemblyInstanceConstructor::visitChildren): Deleted.
2411         * wasm/js/WebAssemblyInstanceConstructor.h:
2412         * wasm/js/WebAssemblyMemoryConstructor.cpp:
2413         (JSC::WebAssemblyMemoryConstructor::visitChildren): Deleted.
2414         * wasm/js/WebAssemblyMemoryConstructor.h:
2415         * wasm/js/WebAssemblyModuleConstructor.cpp:
2416         (JSC::WebAssemblyModuleConstructor::visitChildren): Deleted.
2417         * wasm/js/WebAssemblyModuleConstructor.h:
2418         * wasm/js/WebAssemblyTableConstructor.cpp:
2419         (JSC::WebAssemblyTableConstructor::visitChildren): Deleted.
2420         * wasm/js/WebAssemblyTableConstructor.h:
2421
2422 2017-05-31  Commit Queue  <commit-queue@webkit.org>
2423
2424         Unreviewed, rolling out r217611 and r217631.
2425         https://bugs.webkit.org/show_bug.cgi?id=172785
2426
2427         "caused wasm-hashset-many.html to become flaky." (Requested by
2428         keith_miller on #webkit).
2429
2430         Reverted changesets:
2431
2432         "Reland r216808, underlying lldb bug has been fixed."
2433         https://bugs.webkit.org/show_bug.cgi?id=172759
2434         http://trac.webkit.org/changeset/217611
2435
2436         "Use dispatch queues for mach exceptions"
2437         https://bugs.webkit.org/show_bug.cgi?id=172775
2438         http://trac.webkit.org/changeset/217631
2439
2440 2017-05-31  Oleksandr Skachkov  <gskachkov@gmail.com>
2441
2442         Rolling out: Prevent async methods named 'function'
2443         https://bugs.webkit.org/show_bug.cgi?id=172776
2444
2445         Reviewed by Mark Lam.
2446
2447         Rolling out https://bugs.webkit.org/show_bug.cgi?id=172660 r217578, 
2448         https://bugs.webkit.org/show_bug.cgi?id=172598  r217478
2449         PR to spec was closed, so changes need to roll out. See
2450         https://github.com/tc39/ecma262/pull/884#issuecomment-305212494 
2451
2452         * parser/Parser.cpp:
2453         (JSC::Parser<LexerType>::parseClass):
2454         (JSC::Parser<LexerType>::parsePropertyMethod):
2455
2456 2017-05-31  Andy Estes  <aestes@apple.com>
2457
2458         Rename ENABLE_APPLE_PAY_DELEGATE to ENABLE_APPLE_PAY_SESSION_V3 and bump the supported version number
2459         https://bugs.webkit.org/show_bug.cgi?id=172366
2460
2461         Reviewed by Daniel Bates.
2462
2463         * Configurations/FeatureDefines.xcconfig:
2464
2465 2017-05-31  Keith Miller  <keith_miller@apple.com>
2466
2467         Reland r216808, underlying lldb bug has been fixed.
2468         https://bugs.webkit.org/show_bug.cgi?id=172759
2469
2470
2471         Unreviewed, relanding old patch. See: rdar://problem/31183352
2472
2473         * API/tests/ExecutionTimeLimitTest.cpp:
2474         (dispatchTermitateCallback):
2475         (testExecutionTimeLimit):
2476         * runtime/JSLock.cpp:
2477         (JSC::JSLock::didAcquireLock):
2478         * runtime/Options.cpp:
2479         (JSC::overrideDefaults):
2480         (JSC::Options::initialize):
2481         * runtime/Options.h:
2482         * runtime/VMTraps.cpp:
2483         (JSC::SignalContext::SignalContext):
2484         (JSC::SignalContext::adjustPCToPointToTrappingInstruction):
2485         (JSC::installSignalHandler):
2486         (JSC::VMTraps::SignalSender::send):
2487         * tools/SigillCrashAnalyzer.cpp:
2488         (JSC::SignalContext::SignalContext):
2489         (JSC::SignalContext::dump):
2490         (JSC::installCrashHandler):
2491         * wasm/WasmBBQPlan.cpp:
2492         (JSC::Wasm::BBQPlan::compileFunctions):
2493         * wasm/WasmFaultSignalHandler.cpp:
2494         (JSC::Wasm::trapHandler):
2495         (JSC::Wasm::enableFastMemory):
2496         * wasm/WasmMachineThreads.cpp:
2497         (JSC::Wasm::resetInstructionCacheOnAllThreads):
2498
2499 2017-05-31  Keith Miller  <keith_miller@apple.com>
2500
2501         Fix leak in PromiseDeferredTimer
2502         https://bugs.webkit.org/show_bug.cgi?id=172755
2503
2504         Reviewed by JF Bastien.
2505
2506         We were not properly freeing the list of dependencies if we were already tracking the promise before.
2507         This is because addPendingPromise takes the list of dependencies as an rvalue-reference. In the case
2508         where we were already tracking the promise we append the provided dependency list to the existing list.
2509         Since we never bound or rvalue-ref to a non-temporary value we never destructed the Vector, leaking its
2510         contents.
2511
2512         * runtime/PromiseDeferredTimer.cpp:
2513         (JSC::PromiseDeferredTimer::addPendingPromise):
2514
2515 2017-05-30  Oleksandr Skachkov  <gskachkov@gmail.com>
2516
2517         Prevent async methods named 'function' in Object literal
2518         https://bugs.webkit.org/show_bug.cgi?id=172660
2519
2520         Reviewed by Saam Barati.
2521
2522         Prevent async method named 'function' in object.
2523         https://github.com/tc39/ecma262/pull/884
2524
2525         * parser/Parser.cpp:
2526         (JSC::Parser<LexerType>::parsePropertyMethod):
2527
2528 2017-05-30  Oleksandr Skachkov  <gskachkov@gmail.com>
2529
2530         ASSERTION FAILED: generator.isConstructor() || generator.derivedContextType() == DerivedContextType::DerivedConstructorContext
2531         https://bugs.webkit.org/show_bug.cgi?id=171274
2532
2533         Reviewed by Saam Barati.
2534
2535         Current patch allow to use async arrow function within constructor,
2536         and allow to access to `this`. Current patch force load 'this' from 
2537         virtual scope each time as we access to `this` in async arrow function
2538         within constructor it is neccessary because async function can be 
2539         suspended and `superCall` can be called and async function resumed. 
2540    
2541         * bytecompiler/BytecodeGenerator.cpp:
2542         (JSC::BytecodeGenerator::emitPutGeneratorFields):
2543         (JSC::BytecodeGenerator::ensureThis):
2544         * bytecompiler/BytecodeGenerator.h:
2545         (JSC::BytecodeGenerator::makeFunction):
2546
2547 2017-05-30  Ali Juma  <ajuma@chromium.org>
2548
2549         [CredentialManagement] Incorporate IDL updates from latest spec
2550         https://bugs.webkit.org/show_bug.cgi?id=172011
2551
2552         Reviewed by Daniel Bates.
2553
2554         * runtime/CommonIdentifiers.h:
2555
2556 2017-05-30  Alex Christensen  <achristensen@webkit.org>
2557
2558         Update libwebrtc configuration
2559         https://bugs.webkit.org/show_bug.cgi?id=172727
2560
2561         Reviewed by Geoffrey Garen.
2562
2563         * Configurations/FeatureDefines.xcconfig:
2564
2565 2017-05-28  Dan Bernstein  <mitz@apple.com>
2566
2567         [Xcode] ALWAYS_SEARCH_USER_PATHS is set to YES
2568         https://bugs.webkit.org/show_bug.cgi?id=172691
2569
2570         Reviewed by Tim Horton.
2571
2572         * Configurations/Base.xcconfig: Set ALWAYS_SEARCH_USER_PATHS to NO.
2573         * JavaScriptCore.xcodeproj/project.pbxproj: Added ParseInt.h to the JavaScriptCore target.
2574
2575 2017-05-28  Yusuke Suzuki  <utatane.tea@gmail.com>
2576
2577         [JSC] Provide better type information of toLength and tighten bytecode
2578         https://bugs.webkit.org/show_bug.cgi?id=172690
2579
2580         Reviewed by Sam Weinig.
2581
2582         In this patch, we carefully leverage operator + in order to
2583
2584         1. tighten bytecode
2585
2586         operator+ emits to_number bytecode. What this bytecode does is the same
2587         to @Number() call. It is more efficient, and it is smaller bytecode
2588         than @Number() call (load global variable @Number, set up arguments, and
2589         call it).
2590
2591         2. offer better type prediction data
2592
2593         Now, we have code like
2594
2595             length > 0 ? (length < @MAX_SAFE_INTEGER ? length : @MAX_SAFE_INTEGER) : 0
2596
2597         This is not good because DFG prediction propagation phase predicts as Double
2598         since @MAX_SAFE_INTEGER is double. But actually it rarely becomes Double.
2599         Usually, the result becomes Int32. This patch leverages to_number in a bit
2600         interesting way: to_number has value profiling to offer better type prediction.
2601         This value profiling can offer a chance to change the prediction to Int32 efficiently.
2602         It is a bit tricky. But it is worth doing to speed up our builtin functions,
2603         which should leverage all the JSC's tricky things to be optimized.
2604
2605         Related microbenchmarks show performance improvement.
2606
2607                                                   baseline                  patched
2608
2609             array-prototype-forEach           50.2348+-2.2331           49.7568+-2.3507
2610             array-prototype-map               51.0574+-1.8166           47.9531+-2.1653          might be 1.0647x faster
2611             array-prototype-some              52.3926+-1.8882     ^     48.3632+-2.0852        ^ definitely 1.0833x faster
2612             array-prototype-every             52.7394+-2.0712           50.2896+-2.1480          might be 1.0487x faster
2613             array-prototype-reduce            54.9994+-2.3638           51.8716+-2.6253          might be 1.0603x faster
2614             array-prototype-reduceRight      209.7594+-9.2594     ^     51.5867+-2.5745        ^ definitely 4.0662x faster
2615
2616
2617         * builtins/GlobalOperations.js:
2618         (globalPrivate.toInteger):
2619         (globalPrivate.toLength):
2620
2621 2017-05-28  Sam Weinig  <sam@webkit.org>
2622
2623         [WebIDL] @@iterator should only be accessed once when disambiguating a union type
2624         https://bugs.webkit.org/show_bug.cgi?id=172684
2625
2626         Reviewed by Yusuke Suzuki.
2627
2628         * runtime/IteratorOperations.cpp:
2629         (JSC::iteratorMethod):
2630         (JSC::iteratorForIterable):
2631         * runtime/IteratorOperations.h:
2632         (JSC::forEachInIterable):
2633         Add additional iterator helpers to allow union + sequence conversion code
2634         to check for iterability by getting the iterator method, and iterate using
2635         that method later on.
2636
2637 2017-05-28  Yusuke Suzuki  <utatane.tea@gmail.com>
2638
2639         Unreviewed, build fix for Windows
2640         https://bugs.webkit.org/show_bug.cgi?id=172413
2641
2642         Optimized jsDynamicCast for JSMap and JSSet will be handled in [1].
2643
2644         [1]: https://bugs.webkit.org/show_bug.cgi?id=172685
2645
2646         * runtime/JSMap.h:
2647         (JSC::isJSMap):
2648         (JSC::jsDynamicCast): Deleted.
2649         (JSC::>): Deleted.
2650         * runtime/JSSet.h:
2651         (JSC::isJSSet):
2652         (JSC::jsDynamicCast): Deleted.
2653         (JSC::>): Deleted.
2654         * runtime/MapConstructor.cpp:
2655         (JSC::constructMap):
2656         * runtime/SetConstructor.cpp:
2657         (JSC::constructSet):
2658
2659 2017-05-28  Mark Lam  <mark.lam@apple.com>
2660
2661         Implement a faster Interpreter::getOpcodeID().
2662         https://bugs.webkit.org/show_bug.cgi?id=172669
2663
2664         Reviewed by Saam Barati.
2665
2666         We can implement Interpreter::getOpcodeID() without a hash table lookup by always
2667         embedding the OpcodeID in the 32-bit word just before the start of the LLInt
2668         handler code that executes each opcode.  getOpcodeID() can therefore just read
2669         the 32-bits before the opcode address to get its OpcodeID.
2670
2671         This is currently only enabled for CPU(X86), CPU(X86_64), CPU(ARM64),
2672         CPU(ARM_THUMB2), and only for OS(DARWIN).  It'll probably just work for linux as
2673         well, but I'll let the Linux folks turn that on after they have verified that it
2674         works on linux too.
2675
2676         I'll also take this opportunity to clean up how we initialize the opcodeIDTable:
2677         1. we only need to initialize it once per process, not once per VM / interpreter
2678            instance.
2679         2. we can initialize it in the Interpreter constructor instead of requiring a
2680            separate call to an initialize() function.
2681
2682         On debug builds, the Interpreter constructor will also verify that getOpcodeID()
2683         is working correctly for each opcode when USE(LLINT_EMBEDDED_OPCODE_ID).
2684
2685         * bytecode/BytecodeList.json:
2686         * generate-bytecode-files:
2687         * interpreter/Interpreter.cpp:
2688         (JSC::Interpreter::Interpreter):
2689         (JSC::Interpreter::opcodeIDTable):
2690         (JSC::Interpreter::initialize): Deleted.
2691         * interpreter/Interpreter.h:
2692         (JSC::Interpreter::getOpcode):
2693         (JSC::Interpreter::getOpcodeID):
2694         * llint/LowLevelInterpreter.cpp:
2695         * runtime/VM.cpp:
2696         (JSC::VM::VM):
2697
2698 2017-05-27  Yusuke Suzuki  <utatane.tea@gmail.com>
2699
2700         [JSC] Map and Set constructors should have fast path for cloning
2701         https://bugs.webkit.org/show_bug.cgi?id=172413
2702
2703         Reviewed by Saam Barati.
2704
2705         In this patch, we add a fast path for cloning in Set and Map constructors.
2706
2707         In ARES-6 Air, we have code like `new Set(set)` to clone the given set.
2708         At that time, our generic path just iterates the given set object and add
2709         it to the newly created one. It is quite slow because we need to follow
2710         the iterator protocol inside C++ and we need to call set.add() repeatedly
2711         while the given set guarantees the elements are unique.
2712
2713         This patch implements clone() function to JSMap and JSSet. Cloning JSMap
2714         and JSSet are done really fast without invoking any observable JS functions.
2715         To check whether we can use this clone() function in Set and Map constructors,
2716         we set several watchpoints.
2717
2718         In the case of Set,
2719
2720         1. Set.prototype[Symbol.iterator] is not changed.
2721         2. SetIterator.prototype.next is not changed.
2722         3. Set.prototype.add is not changed.
2723         4. The given Set does not have [Symbol.iterator] function in its instance.
2724         5. The given Set's [[Prototype]] is Set.prototype.
2725         6. Newly created set's [[Prototype]] is Set.prototype.
2726
2727         If the above requirements are met, cloning the given Set is not observable to users.
2728         Thus we can take a fast path.
2729
2730         Currently, we do not integrate this optimization into DFG and FTL.
2731         And we do not optimize other iterables. For example, we can optimize Set
2732         constructor taking Int32 Array. And we should optimize generic iterator cases too.
2733         They are planned as part of a separate bug[1].
2734
2735         This change improves ARES-6 Air by 5.3% in steady state.
2736
2737         Baseline:
2738             Running... Air ( 1  to go)
2739             firstIteration:     76.41 +- 15.60 ms
2740             averageWorstCase:   40.63 +- 7.54 ms
2741             steadyState:        9.13 +- 0.51 ms
2742
2743
2744         Patched:
2745             Running... Air ( 1  to go)
2746             firstIteration:     75.00 +- 22.54 ms
2747             averageWorstCase:   39.18 +- 8.45 ms
2748             steadyState:        8.67 +- 0.28 ms
2749
2750         [1]: https://bugs.webkit.org/show_bug.cgi?id=172419
2751
2752         * CMakeLists.txt:
2753         * JavaScriptCore.xcodeproj/project.pbxproj:
2754         * runtime/ArrayIteratorAdaptiveWatchpoint.cpp: Removed.
2755         * runtime/HashMapImpl.h:
2756         (JSC::HashMapBucket::extractValue):
2757         (JSC::HashMapImpl::finishCreation):
2758         (JSC::HashMapImpl::add):
2759         (JSC::HashMapImpl::setUpHeadAndTail):
2760         (JSC::HashMapImpl::addNormalizedNonExistingForCloning):
2761         (JSC::HashMapImpl::addNormalizedInternal):
2762         * runtime/InternalFunction.cpp:
2763         (JSC::InternalFunction::createSubclassStructureSlow):
2764         (JSC::InternalFunction::createSubclassStructure): Deleted.
2765         * runtime/InternalFunction.h:
2766         (JSC::InternalFunction::createSubclassStructure):
2767         * runtime/JSGlobalObject.cpp:
2768         (JSC::JSGlobalObject::JSGlobalObject):
2769         (JSC::JSGlobalObject::init):
2770         (JSC::JSGlobalObject::visitChildren):
2771         * runtime/JSGlobalObject.h:
2772         (JSC::JSGlobalObject::mapIteratorProtocolWatchpoint):
2773         (JSC::JSGlobalObject::setIteratorProtocolWatchpoint):
2774         (JSC::JSGlobalObject::mapSetWatchpoint):
2775         (JSC::JSGlobalObject::setAddWatchpoint):
2776         (JSC::JSGlobalObject::mapPrototype):
2777         (JSC::JSGlobalObject::jsSetPrototype):
2778         (JSC::JSGlobalObject::setStructure):
2779         * runtime/JSGlobalObjectInlines.h:
2780         (JSC::JSGlobalObject::isMapPrototypeIteratorProtocolFastAndNonObservable):
2781         (JSC::JSGlobalObject::isSetPrototypeIteratorProtocolFastAndNonObservable):
2782         (JSC::JSGlobalObject::isMapPrototypeSetFastAndNonObservable):
2783         (JSC::JSGlobalObject::isSetPrototypeAddFastAndNonObservable):
2784         * runtime/JSMap.cpp:
2785         (JSC::JSMap::clone):
2786         (JSC::JSMap::canCloneFastAndNonObservable):
2787         * runtime/JSMap.h:
2788         (JSC::jsDynamicCast):
2789         (JSC::>):
2790         (JSC::JSMap::createStructure): Deleted.
2791         (JSC::JSMap::create): Deleted.
2792         (JSC::JSMap::set): Deleted.
2793         (JSC::JSMap::JSMap): Deleted.
2794         * runtime/JSSet.cpp:
2795         (JSC::JSSet::clone):
2796         (JSC::JSSet::canCloneFastAndNonObservable):
2797         * runtime/JSSet.h:
2798         (JSC::jsDynamicCast):
2799         (JSC::>):
2800         (JSC::JSSet::createStructure): Deleted.
2801         (JSC::JSSet::create): Deleted.
2802         (JSC::JSSet::JSSet): Deleted.
2803         * runtime/MapConstructor.cpp:
2804         (JSC::constructMap):
2805         * runtime/ObjectPropertyChangeAdaptiveWatchpoint.h: Renamed from Source/JavaScriptCore/runtime/ArrayIteratorAdaptiveWatchpoint.h.
2806         (JSC::ObjectPropertyChangeAdaptiveWatchpoint::ObjectPropertyChangeAdaptiveWatchpoint):
2807         * runtime/SetConstructor.cpp:
2808         (JSC::constructSet):
2809
2810 2017-05-27  Yusuke Suzuki  <utatane.tea@gmail.com>
2811
2812         [DOMJIT] Move DOMJIT patchpoint infrastructure out of domjit
2813         https://bugs.webkit.org/show_bug.cgi?id=172260
2814
2815         Reviewed by Filip Pizlo.
2816
2817         DOMJIT::Patchpoint is now used for generalized CheckSubClass. And it becomes mature enough
2818         to be used as a general-purpose injectable compiler over all the JIT tiers.
2819
2820         We extract DOMJIT::Patchpoint to jit/ and rename it JSC::Snippet.
2821
2822         * CMakeLists.txt:
2823         * JavaScriptCore.xcodeproj/project.pbxproj:
2824         * bytecode/AccessCaseSnippetParams.cpp: Renamed from Source/JavaScriptCore/bytecode/DOMJITAccessCasePatchpointParams.cpp.
2825         (JSC::SlowPathCallGeneratorWithArguments::generateImpl):
2826         (JSC::AccessCaseSnippetParams::emitSlowPathCalls):
2827         * bytecode/AccessCaseSnippetParams.h: Renamed from Source/JavaScriptCore/bytecode/DOMJITAccessCasePatchpointParams.h.
2828         (JSC::AccessCaseSnippetParams::AccessCaseSnippetParams):
2829         * bytecode/GetterSetterAccessCase.cpp:
2830         (JSC::GetterSetterAccessCase::emitDOMJITGetter):
2831         * dfg/DFGAbstractInterpreterInlines.h:
2832         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2833         * dfg/DFGByteCodeParser.cpp:
2834         (JSC::DFG::blessCallDOMGetter):
2835         (JSC::DFG::ByteCodeParser::handleDOMJITGetter):
2836         * dfg/DFGClobberize.h:
2837         (JSC::DFG::clobberize):
2838         * dfg/DFGFixupPhase.cpp:
2839         (JSC::DFG::FixupPhase::fixupNode):
2840         * dfg/DFGGraph.h:
2841         * dfg/DFGNode.h:
2842         * dfg/DFGSnippetParams.cpp: Renamed from Source/JavaScriptCore/dfg/DFGDOMJITPatchpointParams.cpp.
2843         * dfg/DFGSnippetParams.h: Renamed from Source/JavaScriptCore/dfg/DFGDOMJITPatchpointParams.h.
2844         (JSC::DFG::SnippetParams::SnippetParams):
2845         * dfg/DFGSpeculativeJIT.cpp:
2846         (JSC::DFG::allocateTemporaryRegistersForSnippet):
2847         (JSC::DFG::SpeculativeJIT::compileCallDOMGetter):
2848         (JSC::DFG::SpeculativeJIT::compileCheckSubClass):
2849         (JSC::DFG::allocateTemporaryRegistersForPatchpoint): Deleted.
2850         * domjit/DOMJITCallDOMGetterSnippet.h: Renamed from Source/JavaScriptCore/domjit/DOMJITCallDOMGetterPatchpoint.h.
2851         (JSC::DOMJIT::CallDOMGetterSnippet::create):
2852         * domjit/DOMJITGetterSetter.h:
2853         * domjit/DOMJITSignature.h:
2854         * domjit/DOMJITValue.h: Removed.
2855         * ftl/FTLLowerDFGToB3.cpp:
2856         (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass):
2857         (JSC::FTL::DFG::LowerDFGToB3::compileCallDOMGetter):
2858         * ftl/FTLSnippetParams.cpp: Renamed from Source/JavaScriptCore/ftl/FTLDOMJITPatchpointParams.cpp.
2859         * ftl/FTLSnippetParams.h: Renamed from Source/JavaScriptCore/ftl/FTLDOMJITPatchpointParams.h.
2860         (JSC::FTL::SnippetParams::SnippetParams):
2861         * jit/Snippet.h: Renamed from Source/JavaScriptCore/domjit/DOMJITPatchpoint.h.
2862         (JSC::Snippet::create):
2863         (JSC::Snippet::setGenerator):
2864         (JSC::Snippet::generator):
2865         * jit/SnippetParams.h: Renamed from Source/JavaScriptCore/domjit/DOMJITPatchpointParams.h.
2866         (JSC::SnippetParams::~SnippetParams):
2867         (JSC::SnippetParams::Value::Value):
2868         (JSC::SnippetParams::Value::isGPR):
2869         (JSC::SnippetParams::Value::isFPR):
2870         (JSC::SnippetParams::Value::isJSValueRegs):
2871         (JSC::SnippetParams::Value::gpr):
2872         (JSC::SnippetParams::Value::fpr):
2873         (JSC::SnippetParams::Value::jsValueRegs):
2874         (JSC::SnippetParams::Value::reg):
2875         (JSC::SnippetParams::Value::value):
2876         (JSC::SnippetParams::SnippetParams):
2877         * jit/SnippetReg.h: Renamed from Source/JavaScriptCore/domjit/DOMJITReg.h.
2878         (JSC::SnippetReg::SnippetReg):
2879         * jit/SnippetSlowPathCalls.h: Renamed from Source/JavaScriptCore/domjit/DOMJITSlowPathCalls.h.
2880         * jsc.cpp:
2881         (WTF::DOMJITNode::checkSubClassSnippet):
2882         (WTF::DOMJITFunctionObject::checkSubClassSnippet):
2883         (WTF::DOMJITNode::checkSubClassPatchpoint): Deleted.
2884         (WTF::DOMJITFunctionObject::checkSubClassPatchpoint): Deleted.
2885         * runtime/ClassInfo.h:
2886
2887 2017-05-26  Keith Miller  <keith_miller@apple.com>
2888
2889         REEGRESSION(r217459): testapi fails in JSExportTest's wrapperForNSObjectisObject().
2890         https://bugs.webkit.org/show_bug.cgi?id=172654
2891
2892         Reviewed by Mark Lam.
2893
2894         The test's intent is to assert that an exception has not been
2895         thrown (as indicated by the message string), but the test was
2896         erroneously checking for ! the right condition. This is now fixed.
2897
2898         * API/tests/JSExportTests.mm:
2899         (wrapperForNSObjectisObject):
2900
2901 2017-05-26  Joseph Pecoraro  <pecoraro@apple.com>
2902
2903         JSContext Inspector: Improve the reliability of automatically pausing in auto-attach
2904         https://bugs.webkit.org/show_bug.cgi?id=172664
2905         <rdar://problem/32362933>
2906
2907         Reviewed by Matt Baker.
2908
2909         Automatically pause on connection was triggering a pause before the
2910         frontend may have initialized. Often during frontend initialization
2911         the frontend may perform an action that clears the pause state requested
2912         by the developer. This change defers the pause until after the frontend
2913         has initialized, right before returning to the application's code.
2914
2915         * inspector/remote/RemoteControllableTarget.h:
2916         * inspector/remote/RemoteInspectionTarget.h:
2917         * inspector/remote/cocoa/RemoteConnectionToTargetCocoa.mm:
2918         (Inspector::RemoteConnectionToTarget::setup):
2919         * inspector/remote/glib/RemoteConnectionToTargetGlib.cpp:
2920         (Inspector::RemoteConnectionToTarget::setup):
2921         * runtime/JSGlobalObjectDebuggable.cpp:
2922         (JSC::JSGlobalObjectDebuggable::connect):
2923         (JSC::JSGlobalObjectDebuggable::pause): Deleted.
2924         * runtime/JSGlobalObjectDebuggable.h:
2925         Pass an immediatelyPause boolean on to the controller. Remove
2926         the current path that invokes a pause before initialization.
2927
2928         * inspector/JSGlobalObjectInspectorController.h:
2929         * inspector/JSGlobalObjectInspectorController.cpp:
2930         (Inspector::JSGlobalObjectInspectorController::connectFrontend):
2931         (Inspector::JSGlobalObjectInspectorController::disconnectFrontend):
2932         Manage should immediately pause state.
2933
2934         (Inspector::JSGlobalObjectInspectorController::frontendInitialized):
2935         (Inspector::JSGlobalObjectInspectorController::pause): Deleted.
2936         When initialized, trigger a pause if requested.
2937
2938 2017-05-26  Mark Lam  <mark.lam@apple.com>
2939
2940         Temporarily commenting out a JSExportTest test until webkit.org/b/172654 is fixed.
2941         https://bugs.webkit.org/show_bug.cgi?id=172655
2942
2943         Reviewed by Saam Barati.
2944
2945         * API/tests/JSExportTests.mm:
2946         (wrapperForNSObjectisObject):
2947
2948 2017-05-26  Mark Lam  <mark.lam@apple.com>
2949
2950         REGRESSION(216914): testCFStrings encounters an invalid ExecState callee pointer.
2951         https://bugs.webkit.org/show_bug.cgi?id=172651
2952
2953         Reviewed by Saam Barati.
2954
2955         This is because the assertion utility functions used in testCFStrings() expects
2956         to get the JSGlobalContextRef from the global context variable.  However,
2957         testCFStrings() creates its own JSGlobalContextRef but does not set the global
2958         context variable to it.
2959
2960         The fix is to make testCFStrings() initialize the global context variable properly.
2961
2962         * API/tests/testapi.c:
2963         (testCFStrings):
2964
2965 2017-05-26  Yusuke Suzuki  <utatane.tea@gmail.com>
2966
2967         Give ModuleProgram the same treatment that we did for ProgramCode in bug#167725
2968         https://bugs.webkit.org/show_bug.cgi?id=167805
2969
2970         Reviewed by Saam Barati.
2971
2972         Since ModuleProgramExecutable is executed only once, we can skip compiling
2973         code unreachable from the current program count. This can skip massive
2974         initialization code.
2975
2976         We already do this for global code in bug#167725. This patch extends it to
2977         module code.
2978
2979         * interpreter/Interpreter.cpp:
2980         (JSC::Interpreter::executeModuleProgram):
2981         * interpreter/Interpreter.h:
2982         * jit/JIT.cpp:
2983         (JSC::JIT::privateCompileMainPass):
2984         * runtime/JSModuleRecord.cpp:
2985         (JSC::JSModuleRecord::evaluate):
2986         * runtime/JSModuleRecord.h:
2987         (JSC::JSModuleRecord::moduleProgramExecutable): Deleted.
2988
2989 2017-05-26  Oleksandr Skachkov  <gskachkov@gmail.com>
2990
2991         Prevent async methods named 'function'
2992         https://bugs.webkit.org/show_bug.cgi?id=172598
2993
2994         Reviewed by Mark Lam.
2995
2996         Prevent async method named 'function' in class.
2997         Link to change in ecma262 specification
2998         https://github.com/tc39/ecma262/pull/884
2999
3000         * parser/Parser.cpp:
3001         (JSC::Parser<LexerType>::parseClass):
3002
3003 2017-05-25  Yusuke Suzuki  <utatane.tea@gmail.com>
3004
3005         Unreviewed, build fix for GCC
3006
3007         std::tuple does not have implicit constructor.
3008         Thus, we cannot use implicit construction with initializer brace.
3009         We should specify the name like `GetInst { }`.
3010
3011         * bytecompiler/BytecodeGenerator.h:
3012         (JSC::StructureForInContext::addGetInst):
3013
3014 2017-05-25  Keith Miller  <keith_miller@apple.com>
3015
3016         Cleanup tests after r217240
3017         https://bugs.webkit.org/show_bug.cgi?id=172466
3018
3019         Reviewed by Mark Lam.
3020
3021         I forgot to make my test an actual test. Also, remove second call runJSExportTests()
3022
3023         * API/tests/JSExportTests.mm:
3024         (wrapperForNSObjectisObject):
3025         * API/tests/testapi.mm:
3026         (testObjectiveCAPIMain):
3027
3028 2017-05-25  Michael Saboff  <msaboff@apple.com>
3029
3030         The default setting of Option::criticalGCMemoryThreshold is too high for iOS
3031         https://bugs.webkit.org/show_bug.cgi?id=172617
3032
3033         Reviewed by Mark Lam.
3034
3035         Reducing criticalGCMemoryThreshold to 0.80 eliminated jetsam on iOS devices
3036         when tested running JetStream.
3037
3038         * runtime/Options.h:
3039
3040 2017-05-25  Saam Barati  <sbarati@apple.com>
3041
3042         Our for-in optimization in the bytecode generator does its static analysis incorrectly
3043         https://bugs.webkit.org/show_bug.cgi?id=172532
3044         <rdar://problem/32369452>
3045
3046         Reviewed by Mark Lam.
3047
3048         Our static analysis for when a for-in induction variable
3049         is written to tried to its analysis as we generate
3050         bytecode. This has issues, since it does not account for
3051         the dynamic execution path of the program. Let's consider
3052         a program where our old analysis worked:
3053         
3054         ```
3055         for (let p in o) {
3056             o[p]; // We can transform this into a fast get_direct_pname
3057             p = 20;
3058             o[p]; // We cannot transform this since p has been changed.
3059         }
3060         ```
3061         
3062         However, our static analysis did not account for loops, which exist
3063         in JavaScript. e.g, it would incorrectly compile this program as:
3064         ```
3065         for (let p in o) {
3066             for (let i = 0; i < 20; ++i) {
3067                 o[p]; // It transforms this to use get_direct_pname even though p will be over-written if we get here from the inner loop back edge!
3068                 p = 20;
3069                 o[p]; // We correctly do not transform this.
3070             } 
3071         }
3072         ```
3073         
3074         Because of this flaw, I've made the optimization more conservative.
3075         We now optimistically emit code for the optimized access. However,
3076         if a for-in context is *ever* invalidated, before we pop it off
3077         the stack, we rewrite the program's optimized accesses to no longer
3078         be optimized. To do this, each context keeps track of its optimized
3079         accesses.
3080         
3081         This patch also adds a new bytecode, op_nop, which is just a no-op.
3082         It was helpful to add this because reverting get_direct_pname to get_by_val
3083         will leave us with an extra instruction word because get_direct_pname is
3084         has a length of 7 where get_by_val has a length of 6. This leaves us with
3085         an extra slot that we fill with an op_nop.
3086
3087         * bytecode/BytecodeDumper.cpp:
3088         (JSC::BytecodeDumper<Block>::dumpBytecode):
3089         * bytecode/BytecodeList.json:
3090         * bytecode/BytecodeUseDef.h:
3091         (JSC::computeUsesForBytecodeOffset):
3092         (JSC::computeDefsForBytecodeOffset):
3093         * bytecompiler/BytecodeGenerator.cpp:
3094         (JSC::BytecodeGenerator::emitGetByVal):
3095         (JSC::BytecodeGenerator::popIndexedForInScope):
3096         (JSC::BytecodeGenerator::popStructureForInScope):
3097         (JSC::BytecodeGenerator::invalidateForInContextForLocal):
3098         (JSC::StructureForInContext::pop):
3099         (JSC::IndexedForInContext::pop):
3100         * bytecompiler/BytecodeGenerator.h:
3101         (JSC::StructureForInContext::addGetInst):
3102         (JSC::IndexedForInContext::addGetInst):
3103         * dfg/DFGByteCodeParser.cpp:
3104         (JSC::DFG::ByteCodeParser::parseBlock):
3105         * dfg/DFGCapabilities.cpp:
3106         (JSC::DFG::capabilityLevel):
3107         * jit/JIT.cpp:
3108         (JSC::JIT::privateCompileMainPass):
3109         * jit/JIT.h:
3110         * jit/JITOpcodes.cpp:
3111         (JSC::JIT::emit_op_nop):
3112         * llint/LowLevelInterpreter.asm:
3113
3114 2017-05-25  Mark Lam  <mark.lam@apple.com>
3115
3116         ObjectToStringAdaptiveInferredPropertyValueWatchpoint should not reinstall itself nor handleFire if it's dying shortly.
3117         https://bugs.webkit.org/show_bug.cgi?id=172548
3118         <rdar://problem/31458393>
3119
3120         Reviewed by Filip Pizlo.
3121
3122         Consider the following scenario:
3123
3124         1. A ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1, watches for
3125            structure transitions, e.g. structure S2 transitioning to structure S3.
3126            In this case, O1 would be installed in S2's watchpoint set.
3127         2. When the structure transition happens, structure S2 will fire watchpoint O1.
3128         3. O1's handler will normally re-install itself in the watchpoint set of the new
3129            "transitioned to" structure S3.
3130         4. "Installation" here requires writing into the StructureRareData SD3 of the new
3131            structure S3.  If SD3 does not exist yet, the installation process will trigger
3132            the allocation of StructureRareData SD3.
3133         5. It is possible that the Structure S1, and StructureRareData SD1 that owns the
3134            ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1 is no longer reachable
3135            by the GC, and therefore will be collected soon.
3136         6. The allocation of SD3 in (4) may trigger the sweeping of the StructureRareData
3137            SD1.  This, in turn, triggers the deletion of the
3138            ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1.
3139
3140         After O1 is deleted in (6) and SD3 is allocated in (4), execution continues in
3141         AdaptiveInferredPropertyValueWatchpointBase::fire() where O1 gets installed in
3142         structure S3's watchpoint set.  This is obviously incorrect because O1 is already
3143         deleted.  The result is that badness happens later when S3's watchpoint set fires
3144         its watchpoints and accesses the deleted O1.
3145
3146         The fix is to enhance AdaptiveInferredPropertyValueWatchpointBase::fire() to
3147         check if "this" is still valid before proceeding to re-install itself or to
3148         invoke its handleFire() method.
3149
3150         ObjectToStringAdaptiveInferredPropertyValueWatchpoint (which extends
3151         AdaptiveInferredPropertyValueWatchpointBase) will override its isValid() method,
3152         and return false its owner StructureRareData is no longer reachable by the GC.
3153         This ensures that it won't be deleted while it's installed to any watchpoint set.
3154
3155         Additional considerations and notes:
3156         1. In the above, I talked about the ObjectToStringAdaptiveInferredPropertyValueWatchpoint
3157            being installed in watchpoint sets.  What actually happens is that
3158            ObjectToStringAdaptiveInferredPropertyValueWatchpoint has 2 members
3159            (m_structureWatchpoint and m_propertyWatchpoint) which may be installed in
3160            watchpoint sets.  The ObjectToStringAdaptiveInferredPropertyValueWatchpoint is
3161            not itself a Watchpoint object.
3162
3163            But for brevity, in the above, I refer to the ObjectToStringAdaptiveInferredPropertyValueWatchpoint
3164            instead of its Watchpoint members.  The description of the issue is still
3165            accurate given the life-cycle of the Watchpoint members are embedded in the
3166            enclosing ObjectToStringAdaptiveInferredPropertyValueWatchpoint object, and
3167            hence, they share the same life-cycle.
3168
3169         2. The top of AdaptiveInferredPropertyValueWatchpointBase::fire() removes its
3170            m_structureWatchpoint and m_propertyWatchpoint if they have been added to any
3171            watchpoint sets.  This is safe to do even if the owner StructureRareData is no
3172            longer reachable by the GC.
3173
3174            This is because the only way we can get to AdaptiveInferredPropertyValueWatchpointBase::fire()
3175            is if its Watchpoint members are still installed in some watchpoint set that
3176            fired.  This means that the AdaptiveInferredPropertyValueWatchpointBase
3177            instance has not been deleted yet, because its destructor will automatically
3178            remove the Watchpoint members from any watchpoint sets.
3179
3180         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp:
3181         (JSC::AdaptiveInferredPropertyValueWatchpointBase::fire):
3182         (JSC::AdaptiveInferredPropertyValueWatchpointBase::isValid):
3183         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.h:
3184         * heap/FreeList.cpp:
3185         (JSC::FreeList::contains):
3186         * heap/FreeList.h:
3187         * heap/HeapCell.h:
3188         * heap/HeapCellInlines.h:
3189         (JSC::HeapCell::isLive):
3190         * heap/MarkedAllocator.h:
3191         (JSC::MarkedAllocator::isFreeListedCell):
3192         * heap/MarkedBlock.h:
3193         * heap/MarkedBlockInlines.h:
3194         (JSC::MarkedBlock::Handle::isFreeListedCell):
3195         * runtime/StructureRareData.cpp:
3196         (JSC::ObjectToStringAdaptiveInferredPropertyValueWatchpoint::isValid):
3197
3198 2017-05-23  Saam Barati  <sbarati@apple.com>
3199
3200         We should not mmap zero bytes for a memory in Wasm
3201         https://bugs.webkit.org/show_bug.cgi?id=172528
3202         <rdar://problem/32257076>
3203
3204         Reviewed by Mark Lam.
3205
3206         This patch fixes a bug where we would call into mmap with zero bytes
3207         when creating a slow WasmMemory with zero initial page size. This fix
3208         is simple: if we don't have any initial bytes, we just call the constructor
3209         in WasmMemory that's meant to handle this case.
3210
3211         * wasm/WasmMemory.cpp:
3212         (JSC::Wasm::Memory::create):
3213
3214 2017-05-23  Brian Burg  <bburg@apple.com>
3215
3216         REGRESSION(r217051): Automation sessions fail to complete bootstrap
3217         https://bugs.webkit.org/show_bug.cgi?id=172513
3218         <rdar://problem/32338354>
3219
3220         Reviewed by Joseph Pecoraro.
3221
3222         The changes to be more strict about typechecking messages were too strict.
3223
3224         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
3225         (Inspector::RemoteInspector::receivedSetupMessage):
3226         WIRAutomatically is an optional key in the setup message. In the relay, this key gets copied
3227         into an NSDictionary as NSNull if the key isn't present in a forwarded command.
3228         We need to revert NSNull values to nil, since it's valid to call [nil boolValue] but not
3229         [[NSNull null] boolValue]. We also need to allow for nil in the typecheck for this key.
3230
3231 2017-05-23  Myles C. Maxfield  <mmaxfield@apple.com>
3232
3233         Remove dead ENABLE(FONT_LOAD_EVENTS) code
3234         https://bugs.webkit.org/show_bug.cgi?id=172517
3235
3236         Rubber-stamped by Simon Fraser.
3237
3238         * Configurations/FeatureDefines.xcconfig:
3239
3240 2017-05-23  Saam Barati  <sbarati@apple.com>
3241
3242         CFGSimplificationPhase should not merge a block with itself
3243         https://bugs.webkit.org/show_bug.cgi?id=172508
3244         <rdar://problem/28424006>
3245
3246         Reviewed by Keith Miller.
3247
3248         CFGSimplificationPhase can run into or create IR that ends up with a
3249         block that has a Jump to itself, and no other predecessors. It should
3250         gracefully handle such IR. Before this patch, it would not. The only criteria
3251         for merging 'block' with 'targetBlock' used to be that 'targetBlock.predecessors.size() == 1'.
3252         The code is written in such a way that if we merge a block with itself, we
3253         will infinite loop until we run out of memory.
3254         
3255         Merging a block with itself does not make sense for a few reasons. First,
3256         we're joining the contents of two blocks. What is the definition of joining
3257         a block with itself? I suppose we could simply unroll this self loop
3258         one level, but that would not be wise because this self loop is by definition
3259         unreachable unless it's the root block in the graph (which I think is
3260         invalid IR since we'd never generate bytecode that would do this).
3261         
3262         This patch employs an easy fix: we can't merge a block with itself.
3263
3264         * dfg/DFGCFGSimplificationPhase.cpp:
3265         (JSC::DFG::CFGSimplificationPhase::canMergeBlocks):
3266         (JSC::DFG::CFGSimplificationPhase::run):
3267         (JSC::DFG::CFGSimplificationPhase::convertToJump):
3268         (JSC::DFG::CFGSimplificationPhase::mergeBlocks):
3269
3270 2017-05-22  Brian Burg  <bburg@apple.com>
3271
3272         Web Inspector: webkit reload policy should match default behavior
3273         https://bugs.webkit.org/show_bug.cgi?id=171385
3274         <rdar://problem/31871515>
3275
3276         Reviewed by Joseph Pecoraro.
3277
3278         Add a new option to Page.reload that allows the test harness
3279         to reload its test page using the old reload behavior.
3280
3281         The new behavior of revalidating expired cached subresources only
3282         is the current default, since only the test harness needs the old behavior.
3283
3284         * inspector/protocol/Page.json:
3285
3286 2017-05-22  Keith Miller  <keith_miller@apple.com>
3287
3288         [Cocoa] An exported Objective C class’s prototype and constructor don't persist across JSContext deallocation
3289         https://bugs.webkit.org/show_bug.cgi?id=167708
3290
3291         Reviewed by Geoffrey Garen.
3292
3293         This patch moves the Objective C wrapper map to the global object. In order to make this work the JSWrapperMap
3294         class no longer holds a reference to the JSContext. Instead, the context must be provided when getting a wrapper.
3295
3296         Also, this patch fixes a "bug" where we would observe changes to the Object property on the global object when
3297         creating a wrapper for NSObject.
3298
3299         * API/APICast.h:
3300         (toJSGlobalObject):
3301         * API/JSContext.mm:
3302         (-[JSContext ensureWrapperMap]):
3303         (-[JSContext initWithVirtualMachine:]):
3304         (-[JSContext dealloc]):
3305         (-[JSContext wrapperMap]):
3306         (-[JSContext initWithGlobalContextRef:]):
3307         (-[JSContext wrapperForObjCObject:]):
3308         (-[JSContext wrapperForJSObject:]):
3309         * API/JSWrapperMap.h:
3310         * API/JSWrapperMap.mm:
3311         (-[JSObjCClassInfo initForClass:]):
3312         (-[JSObjCClassInfo allocateConstructorAndPrototypeInContext:]):
3313         (-[JSObjCClassInfo wrapperForObject:inContext:]):
3314         (-[JSObjCClassInfo constructorInContext:]):
3315         (-[JSObjCClassInfo prototypeInContext:]):
3316         (-[JSWrapperMap initWithGlobalContextRef:]):
3317         (-[JSWrapperMap classInfoForClass:]):
3318         (-[JSWrapperMap jsWrapperForObject:inContext:]):
3319         (-[JSWrapperMap objcWrapperForJSValueRef:inContext:]):
3320         (-[JSObjCClassInfo initWithContext:forClass:]): Deleted.
3321         (-[JSObjCClassInfo allocateConstructorAndPrototype]): Deleted.
3322         (-[JSObjCClassInfo wrapperForObject:]): Deleted.
3323         (-[JSObjCClassInfo constructor]): Deleted.
3324         (-[JSObjCClassInfo prototype]): Deleted.
3325         (-[JSWrapperMap initWithContext:]): Deleted.
3326         (-[JSWrapperMap jsWrapperForObject:]): Deleted.
3327         (-[JSWrapperMap objcWrapperForJSValueRef:]): Deleted.
3328         * API/tests/JSExportTests.mm:
3329         (wrapperLifetimeIsTiedToGlobalObject):
3330         (runJSExportTests):
3331         * API/tests/testapi.mm:
3332         * runtime/JSGlobalObject.h:
3333         (JSC::JSGlobalObject::wrapperMap):
3334         (JSC::JSGlobalObject::setWrapperMap):
3335
3336 2017-05-22  Filip Pizlo  <fpizlo@apple.com>
3337
3338         FTL stack overflow handling should not assume that B3 never selects callee-saves in the prologue
3339         https://bugs.webkit.org/show_bug.cgi?id=172455
3340
3341         Reviewed by Mark Lam.
3342         
3343         The FTL needs to run B3's callee-save register restoration before it runs the exception
3344         handler's callee-save register restoration.  This exposes B3's callee-save register
3345         algorithm in AssemblyHelpers so that the FTL can call it.
3346
3347         * b3/air/AirGenerate.cpp:
3348         (JSC::B3::Air::generate):
3349         * ftl/FTLLowerDFGToB3.cpp:
3350         (JSC::FTL::DFG::LowerDFGToB3::lower): Fix the bug.
3351         * heap/Subspace.cpp: Added some debugging support.
3352         (JSC::Subspace::allocate):
3353         (JSC::Subspace::tryAllocate):
3354         (JSC::Subspace::didAllocate):
3355         * heap/Subspace.h:
3356         * jit/AssemblyHelpers.h:
3357         (JSC::AssemblyHelpers::addressFor):
3358         (JSC::AssemblyHelpers::emitSave):
3359         (JSC::AssemblyHelpers::emitRestore):
3360
3361 2017-05-20  Yusuke Suzuki  <utatane.tea@gmail.com>
3362
3363         [FTL] Support GetByVal with ArrayStorage and SlowPutArrayStorage
3364         https://bugs.webkit.org/show_bug.cgi?id=172216
3365
3366         Reviewed by Saam Barati.
3367
3368         This patch adds GetByVal support for ArrayStorage and SlowPutArrayStorage.
3369         To lower CheckInBounds in FTL, we add a new GetVectorLength op. It only accepts
3370         ArrayStorage and SlowPutArrayStorage, then it produces vector length.
3371         CheckInBounds uses this vector length to perform bound checking for ArrayStorage
3372         and SlowPutArrayStorage.
3373
3374         * dfg/DFGAbstractInterpreterInlines.h:
3375         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3376         * dfg/DFGArrayMode.cpp:
3377         (JSC::DFG::permitsBoundsCheckLowering):
3378         * dfg/DFGClobberize.h:
3379         (JSC::DFG::clobberize):
3380         * dfg/DFGDoesGC.cpp:
3381         (JSC::DFG::doesGC):
3382         * dfg/DFGFixupPhase.cpp:
3383         (JSC::DFG::FixupPhase::fixupNode):
3384         * dfg/DFGHeapLocation.cpp:
3385         (WTF::printInternal):
3386         * dfg/DFGHeapLocation.h:
3387         * dfg/DFGIntegerRangeOptimizationPhase.cpp:
3388         * dfg/DFGNode.h:
3389         (JSC::DFG::Node::hasArrayMode):
3390         * dfg/DFGNodeType.h:
3391         * dfg/DFGPredictionPropagationPhase.cpp:
3392         * dfg/DFGSSALoweringPhase.cpp:
3393         (JSC::DFG::SSALoweringPhase::lowerBoundsCheck):
3394         * dfg/DFGSafeToExecute.h:
3395         (JSC::DFG::safeToExecute):
3396         * dfg/DFGSpeculativeJIT32_64.cpp:
3397         (JSC::DFG::SpeculativeJIT::compile):
3398         * dfg/DFGSpeculativeJIT64.cpp:
3399         (JSC::DFG::SpeculativeJIT::compile):
3400         * ftl/FTLAbstractHeapRepository.h:
3401         (JSC::FTL::AbstractHeapRepository::forIndexingType):
3402         (JSC::FTL::AbstractHeapRepository::forArrayType):
3403         * ftl/FTLCapabilities.cpp:
3404         (JSC::FTL::canCompile):
3405         * ftl/FTLLowerDFGToB3.cpp:
3406         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
3407         (JSC::FTL::DFG::LowerDFGToB3::compileGetVectorLength):
3408         (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal):
3409         * jit/JITPropertyAccess.cpp:
3410         (JSC::JIT::emitArrayStoragePutByVal):
3411         * jit/JITPropertyAccess32_64.cpp:
3412         (JSC::JIT::emitArrayStorageLoad):
3413         (JSC::JIT::emitArrayStoragePutByVal):
3414
3415 2017-05-21  Saam Barati  <sbarati@apple.com>
3416
3417         We incorrectly throw a syntax error when declaring a top level for-loop iteration variable the same as a parameter
3418         https://bugs.webkit.org/show_bug.cgi?id=171041
3419         <rdar://problem/32082516>
3420
3421         Reviewed by Yusuke Suzuki.
3422
3423         We were treating a for-loop variable declaration potentially as a top
3424         level statement, e.g, in a program like this:
3425         ```
3426         function foo() {
3427             for (let variable of expr) { }
3428         }
3429         ```
3430         But we should not be. This had the consequence of making this type of program
3431         throw a syntax error:
3432         ```
3433         function foo(arg) {
3434             for (let arg of expr) { }
3435         }
3436         ```
3437         even though it should not. The fix is simple, we just need to increment the
3438         statement depth before parsing anything inside the for loop.
3439
3440         * parser/Parser.cpp:
3441         (JSC::Parser<LexerType>::parseForStatement):
3442
3443 2017-05-19  Yusuke Suzuki  <utatane.tea@gmail.com>
3444
3445         [JSC] Make get_by_val & string "499" to number 499
3446         https://bugs.webkit.org/show_bug.cgi?id=172225
3447
3448         Reviewed by Saam Barati.
3449
3450         Property subscript will be converted by ToString. So JS code is not aware of
3451         the original type of the subscript value. But our get_by_val can leverage
3452         information if the given subscript is number. Thus, passing number instead of
3453         string can improve the performance of get_by_val in all the tiers.
3454
3455         In this patch, we add BytecodeGenerator::emitNodeForProperty. It attempts to
3456         convert the given value to Int32 index constant if the given value is a string
3457         that can be converted to Int32.
3458
3459         This patch improves SixSpeed map-string.es5 by 9.8x. This accessing form can
3460         appear in some code like accessing the result of JSON.
3461
3462             map-string.es5     1640.6738+-110.9182   ^    167.4121+-23.8328       ^ definitely 9.8002x faster
3463
3464         * bytecompiler/BytecodeGenerator.h:
3465         (JSC::BytecodeGenerator::emitNodeForProperty):
3466         (JSC::BytecodeGenerator::emitNodeForLeftHandSideForProperty):
3467         * bytecompiler/NodesCodegen.cpp:
3468         (JSC::TaggedTemplateNode::emitBytecode):
3469         (JSC::BracketAccessorNode::emitBytecode):
3470         (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByValDirect):
3471         (JSC::FunctionCallBracketNode::emitBytecode):
3472         (JSC::PostfixNode::emitBracket):
3473         (JSC::PrefixNode::emitBracket):
3474         (JSC::AssignBracketNode::emitBytecode):
3475         (JSC::ReadModifyBracketNode::emitBytecode):
3476         (JSC::ForInNode::emitLoopHeader):
3477         (JSC::ForOfNode::emitBytecode):
3478         (JSC::ObjectPatternNode::bindValue):
3479         (JSC::AssignmentElementNode::bindValue):
3480
3481 2017-05-21  Saam Barati  <sbarati@apple.com>
3482
3483         We overwrite the callee save space on the stack when throwing stack overflow from wasm
3484         https://bugs.webkit.org/show_bug.cgi?id=172316
3485
3486         Reviewed by Mark Lam.
3487
3488         When throwing a stack overflow exception, the overflow
3489         thunk would do the following:
3490           move fp, sp
3491           populate argument registers
3492           call C code
3493         
3494         However, the C function is allowed to clobber our spilled
3495         callee saves that live below fp. The reason I did this move is that
3496         when we jump to this code, we've proven that sp is out of bounds on
3497         the stack. So we're not allowed to just use its value or keep growing
3498         the stack from that point. However, this patch revises this approach
3499         to be the same in spirit, but actually correct. We conservatively assume
3500         the B3 function we're coming from could have saved all callee saves.
3501         So we emit code like this now:
3502           add -maxNumCalleeSaveSpace, fp, sp
3503           populate argument registers
3504           call C code
3505         
3506         This ensures our callee saves will not be overwritten. Note
3507         that fp is still in a valid stack range here, since the thing
3508         calling the wasm code did a stack check. Also note that maxNumCalleeSaveSpace
3509         is less than our redzone size, so it's safe to decrement sp by 
3510         this amount.
3511         
3512         The previously added wasm stack overflow test is an instance crash
3513         without this change on arm64. It also appears that this test crashed
3514         on some other x86 devices.
3515
3516         * wasm/WasmThunks.cpp:
3517         (JSC::Wasm::throwStackOverflowFromWasmThunkGenerator):
3518
3519 2017-05-20  Chris Dumez  <cdumez@apple.com>
3520
3521         Drop [NoInterfaceObject] from RTCDTMFSender and RTCStatsReport
3522         https://bugs.webkit.org/show_bug.cgi?id=172418
3523
3524         Reviewed by Youenn Fablet.
3525
3526         Add CommonIdentifiers that are now needed.
3527
3528         * runtime/CommonIdentifiers.h:
3529
3530 2017-05-20  Yusuke Suzuki  <utatane.tea@gmail.com>
3531
3532         Unreviewed, add scope.release() to propertyIsEnumerable functions.
3533         https://bugs.webkit.org/show_bug.cgi?id=172411
3534
3535         * runtime/JSGlobalObjectFunctions.cpp:
3536         (JSC::globalFuncPropertyIsEnumerable):
3537         * runtime/ObjectPrototype.cpp:
3538         (JSC::objectProtoFuncPropertyIsEnumerable):
3539
3540 2017-05-20  Yusuke Suzuki  <utatane.tea@gmail.com>
3541
3542         [JSC] Drop MapBase
3543         https://bugs.webkit.org/show_bug.cgi?id=172417
3544
3545         Reviewed by Sam Weinig.
3546
3547         MapBase is a purely additional indirection. JSMap and JSSet can directly inherit HashMapImpl.
3548         Thus MapBase is unnecessary. This patch drops it.
3549         It is good because we can eliminate one indirection when accessing to map implementation.
3550         Moreover, we can drop one unnecessary allocation per Map and Set.
3551
3552         * CMakeLists.txt:
3553         * JavaScriptCore.xcodeproj/project.pbxproj:
3554         * dfg/DFGSpeculativeJIT64.cpp:
3555         (JSC::DFG::SpeculativeJIT::compile):
3556         * ftl/FTLAbstractHeapRepository.h:
3557         * ftl/FTLLowerDFGToB3.cpp:
3558         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucket):
3559         * runtime/HashMapImpl.cpp:
3560         (JSC::HashMapImpl<HashMapBucket>::estimatedSize):
3561         (JSC::getHashMapImplKeyClassInfo): Deleted.
3562         (JSC::getHashMapImplKeyValueClassInfo): Deleted.
3563         * runtime/HashMapImpl.h:
3564         (JSC::HashMapImpl::finishCreation):
3565         (JSC::HashMapImpl::get):
3566         (JSC::HashMapImpl::info): Deleted.
3567         (JSC::HashMapImpl::createStructure): Deleted.
3568         (JSC::HashMapImpl::create): Deleted.
3569         * runtime/JSMap.h:
3570         (JSC::JSMap::set):
3571         (JSC::JSMap::get): Deleted.
3572         * runtime/JSMapIterator.cpp:
3573         (JSC::JSMapIterator::finishCreation):
3574         * runtime/JSSet.h:
3575         (JSC::JSSet::add): Deleted.
3576         * runtime/JSSetIterator.cpp:
3577         (JSC::JSSetIterator::finishCreation):
3578         * runtime/MapBase.cpp: Removed.
3579         * runtime/MapBase.h: Removed.
3580         * runtime/MapPrototype.cpp:
3581         (JSC::mapProtoFuncSize):
3582         * runtime/SetConstructor.cpp:
3583         (JSC::constructSet):
3584         * runtime/SetPrototype.cpp:
3585         (JSC::setProtoFuncSize):
3586         * runtime/VM.cpp:
3587         (JSC::VM::VM):
3588
3589 2017-05-20  Yusuke Suzuki  <utatane.tea@gmail.com>
3590
3591         [JSC] Speedup Object.assign for slow case by using propertyIsEnumerable
3592         https://bugs.webkit.org/show_bug.cgi?id=172411
3593
3594         Reviewed by Sam Weinig.
3595
3596         We use @Reflect.@getOwnPropertyDescriptor() to check
3597
3598         1. the descriptor exists,
3599         2. and the descriptor.enumrable is true
3600
3601         But Object::propertyIsEnumerable does the completely same thing without
3602         allocating a new object for property descriptor.
3603
3604         In this patch, we add a new private function @propertyIsEnumerable, and
3605         use it in Object.assign implementation. It does not allocate unnecessary
3606         objects. It is good for GC-pressure and performance.
3607
3608         This patch improves SixSpeed object-assign.es6 by 1.7x. While this patch
3609         does not introduce a fast path for objects that do not have accessors,
3610         and it could speed up things further, this patch can speed up the common
3611         slow path cases that is the current implementation of Object.assign.
3612
3613             object-assign.es6     1103.2487+-21.5602    ^    621.8478+-34.9875       ^ definitely 1.7741x faster
3614
3615         * builtins/BuiltinNames.h:
3616         * builtins/ObjectConstructor.js:
3617         (globalPrivate.enumerableOwnProperties):
3618         (assign):
3619         * runtime/JSGlobalObject.cpp:
3620         (JSC::JSGlobalObject::init):
3621         * runtime/JSGlobalObjectFunctions.cpp:
3622         (JSC::globalFuncPropertyIsEnumerable):
3623         * runtime/JSGlobalObjectFunctions.h:
3624
3625 2017-05-19  Yusuke Suzuki  <utatane.tea@gmail.com>
3626
3627         [JSC] Enable testapi on Mac CMake build
3628         https://bugs.webkit.org/show_bug.cgi?id=172354
3629
3630         Reviewed by Alex Christensen.
3631
3632         This patch makes testapi buildable and runnable for Mac CMake port.
3633
3634         * API/tests/DateTests.mm:
3635         (+[DateTests JSDateToNSDateTest]):
3636         (+[DateTests roundTripThroughJSDateTest]):
3637         This test only works with the en_US locale.
3638
3639         * shell/CMakeLists.txt:
3640         * shell/PlatformMac.cmake:
3641         Some of tests rely on ARC. We enable ARC for those files.
3642
3643         * shell/PlatformWin.cmake:
3644         Clean up.
3645
3646 2017-05-19  Mark Lam  <mark.lam@apple.com>
3647
3648         [Re-landing] DFG::SpeculativeJIT::pickCanTrample() is wrongly ignoring result registers.
3649         https://bugs.webkit.org/show_bug.cgi?id=172383
3650         <rdar://problem/31418651>
3651
3652         Reviewed by Filip Pizlo.
3653
3654         pickCanTrample() is wrongly assuming that one of regT0 and regT1 is always
3655         available as a scratch register.  This assumption is wrong if this canTrample
3656         register is used for a silentFill() after an operation that returns a result in
3657         regT0 or regT1.
3658
3659         Turns out the only reason we need the canTrample register is for
3660         SetDoubleConstant.  We can remove the need for this canTrample register by
3661         introducing a moveDouble() pseudo instruction in the MacroAssembler to do the
3662         job using the scratchRegister() on X86_64 or the dataMemoryTempRegister() on
3663         ARM64.  In so doing, we can simplify the silentFill() code and eliminate the bug.
3664
3665         Update for re-landing: Changed ARM64 to use scratchRegister() as well.
3666         scratchRegister() is the proper way to get the underlying dataMemoryTempRegister()
3667         as a scratch register.
3668
3669         * assembler/MacroAssembler.h:
3670         (JSC::MacroAssembler::moveDouble):
3671         * dfg/DFGArrayifySlowPathGenerator.h:
3672         * dfg/DFGCallArrayAllocatorSlowPathGenerator.h:
3673         (JSC::DFG::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator):
3674         * dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h:
3675         * dfg/DFGSaneStringGetByValSlowPathGenerator.h:
3676         * dfg/DFGSlowPathGenerator.h:
3677         (JSC::DFG::CallSlowPathGenerator::tearDown):
3678         * dfg/DFGSpeculativeJIT.cpp:
3679         (JSC::DFG::SpeculativeJIT::silentFill):
3680         (JSC::DFG::SpeculativeJIT::compileToLowerCase):
3681         (JSC::DFG::SpeculativeJIT::compileValueToInt32):
3682         (JSC::DFG::SpeculativeJIT::compileInstanceOfForObject):
3683         (JSC::DFG::SpeculativeJIT::emitUntypedBitOp):
3684         (JSC::DFG::SpeculativeJIT::emitUntypedRightShiftBitOp):
3685         (JSC::DFG::SpeculativeJIT::compileArithDiv):
3686         (JSC::DFG::SpeculativeJIT::compileArraySlice):
3687         (JSC::DFG::SpeculativeJIT::emitSwitchImm):
3688         (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
3689         (JSC::DFG::SpeculativeJIT::compileStoreBarrier):
3690         * dfg/DFGSpeculativeJIT.h:
3691         (JSC::DFG::SpeculativeJIT::silentFill):
3692         (JSC::DFG::SpeculativeJIT::silentSpillAllRegisters):
3693         (JSC::DFG::SpeculativeJIT::silentFillAllRegisters):
3694         (JSC::DFG::SpeculativeJIT::pickCanTrample): Deleted.
3695         * dfg/DFGSpeculativeJIT32_64.cpp:
3696         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
3697         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
3698         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
3699         (JSC::DFG::SpeculativeJIT::emitCall):
3700         (JSC::DFG::SpeculativeJIT::compile):
3701         * dfg/DFGSpeculativeJIT64.cpp:
3702         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
3703         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
3704         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
3705         (JSC::DFG::SpeculativeJIT::emitCall):
3706         (JSC::DFG::SpeculativeJIT::compile):
3707         (JSC::DFG::SpeculativeJIT::convertAnyInt):
3708
3709 2017-05-19  Ryan Haddad  <ryanhaddad@apple.com>
3710
3711         Unreviewed, rolling out r217156.
3712
3713         This change broke the iOS build.
3714
3715         Reverted changeset:
3716
3717         "DFG::SpeculativeJIT::pickCanTrample() is wrongly ignoring
3718         result registers."
3719         https://bugs.webkit.org/show_bug.cgi?id=172383
3720         http://trac.webkit.org/changeset/217156
3721
3722 2017-05-19  Mark Lam  <mark.lam@apple.com>
3723
3724         Add missing exception check.
3725         https://bugs.webkit.org/show_bug.cgi?id=172346
3726         <rdar://problem/32289640>
3727
3728         Reviewed by Geoffrey Garen.
3729
3730         * runtime/JSObject.cpp:
3731         (JSC::JSObject::hasInstance):
3732
3733 2017-05-19  Mark Lam  <mark.lam@apple.com>
3734
3735         DFG::SpeculativeJIT::pickCanTrample() is wrongly ignoring result registers.
3736         https://bugs.webkit.org/show_bug.cgi?id=172383
3737         <rdar://problem/31418651>
3738
3739         Reviewed by Filip Pizlo.
3740
3741         pickCanTrample() is wrongly assuming that one of regT0 and regT1 is always
3742         available as a scratch register.  This assumption is wrong if this canTrample
3743         register is used for a silentFill() after an operation that returns a result in
3744         regT0 or regT1.
3745
3746         Turns out the only reason we need the canTrample register is for
3747         SetDoubleConstant.  We can remove the need for this canTrample register by
3748         introducing a moveDouble() pseudo instruction in the MacroAssembler to do the
3749         job using the scratchRegister() on X86_64 or the dataMemoryTempRegister() on
3750         ARM64.  In so doing, we can simplify the silentFill() code and eliminate the bug.
3751
3752         * assembler/MacroAssembler.h:
3753         (JSC::MacroAssembler::moveDouble):
3754         * dfg/DFGArrayifySlowPathGenerator.h:
3755         * dfg/DFGCallArrayAllocatorSlowPathGenerator.h:
3756         (JSC::DFG::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator):
3757         * dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h:
3758         * dfg/DFGSaneStringGetByValSlowPathGenerator.h:
3759         * dfg/DFGSlowPathGenerator.h:
3760         (JSC::DFG::CallSlowPathGenerator::tearDown):
3761         * dfg/DFGSpeculativeJIT.cpp:
3762         (JSC::DFG::SpeculativeJIT::silentFill):
3763         (JSC::DFG::SpeculativeJIT::compileToLowerCase):
3764         (JSC::DFG::SpeculativeJIT::compileValueToInt32):
3765         (JSC::DFG::SpeculativeJIT::compileInstanceOfForObject):
3766         (JSC::DFG::SpeculativeJIT::emitUntypedBitOp):
3767         (JSC::DFG::SpeculativeJIT::emitUntypedRightShiftBitOp):
3768         (JSC::DFG::SpeculativeJIT::compileArithDiv):
3769         (JSC::DFG::SpeculativeJIT::compileArraySlice):
3770         (JSC::DFG::SpeculativeJIT::emitSwitchImm):
3771         (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
3772         (JSC::DFG::SpeculativeJIT::compileStoreBarrier):
3773         * dfg/DFGSpeculativeJIT.h:
3774         (JSC::DFG::SpeculativeJIT::silentFill):
3775         (JSC::DFG::SpeculativeJIT::silentSpillAllRegisters):
3776         (JSC::DFG::SpeculativeJIT::silentFillAllRegisters):
3777         (JSC::DFG::SpeculativeJIT::pickCanTrample): Deleted.
3778         * dfg/DFGSpeculativeJIT32_64.cpp:
3779         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
3780         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
3781         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
3782         (JSC::DFG::SpeculativeJIT::emitCall):
3783         (JSC::DFG::SpeculativeJIT::compile):
3784         * dfg/DFGSpeculativeJIT64.cpp:
3785         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
3786         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
3787         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
3788         (JSC::DFG::SpeculativeJIT::emitCall):
3789         (JSC::DFG::SpeculativeJIT::compile):
3790         (JSC::DFG::SpeculativeJIT::convertAnyInt):
3791
3792 2017-05-19  Filip Pizlo  <fpizlo@apple.com>
3793
3794         Deduplicate some code in arrayProtoPrivateFuncConcatMemcpy
3795         https://bugs.webkit.org/show_bug.cgi?id=172382
3796
3797         Reviewed by Saam Barati.
3798         
3799         This is just a small clean-up - my last patch here created some unnecessary code duplication.
3800
3801         * runtime/ArrayPrototype.cpp:
3802         (JSC::arrayProtoPrivateFuncConcatMemcpy):
3803
3804 2017-05-19  Filip Pizlo  <fpizlo@apple.com>
3805
3806         arrayProtoPrivateFuncConcatMemcpy needs to be down with firstArray being undecided
3807         https://bugs.webkit.org/show_bug.cgi?id=172369
3808
3809         Reviewed by Mark Lam.
3810
3811         * heap/Subspace.cpp: Reshaped the code a bit to aid debugging.
3812         (JSC::Subspace::allocate):
3813         (JSC::Subspace::tryAllocate):
3814         * runtime/ArrayPrototype.cpp:
3815         (JSC::arrayProtoPrivateFuncConcatMemcpy): Fix the bug!
3816         * runtime/ObjectInitializationScope.cpp: Provide even better feedback.
3817         (JSC::ObjectInitializationScope::verifyPropertiesAreInitialized):
3818
3819 2017-05-18  Filip Pizlo  <fpizlo@apple.com>
3820
3821         B3::Value::effects() says that having a fence range implies the fence bit, but on x86_64 we lower loadAcq/storeRel to load/store so the store-before-load fence bit orderings won't be honored
3822         https://bugs.webkit.org/show_bug.cgi?id=172306
3823
3824         Reviewed by Michael Saboff.
3825         
3826         This changes B3 to emit xchg and its variants for fenced stores on x86. This ensures that
3827         fenced stores cannot be reordered around other fenced instructions. Previously, B3 emitted
3828         normal store instructions for fenced stores. That's wrong because then you get reorderings
3829         that are possible in TSO but impossible in SC. Fenced instructions are supposed to be SC
3830         with respect for each other.
3831         
3832         This is imprecise. If you really just wanted a store-release, then every X86 store does this.
3833         But, in B3, fenced stores are ARM-style store-release, meaning that they are fenced with
3834         respect to all other fences. If we ever did want to say that something is a store release in
3835         the traditional sense, then we'd want MemoryValue to have a fence flag. Then, having a fence
3836         range without the fence flag would mean the traditional store-release, which lowers to a
3837         normal store on x86. But to my knowledge, that traditional store-release is only useful for
3838         unlocking spinlocks. We don't use spinlocks in JSC. Adaptive locks require CAS for unlock,
3839         and B3 CAS is plenty fast. I think it's OK to have this small imprecision of giving clients
3840         an ARM-style store-release on x86 using xchg.
3841         
3842         The implication of this change is that the FTL no longer violates the SAB memory model.
3843
3844         * assembler/MacroAssemblerX86Common.h:
3845         (JSC::MacroAssemblerX86Common::xchg8):
3846         (JSC::MacroAssemblerX86Common::xchg16):
3847         (JSC::MacroAssemblerX86Common::xchg32):
3848         (JSC::MacroAssemblerX86Common::loadAcq8): Deleted.
3849         (JSC::MacroAssemblerX86Common::loadAcq8SignedExtendTo32): Deleted.
3850         (JSC::MacroAssemblerX86Common::loadAcq16): Deleted.
3851         (JSC::MacroAssemblerX86Common::loadAcq16SignedExtendTo32): Deleted.
3852         (JSC::MacroAssemblerX86Common::loadAcq32): Deleted.
3853         (JSC::MacroAssemblerX86Common::storeRel8): Deleted.
3854         (JSC::MacroAssemblerX86Common::storeRel16): Deleted.
3855         (JSC::MacroAssemblerX86Common::storeRel32): Deleted.
3856         * assembler/MacroAssemblerX86_64.h:
3857         (JSC::MacroAssemblerX86_64::xchg64):
3858         (JSC::MacroAssemblerX86_64::loadAcq64): Deleted.
3859         (JSC::MacroAssemblerX86_64::storeRel64): Deleted.
3860         * b3/B3LowerToAir.cpp:
3861         (JSC::B3::Air::LowerToAir::ArgPromise::inst):
3862         (JSC::B3::Air::LowerToAir::trappingInst):
3863         (JSC::B3::Air::LowerToAir::tryAppendStoreBinOp):
3864         (JSC::B3::Air::LowerToAir::createStore):
3865         (JSC::B3::Air::LowerToAir::storeOpcode):
3866         (JSC::B3::Air::LowerToAir::appendStore):
3867         (JSC::B3::Air::LowerToAir::append):
3868         (JSC::B3::Air::LowerToAir::appendTrapping):
3869         (JSC::B3::Air::LowerToAir::fillStackmap):
3870         (JSC::B3::Air::LowerToAir::lower):
3871         * b3/air/AirKind.cpp:
3872         (JSC::B3::Air::Kind::dump):
3873         * b3/air/AirKind.h:
3874         (JSC::B3::Air::Kind::Kind):
3875         (JSC::B3::Air::Kind::operator==):
3876         (JSC::B3::Air::Kind::hash):
3877         * b3/air/AirLowerAfterRegAlloc.cpp:
3878         (JSC::B3::Air::lowerAfterRegAlloc):
3879         * b3/air/AirLowerMacros.cpp:
3880         (JSC::B3::Air::lowerMacros):
3881         * b3/air/AirOpcode.opcodes:
3882         * b3/air/AirValidate.cpp:
3883         * b3/air/opcode_generator.rb:
3884         * b3/testb3.cpp:
3885         (JSC::B3::correctSqrt):
3886         (JSC::B3::testSqrtArg):
3887         (JSC::B3::testSqrtImm):
3888         (JSC::B3::testSqrtMem):
3889         (JSC::B3::testSqrtArgWithUselessDoubleConversion):
3890         (JSC::B3::testSqrtArgWithEffectfulDoubleConversion):
3891         (JSC::B3::testStoreRelAddLoadAcq32):
3892         (JSC::B3::testTrappingLoad):
3893         (JSC::B3::testTrappingStore):
3894         (JSC::B3::testTrappingLoadAddStore):
3895         (JSC::B3::testTrappingLoadDCE):
3896
3897 2017-05-19  Don Olmstead  <don.olmstead@am.sony.com>
3898
3899         [JSC] Remove PLATFORM(WIN) references
3900         https://bugs.webkit.org/show_bug.cgi?id=172294
3901
3902         Reviewed by Yusuke Suzuki.
3903
3904         * heap/MachineStackMarker.cpp:
3905         (JSC::MachineThreads::removeThread):
3906         * llint/LLIntOfflineAsmConfig.h:
3907         * runtime/ConfigFile.h:
3908         * runtime/VM.cpp:
3909         (JSC::VM::updateStackLimits):
3910
3911 2017-05-19  Yusuke Suzuki  <utatane.tea@gmail.com>
3912
3913         [JSC][DFG][DOMJIT] Extend CheckDOM to CheckSubClass
3914         https://bugs.webkit.org/show_bug.cgi?id=172098
3915
3916         Reviewed by Saam Barati.
3917
3918         In this patch, we generalize CheckDOM to CheckSubClass.
3919         It can accept any ClassInfo and perform ClassInfo check
3920         in DFG / FTL. Now, we add a new function pointer to ClassInfo,
3921         checkSubClassPatchpoint. It can create DOMJIT patchpoint
3922         for that ClassInfo. It it natural that ClassInfo holds the
3923         way to emit DOMJIT::Patchpoint to perform CheckSubClass
3924         rather than having it in each DOMJIT getter / function
3925         signature annotation.
3926
3927         One problem is that it enlarges the size of ClassInfo.
3928         But this is the best place to put this function pointer.
3929         By doing so, we can add a patchpoint for CheckSubClass
3930         in an non-intrusive manner: WebCore can inject patchpoints
3931         without interactive JSC.
3932
3933         We still have a way to reduce the size of ClassInfo if
3934         we move ArrayBuffer related methods out to the other places.
3935
3936         This patch touches many files because we add a new function
3937         pointer to ClassInfo. But they are basically mechanical change.
3938
3939         * API/JSAPIWrapperObject.mm:
3940         * API/JSCallbackConstructor.cpp:
3941         * API/JSCallbackFunction.cpp:
3942         * API/JSCallbackObject.cpp:
3943         * API/ObjCCallbackFunction.mm:
3944         * CMakeLists.txt:
3945         * JavaScriptCore.xcodeproj/project.pbxproj:
3946         * bytecode/CodeBlock.cpp:
3947         * bytecode/DOMJITAccessCasePatchpointParams.h:
3948         (JSC::DOMJITAccessCasePatchpointParams::DOMJITAccessCasePatchpointParams):
3949         * bytecode/EvalCodeBlock.cpp:
3950         * bytecode/FunctionCodeBlock.cpp:
3951         * bytecode/GetterSetterAccessCase.cpp:
3952         (JSC::GetterSetterAccessCase::emitDOMJITGetter):
3953         * bytecode/ModuleProgramCodeBlock.cpp:
3954         * bytecode/ProgramCodeBlock.cpp:
3955         * bytecode/UnlinkedCodeBlock.cpp:
3956         * bytecode/UnlinkedEvalCodeBlock.cpp: