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