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