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