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