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