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