REGRESSION (r184337): [EFL] unresolved reference errors in ARM builds
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2015-05-14  Yusuke Suzuki  <utatane.tea@gmail.com>
2
3         REGRESSION (r184337): [EFL] unresolved reference errors in ARM builds
4         https://bugs.webkit.org/show_bug.cgi?id=145019
5
6         Reviewed by Ryosuke Niwa.
7
8         Attempt to fix compile errors in EFL ARM buildbots.
9         By executing `nm`, found JSTemplateRegistryKey.cpp.o and TemplateRegistry.cpp.o have
10         unresolved reference to Structure::get. That is inlined function in StructureInlines.h.
11
12         * runtime/JSTemplateRegistryKey.cpp:
13         * runtime/TemplateRegistry.cpp:
14
15 2015-05-14  Alexandr Skachkov  <gskachkov@gmail.com>
16
17         Small refactoring before implementation of the ES6 arrow function.
18         https://bugs.webkit.org/show_bug.cgi?id=144954
19
20         Reviewed by Ryosuke Niwa.
21
22         * parser/Parser.h:
23         * parser/Parser.cpp:
24
25 2015-05-14  Yusuke Suzuki  <utatane.tea@gmail.com>
26
27         REGRESSION (r184337): ASSERT failed in debug builds for tagged templates
28         https://bugs.webkit.org/show_bug.cgi?id=145013
29
30         Reviewed by Filip Pizlo.
31
32         Fix the regression introduced by r184337.
33
34         1. JSTemporaryRegistryKey::s_info should inherit the Base::s_info,
35            JSDestructibleObject::s_info.
36
37         2. The first register argument of BytecodeGenerator::emitNode
38            should be a referenced register if it is a temporary register.
39
40         * bytecompiler/NodesCodegen.cpp:
41         (JSC::TaggedTemplateNode::emitBytecode):
42         * runtime/JSTemplateRegistryKey.cpp:
43
44 2015-05-14  Andreas Kling  <akling@apple.com>
45
46         String.prototype.split() should create efficient substrings.
47         <https://webkit.org/b/144985>
48         <rdar://problem/20949344>
49
50         Reviewed by Geoffrey Garen.
51
52         Teach split() how to make substring JSStrings instead of relying on StringImpl's
53         substring sharing mechanism. The optimization works by deferring the construction
54         of a StringImpl until the substring's value is actually needed.
55
56         This knocks ~2MB off of theverge.com by avoiding the extra StringImpl allocations.
57         Out of ~70000 substrings created by split(), only ~2000 of them get reified.
58
59         * runtime/StringPrototype.cpp:
60         (JSC::jsSubstring):
61         (JSC::splitStringByOneCharacterImpl):
62         (JSC::stringProtoFuncSplit):
63
64 2015-05-14  Yusuke Suzuki  <utatane.tea@gmail.com>
65
66         Change the status of ES6 tagged templates to Done in features.json
67         https://bugs.webkit.org/show_bug.cgi?id=145003
68
69         Reviewed by Benjamin Poulain.
70
71         Now it's implemented in r184337.
72
73         * features.json:
74
75 2015-05-14  Yusuke Suzuki  <utatane.tea@gmail.com>
76
77         Introduce SymbolType into SpeculativeTypes
78         https://bugs.webkit.org/show_bug.cgi?id=142651
79
80         Reviewed by Filip Pizlo.
81
82         Introduce SpecSymbol type into speculative types.
83         Previously symbol type is categorized into SpecCellOther.
84         But SpecCellOther is not intended to be used for such cells.
85
86         This patch just introduces SpecSymbol.
87         It represents the type of target value is definitely the symbol type.
88         It is the part of SpecCell.
89
90         In this patch, we do not introduce SymbolUse tracking.
91         It will be added in the separate patch.
92
93         * bytecode/SpeculatedType.cpp:
94         (JSC::dumpSpeculation):
95         (JSC::speculationFromStructure):
96         * bytecode/SpeculatedType.h:
97         (JSC::isSymbolSpeculation):
98         * dfg/DFGAbstractInterpreterInlines.h:
99         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
100         * dfg/DFGAbstractValue.cpp:
101         (JSC::DFG::AbstractValue::setType):
102         * dfg/DFGConstantFoldingPhase.cpp:
103         (JSC::DFG::ConstantFoldingPhase::foldConstants):
104         * tests/stress/typeof-symbol.js: Added.
105
106 2015-05-14  Yusuke Suzuki  <utatane.tea@gmail.com>
107
108         [ES6] Implement tagged templates
109         https://bugs.webkit.org/show_bug.cgi?id=143183
110
111         Reviewed by Oliver Hunt.
112
113         This patch implements ES6 tagged templates.
114         In tagged templates, the function takes the template object.
115
116         The template object contains the raw and cooked template strings,
117         so when parsing the tagged templates, we need to tokenize the raw and cooked strings.
118         While tagged templates require the both strings, the template literal only requires
119         the cooked strings. So when tokenizing under the template literal context,
120         we only builds the cooked strings.
121
122         As per ES6 spec, the template objects for the same raw strings are shared in the same realm.
123         The template objects is cached. And every time we evaluate the same tagged templates,
124         the same (cached) template objects are used.
125         Since the spec freezes this template objects completely,
126         we cannot attach some properties to it.
127         So we can say that it behaves as if the template objects are the primitive values (like JSString).
128         Since we cannot attach properties, the only way to test the identity of the template object is comparing. (===)
129         As the result, when there is no reference to the template object, we can garbage collect it
130         because the user has no way to test that the newly created template object does not equal
131         to the already collected template object.
132
133         So, to implement tagged templates, we implement the following components.
134
135         1. JSTemplateRegistryKey
136         It holds the template registry key and it does not exposed to users.
137         TemplateRegistryKey holds the vector of raw and cooked strings with the pre-computed hash value.
138         When obtaining the template object for the (statically, a.k.a. at the parsing time) given raw string vectors,
139         we use this JSTemplateRegistryKey as a key to the map and look up the template object from
140         TemplateRegistry.
141         JSTemplateRegistryKey is created at the bytecode compiling time and
142         stored in the CodeBlock as like as JSString content values.
143
144         2. TemplateRegistry
145         This manages the cached template objects.
146         It holds the weak map (JSTemplateRegistryKey -> the template object).
147         The template object is weakly referenced.
148         So if there is no reference to the template object,
149         the template object is automatically GC-ed.
150         When looking up the template object, it searches the cached template object.
151         If it is found, it is returned to the users.
152         If there is no cached template objects, it creates the new template object and
153         stores it with the given template registry key.
154
155         * CMakeLists.txt:
156         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
157         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
158         * JavaScriptCore.xcodeproj/project.pbxproj:
159         * bytecompiler/BytecodeGenerator.cpp:
160         (JSC::BytecodeGenerator::addTemplateRegistryKeyConstant):
161         (JSC::BytecodeGenerator::emitGetTemplateObject):
162         * bytecompiler/BytecodeGenerator.h:
163         * bytecompiler/NodesCodegen.cpp:
164         (JSC::TaggedTemplateNode::emitBytecode):
165         (JSC::TemplateLiteralNode::emitBytecode): Deleted.
166         * parser/ASTBuilder.h:
167         (JSC::ASTBuilder::createTaggedTemplate):
168         (JSC::ASTBuilder::createTemplateLiteral): Deleted.
169         * parser/Lexer.cpp:
170         (JSC::Lexer<T>::setCode):
171         (JSC::Lexer<T>::parseTemplateLiteral):
172         (JSC::Lexer<T>::lex):
173         (JSC::Lexer<T>::scanTrailingTemplateString):
174         (JSC::Lexer<T>::clear):
175         * parser/Lexer.h:
176         (JSC::Lexer<T>::makeEmptyIdentifier):
177         * parser/NodeConstructors.h:
178         (JSC::TaggedTemplateNode::TaggedTemplateNode):
179         (JSC::TemplateLiteralNode::TemplateLiteralNode): Deleted.
180         * parser/Nodes.h:
181         (JSC::TemplateLiteralNode::templateStrings):
182         (JSC::TemplateLiteralNode::templateExpressions):
183         (JSC::TaggedTemplateNode::templateLiteral):
184         * parser/Parser.cpp:
185         (JSC::Parser<LexerType>::parseTemplateString):
186         (JSC::Parser<LexerType>::parseTemplateLiteral):
187         (JSC::Parser<LexerType>::parsePrimaryExpression):
188         (JSC::Parser<LexerType>::parseMemberExpression):
189         * parser/Parser.h:
190         * parser/ParserArena.h:
191         (JSC::IdentifierArena::makeEmptyIdentifier):
192         * parser/SyntaxChecker.h:
193         (JSC::SyntaxChecker::createTaggedTemplate):
194         (JSC::SyntaxChecker::createTemplateLiteral): Deleted.
195         * runtime/CommonIdentifiers.h:
196         * runtime/JSGlobalObject.cpp:
197         (JSC::getTemplateObject):
198         (JSC::JSGlobalObject::JSGlobalObject):
199         (JSC::JSGlobalObject::init):
200         * runtime/JSGlobalObject.h:
201         (JSC::JSGlobalObject::templateRegistry):
202         * runtime/JSTemplateRegistryKey.cpp: Added.
203         (JSC::JSTemplateRegistryKey::JSTemplateRegistryKey):
204         (JSC::JSTemplateRegistryKey::create):
205         (JSC::JSTemplateRegistryKey::destroy):
206         * runtime/JSTemplateRegistryKey.h: Added.
207         * runtime/ObjectConstructor.cpp:
208         (JSC::objectConstructorFreeze):
209         * runtime/ObjectConstructor.h:
210         * runtime/TemplateRegistry.cpp: Added.
211         (JSC::TemplateRegistry::TemplateRegistry):
212         (JSC::TemplateRegistry::getTemplateObject):
213         * runtime/TemplateRegistry.h: Added.
214         * runtime/TemplateRegistryKey.h: Added.
215         (JSC::TemplateRegistryKey::isDeletedValue):
216         (JSC::TemplateRegistryKey::isEmptyValue):
217         (JSC::TemplateRegistryKey::hash):
218         (JSC::TemplateRegistryKey::rawStrings):
219         (JSC::TemplateRegistryKey::cookedStrings):
220         (JSC::TemplateRegistryKey::operator==):
221         (JSC::TemplateRegistryKey::operator!=):
222         (JSC::TemplateRegistryKey::Hasher::hash):
223         (JSC::TemplateRegistryKey::Hasher::equal):
224         (JSC::TemplateRegistryKey::TemplateRegistryKey):
225         * runtime/VM.cpp:
226         (JSC::VM::VM):
227         * runtime/VM.h:
228         * tests/stress/tagged-templates-identity.js: Added.
229         (shouldBe):
230         * tests/stress/tagged-templates-raw-strings.js: Added.
231         (shouldBe):
232         (tag):
233         (testEval):
234         * tests/stress/tagged-templates-syntax.js: Added.
235         (tag):
236         (testSyntax):
237         (testSyntaxError):
238         * tests/stress/tagged-templates-template-object.js: Added.
239         (shouldBe):
240         (tag):
241         * tests/stress/tagged-templates-this.js: Added.
242         (shouldBe):
243         (tag):
244         * tests/stress/tagged-templates.js: Added.
245         (shouldBe):
246         (raw):
247         (cooked):
248         (Counter):
249
250 2015-05-13  Ryosuke Niwa  <rniwa@webkit.org>
251
252         REGRESSION(r180595): same-callee profiling no longer works
253         https://bugs.webkit.org/show_bug.cgi?id=144787
254
255         Reviewed by Filip Pizlo.
256
257         This patch introduces a DFG optimization to use NewObject node when the callee of op_create_this is
258         always the same JSFunction. This condition doesn't hold when the byte code creates multiple
259         JSFunction objects at runtime as in: function y() { return function () {} }; new y(); new y();
260
261         To enable this optimization, LLint and baseline JIT now store the last callee we saw in the newly
262         added fourth operand of op_create_this. We use this JSFunction's structure in DFG after verifying
263         our speculation that the callee is the same. To avoid recompiling the same code for different callee
264         objects in the polymorphic case, the special value of seenMultipleCalleeObjects() is set in
265         LLint and baseline JIT when multiple callees are observed.
266
267         Tests: stress/create-this-with-callee-variants.js
268
269         * bytecode/BytecodeList.json: Increased the number of operands to 5.
270         * bytecode/CodeBlock.cpp:
271         (JSC::CodeBlock::dumpBytecode): Dump the newly added callee cache.
272         (JSC::CodeBlock::finalizeUnconditionally): Clear the callee cache if the callee is no longer alive.
273         * bytecompiler/BytecodeGenerator.cpp:
274         (JSC::BytecodeGenerator::emitCreateThis): Add the instruction to propertyAccessInstructions so that
275         we can clear the callee cache in CodeBlock::finalizeUnconditionally. Also initialize the newly added
276         operand.
277         * dfg/DFGByteCodeParser.cpp:
278         (JSC::DFG::ByteCodeParser::parseBlock): Implement the optimization. Speculate the actual callee to
279         match the cache. Use the cached callee's structure if the speculation succeeds. Otherwise, OSR exit.
280         * jit/JITOpcodes.cpp:
281         (JSC::JIT::emit_op_create_this): Go to the slow path to update the cache unless it's already marked
282         as seenMultipleCalleeObjects() to indicate the polymorphic behavior and/or we've OSR exited here.
283         (JSC::JIT::emitSlow_op_create_this):
284         * jit/JITOpcodes32_64.cpp:
285         (JSC::JIT::emit_op_create_this): Ditto.
286         (JSC::JIT::emitSlow_op_create_this):
287         * llint/LowLevelInterpreter32_64.asm:
288         (_llint_op_create_this): Ditto.
289         * llint/LowLevelInterpreter64.asm:
290         (_llint_op_create_this): Ditto.
291         * runtime/CommonSlowPaths.cpp:
292         (slow_path_create_this): Set the callee cache to the actual callee if it's not set. If the cache has
293         been set to a JSFunction* different from the actual callee, set it to seenMultipleCalleeObjects().
294         * runtime/JSCell.h:
295         (JSC::JSCell::seenMultipleCalleeObjects): Added.
296         * runtime/WriteBarrier.h:
297         (JSC::WriteBarrierBase::unvalidatedGet): Removed the compile guard around it.
298         * tests/stress/create-this-with-callee-variants.js: Added.
299
300 2015-05-13  Joseph Pecoraro  <pecoraro@apple.com>
301
302         Clean up some possible RefPtr to PassRefPtr churn
303         https://bugs.webkit.org/show_bug.cgi?id=144779
304
305         Reviewed by Darin Adler.
306
307         * runtime/GenericTypedArrayViewInlines.h:
308         (JSC::GenericTypedArrayView<Adaptor>::create):
309         (JSC::GenericTypedArrayView<Adaptor>::createUninitialized):
310         * runtime/JSArrayBufferConstructor.cpp:
311         (JSC::constructArrayBuffer):
312         * runtime/Structure.cpp:
313         (JSC::Structure::toStructureShape):
314         * runtime/TypedArrayBase.h:
315         (JSC::TypedArrayBase::create):
316         (JSC::TypedArrayBase::createUninitialized):
317         * tools/FunctionOverrides.cpp:
318         (JSC::initializeOverrideInfo):
319         Release the last use of a RefPtr as it is passed on.
320
321 2015-05-13  Joseph Pecoraro  <pecoraro@apple.com>
322
323         ES6: Allow duplicate property names
324         https://bugs.webkit.org/show_bug.cgi?id=142895
325
326         Reviewed by Geoffrey Garen.
327
328         Introduce new `op_put_getter_by_id` and `op_put_setter_by_id` opcodes
329         that will define a single getter or setter property on an object.
330
331         The existing `op_put_getter_setter` opcode is still preferred for
332         putting both a getter and setter at the same time but cannot be used
333         for putting an individual getter or setter which is needed in
334         some cases.
335
336         Add a new slow path when generating bytecodes for a property list
337         with computed properties, as computed properties are the only time
338         the list of properties cannot be determined statically.
339
340         * bytecompiler/NodesCodegen.cpp:
341         (JSC::PropertyListNode::emitBytecode):
342         - fast path for all constant properties
343         - slow but paired getter/setter path if there are no computed properties
344         - slow path, individual put operation for every property, if there are computed properties
345
346         * parser/Nodes.h:
347         Distinguish a Computed property from a Constant property.
348
349         * parser/Parser.cpp:
350         (JSC::Parser<LexerType>::parseProperty):
351         (JSC::Parser<LexerType>::parsePropertyMethod):
352         Distingish Computed and Constant properties.
353
354         (JSC::Parser<LexerType>::parseObjectLiteral):
355         When we drop into strict mode it is because we saw a getter
356         or setter, so be more explicit.
357
358         (JSC::Parser<LexerType>::parseStrictObjectLiteral):
359         Eliminate duplicate property syntax error exception.
360
361         * parser/SyntaxChecker.h:
362         (JSC::SyntaxChecker::getName):
363         * parser/ASTBuilder.h:
364         (JSC::ASTBuilder::getName): Deleted.
365         No longer used.
366
367         * runtime/JSObject.h:
368         (JSC::JSObject::putDirectInternal):
369         When updating a property. If the Accessor attribute changed
370         update the Structure.
371
372         * runtime/JSObject.cpp:
373         (JSC::JSObject::putGetter):
374         (JSC::JSObject::putSetter):
375         Called by the opcodes, just perform the same operation that
376         __defineGetter__ or __defineSetter__ would do.
377
378         (JSC::JSObject::putDirectNonIndexAccessor):
379         This transition is now handled in putDirectInternal.
380
381         * runtime/Structure.h:
382         Add needed export.
383
384         * bytecode/BytecodeList.json:
385         * bytecode/BytecodeUseDef.h:
386         (JSC::computeUsesForBytecodeOffset):
387         (JSC::computeDefsForBytecodeOffset):
388         * bytecode/CodeBlock.cpp:
389         (JSC::CodeBlock::dumpBytecode):
390         * bytecompiler/BytecodeGenerator.cpp:
391         (JSC::BytecodeGenerator::emitPutGetterById):
392         (JSC::BytecodeGenerator::emitPutSetterById):
393         * bytecompiler/BytecodeGenerator.h:
394         * jit/JIT.cpp:
395         (JSC::JIT::privateCompileMainPass):
396         * jit/JIT.h:
397         * jit/JITInlines.h:
398         (JSC::JIT::callOperation):
399         * jit/JITOperations.cpp:
400         * jit/JITOperations.h:
401         * jit/JITPropertyAccess.cpp:
402         (JSC::JIT::emit_op_put_getter_by_id):
403         (JSC::JIT::emit_op_put_setter_by_id):
404         * jit/JITPropertyAccess32_64.cpp:
405         (JSC::JIT::emit_op_put_getter_by_id):
406         (JSC::JIT::emit_op_put_setter_by_id):
407         * llint/LLIntSlowPaths.cpp:
408         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
409         * llint/LLIntSlowPaths.h:
410         * llint/LowLevelInterpreter.asm:
411         New bytecodes. Modelled after existing op_put_getter_setter.
412
413 2015-05-13  Filip Pizlo  <fpizlo@apple.com>
414
415         Creating a new blank document in icloud pages causes an AI error: Abstract value (CellBytecodedoubleBoolOther, TOP, TOP) for double node has type outside SpecFullDouble.
416         https://bugs.webkit.org/show_bug.cgi?id=144856
417
418         Reviewed by Benjamin Poulain.
419         
420         First I made fixTypeForRepresentation() print out better diagnostics when it dies.
421         
422         Then I fixed the bug: Node::convertToIdentityOn(Node*) needs to make sure that when it
423         converts to a representation-changing node, it needs to use one of the UseKinds that such
424         a node expects. For example, DoubleRep(UntypedUse:) doesn't make sense; it needs to be
425         something like DoubleRep(NumberUse:) since it will speculate that the input is a number.
426
427         * dfg/DFGAbstractInterpreter.h:
428         (JSC::DFG::AbstractInterpreter::setBuiltInConstant):
429         * dfg/DFGAbstractInterpreterInlines.h:
430         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
431         * dfg/DFGAbstractValue.cpp:
432         (JSC::DFG::AbstractValue::fixTypeForRepresentation):
433         * dfg/DFGAbstractValue.h:
434         * dfg/DFGInPlaceAbstractState.cpp:
435         (JSC::DFG::InPlaceAbstractState::initialize):
436         * dfg/DFGNode.cpp:
437         (JSC::DFG::Node::convertToIdentityOn):
438         * tests/stress/cloned-arguments-get-by-val-double-array.js: Added.
439         (foo):
440
441 2015-05-13  Commit Queue  <commit-queue@webkit.org>
442
443         Unreviewed, rolling out r184313.
444         https://bugs.webkit.org/show_bug.cgi?id=144974
445
446         Introduced an assertion failure in class-syntax-
447         declaration.js, class-syntax-expression.js, and object-
448         literal-syntax.js (Requested by rniwa on #webkit).
449
450         Reverted changeset:
451
452         "Small refactoring before ES6 Arrow function implementation."
453         https://bugs.webkit.org/show_bug.cgi?id=144954
454         http://trac.webkit.org/changeset/184313
455
456 2015-05-13  Oliver Hunt  <oliver@apple.com>
457         Ensure that all the smart pointer types in WTF clear their pointer before deref
458         https://bugs.webkit.org/show_bug.cgi?id=143789
459
460         Reviewed by Ryosuke Niwa.
461
462         One of the simpler cases of this in JavaScriptCore. There
463         are other cases where we need to guard the derefs but they
464         are more complex cases.
465
466         * inspector/JSInjectedScriptHost.cpp:
467         (Inspector::JSInjectedScriptHost::releaseImpl):
468         * inspector/JSJavaScriptCallFrame.cpp:
469         (Inspector::JSJavaScriptCallFrame::releaseImpl):
470
471 2015-05-13  Alexandr Skachkov  <gskachkov@gmail.com>
472
473         Small refactoring before ES6 Arrow function implementation.
474         https://bugs.webkit.org/show_bug.cgi?id=144954
475
476         Reviewed by Filip Pizlo.
477
478         * parser/Parser.h:
479         * parser/Parser.cpp:
480
481 2015-05-13  Filip Pizlo  <fpizlo@apple.com>
482
483         The liveness pruning done by ObjectAllocationSinkingPhase ignores the possibility of an object's bytecode liveness being longer than its DFG liveness
484         https://bugs.webkit.org/show_bug.cgi?id=144945
485
486         Reviewed by Michael Saboff.
487         
488         We were making the mistake of using DFG liveness for object allocation sinking decisions.
489         This is wrong. In fact we almost never want to use DFG liveness directly. The only place
490         where that makes sense is pruning in DFG AI.
491         
492         So, I created a CombinedLiveness class that combines the DFG liveness with bytecode
493         liveness.
494         
495         In the process of doing this, I realized that the DFGForAllKills definition of combined
496         liveness at block tail was not strictly right; it was using the bytecode liveness at the
497         block terminal instead of the union of the bytecode live-at-heads of successor blocks. So,
498         I changed DFGForAllKills to work in terms of CombinedLiveness.
499         
500         This allows me to unskip the test I added in r184260. I also added a new test that tries to
501         trigger this bug more directly.
502
503         * CMakeLists.txt:
504         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
505         * JavaScriptCore.xcodeproj/project.pbxproj:
506         * dfg/DFGArgumentsEliminationPhase.cpp:
507         * dfg/DFGCombinedLiveness.cpp: Added.
508         (JSC::DFG::liveNodesAtHead):
509         (JSC::DFG::CombinedLiveness::CombinedLiveness):
510         * dfg/DFGCombinedLiveness.h: Added.
511         (JSC::DFG::CombinedLiveness::CombinedLiveness):
512         * dfg/DFGForAllKills.h:
513         (JSC::DFG::forAllKillsInBlock):
514         (JSC::DFG::forAllLiveNodesAtTail): Deleted.
515         * dfg/DFGObjectAllocationSinkingPhase.cpp:
516         (JSC::DFG::ObjectAllocationSinkingPhase::performSinking):
517         (JSC::DFG::ObjectAllocationSinkingPhase::determineMaterializationPoints):
518         (JSC::DFG::ObjectAllocationSinkingPhase::placeMaterializationPoints):
519         (JSC::DFG::ObjectAllocationSinkingPhase::promoteSunkenFields):
520         * tests/stress/escape-object-in-diamond-then-exit.js: Added.
521         * tests/stress/sink-object-past-invalid-check-sneaky.js:
522
523 2015-05-13  Ryosuke Niwa  <rniwa@webkit.org>
524
525         I skipped a wrong test in r184270. Fix that.
526         The failure is tracked by webkit.org/b/144947.
527
528         * tests/stress/arith-modulo-node-behaviors.js:
529         * tests/stress/arith-mul-with-constants.js:
530
531 2015-05-13  Joseph Pecoraro  <pecoraro@apple.com>
532
533         Avoid always running some debug code in type profiling
534         https://bugs.webkit.org/show_bug.cgi?id=144775
535
536         Reviewed by Daniel Bates.
537
538         * runtime/TypeProfilerLog.cpp:
539         (JSC::TypeProfilerLog::processLogEntries):
540
541 2015-05-13  Joseph Pecoraro  <pecoraro@apple.com>
542
543         Pass String as reference in more places
544         https://bugs.webkit.org/show_bug.cgi?id=144769
545
546         Reviewed by Daniel Bates.
547
548         * debugger/Breakpoint.h:
549         (JSC::Breakpoint::Breakpoint):
550         * parser/Parser.h:
551         (JSC::Parser::setErrorMessage):
552         (JSC::Parser::updateErrorWithNameAndMessage):
553         * parser/ParserError.h:
554         (JSC::ParserError::ParserError):
555         * runtime/RegExp.cpp:
556         (JSC::RegExpFunctionalTestCollector::outputOneTest):
557         * runtime/RegExpObject.cpp:
558         (JSC::regExpObjectSourceInternal):
559         * runtime/TypeProfiler.cpp:
560         (JSC::TypeProfiler::typeInformationForExpressionAtOffset):
561         * runtime/TypeProfilerLog.cpp:
562         (JSC::TypeProfilerLog::processLogEntries):
563         * runtime/TypeProfilerLog.h:
564         * tools/FunctionOverrides.cpp:
565         (JSC::initializeOverrideInfo):
566         * inspector/scripts/codegen/generate_objc_conversion_helpers.py:
567         (ObjCConversionHelpersGenerator._generate_enum_from_protocol_string):
568
569         * inspector/scripts/codegen/objc_generator_templates.py:
570         * inspector/scripts/tests/expected/commands-with-async-attribute.json-result:
571         * inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result:
572         * inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result:
573         * inspector/scripts/tests/expected/enum-values.json-result:
574         * inspector/scripts/tests/expected/events-with-optional-parameters.json-result:
575         * inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result:
576         * inspector/scripts/tests/expected/same-type-id-different-domain.json-result:
577         * inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result:
578         * inspector/scripts/tests/expected/type-declaration-aliased-primitive-type.json-result:
579         * inspector/scripts/tests/expected/type-declaration-array-type.json-result:
580         * inspector/scripts/tests/expected/type-declaration-enum-type.json-result:
581         * inspector/scripts/tests/expected/type-declaration-object-type.json-result:
582         * inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result:
583         Rebaseline tests after updating the generator.
584
585 2015-05-13  Michael Saboff  <msaboff@apple.com>
586
587         com.apple.WebKit.WebContent crashed at JavaScriptCore: JSC::CodeBlock::finalizeUnconditionally
588         https://bugs.webkit.org/show_bug.cgi?id=144933
589
590         Changed the RELEASE_ASSERT_NOT_REACHED into an ASSERT.  Added some diagnostic messages to
591         help determine the cause for any crash.
592
593         Reviewed by Geoffrey Garen.
594
595         * bytecode/CodeBlock.cpp:
596         (JSC::CodeBlock::finalizeUnconditionally):
597
598 2015-05-13  Filip Pizlo  <fpizlo@apple.com>
599
600         REGRESSION(r184260): arguments elimination has stopped working because of Check(UntypedUse:) from SSAConversionPhase
601         https://bugs.webkit.org/show_bug.cgi?id=144951
602
603         Reviewed by Michael Saboff.
604         
605         There were two issues here:
606         
607         - In r184260 we expected a small number of possible use kinds in Check nodes, and
608           UntypedUse was not one of them. That seemed like a sensible assumption because we don't
609           create Check nodes unless it's to have a check. But, SSAConversionPhase was creating a
610           Check that could have UntypedUse. I fixed this. It's cleaner for SSAConversionPhase to
611           follow the same idiom as everyone else and not create tautological checks.
612         
613         - It's clearly not very robust to assume that Checks will not be used tautologically. So,
614           this changes how we validate Checks in the escape analyses. We now use willHaveCheck,
615           which catches cases that AI would have already marked as unnecessary. It then also uses
616           a new helper called alreadyChecked(), which allows us to just ask if the check is
617           unnecessary for objects. That's a good fall-back in case AI hadn't run yet.
618
619         * dfg/DFGArgumentsEliminationPhase.cpp:
620         * dfg/DFGMayExit.cpp:
621         * dfg/DFGObjectAllocationSinkingPhase.cpp:
622         (JSC::DFG::ObjectAllocationSinkingPhase::handleNode):
623         * dfg/DFGSSAConversionPhase.cpp:
624         (JSC::DFG::SSAConversionPhase::run):
625         * dfg/DFGUseKind.h:
626         (JSC::DFG::alreadyChecked):
627         * dfg/DFGVarargsForwardingPhase.cpp:
628
629 k
630 2015-05-13  Yusuke Suzuki  <utatane.tea@gmail.com>
631
632         [ES6] Implement String.raw
633         https://bugs.webkit.org/show_bug.cgi?id=144330
634
635         Reviewed by Filip Pizlo.
636
637         Implement String.raw. It is intended to be used with tagged-templates syntax.
638         To implement ToString abstract operation efficiently,
639         we introduce @toString bytecode intrinsic. It emits op_to_string directly.
640
641         * CMakeLists.txt:
642         * builtins/StringConstructor.js: Added.
643         (raw):
644         * bytecompiler/NodesCodegen.cpp:
645         (JSC::BytecodeIntrinsicNode::emit_intrinsic_toString):
646         * runtime/CommonIdentifiers.h:
647         * runtime/StringConstructor.cpp:
648         * tests/stress/string-raw.js: Added.
649         (shouldBe):
650         (.get shouldBe):
651         (Counter):
652
653 2015-05-12  Ryosuke Niwa  <rniwa@webkit.org>
654
655         Temporarily disable the test on Windows. The failure is tracked in webkit.org/b/144897.
656
657         * tests/stress/arith-mul-with-constants.js:
658
659 2015-05-12  Filip Pizlo  <fpizlo@apple.com>
660
661         js/dom/stack-trace.html fails with eager compilation
662         https://bugs.webkit.org/show_bug.cgi?id=144853
663
664         Reviewed by Benjamin Poulain.
665         
666         All of our escape analyses were mishandling Check(). They were assuming that this is a
667         non-escaping operation. But, if we do for example a Check(Int32:@x) and @x is an escape
668         candidate, then we need to do something: if we eliminate or sink @x, then the check no
669         longer makes any sense since a phantom allocation has no type. This will make us forget
670         that this operation would have exited. This was causing us to not call a valueOf method in
671         js/dom/stack-trace.html with eager compilation enabled, because it was doing something like
672         +o where o had a valueOf method, and o was otherwise sinkable.
673         
674         This changes our escape analyses to basically pretend that any Check() that isn't obviously
675         unnecessary is an escape. We don't have to be super careful here. Most checks will be
676         completely eliminated by constant-folding. If that doesn't run in time, then the most
677         common check we will see is CellUse. So, we just recognize some very obvious check kinds
678         that we know would have passed, and for all of the rest we just assume that it's an escape.
679         
680         This was super tricky to test. The obvious way to test it is to use +o like
681         stack-trace.html, except that doing so relies on the fact that we still haven't implemented
682         the optimal behavior for op_to_number. So, I take four approaches in testing this patch:
683         
684         1) Use +o. These will test what we want it to test for now, but at some point in the future
685            these tests will just be a good sanity-check that our op_to_number implementation is
686            right.
687         
688         2) Do fancy control flow tricks to fool the profiling into thinking that some arithmetic
689            operation always sees integers even though we eventually feed it an object and that
690            object is a sink candidate.
691         
692         3) Introduce a new jsc.cpp intrinsic called isInt32() which returns true if the incoming
693            value is an int32. This intrinsic is required to be implemented by DFG by
694            unconditionally speculating that the input is int32. This allows us to write much more
695            targetted tests of the underlying issue.
696         
697         4) I made a version of stack-trace.html that runs in run-jsc-stress-tests, so that we can
698            get regression test coverage of this test in eager mode.
699
700         * dfg/DFGArgumentsEliminationPhase.cpp:
701         * dfg/DFGByteCodeParser.cpp:
702         (JSC::DFG::ByteCodeParser::handleIntrinsic):
703         * dfg/DFGObjectAllocationSinkingPhase.cpp:
704         (JSC::DFG::ObjectAllocationSinkingPhase::handleNode):
705         * dfg/DFGVarargsForwardingPhase.cpp:
706         * ftl/FTLExitValue.cpp:
707         (JSC::FTL::ExitValue::dumpInContext):
708         * ftl/FTLLowerDFGToLLVM.cpp:
709         (JSC::FTL::LowerDFGToLLVM::buildExitArguments):
710         * ftl/FTLOSRExitCompiler.cpp:
711         (JSC::FTL::compileFTLOSRExit):
712         * jsc.cpp:
713         (GlobalObject::finishCreation):
714         (functionIsInt32):
715         * runtime/Intrinsic.h:
716         * tests/stress/sink-arguments-past-invalid-check-dfg.js: Added.
717         * tests/stress/sink-arguments-past-invalid-check-int32-dfg.js: Added.
718         * tests/stress/sink-arguments-past-invalid-check-int32.js: Added.
719         * tests/stress/sink-arguments-past-invalid-check-sneakier.js: Added.
720         * tests/stress/sink-arguments-past-invalid-check.js: Added.
721         * tests/stress/sink-function-past-invalid-check-sneakier.js: Added.
722         * tests/stress/sink-function-past-invalid-check-sneaky.js: Added.
723         * tests/stress/sink-object-past-invalid-check-int32.js: Added.
724         * tests/stress/sink-object-past-invalid-check-sneakier.js: Added.
725         * tests/stress/sink-object-past-invalid-check-sneaky.js: Added.
726         * tests/stress/sink-object-past-invalid-check.js: Added.
727
728 2015-05-12  Benjamin Poulain  <benjamin@webkit.org>
729
730         Fix the iteration count of arith-modulo-node-behaviors.js
731
732         * tests/stress/arith-modulo-node-behaviors.js:
733         No need for big numbers for the real testing.
734
735 2015-05-12  Mark Lam  <mark.lam@apple.com>
736
737         Windows: Cannot use HANDLE from GetCurrentThread() to get the CONTEXT of another thread.
738         https://bugs.webkit.org/show_bug.cgi?id=144924
739
740         Reviewed by Alex Christensen.
741
742         The present stack scanning code in the Windows port is expecting that the
743         GetCurrentThread() API will provide a unique HANDLE for each thread.  The code
744         then saves and later uses that HANDLE with GetThreadContext() to get the
745         runtime state of the target thread from the GC thread.  According to
746         https://msdn.microsoft.com/en-us/library/windows/desktop/ms683182(v=vs.85).aspx,
747         GetCurrentThread() does not provide this unique HANDLE that we expect:
748
749             "The function cannot be used by one thread to create a handle that can
750             be used by other threads to refer to the first thread. The handle is
751             always interpreted as referring to the thread that is using it. A
752             thread can create a "real" handle to itself that can be used by other
753             threads, or inherited by other processes, by specifying the pseudo
754             handle as the source handle in a call to the DuplicateHandle function."
755
756         As a result of this, GetCurrentThread() always returns the same HANDLE value, and
757         we end up never scanning the stacks of other threads because we wrongly think that
758         they are all equal (in identity) to the scanning thread.  This, in turn, results
759         in crashes due to objects that are incorrectly collected.
760
761         The fix is to call DuplicateHandle() to create a HANDLE that we can use.  The
762         MachineThreads::Thread class already accurately tracks the period of time when
763         we need that HANDLE for the VM.  Hence, the life-cycle of the HANDLE can be tied
764         to the life-cycle of the MachineThreads::Thread object for the corresponding thread.
765
766         * heap/MachineStackMarker.cpp:
767         (JSC::getCurrentPlatformThread):
768         (JSC::MachineThreads::Thread::Thread):
769         (JSC::MachineThreads::Thread::~Thread):
770         (JSC::MachineThreads::Thread::suspend):
771         (JSC::MachineThreads::Thread::resume):
772         (JSC::MachineThreads::Thread::getRegisters):
773
774 2015-05-12  Benjamin Poulain  <bpoulain@apple.com>
775
776         [JSC] Make the NegZero backward propagated flags of ArithMod stricter
777         https://bugs.webkit.org/show_bug.cgi?id=144897
778
779         Reviewed by Geoffrey Garen.
780
781         The NegZero flags of ArithMod were the same as ArithDiv: both children were
782         marked as needing to handle NegativeZero.
783
784         Lucky for us, ArithMod is quite a bit different than ArithDiv.
785
786         First, the sign of the result is completely independent from
787         the sign of the divisor. A zero on the divisor always produces a NaN.
788         That's great, we can remove the NodeBytecodeNeedsNegZero
789         from the flags propagated to child2.
790
791         Second, the sign of the result is always the same as the sign of
792         the dividend. A dividend of zero produces a zero of same sign
793         unless the divisor is zero (in which case the result is NaN).
794         This is great too: we can just pass the flags we got into
795         ArithMod.
796
797         With those two out of the way, we can make a faster version of ArithRound
798         for Kraken's oscillator. Since we no longer care about negative zero,
799         rounding becomes cast<int32>(value + 0.5). This gives ~3% faster runtime
800         on the benchmark.
801
802         Unfortunatelly, most of the time is spent in FTL and the same optimization
803         does not apply well just yet: rdar://problem/20904149.
804
805         * dfg/DFGBackwardsPropagationPhase.cpp:
806         (JSC::DFG::BackwardsPropagationPhase::propagate):
807         Never add NodeBytecodeNeedsNegZero unless needed by the users of this node.
808
809         * dfg/DFGSpeculativeJIT.cpp:
810         (JSC::DFG::SpeculativeJIT::compileArithRound):
811         Faster Math.round() when negative zero is not important.
812
813         * tests/stress/arith-modulo-node-behaviors.js: Added.
814         (moduloWithNegativeZeroDividend):
815         (moduloWithUnusedNegativeZeroDividend):
816         (moduloWithNegativeZeroDivisor):
817
818 2015-05-12  Mark Lam  <mark.lam@apple.com>
819
820         Refactor MachineStackMarker.cpp so that it's easier to reason about MachineThreads::Thread.
821         https://bugs.webkit.org/show_bug.cgi?id=144925
822
823         Reviewed by Michael Saboff.
824
825         Currently, the code in MachineStackMarker.cpp is written as a bunch of functions that
826         operate on the platformThread value in the MachineThreads::Thread struct.  Instead, we
827         can apply better OO encapsulation and convert all these functions into methods of the
828         MachineThreads::Thread struct.
829
830         This will also make it easier to reason about the fix for
831         https://bugs.webkit.org/show_bug.cgi?id=144924 later.
832
833         * heap/MachineStackMarker.cpp:
834         (JSC::getCurrentPlatformThread):
835         (JSC::MachineThreads::Thread::createForCurrentThread):
836         (JSC::MachineThreads::Thread::operator!=):
837         (JSC::MachineThreads::Thread::operator==):
838         (JSC::MachineThreads::addCurrentThread):
839         (JSC::MachineThreads::removeThreadIfFound):
840         (JSC::MachineThreads::Thread::suspend):
841         (JSC::MachineThreads::Thread::resume):
842         (JSC::MachineThreads::Thread::getRegisters):
843         (JSC::MachineThreads::Thread::Registers::stackPointer):
844         (JSC::MachineThreads::Thread::freeRegisters):
845         (JSC::MachineThreads::Thread::captureStack):
846         (JSC::MachineThreads::tryCopyOtherThreadStack):
847         (JSC::MachineThreads::tryCopyOtherThreadStacks):
848         (JSC::equalThread): Deleted.
849         (JSC::suspendThread): Deleted.
850         (JSC::resumeThread): Deleted.
851         (JSC::getPlatformThreadRegisters): Deleted.
852         (JSC::otherThreadStackPointer): Deleted.
853         (JSC::freePlatformThreadRegisters): Deleted.
854         (JSC::otherThreadStack): Deleted.
855
856 2015-05-12  Ryosuke Niwa  <rniwa@webkit.org>
857
858         Array.slice should have a fast path like Array.splice
859         https://bugs.webkit.org/show_bug.cgi?id=144901
860
861         Reviewed by Geoffrey Garen.
862
863         Add a fast memcpy path to Array.prototype.slice as done for Array.prototype.splice.
864         In Kraken, this appears to be 30% win on stanford-crypto-ccm and 10% win on stanford-crypto-pbkdf2.
865
866         * runtime/ArrayPrototype.cpp:
867         (JSC::arrayProtoFuncSlice):
868         * runtime/JSArray.cpp:
869         (JSC::JSArray::fastSlice): Added.
870         * runtime/JSArray.h:
871
872 2015-05-11  Filip Pizlo  <fpizlo@apple.com>
873
874         OSR availability analysis would be more scalable (and correct) if it did more liveness pruning
875         https://bugs.webkit.org/show_bug.cgi?id=143078
876
877         Reviewed by Andreas Kling.
878         
879         In https://bugs.webkit.org/show_bug.cgi?id=144883, we found an example of where liveness
880         pruning is actually necessary. Well, not quite: we just need to prune out keys from the
881         heap availability map where the base node doesn't dominate the point where we are asking
882         for availability. If we don't do this, then eventually the IR gets corrupt because we'll
883         insert PutHints that reference the base node in places where the base node doesn't
884         dominate. But if we're going to do any pruning, then it makes sense to prune by bytecode
885         liveness. This is the strongest possible pruning we can do, and it should be sound. We
886         shouldn't have a node available for a virtual register if that register is live and the
887         node doesn't dominate.
888         
889         Making this work meant reusing the prune-to-liveness algorithm from the FTL backend. So, I
890         abstracted this a bit better. You can now availabilityMap.pruneByLiveness(graph, origin).
891
892         * dfg/DFGAvailabilityMap.cpp:
893         (JSC::DFG::AvailabilityMap::pruneHeap):
894         (JSC::DFG::AvailabilityMap::pruneByLiveness):
895         (JSC::DFG::AvailabilityMap::prune): Deleted.
896         * dfg/DFGAvailabilityMap.h:
897         * dfg/DFGOSRAvailabilityAnalysisPhase.cpp:
898         (JSC::DFG::OSRAvailabilityAnalysisPhase::run):
899         * ftl/FTLLowerDFGToLLVM.cpp:
900         (JSC::FTL::LowerDFGToLLVM::buildExitArguments):
901         * tests/stress/liveness-pruning-needed-for-osr-availability.js: Added. This is a proper regression test.
902         * tests/stress/liveness-pruning-needed-for-osr-availability-eager.js: Added. This is the original reduced test case, requires eager-no-cjit to fail prior to this changeset.
903
904 2015-05-12  Gabor Loki  <loki@webkit.org>
905
906         Workaround for Cortex-A53 erratum 843419
907         https://bugs.webkit.org/show_bug.cgi?id=144680
908
909         Reviewed by Michael Saboff.
910
911         This patch is about to give simple workaround for Cortex-A53 erratum 843419.
912         It inserts nops after ADRP instruction to avoid wrong address accesses.
913
914         * assembler/ARM64Assembler.h:
915         (JSC::ARM64Assembler::adrp):
916         (JSC::ARM64Assembler::nopCortexA53Fix843419):
917
918 2015-05-11  Commit Queue  <commit-queue@webkit.org>
919
920         Unreviewed, rolling out r184009.
921         https://bugs.webkit.org/show_bug.cgi?id=144900
922
923         Caused crashes on inspector tests (Requested by ap on
924         #webkit).
925
926         Reverted changeset:
927
928         "MapDataImpl::add() shouldn't do the same hash lookup twice."
929         https://bugs.webkit.org/show_bug.cgi?id=144759
930         http://trac.webkit.org/changeset/184009
931
932 2015-05-11  Commit Queue  <commit-queue@webkit.org>
933
934         Unreviewed, rolling out r184123.
935         https://bugs.webkit.org/show_bug.cgi?id=144899
936
937         Seems to have introduced flaky crashes in many JS tests
938         (Requested by rniwa on #webkit).
939
940         Reverted changeset:
941
942         "REGRESSION(r180595): same-callee profiling no longer works"
943         https://bugs.webkit.org/show_bug.cgi?id=144787
944         http://trac.webkit.org/changeset/184123
945
946 2015-05-11  Brent Fulgham  <bfulgham@apple.com>
947
948         [Win] Move Windows build target to Windows 7 (or newer)
949         https://bugs.webkit.org/show_bug.cgi?id=144890
950         <rdar://problem/20707307>
951
952         Reviewed by Anders Carlsson.
953
954         Update linked SDK and minimal Windows level to be compatible with
955         Windows 7 or newer.
956
957         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
958         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
959         * JavaScriptCore.vcxproj/JavaScriptCoreGenerated.vcxproj:
960         * JavaScriptCore.vcxproj/LLInt/LLIntAssembly/LLIntAssembly.vcxproj:
961         * JavaScriptCore.vcxproj/LLInt/LLIntDesiredOffsets/LLIntDesiredOffsets.vcxproj:
962         * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcxproj:
963         * JavaScriptCore.vcxproj/jsc/jsc.vcxproj:
964         * JavaScriptCore.vcxproj/jsc/jscLauncher.vcxproj:
965         * JavaScriptCore.vcxproj/libllvmForJSC/libllvmForJSC.vcxproj:
966         * JavaScriptCore.vcxproj/testRegExp/testRegExp.vcxproj:
967         * JavaScriptCore.vcxproj/testRegExp/testRegExpLauncher.vcxproj:
968         * JavaScriptCore.vcxproj/testapi/testapi.vcxproj:
969         * JavaScriptCore.vcxproj/testapi/testapiLauncher.vcxproj:
970         * config.h:
971
972 2015-05-08  Filip Pizlo  <fpizlo@apple.com>
973
974         CPS rethreading phase's flush detector flushes way too many SetLocals
975         https://bugs.webkit.org/show_bug.cgi?id=144819
976
977         Reviewed by Geoffrey Garen.
978         
979         After probably unrelated changes, this eventually caused some arguments elimination to stop
980         working because it would cause more SetLocals to turn into PutStacks. But it was a bug for
981         a long time. Basically, we don't want the children of a SetLocal to be flushed. Flushing is
982         meant to only affect the SetLocal itself.
983         
984         This is a speed-up on Octane/earley.
985
986         * dfg/DFGCPSRethreadingPhase.cpp:
987         (JSC::DFG::CPSRethreadingPhase::computeIsFlushed):
988
989 2015-05-11  Filip Pizlo  <fpizlo@apple.com>
990
991         gmail and google maps fail to load with eager compilation: Failed to insert inline cache for varargs call (specifically, CallForwardVarargs) because we thought the size would be 250 but it ended up being 262 prior to compaction.
992         https://bugs.webkit.org/show_bug.cgi?id=144854
993
994         Reviewed by Oliver Hunt.
995         
996         This is easy: just lift the threshold. Also remove the need for some duplicate thresholds.
997         It used to be that Construct required less code, but that's not the case for now.
998
999         * ftl/FTLInlineCacheSize.cpp:
1000         (JSC::FTL::sizeOfCallForwardVarargs):
1001         (JSC::FTL::sizeOfConstructVarargs):
1002         (JSC::FTL::sizeOfConstructForwardVarargs):
1003
1004 2015-05-11  Ryosuke Niwa  <rniwa@webkit.org>
1005
1006         REGRESSION(r180595): same-callee profiling no longer works
1007         https://bugs.webkit.org/show_bug.cgi?id=144787
1008
1009         Reviewed by Michael Saboff.
1010
1011         This patch introduces a DFG optimization to use NewObject node when the callee of op_create_this is
1012         always the same JSFunction. This condition doesn't hold when the byte code creates multiple
1013         JSFunction objects at runtime as in: function y() { return function () {} }; new y(); new y();
1014
1015         To enable this optimization, LLint and baseline JIT now store the last callee we saw in the newly
1016         added fourth operand of op_create_this. We use this JSFunction's structure in DFG after verifying
1017         our speculation that the callee is the same. To avoid recompiling the same code for different callee
1018         objects in the polymorphic case, the special value of seenMultipleCalleeObjects() is set in
1019         LLint and baseline JIT when multiple callees are observed.
1020
1021         Tests: stress/create-this-with-callee-variants.js
1022
1023         * bytecode/BytecodeList.json: Increased the number of operands to 5.
1024         * bytecode/BytecodeUseDef.h:
1025         (JSC::computeUsesForBytecodeOffset): op_create_this uses 2nd (constructor) and 4th (callee cache)
1026         operands.
1027         * bytecode/CodeBlock.cpp:
1028         (JSC::CodeBlock::dumpBytecode): Dump the newly added callee cache.
1029         (JSC::CodeBlock::finalizeUnconditionally): Clear the callee cache if the callee is no longer alive.
1030         * bytecompiler/BytecodeGenerator.cpp:
1031         (JSC::BytecodeGenerator::emitCreateThis): Add the instruction to propertyAccessInstructions so that
1032         we can clear the callee cache in CodeBlock::finalizeUnconditionally. Also initialize the newly added
1033         operand.
1034         * dfg/DFGByteCodeParser.cpp:
1035         (JSC::DFG::ByteCodeParser::parseBlock): Implement the optimization. Speculate the actual callee to
1036         match the cache. Use the cached callee's structure if the speculation succeeds. Otherwise, OSR exit.
1037         * jit/JITOpcodes.cpp:
1038         (JSC::JIT::emit_op_create_this): Go to the slow path to update the cache unless it's already marked
1039         as seenMultipleCalleeObjects() to indicate the polymorphic behavior.
1040         (JSC::JIT::emitSlow_op_create_this):
1041         * jit/JITOpcodes32_64.cpp:
1042         (JSC::JIT::emit_op_create_this): Ditto.
1043         (JSC::JIT::emitSlow_op_create_this):
1044         * llint/LowLevelInterpreter32_64.asm:
1045         (_llint_op_create_this): Ditto.
1046         * llint/LowLevelInterpreter64.asm:
1047         (_llint_op_create_this): Ditto.
1048         * runtime/CommonSlowPaths.cpp:
1049         (slow_path_create_this): Set the callee cache to the actual callee if it's not set. If the cache has
1050         been set to a JSFunction* different from the actual callee, set it to seenMultipleCalleeObjects().
1051         * runtime/JSCell.h:
1052         (JSC::JSCell::seenMultipleCalleeObjects): Added.
1053         * runtime/WriteBarrier.h:
1054         (JSC::WriteBarrierBase::unvalidatedGet): Removed the compile guard around it.
1055         * tests/stress/create-this-with-callee-variants.js: Added.
1056
1057 2015-05-11  Andreas Kling  <akling@apple.com>
1058
1059         PropertyNameArray should use a Vector when there are few entries.
1060         <https://webkit.org/b/144874>
1061
1062         Reviewed by Geoffrey Garen.
1063
1064         Bring back an optimization that was lost in the for-in refactoring.
1065         PropertyNameArray now holds a Vector<AtomicStringImpl*> until there are
1066         enough (20) entries to justify converting to a HashSet for contains().
1067
1068         Also inlined the code while we're here, since it has so few clients and
1069         the call overhead adds up.
1070
1071         ~5% progression on Kraken/json-stringify-tinderbox.
1072
1073         * runtime/PropertyNameArray.cpp: Removed.
1074         * runtime/PropertyNameArray.h:
1075         (JSC::PropertyNameArray::canAddKnownUniqueForStructure):
1076         (JSC::PropertyNameArray::add):
1077         (JSC::PropertyNameArray::addKnownUnique):
1078
1079 2015-05-11  Matt Baker  <mattbaker@apple.com>
1080
1081         Web Inspector: REGRESSION (r175203): No profile information is shown in Inspector
1082         https://bugs.webkit.org/show_bug.cgi?id=144808
1083
1084         Reviewed by Darin Adler.
1085
1086         Since a profile can be started after a timeline recording has already begun, we can't assume a zero start time.
1087         The start time for the root node's call entry should be based on the stopwatch used by the ProfileGenerator.
1088
1089         * profiler/Profile.cpp:
1090         (JSC::Profile::create):
1091         (JSC::Profile::Profile):
1092         * profiler/Profile.h:
1093         * profiler/ProfileGenerator.cpp:
1094         (JSC::ProfileGenerator::ProfileGenerator):
1095         (JSC::AddParentForConsoleStartFunctor::operator()):
1096
1097 2015-05-11  Basile Clement  <basile_clement@apple.com>
1098
1099         Unreviewed, remove unintended change.
1100
1101         * dfg/DFGAbstractInterpreterInlines.h:
1102         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1103
1104 2015-05-11  Filip Pizlo  <fpizlo@apple.com>
1105
1106         Make it easy to enable eager/non-concurrent JIT compilation
1107         https://bugs.webkit.org/show_bug.cgi?id=144877
1108
1109         Reviewed by Michael Saboff.
1110
1111         * runtime/Options.cpp:
1112         (JSC::recomputeDependentOptions):
1113         * runtime/Options.h:
1114
1115 2015-05-10  Filip Pizlo  <fpizlo@apple.com>
1116
1117         We shouldn't promote LoadVarargs to a sequence of GetStacks and PutStacks if doing so would exceed the LoadVarargs' limit
1118         https://bugs.webkit.org/show_bug.cgi?id=144851
1119
1120         Reviewed by Michael Saboff.
1121         
1122         LoadVarargs loads arguments from some object and puts them on the stack. The region of
1123         stack is controlled by a bunch of meta-data, including InlineCallFrame. InlineCallFrame
1124         shouldn't really be edited after ByteCodeParser, so we cannot convert LoadVarargs to
1125         something that uses more stack than the LoadVarargs wanted to.
1126         
1127         This check was missing in the ArgumentsEliminationPhase's LoadVarargs->GetStack+PutStack
1128         promoter. This is an important promotion rule for performance, and in cases where we are
1129         compiling truly hot code, the LoadVarargs limit will be at least as big as the length of
1130         the phantom arguments array that this phase sees. The LoadVarargs limit is based on
1131         profiling and the phantom arguments array is a proof; in most cases the profiling is more
1132         conservative.
1133         
1134         But, you could write some crazy code where the statically obvious arguments array value is
1135         bigger than what the profiling would have told you. When this happens, this promotion
1136         effectively removes a bounds check. This either results in us clobbering a bunch of stack,
1137         or it means that we never initialize a region of the stack that a later operation will read
1138         (the uninitialization happens because PutStackSinkingPhase removes PutStacks that appear
1139         unnecessary, and a GetMyArgumentByVal will claim not to use the region of the stack outside
1140         the original LoadVarargs limit).
1141         
1142         * dfg/DFGArgumentsEliminationPhase.cpp:
1143         * tests/stress/load-varargs-elimination-bounds-check-barely.js: Added.
1144         (foo):
1145         (bar):
1146         (baz):
1147         * tests/stress/load-varargs-elimination-bounds-check.js: Added.
1148         (foo):
1149         (bar):
1150         (baz):
1151
1152 2015-05-11  Andreas Kling  <akling@apple.com>
1153
1154         JSON.stringify shouldn't use generic get() to access Array.length
1155         <https://webkit.org/b/144847>
1156
1157         Reviewed by Geoffrey Garen.
1158
1159         If the value being serialized is a JSArray object, we can downcast and call its
1160         length() directly instead of doing a generic property lookup.
1161
1162         0.5% progression on Kraken/json-stringify-tinderbox.
1163
1164         * runtime/JSONObject.cpp:
1165         (JSC::Stringifier::Holder::appendNextProperty):
1166
1167 2015-05-10  Andreas Kling  <akling@apple.com>
1168
1169         Remove unnecessary AtomicStringImpl* hash specification in PropertyNameArray.
1170
1171         Follow up to r184050 suggested by Darin.
1172
1173         * runtime/PropertyNameArray.h:
1174
1175 2015-05-10  Andreas Kling  <akling@apple.com>
1176
1177         Remove unused things from PropertyNameArray.
1178         <https://webkit.org/b/144834>
1179
1180         Reviewed by Filip Pizlo.
1181
1182         PropertyNameArray had a bunch of bells and whistles added to it when for-in iteration
1183         was refactored and optimized last year. Then more refactoring happened and this class
1184         doesn't need to ring and toot anymore.
1185
1186         The RefCountedIdentifierSet class disappears since the JSPropertyNameEnumerator wasn't
1187         actually using it for anything and we were just wasting time creating these.
1188
1189         Also made the member functions take AtomicStringImpl* instead of plain StringImpl*.
1190
1191         * runtime/JSObject.cpp:
1192         (JSC::JSObject::getPropertyNames):
1193         * runtime/JSPropertyNameEnumerator.cpp:
1194         (JSC::JSPropertyNameEnumerator::create):
1195         (JSC::JSPropertyNameEnumerator::JSPropertyNameEnumerator):
1196         * runtime/JSPropertyNameEnumerator.h:
1197         * runtime/PropertyNameArray.cpp:
1198         (JSC::PropertyNameArray::add):
1199         (JSC::PropertyNameArray::setPreviouslyEnumeratedProperties): Deleted.
1200         * runtime/PropertyNameArray.h:
1201         (JSC::PropertyNameArray::PropertyNameArray):
1202         (JSC::PropertyNameArray::add):
1203         (JSC::PropertyNameArray::addKnownUnique):
1204         (JSC::PropertyNameArray::canAddKnownUniqueForStructure):
1205         (JSC::RefCountedIdentifierSet::contains): Deleted.
1206         (JSC::RefCountedIdentifierSet::size): Deleted.
1207         (JSC::RefCountedIdentifierSet::add): Deleted.
1208         (JSC::PropertyNameArray::identifierSet): Deleted.
1209         (JSC::PropertyNameArray::numCacheableSlots): Deleted.
1210         (JSC::PropertyNameArray::setNumCacheableSlotsForObject): Deleted.
1211         (JSC::PropertyNameArray::setBaseObject): Deleted.
1212         (JSC::PropertyNameArray::setPreviouslyEnumeratedLength): Deleted.
1213
1214 2015-05-09  Yoav Weiss  <yoav@yoav.ws>
1215
1216         Remove the PICTURE_SIZES build flag
1217         https://bugs.webkit.org/show_bug.cgi?id=144679
1218
1219         Reviewed by Benjamin Poulain.
1220
1221         Removed the PICTURE_SIZES build time flag.
1222
1223         * Configurations/FeatureDefines.xcconfig:
1224
1225 2015-05-08  Filip Pizlo  <fpizlo@apple.com>
1226
1227         Extend the SaneChain optimization to Contiguous arrays
1228         https://bugs.webkit.org/show_bug.cgi?id=144664
1229
1230         Reviewed by Mark Lam.
1231         
1232         Previously if you loaded from a hole, you'd either have to take slow path for the array
1233         load (which means C++ calls and prototype chain walks) or you'd exit (if you hadn't
1234         gathered the necessary profiling yet). But that's unnecessary if we know that the
1235         prototype chain is sane - i.e. has no indexed properties. Then we can just return
1236         Undefined for the hole.
1237         
1238         Making this change requires setting more watchpoints on the array prototype chain. But
1239         that hit a horrible bug: ArrayPrototype still uses the static lookup tables and builds
1240         itself up lazily. This means that this increased the number of recompilations we'd get
1241         due to the array prototype chain being built up.
1242         
1243         So, this change also removes the laziness and static tables from ArrayPrototype.
1244         
1245         But to make that change, I also had to add a helper for eagerly building up a prototype
1246         that has builtin functions.
1247
1248         * CMakeLists.txt:
1249         * DerivedSources.make:
1250         * dfg/DFGArrayMode.h:
1251         * dfg/DFGFixupPhase.cpp:
1252         (JSC::DFG::FixupPhase::fixupNode):
1253         * dfg/DFGSpeculativeJIT32_64.cpp:
1254         (JSC::DFG::SpeculativeJIT::compile):
1255         * dfg/DFGSpeculativeJIT64.cpp:
1256         (JSC::DFG::SpeculativeJIT::compile):
1257         * ftl/FTLLowerDFGToLLVM.cpp:
1258         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
1259         * runtime/ArrayPrototype.cpp:
1260         (JSC::ArrayPrototype::finishCreation):
1261         (JSC::ArrayPrototype::getOwnPropertySlot): Deleted.
1262         * runtime/ArrayPrototype.h:
1263         * runtime/JSObject.h:
1264
1265 2015-05-08  Michael Saboff  <msaboff@apple.com>
1266
1267         Creating a large MarkedBlock sometimes results in more than one cell in the block
1268         https://bugs.webkit.org/show_bug.cgi?id=144815
1269
1270         Reviewed by Mark Lam.
1271
1272         Large MarkedBlocks should have one and only one cell.  Changed the calculation of
1273         m_endAtom for large blocks to use the location of the first cell + 1.  This
1274         assures that large blocks only have one cell.
1275
1276         * heap/MarkedBlock.cpp:
1277         (JSC::MarkedBlock::MarkedBlock):
1278
1279 2015-05-08  Oliver Hunt  <oliver@apple.com>
1280
1281         MapDataImpl::add() shouldn't do the same hash lookup twice.
1282         https://bugs.webkit.org/show_bug.cgi?id=144759
1283
1284         Reviewed by Gavin Barraclough.
1285
1286         We don't actually need to do a double lookup here, all we need to
1287         do is update the index to point to the correct m_size.
1288
1289         * runtime/MapDataInlines.h:
1290         (JSC::JSIterator>::add):
1291
1292 2015-05-08  Andreas Kling  <akling@apple.com>
1293
1294         Micro-optimize JSON serialization of string primitives.
1295         <https://webkit.org/b/144800>
1296
1297         Reviewed by Sam Weinig.
1298
1299         Don't use the out-of-line JSValue::getString() to grab at string primitives
1300         in serialization. Just check if it's a JSString and then downcast to grab at
1301         the WTF::String inside.
1302
1303         2% progression on Kraken/json-stringify-tinderbox.
1304
1305         * runtime/JSONObject.cpp:
1306         (JSC::Stringifier::appendStringifiedValue):
1307
1308 2015-05-08  Andreas Kling  <akling@apple.com>
1309
1310         Optimize serialization of quoted JSON strings.
1311         <https://webkit.org/b/144754>
1312
1313         Reviewed by Darin Adler.
1314
1315         Optimized the serialization of quoted strings into JSON by moving the logic into
1316         StringBuilder so it can make smarter decisions about buffering.
1317
1318         12% progression on Kraken/json-stringify-tinderbox (on my Mac Pro.)
1319
1320         * bytecompiler/NodesCodegen.cpp:
1321         (JSC::ObjectPatternNode::toString): Use the new StringBuilder API.
1322
1323         * runtime/JSONObject.h:
1324         * runtime/JSONObject.cpp:
1325         (JSC::Stringifier::Holder::appendNextProperty):
1326         (JSC::appendStringToStringBuilder): Deleted.
1327         (JSC::appendQuotedJSONStringToBuilder): Deleted.
1328         (JSC::Stringifier::appendQuotedString): Deleted.
1329         (JSC::Stringifier::appendStringifiedValue): Moved the bulk of this logic
1330         to StringBuilder and call that from here.
1331
1332 2015-05-07  Commit Queue  <commit-queue@webkit.org>
1333
1334         Unreviewed, rolling out r183961.
1335         https://bugs.webkit.org/show_bug.cgi?id=144784
1336
1337         Broke js/dom/JSON-stringify.html (Requested by kling on
1338         #webkit).
1339
1340         Reverted changeset:
1341
1342         "Optimize serialization of quoted JSON strings."
1343         https://bugs.webkit.org/show_bug.cgi?id=144754
1344         http://trac.webkit.org/changeset/183961
1345
1346 2015-05-07  Filip Pizlo  <fpizlo@apple.com>
1347
1348         GC has trouble with pathologically large array allocations
1349         https://bugs.webkit.org/show_bug.cgi?id=144609
1350
1351         Reviewed by Geoffrey Garen.
1352
1353         The bug was that SlotVisitor::copyLater() would return early for oversize blocks (right
1354         after pinning them), and would skip the accounting. The GC calculates the size of the heap
1355         in tandem with the scan to save time, and that accounting was part of how the GC would
1356         know how big the heap was. The GC would then think that oversize copied blocks use no
1357         memory, and would then mess up its scheduling of the next GC.
1358         
1359         Fixing this bug is harder than it seems. When running an eden GC, we figure out the heap
1360         size by summing the size from the last collection and the size by walking the eden heap.
1361         But this breaks when we eagerly delete objects that the last collection touched. We can do
1362         that in one corner case: copied block reallocation. The old block will be deleted from old
1363         space during the realloc and a new block will be allocated in new space. In order for the
1364         GC to know that the size of old space actually shrank, we need a field to tell us how much
1365         such shrinkage could occur. Since this is a very dirty corner case and it only works for
1366         very particular reasons arising from the special properties of copied space (single owner,
1367         and the realloc is used in places where the compiler already knows that it cannot register
1368         allocate a pointer to the old block), I opted for an equally dirty shrinkage counter
1369         devoted just to this case. It's called bytesRemovedFromOldSpaceDueToReallocation.
1370         
1371         To test this, I needed to add an Option to force a particular RAM size in the GC. This
1372         allows us to write tests that assert that the GC heap size is some value X, without
1373         worrying about machine-to-machine variations due to GC heuristics changing based on RAM
1374         size.
1375
1376         * heap/CopiedSpace.cpp:
1377         (JSC::CopiedSpace::CopiedSpace): Initialize the dirty shrinkage counter.
1378         (JSC::CopiedSpace::tryReallocateOversize): Bump the dirty shrinkage counter.
1379         * heap/CopiedSpace.h:
1380         (JSC::CopiedSpace::takeBytesRemovedFromOldSpaceDueToReallocation): Swap out the counter. Used by the GC when it does its accounting.
1381         * heap/Heap.cpp:
1382         (JSC::Heap::Heap): Allow the user to force the RAM size.
1383         (JSC::Heap::updateObjectCounts): Use the dirty shrinkage counter to good effect. Also, make this code less confusing.
1384         * heap/SlotVisitorInlines.h:
1385         (JSC::SlotVisitor::copyLater): The early return for isOversize() was the bug. We still need to report these bytes as live. Otherwise the GC doesn't know that it owns this memory.
1386         * jsc.cpp: Add size measuring hooks to write the largeish test.
1387         (GlobalObject::finishCreation):
1388         (functionGCAndSweep):
1389         (functionFullGC):
1390         (functionEdenGC):
1391         (functionHeapSize):
1392         * runtime/Options.h:
1393         * tests/stress/new-array-storage-array-with-size.js: Fix this so that it actually allocates ArrayStorage arrays and tests the thing it was supposed to test.
1394         * tests/stress/new-largeish-contiguous-array-with-size.js: Added. This tests what the other test accidentally started testing, but does so without running your system out of memory.
1395         (foo):
1396         (test):
1397
1398 2015-05-07  Saam Barati  <saambarati1@gmail.com>
1399
1400         Global functions should be initialized as JSFunctions in byte code
1401         https://bugs.webkit.org/show_bug.cgi?id=144178
1402
1403         Reviewed by Geoffrey Garen.
1404
1405         This patch makes the initialization of global functions more explicit by
1406         moving initialization into bytecode. It also prepares JSC for having ES6
1407         style lexical scoping because initializing global functions in bytecode
1408         easily allows global functions to be initialized with the proper scope that
1409         will have access to global lexical variables. Global lexical variables
1410         should be visible to global functions but don't live on the global object.
1411
1412         * bytecode/UnlinkedCodeBlock.cpp:
1413         (JSC::UnlinkedProgramCodeBlock::visitChildren):
1414         * bytecode/UnlinkedCodeBlock.h:
1415         * bytecompiler/BytecodeGenerator.cpp:
1416         (JSC::BytecodeGenerator::generate):
1417         (JSC::BytecodeGenerator::BytecodeGenerator):
1418         * bytecompiler/BytecodeGenerator.h:
1419         * runtime/Executable.cpp:
1420         (JSC::ProgramExecutable::initializeGlobalProperties):
1421         * runtime/JSGlobalObject.cpp:
1422         (JSC::JSGlobalObject::addGlobalVar):
1423         (JSC::JSGlobalObject::addFunction):
1424         * runtime/JSGlobalObject.h:
1425
1426 2015-05-07  Benjamin Poulain  <bpoulain@apple.com>
1427
1428         Fix the x86 32bits build
1429
1430         * assembler/X86Assembler.h:
1431
1432 2015-05-07  Benjamin Poulain  <bpoulain@apple.com>
1433
1434         [JSC] Add basic DFG/FTL support for Math.round
1435         https://bugs.webkit.org/show_bug.cgi?id=144725
1436
1437         Reviewed by Filip Pizlo.
1438
1439         This patch adds two optimizations targeting Math.round():
1440         -Add a DFGNode ArithRound corresponding to the intrinsic RoundIntrinsic.
1441         -Change the MacroAssembler to be stricter on how we fail to convert a double
1442          to ingeter. Previously, any number valued zero would fail, now we only
1443          fail for -0.
1444
1445         Since ArithRound speculate it produces int32, the MacroAssembler assembler
1446         part became necessary because zero is a pretty common output of Math.round()
1447         and we would OSR exit a lot (and eventually recompile for doubles).
1448
1449         The implementation itself of the inline Math.round() is exactly the same
1450         as the C function that exists for Math.round(). We can very likely do better
1451         but it is a good start known to be valid and inlining alone alread provides
1452         significant speedups.
1453
1454         * assembler/X86Assembler.h:
1455         (JSC::X86Assembler::movmskpd_rr):
1456         * assembler/MacroAssemblerX86Common.h:
1457         (JSC::MacroAssemblerX86Common::branchConvertDoubleToInt32):
1458         When we have a zero, get the sign bit out of the double and check if is one.
1459
1460         I'll look into doing the same improvement for ARM.
1461
1462         * bytecode/SpeculatedType.cpp:
1463         (JSC::typeOfDoubleRounding):
1464         (JSC::typeOfDoubleFRound): Deleted.
1465         * bytecode/SpeculatedType.h:
1466         * dfg/DFGAbstractInterpreterInlines.h:
1467         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1468         * dfg/DFGByteCodeParser.cpp:
1469         (JSC::DFG::ByteCodeParser::handleIntrinsic):
1470         * dfg/DFGClobberize.h:
1471         (JSC::DFG::clobberize):
1472         * dfg/DFGDoesGC.cpp:
1473         (JSC::DFG::doesGC):
1474         * dfg/DFGFixupPhase.cpp:
1475         (JSC::DFG::FixupPhase::fixupNode):
1476         * dfg/DFGGraph.h:
1477         (JSC::DFG::Graph::roundShouldSpeculateInt32):
1478         (JSC::DFG::Graph::negateShouldSpeculateMachineInt): Deleted.
1479         * dfg/DFGNode.h:
1480         (JSC::DFG::Node::arithNodeFlags):
1481         (JSC::DFG::Node::hasHeapPrediction):
1482         (JSC::DFG::Node::hasArithMode):
1483         * dfg/DFGNodeType.h:
1484         * dfg/DFGPredictionPropagationPhase.cpp:
1485         (JSC::DFG::PredictionPropagationPhase::propagate):
1486         * dfg/DFGSafeToExecute.h:
1487         (JSC::DFG::safeToExecute):
1488         * dfg/DFGSpeculativeJIT.cpp:
1489         (JSC::DFG::SpeculativeJIT::compileArithRound):
1490         * dfg/DFGSpeculativeJIT.h:
1491         * dfg/DFGSpeculativeJIT32_64.cpp:
1492         (JSC::DFG::SpeculativeJIT::compile):
1493         * dfg/DFGSpeculativeJIT64.cpp:
1494         (JSC::DFG::SpeculativeJIT::compile):
1495         * ftl/FTLCapabilities.cpp:
1496         (JSC::FTL::canCompile):
1497         * ftl/FTLIntrinsicRepository.h:
1498         * ftl/FTLLowerDFGToLLVM.cpp:
1499         (JSC::FTL::LowerDFGToLLVM::compileNode):
1500         (JSC::FTL::LowerDFGToLLVM::convertDoubleToInt32):
1501         (JSC::FTL::LowerDFGToLLVM::compileDoubleAsInt32):
1502         (JSC::FTL::LowerDFGToLLVM::compileArithRound):
1503         * ftl/FTLOutput.h:
1504         (JSC::FTL::Output::ceil64):
1505         * jit/ThunkGenerators.cpp:
1506         * runtime/MathCommon.cpp:
1507         * runtime/MathCommon.h:
1508         * runtime/MathObject.cpp:
1509         (JSC::mathProtoFuncRound):
1510         * tests/stress/math-round-basics.js: Added.
1511         (mathRoundOnIntegers):
1512         (mathRoundOnDoubles):
1513         (mathRoundOnBooleans):
1514         (uselessMathRound):
1515         (mathRoundWithOverflow):
1516         (mathRoundConsumedAsDouble):
1517         (mathRoundDoesNotCareAboutMinusZero):
1518         (mathRoundNoArguments):
1519         (mathRoundTooManyArguments):
1520         (testMathRoundOnConstants):
1521         (mathRoundStructTransition):
1522         (Math.round):
1523
1524 2015-05-07  Saam Barati  <saambarati1@gmail.com>
1525
1526         exceptionFuzz tests should explicitly initialize the exceptionFuzz boolean in JavaScript code through a function in jsc.cpp
1527         https://bugs.webkit.org/show_bug.cgi?id=144753
1528
1529         Reviewed by Mark Lam.
1530
1531         This allows the BytecodeGenerator to freely emit startup code that "may"
1532         throw exceptions without worrying that this startup code will trigger
1533         the exceptionFuzz exception. The exceptionFuzz counter will only begin
1534         ticking when the 'enableExceptionFuzz' function is explicitly called in 
1535         the exceptionFuzz tests.
1536
1537         * jsc.cpp:
1538         (GlobalObject::finishCreation):
1539         (functionEnableExceptionFuzz):
1540         * tests/exceptionFuzz/3d-cube.js:
1541         * tests/exceptionFuzz/date-format-xparb.js:
1542         * tests/exceptionFuzz/earley-boyer.js:
1543
1544 2015-05-07  Andreas Kling  <akling@apple.com>
1545
1546         Optimize serialization of quoted JSON strings.
1547         <https://webkit.org/b/144754>
1548
1549         Reviewed by Darin Adler.
1550
1551         Optimized the serialization of quoted strings into JSON by moving the logic into
1552         StringBuilder so it can make smarter decisions about buffering.
1553
1554         12% progression on Kraken/json-stringify-tinderbox (on my Mac Pro.)
1555
1556         * bytecompiler/NodesCodegen.cpp:
1557         (JSC::ObjectPatternNode::toString): Use the new StringBuilder API.
1558
1559         * runtime/JSONObject.h:
1560         * runtime/JSONObject.cpp:
1561         (JSC::Stringifier::Holder::appendNextProperty):
1562         (JSC::appendStringToStringBuilder): Deleted.
1563         (JSC::appendQuotedJSONStringToBuilder): Deleted.
1564         (JSC::Stringifier::appendQuotedString): Deleted.
1565         (JSC::Stringifier::appendStringifiedValue): Moved the bulk of this logic
1566         to StringBuilder and call that from here.
1567
1568 2015-05-07  Yusuke Suzuki  <utatane.tea@gmail.com>
1569
1570         FunctionCallBracketNode should store the base value to the temporary when subscript has assignment
1571         https://bugs.webkit.org/show_bug.cgi?id=144678
1572
1573         Reviewed by Geoffrey Garen.
1574
1575         Currently, FunctionCallBracketNode directly use the RegisterID returned by emitNode.
1576         But if the base part is the local register and the subscript part has assignment to it, the base result is accidentally rewritten.
1577
1578         function t() { var ok = {null: function () { } }; ok[ok = null](); }
1579         t();  // Should not throw error.
1580
1581         This patch takes care about `subscriptHasAssignment`.
1582         By using `emitNodeForLeftHandSide`, when there's assignment to local variables in RHS,
1583         it correctly moves the LHS value to a temporary register.
1584
1585         * bytecompiler/NodesCodegen.cpp:
1586         (JSC::FunctionCallBracketNode::emitBytecode):
1587         * parser/ASTBuilder.h:
1588         (JSC::ASTBuilder::makeFunctionCallNode):
1589         * parser/NodeConstructors.h:
1590         (JSC::FunctionCallBracketNode::FunctionCallBracketNode):
1591         * parser/Nodes.h:
1592         * tests/stress/assignment-in-function-call-bracket-node.js: Added.
1593         (shouldBe):
1594         (shouldBe.):
1595
1596 2015-05-07  Basile Clement  <basile_clement@apple.com>
1597
1598         Unreviewed, add missing braces on a single-line if that got expanded in r183939
1599
1600         * ftl/FTLLowerDFGToLLVM.cpp:
1601         (JSC::FTL::LowerDFGToLLVM::buildExitArguments):
1602
1603 2015-05-05  Myles C. Maxfield  <mmaxfield@apple.com>
1604
1605         Revert "Introducing the Platform Abstraction Layer (PAL)"
1606         https://bugs.webkit.org/show_bug.cgi?id=144751
1607
1608         Unreviewed.
1609
1610         PAL should be a new target inside WebCore, rather than a top-level folder.
1611
1612         * Configurations/FeatureDefines.xcconfig: Updated
1613
1614 2015-05-07  Basile Clement  <basile_clement@apple.com>
1615
1616         Dumping OSR ExitValue should expand materializations only once
1617         https://bugs.webkit.org/show_bug.cgi?id=144694
1618
1619         Reviewed by Filip Pizlo.
1620
1621         Currently, dumping OSR exit values will print the full materialization
1622         information each time it is encountered. We change it to print only a
1623         brief description (only the materialization's address), and print the
1624         whole set of materializations later on.
1625
1626         This makes the dump less confusing (less likely to think that two
1627         instances of the same materialization are different), and will be a
1628         necessary change if/when we support materialization cycles.
1629
1630         * ftl/FTLCompile.cpp:
1631         (JSC::FTL::mmAllocateDataSection):
1632         * ftl/FTLExitValue.cpp:
1633         (JSC::FTL::ExitValue::dumpInContext):
1634         * ftl/FTLLowerDFGToLLVM.cpp:
1635         (JSC::FTL::LowerDFGToLLVM::buildExitArguments):
1636
1637 2015-05-07  Andreas Kling  <akling@apple.com>
1638
1639         Worker threads leak WeakBlocks (as seen on leaks bot)
1640         <https://webkit.org/b/144721>
1641         <rdar://problem/20848288>
1642
1643         Reviewed by Darin Adler.
1644
1645         Nuke any remaining empty WeakBlocks when the Heap is being torn down.
1646         Trying to peek into these blocks after the VM is dead would be a bug anyway.
1647
1648         This fixes a ~750 KB leak seen on the leaks bot.
1649
1650         * heap/Heap.cpp:
1651         (JSC::Heap::~Heap):
1652
1653 2015-05-05  Geoffrey Garen  <ggaren@apple.com>
1654
1655         Don't branch when accessing the callee
1656         https://bugs.webkit.org/show_bug.cgi?id=144645
1657
1658         Reviewed by Michael Saboff.
1659
1660         The branch was added in <http://trac.webkit.org/changeset/81040> without
1661         explanation.
1662
1663         kling found it to be a performance problem. See <https://webkit.org/b/144586>.
1664
1665         Our theory of access to Registers is that it's up to the client to access
1666         them in the right way. So, let's do that.
1667
1668         * interpreter/CallFrame.h:
1669         (JSC::ExecState::callee):
1670         (JSC::ExecState::setCallee): Call the field object instead of function
1671         because nothing guarantees that it's a function.
1672         * interpreter/ProtoCallFrame.h:
1673         (JSC::ProtoCallFrame::callee):
1674         (JSC::ProtoCallFrame::setCallee):
1675         * interpreter/Register.h:
1676         * runtime/JSObject.h:
1677         (JSC::Register::object): Just do a cast like our other accessors do.
1678         (JSC::Register::operator=):
1679         (JSC::Register::function): Deleted.
1680         (JSC::Register::withCallee): Deleted.
1681
1682 2015-05-07  Dan Bernstein  <mitz@apple.com>
1683
1684         <rdar://problem/19317140> [Xcode] Remove usage of AspenFamily.xcconfig in Source/
1685         https://bugs.webkit.org/show_bug.cgi?id=144727
1686
1687         Reviewed by Darin Adler.
1688
1689         * Configurations/Base.xcconfig: Don’t include AspenFamily.xcconfig, and define
1690         INSTALL_PATH_PREFIX and LD_DYLIB_INSTALL_NAME for the iOS 8.x Simulator.
1691
1692 2015-05-07  Andreas Kling  <akling@apple.com>
1693
1694         Special-case Int32 values in JSON.stringify().
1695         <https://webkit.org/b/144731>
1696
1697         Reviewed by Michael Saboff.
1698
1699         Add a fast path for serializing Int32 values to JSON. This is far faster than dragging
1700         simple integers through the full-blown dtoa() machinery.
1701
1702         ~50% speedup on Kraken/json-stringify-tinderbox.
1703
1704         * runtime/JSONObject.cpp:
1705         (JSC::Stringifier::appendStringifiedValue):
1706
1707 2015-05-06  Ryosuke Niwa  <rniwa@webkit.org>
1708
1709         ToT WebKit crashes while loading ES6 compatibility table
1710         https://bugs.webkit.org/show_bug.cgi?id=144726
1711
1712         Reviewed by Filip Pizlo.
1713
1714         The bug was caused by parseClass superfluously avoiding to build up the string after seeing {.
1715
1716         Always build the identifier here as it could be a method name.
1717
1718         * parser/Parser.cpp:
1719         (JSC::Parser<LexerType>::parseClass):
1720
1721 2015-05-05  Filip Pizlo  <fpizlo@apple.com>
1722
1723         Sane chain and string watchpoints should be set in FixupPhase or the backend rather than WatchpointCollectionPhase
1724         https://bugs.webkit.org/show_bug.cgi?id=144665
1725
1726         Reviewed by Michael Saboff.
1727         
1728         This is a step towards getting rid of WatchpointCollectionPhase. It's also a step towards
1729         extending SaneChain to all indexing shapes.
1730
1731         * dfg/DFGFixupPhase.cpp:
1732         (JSC::DFG::FixupPhase::fixupNode): Set the watchpoints here so that we don't need a case in WatchpointCollectionPhase.
1733         (JSC::DFG::FixupPhase::checkArray): Clarify the need for checking the structure. We often forget why we do this instead of always using CheckArray.
1734         * dfg/DFGSpeculativeJIT.cpp:
1735         (JSC::DFG::SpeculativeJIT::compileGetByValOnString): Set the watchpoints here so that we don't need a case in WatchpointCollectionPhase.
1736         * dfg/DFGWatchpointCollectionPhase.cpp:
1737         (JSC::DFG::WatchpointCollectionPhase::handle): Remove some code.
1738         (JSC::DFG::WatchpointCollectionPhase::handleStringGetByVal): Deleted.
1739         * ftl/FTLLowerDFGToLLVM.cpp:
1740         (JSC::FTL::LowerDFGToLLVM::compileStringCharAt): Set the watchpoints here so that we don't need a case in WatchpointCollectionPhase.
1741
1742 2015-04-02  Myles C. Maxfield  <mmaxfield@apple.com>
1743
1744         Introducing the Platform Abstraction Layer (PAL)
1745         https://bugs.webkit.org/show_bug.cgi?id=143358
1746
1747         Reviewed by Simon Fraser.
1748
1749         * Configurations/FeatureDefines.xcconfig: Updated
1750
1751 2015-05-06  Andreas Kling  <akling@apple.com>
1752
1753         Don't allocate a StringImpl for every Number JSValue in JSON.stringify().
1754         <https://webkit.org/b/144676>
1755
1756         Reviewed by Darin Adler.
1757
1758         We were creating a new String for every number JSValue passing through the JSON stringifier.
1759         These StringImpl allocations were dominating one of the Kraken JSON benchmarks.
1760         Optimize this by using StringBuilder::appendECMAScriptNumber() which uses a stack buffer
1761         for the conversion instead.
1762
1763         13% progression on Kraken/json-stringify-tinderbox.
1764
1765         * runtime/JSONObject.cpp:
1766         (JSC::Stringifier::appendStringifiedValue):
1767
1768 2015-05-06  Commit Queue  <commit-queue@webkit.org>
1769
1770         Unreviewed, rolling out r183847.
1771         https://bugs.webkit.org/show_bug.cgi?id=144691
1772
1773         Caused many assertion failures (Requested by ap on #webkit).
1774
1775         Reverted changeset:
1776
1777         "GC has trouble with pathologically large array allocations"
1778         https://bugs.webkit.org/show_bug.cgi?id=144609
1779         http://trac.webkit.org/changeset/183847
1780
1781 2015-05-05  Filip Pizlo  <fpizlo@apple.com>
1782
1783         PutGlobalVar shouldn't have an unconditional store barrier
1784         https://bugs.webkit.org/show_bug.cgi?id=133104
1785
1786         Reviewed by Benjamin Poulain.
1787         
1788         We don't need a store barrier on PutGlobalVar if the value being stored can be
1789         speculated to not be a cell.
1790
1791         * dfg/DFGFixupPhase.cpp:
1792         (JSC::DFG::FixupPhase::fixupNode):
1793
1794 2015-05-05  Filip Pizlo  <fpizlo@apple.com>
1795
1796         CopiedBlock::reportLiveBytes() should be totally cool with oversize blocks
1797         https://bugs.webkit.org/show_bug.cgi?id=144667
1798
1799         Reviewed by Andreas Kling.
1800         
1801         We are now calling this method for oversize blocks. It had an assertion that indirectly
1802         implied that the block is not oversize, because it was claiming that the number of live
1803         bytes should be smaller than the non-oversize-block size.
1804
1805         * heap/CopiedBlockInlines.h:
1806         (JSC::CopiedBlock::reportLiveBytes):
1807
1808 2015-05-05  Filip Pizlo  <fpizlo@apple.com>
1809
1810         GC has trouble with pathologically large array allocations
1811         https://bugs.webkit.org/show_bug.cgi?id=144609
1812
1813         Reviewed by Mark Lam.
1814
1815         * heap/Heap.cpp:
1816         (JSC::Heap::updateObjectCounts): Make this code less confusing.
1817         * heap/SlotVisitorInlines.h:
1818         (JSC::SlotVisitor::copyLater): The early return for isOversize() was the bug. We still need to report these bytes as live. Otherwise the GC doesn't know that it owns this memory.
1819         * jsc.cpp: Add size measuring hooks to write the largeish test.
1820         (GlobalObject::finishCreation):
1821         (functionGCAndSweep):
1822         (functionFullGC):
1823         (functionEdenGC):
1824         (functionHeapSize):
1825         * tests/stress/new-array-storage-array-with-size.js: Fix this so that it actually allocates ArrayStorage arrays and tests the thing it was supposed to test.
1826         * tests/stress/new-largeish-contiguous-array-with-size.js: Added. This tests what the other test accidentally started testing, but does so without running your system out of memory.
1827         (foo):
1828         (test):
1829
1830 2015-05-05  Filip Pizlo  <fpizlo@apple.com>
1831
1832         FTL SwitchString slow case creates duplicate switch cases
1833         https://bugs.webkit.org/show_bug.cgi?id=144634
1834
1835         Reviewed by Geoffrey Garen.
1836         
1837         The problem of duplicate switches is sufficiently annoying that I fixed the issue and also
1838         added mostly-debug-only asserts to catch such issues earlier.
1839
1840         * bytecode/CallVariant.cpp:
1841         (JSC::variantListWithVariant): Assertion to prevent similar bugs.
1842         * ftl/FTLLowerDFGToLLVM.cpp:
1843         (JSC::FTL::LowerDFGToLLVM::switchStringRecurse): Assertion to prevent similar bugs.
1844         (JSC::FTL::LowerDFGToLLVM::switchStringSlow): This is the bug.
1845         * jit/BinarySwitch.cpp:
1846         (JSC::BinarySwitch::BinarySwitch): Assertion to prevent similar bugs.
1847         * jit/Repatch.cpp:
1848         (JSC::linkPolymorphicCall): Assertion to prevent similar bugs.
1849         * tests/stress/ftl-switch-string-slow-duplicate-cases.js: Added. This tests the FTL SwitchString bug. It was previously crashing every time.
1850         (foo):
1851         (cat):
1852
1853 2015-05-05  Basile Clement  <basile_clement@apple.com>
1854
1855         Fix debug builds after r183812
1856         https://bugs.webkit.org/show_bug.cgi?id=144300
1857
1858         Rubber stamped by Andreas Kling and Filip Pizlo.
1859
1860         hasObjectMaterializationData() didn't treat MaterializeCreateActivation
1861         as having materialization data, which was causing an assertion failure when
1862         sinking CreateActivations on debug builds.
1863
1864         * dfg/DFGNode.h:
1865         (JSC::DFG::Node::hasObjectMaterializationData):
1866
1867 2015-05-04  Basile Clement  <basile_clement@apple.com>
1868
1869         Allow CreateActivation sinking
1870         https://bugs.webkit.org/show_bug.cgi?id=144300
1871
1872         Reviewed by Filip Pizlo.
1873
1874         This pursues the work started in
1875         https://bugs.webkit.org/show_bug.cgi?id=144016 to expand the set of
1876         allocations we are able to sink by allowing sinking of CreateActivation
1877         node.
1878
1879         This is achieved by following closely the way NewObject is currently
1880         sunk: we add a new PhantomCreateActivation node to record the initial
1881         position of the CreateActivation node, new ClosureVarPLoc promoted heap
1882         locations to keep track of the variables put in the activation, and a
1883         new MaterializeCreateActivation node to allocate and populate the sunk
1884         activation.
1885
1886         * dfg/DFGAbstractInterpreterInlines.h:
1887         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1888         * dfg/DFGClobberize.h:
1889         (JSC::DFG::clobberize):
1890         * dfg/DFGDoesGC.cpp:
1891         (JSC::DFG::doesGC):
1892         * dfg/DFGFixupPhase.cpp:
1893         (JSC::DFG::FixupPhase::fixupNode):
1894         * dfg/DFGNode.cpp:
1895         (JSC::DFG::Node::convertToPutClosureVarHint):
1896         * dfg/DFGNode.h:
1897         (JSC::DFG::Node::convertToPhantomCreateActivation):
1898         (JSC::DFG::Node::isActivationAllocation):
1899         (JSC::DFG::Node::isPhantomActivationAllocation):
1900         (JSC::DFG::Node::isPhantomAllocation):
1901         * dfg/DFGNodeType.h:
1902         * dfg/DFGObjectAllocationSinkingPhase.cpp:
1903         (JSC::DFG::ObjectAllocationSinkingPhase::lowerNonReadingOperationsOnPhantomAllocations):
1904         (JSC::DFG::ObjectAllocationSinkingPhase::handleNode):
1905         (JSC::DFG::ObjectAllocationSinkingPhase::createMaterialize):
1906         (JSC::DFG::ObjectAllocationSinkingPhase::populateMaterialize):
1907         * dfg/DFGPredictionPropagationPhase.cpp:
1908         (JSC::DFG::PredictionPropagationPhase::propagate):
1909         * dfg/DFGPromotedHeapLocation.cpp:
1910         (WTF::printInternal):
1911         * dfg/DFGPromotedHeapLocation.h:
1912         * dfg/DFGSafeToExecute.h:
1913         (JSC::DFG::safeToExecute):
1914         * dfg/DFGSpeculativeJIT32_64.cpp:
1915         (JSC::DFG::SpeculativeJIT::compile):
1916         * dfg/DFGSpeculativeJIT64.cpp:
1917         (JSC::DFG::SpeculativeJIT::compile):
1918         * dfg/DFGValidate.cpp:
1919         (JSC::DFG::Validate::validateCPS):
1920         * ftl/FTLCapabilities.cpp:
1921         (JSC::FTL::canCompile):
1922         * ftl/FTLLowerDFGToLLVM.cpp:
1923         (JSC::FTL::LowerDFGToLLVM::compileNode):
1924         (JSC::FTL::LowerDFGToLLVM::compileMaterializeCreateActivation):
1925         * ftl/FTLOperations.cpp:
1926         (JSC::FTL::operationMaterializeObjectInOSR):
1927         * tests/stress/activation-sink-osrexit.js: Added.
1928         (bar):
1929         (foo.set result):
1930         * tests/stress/activation-sink.js: Added.
1931         (bar):
1932
1933 2015-05-04  Filip Pizlo  <fpizlo@apple.com>
1934
1935         Unreviewed, fix stale comment.
1936
1937         * tests/mozilla/js1_5/Array/regress-101964.js:
1938
1939 2015-05-04  Filip Pizlo  <fpizlo@apple.com>
1940
1941         Large array shouldn't be slow
1942         https://bugs.webkit.org/show_bug.cgi?id=144617
1943
1944         Rubber stamped by Mark Lam.
1945
1946         * tests/mozilla/js1_5/Array/regress-101964.js: 500ms isn't enough in debug mode. We don't care how long this takes so long as we run it to completion. I've raised the limit much higher.
1947
1948 2015-05-04  Filip Pizlo  <fpizlo@apple.com>
1949
1950         Large array shouldn't be slow
1951         https://bugs.webkit.org/show_bug.cgi?id=144617
1952
1953         Rubber stamped by Mark Lam.
1954
1955         * tests/mozilla/js1_5/Array/regress-101964.js: Mozilla may have cared about this being fast a decade ago (or more), but we don't care. We've consistently found that an array implementation that punishes this case to get speed on common-case array accesses is better. This should fix some test failures on the bots.
1956
1957 2015-05-04  Commit Queue  <commit-queue@webkit.org>
1958
1959         Unreviewed, rolling out r183789.
1960         https://bugs.webkit.org/show_bug.cgi?id=144620
1961
1962         Causing flakiness on exceptionFuzz tests locally on 32-bit
1963         build (Requested by saamyjoon on #webkit).
1964
1965         Reverted changeset:
1966
1967         "Global functions should be initialized as JSFunctions in byte
1968         code"
1969         https://bugs.webkit.org/show_bug.cgi?id=144178
1970         http://trac.webkit.org/changeset/183789
1971
1972 2015-05-04  Saam Barati  <saambarati1@gmail.com>
1973
1974         Global functions should be initialized as JSFunctions in byte code
1975         https://bugs.webkit.org/show_bug.cgi?id=144178
1976
1977         Reviewed by Geoffrey Garen.
1978
1979         This patch makes the initialization of global functions more explicit by
1980         moving initialization into bytecode. It also prepares JSC for having ES6
1981         style lexical scoping because initializing global functions in bytecode
1982         easily allows global functions to be initialized with the proper scope that
1983         will have access to global lexical variables. Global lexical variables
1984         should be visible to global functions but don't live on the global object.
1985
1986         * bytecode/UnlinkedCodeBlock.cpp:
1987         (JSC::UnlinkedProgramCodeBlock::visitChildren):
1988         * bytecode/UnlinkedCodeBlock.h:
1989         * bytecompiler/BytecodeGenerator.cpp:
1990         (JSC::BytecodeGenerator::generate):
1991         (JSC::BytecodeGenerator::BytecodeGenerator):
1992         * bytecompiler/BytecodeGenerator.h:
1993         * runtime/Executable.cpp:
1994         (JSC::ProgramExecutable::initializeGlobalProperties):
1995         * runtime/JSGlobalObject.cpp:
1996         (JSC::JSGlobalObject::addGlobalVar):
1997         (JSC::JSGlobalObject::addFunction):
1998         * runtime/JSGlobalObject.h:
1999
2000 2015-05-04  Filip Pizlo  <fpizlo@apple.com>
2001
2002         Large array shouldn't be slow
2003         https://bugs.webkit.org/show_bug.cgi?id=144617
2004
2005         Reviewed by Geoffrey Garen.
2006         
2007         Decouple MIN_SPARSE_ARRAY_INDEX, which is the threshold for storing to the sparse map when
2008         you're already using ArrayStorage mode, from the minimul array length required to use
2009         ArrayStorage in a new Array(length) allocation.
2010         
2011         Lift the array allocation length threshold to something very high. If this works, we'll
2012         probably remove that threshold entirely.
2013         
2014         This is a 27% speed-up on JetStream/hash-map. Because run-jsc-benchmarks still can't run
2015         JetStream as a discrete suite, this adds hash-map to LongSpider so that we run it somewhere
2016         for now.
2017
2018         * dfg/DFGCallArrayAllocatorSlowPathGenerator.h:
2019         * dfg/DFGSpeculativeJIT32_64.cpp:
2020         (JSC::DFG::SpeculativeJIT::compile):
2021         * dfg/DFGSpeculativeJIT64.cpp:
2022         (JSC::DFG::SpeculativeJIT::compile):
2023         * ftl/FTLLowerDFGToLLVM.cpp:
2024         (JSC::FTL::LowerDFGToLLVM::compileNewArrayWithSize):
2025         * runtime/ArrayConventions.h:
2026         * runtime/JSArray.h:
2027         (JSC::JSArray::create):
2028         * runtime/JSGlobalObject.h:
2029         (JSC::constructEmptyArray):
2030         * tests/stress/new-array-storage-array-with-size.js: Skip this test until we fix https://bugs.webkit.org/show_bug.cgi?id=144609.
2031
2032 2015-05-03  Yusuke Suzuki  <utatane.tea@gmail.com>
2033
2034         Add backed intrinsics to private functions exposed with private symbols in global object
2035         https://bugs.webkit.org/show_bug.cgi?id=144545
2036
2037         Reviewed by Darin Adler.
2038
2039         Math.abs and Math.floor have ASM intrinsics And it is further accelerated in DFG/FTL layers.
2040         This patch adds intrinsic to private functions exposed with private symbols in global object,
2041         @floor and @abs.
2042
2043         * runtime/JSGlobalObject.cpp:
2044         (JSC::JSGlobalObject::init):
2045         * runtime/JSGlobalObjectFunctions.cpp:
2046         (JSC::globalPrivateFuncAbs): Deleted.
2047         (JSC::globalPrivateFuncFloor): Deleted.
2048         * runtime/MathObject.cpp:
2049         * runtime/MathObject.h:
2050         * tests/stress/array-from-abs-and-floor.js: Added.
2051         (target1):
2052         (target2):
2053         (target3):
2054
2055 2015-05-04  Csaba Osztrogonác  <ossy@webkit.org>
2056
2057         [cmake] ARM related build system cleanup
2058         https://bugs.webkit.org/show_bug.cgi?id=144566
2059
2060         Reviewed by Darin Adler.
2061
2062         * CMakeLists.txt:
2063
2064 2015-05-04  Andreas Kling  <akling@apple.com>
2065
2066         Optimize WeakBlock's "reap" and "visit" operations.
2067         <https://webkit.org/b/144585>
2068
2069         Reviewed by Geoffrey Garen.
2070
2071         WeakBlock was using Heap::isLive(void*) to determine the liveness of weak pointees.
2072         That function was really written with conservative roots marking in mind, and will do a bunch
2073         of sanity and bounds checks.
2074
2075         For weaks, we know that the pointer will have been a valid cell pointer into a block
2076         of appropriate cell size, so we can skip a lot of the checks.
2077
2078         We now keep a pointer to the MarkedBlock in each WeakBlock. That way we no longer have to do
2079         MarkedBlock::blockFor() for every single cell when iterating.
2080
2081         Note that a WeakBlock's MarkedBlock pointer becomes null when we detach a logically empty
2082         WeakBlock from its WeakSet and transfer ownership to Heap. At that point, the block will never
2083         be pointing to any live cells, and the only operation that will run on the block is sweep().
2084
2085         Finally, MarkedBlock allows liveness queries in three states: Marked, Retired, and Allocated.
2086         In Allocated state, all cells are reported as live. This state will reset to Marked on next GC.
2087         This patch uses that knowledge to avoid branching on the MarkedBlock's state for every cell.
2088
2089         This is a ~3x speedup of visit() and a ~2x speedup of reap() on Dromaeo/dom-modify, netting
2090         what looks like a 1% speedup locally.
2091
2092         * heap/MarkedBlock.cpp:
2093         (JSC::MarkedBlock::MarkedBlock): Pass *this to the WeakSet's ctor.
2094
2095         * heap/MarkedBlock.h:
2096         (JSC::MarkedBlock::isMarkedOrNewlyAllocated): Added, stripped-down version of isLive() when the
2097         block's state is known to be either Marked or Retired.
2098
2099         (JSC::MarkedBlock::isAllocated): Added, tells WeakBlock it's okay to skip reap/visit since isLive()
2100         would report that all cells are live anyway.
2101
2102         * heap/WeakBlock.cpp:
2103         (JSC::WeakBlock::create):
2104         (JSC::WeakBlock::WeakBlock): Stash a MarkedBlock* on each WeakBlock.
2105
2106         (JSC::WeakBlock::visit):
2107         (JSC::WeakBlock::reap): Optimized these two to avoid a bunch of pointer arithmetic and branches.
2108
2109         * heap/WeakBlock.h:
2110         (JSC::WeakBlock::disconnectMarkedBlock): Added.
2111         * heap/WeakSet.cpp:
2112         (JSC::WeakSet::sweep): Call the above when removing a WeakBlock from WeakSet and transferring
2113         ownership to Heap until it can die peacefully.
2114
2115         (JSC::WeakSet::addAllocator):
2116         * heap/WeakSet.h:
2117         (JSC::WeakSet::WeakSet): Give WeakSet a MarkedBlock& for passing on to WeakBlocks.
2118
2119 2015-05-04  Basile Clement  <basile_clement@apple.com>
2120
2121         Allocation sinking is prohibiting the creation of phis between a Phantom object and its materialization
2122         https://bugs.webkit.org/show_bug.cgi?id=144587
2123
2124         Rubber stamped by Filip Pizlo.
2125
2126         When sinking object allocations, we ensure in
2127         determineMaterializationPoints that whenever an allocation is
2128         materialized on a path to a block, it is materialized in all such
2129         paths. Thus when running the SSA calculator to place Phis in
2130         placeMaterializationPoints, we can't encounter a situation where some
2131         Upsilons are referring to a materialization while others are referring
2132         to the phantom object.
2133
2134         This replaces the code that was adding a materialization late in
2135         placeMaterializationPoints to handle that case by an assertion that it
2136         does not happen, which will make
2137         https://bugs.webkit.org/show_bug.cgi?id=143073 easier to implement.
2138
2139         * dfg/DFGObjectAllocationSinkingPhase.cpp:
2140         (JSC::DFG::ObjectAllocationSinkingPhase::placeMaterializationPoints):
2141
2142 2015-05-04  Ryosuke Niwa  <rniwa@webkit.org>
2143
2144         Extending undefined in class syntax should throw a TypeError
2145         https://bugs.webkit.org/show_bug.cgi?id=144284
2146
2147         Reviewed by Darin Adler.
2148
2149         The bug was caused by op_eq_null evaluating to true when compared to undefined.
2150         Explicitly check op_eq_undefined first to detect the case where we're extending undefined.
2151
2152         We also had bogus test cases checked in class-syntax-extends.html. This patch also fixes them.
2153
2154         * bytecompiler/NodesCodegen.cpp:
2155         (JSC::ClassExprNode::emitBytecode):
2156
2157 2015-05-04  Ryosuke Niwa  <rniwa@webkit.org>
2158
2159         new super should be a syntax error
2160         https://bugs.webkit.org/show_bug.cgi?id=144282
2161
2162         Reviewed by Joseph Pecoraro.
2163
2164         Disallow "new super" as ES6 spec doesn't allow this.
2165
2166         * parser/Parser.cpp:
2167         (JSC::Parser<LexerType>::parseMemberExpression):
2168
2169 2015-05-04  Saam Barati  <saambarati1@gmail.com>
2170
2171         JSCallbackObject does not maintain symmetry between accesses for getOwnPropertySlot and put
2172         https://bugs.webkit.org/show_bug.cgi?id=144265
2173
2174         Reviewed by Geoffrey Garen.
2175
2176         JSCallbackObject will defer to a parent's implementation of getOwnPropertySlot
2177         for a static function if the parent has that property slot. JSCallbackObject::put 
2178         did not maintain this symmetry of also calling ::put on the parent if the parent 
2179         has the property. We should ensure that this symmetry exists.
2180
2181         * API/JSCallbackObjectFunctions.h:
2182         (JSC::JSCallbackObject<Parent>::put):
2183         * API/tests/testapi.c:
2184         * API/tests/testapi.js:
2185         (globalStaticFunction2):
2186         (this.globalStaticFunction2):
2187         (iAmNotAStaticFunction):
2188         (this.iAmNotAStaticFunction):
2189
2190 2015-05-04  Andreas Kling  <akling@apple.com>
2191
2192         Make ExecState::vm() branchless in release builds.
2193         <https://webkit.org/b/144586>
2194
2195         Reviewed by Geoffrey Garen.
2196
2197         Avoid null checking the ExecState's callee() before getting the
2198         VM from it. The code was already dereferencing it anyway, since we
2199         know it's not gonna be null.
2200
2201         * runtime/JSCellInlines.h:
2202         (JSC::ExecState::vm):
2203
2204 2015-05-04  Basile Clement  <basile_clement@apple.com>
2205
2206         Object allocation not sinking properly through CheckStructure
2207         https://bugs.webkit.org/show_bug.cgi?id=144465
2208
2209         Reviewed by Filip Pizlo.
2210
2211         Currently, sinking an allocation through a CheckStructure will
2212         completely ignore all structure checking, which is obviously wrong.
2213
2214         A CheckStructureImmediate node type was present for that purpose, but
2215         the CheckStructures were not properly replaced.  This ensures that
2216         CheckStructure nodes are replaced by CheckStructureImmediate nodes when
2217         sunk through, and that structure checking happens correctly.
2218
2219         * dfg/DFGNode.h:
2220         (JSC::DFG::Node::convertToCheckStructureImmediate): Added.
2221         (JSC::DFG::Node::hasStructureSet):
2222         * dfg/DFGObjectAllocationSinkingPhase.cpp:
2223         (JSC::DFG::ObjectAllocationSinkingPhase::promoteSunkenFields):
2224         * ftl/FTLLowerDFGToLLVM.cpp:
2225         (JSC::FTL::LowerDFGToLLVM::compileCheckStructure):
2226         (JSC::FTL::LowerDFGToLLVM::compileCheckStructureImmediate):
2227         (JSC::FTL::LowerDFGToLLVM::checkStructure):
2228         * tests/stress/sink_checkstructure.js: Added.
2229         (foo):
2230
2231 2015-05-01  Geoffrey Garen  <ggaren@apple.com>
2232
2233         REGRESSION(r183570): jslib-traverse-jquery is 22% slower
2234         https://bugs.webkit.org/show_bug.cgi?id=144476
2235
2236         Reviewed by Sam Weinig.
2237
2238         jslib-traverse-jquery is now 31% faster than its unregressed baseline.
2239
2240         The jQuery algorithm for sorting DOM nodes is so pathologically slow that,
2241         to my knowledge, the topic of how to optimize it is not covered in any
2242         literature about sorting.
2243
2244         On the slowest jQuery sorting test -- prevAll -- our new
2245         Array.prototype.sort, compared to its predecessor, performed 12% fewer
2246         comparisons and requireed 10X less overhead per comparison. Yet, it was
2247         slower.
2248
2249         It was slower because it inadvertantly increased the average cost of the
2250         comparison function by 2X. jQuery uses compareDocumentPosition to compare
2251         DOM nodes, and compareDocumentPosition(a, b) is O(N) in the distance
2252         required to traverse backwards from b to a. In prevAll, we encounter the
2253         worst case for merge sort of compareDocumentPosition: A long list of DOM
2254         nodes in mostly reverse order. In this case, merge sort will sequentially
2255         compareDocumentPosition(a, b), where a is not reachable backwards from
2256         b, and therefore compareDocumentPosition will traverse the whole sibling
2257         list.
2258
2259         The solution is simple enough: Call compareDocumentPosition(b, a) instead.
2260
2261         This is a pretty silly thing to do, but it is harmless, and jQuery is
2262         popular, so let's do it.
2263
2264         We do not risk suffering the same problem in reverse when sorting a long
2265         list of DOM nodes in forward order. (We still have a 37% speedup on the
2266         nextAll benchmark.) The reason is that merge sort performs 2X fewer
2267         comparisons when the list is already sorted, so we can worry less about
2268         the cost of each comparison.
2269
2270         A fully principled soultion to this problem would probably do something
2271         like Python's timsort, which special-cases ordered ranges to perform
2272         only O(n) comparisons. But that would contradict our original
2273         goal of just having something simple that works.
2274
2275         Another option is for elements to keep a compareDocumentPosition cache,
2276         like a node list cache, which allows you to determine the absolute
2277         position of a node using a hash lookup. I will leave this as an exercise
2278         for kling.
2279
2280         * builtins/Array.prototype.js:
2281         (sort.merge): Compare in an order that is favorable to a comparator
2282         that calls compareDocumentPosition.
2283
2284 2015-05-04  Csaba Osztrogonác  <ossy@webkit.org>
2285
2286         [cmake] Fix generate-js-builtins related incremental build issue
2287         https://bugs.webkit.org/show_bug.cgi?id=144094
2288
2289         Reviewed by Michael Saboff.
2290
2291         * CMakeLists.txt: Generated JSCBuiltins.<cpp|h> should depend on Source/JavaScriptCore/builtins directory.
2292         Pass input directory to generate-js-builtins instead of Source/JavaScriptCore/builtins/*.js.
2293         * DerivedSources.make:
2294         Pass input directory to generate-js-builtins instead of Source/JavaScriptCore/builtins/*.js.
2295         * generate-js-builtins: Accept input files and input directory too.
2296
2297 2015-05-03  Simon Fraser  <simon.fraser@apple.com>
2298
2299         Make some static data const
2300         https://bugs.webkit.org/show_bug.cgi?id=144552
2301
2302         Reviewed by Andreas Kling.
2303         
2304         Turn characterSetInfo into const data.
2305
2306         * yarr/YarrCanonicalizeUCS2.cpp:
2307         * yarr/YarrCanonicalizeUCS2.h:
2308
2309 2015-05-01  Filip Pizlo  <fpizlo@apple.com>
2310
2311         TypeOf should be fast
2312         https://bugs.webkit.org/show_bug.cgi?id=144396
2313
2314         Reviewed by Geoffrey Garen.
2315         
2316         Adds comprehensive support for fast typeof to the optimizing JITs. Calls into the runtime
2317         are only used for very exotic objects - they must have either the MasqueradesAsUndefined or
2318         TypeOfShouldCallGetCallData type flags set. All other cases are handled inline.
2319         
2320         This means optimizing IsObjectOrNull, IsFunction, and TypeOf - all node types that used to
2321         rely heavily on C++ calls to fulfill their function.
2322         
2323         Because TypeOf is now so fast, we no longer need to do any speculations on this node.
2324         
2325         In the FTL, we take this further by querying AI for each branch in the TypeOf decision tree.
2326         This means that if the TypeOf is dominated by any type checks, we will automatically prune
2327         out cases that are redundant.
2328         
2329         This patch anticipates the addition of SwitchTypeOf or something like that. So, the TypeOf
2330         code generation is designed to be reusable.
2331         
2332         This is a speed-up on most typeof benchmarks. But, it is a slow-down on benchmarks that take
2333         the exotic call trap hook. That hook is now in a deeper slow path than before.
2334
2335         * CMakeLists.txt:
2336         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
2337         * JavaScriptCore.xcodeproj/project.pbxproj:
2338         * dfg/DFGClobberize.h:
2339         (JSC::DFG::clobberize): TypeOf was pure all along, but we failed to realize this.
2340         * dfg/DFGFixupPhase.cpp:
2341         (JSC::DFG::FixupPhase::fixupNode):
2342         * dfg/DFGHeapLocation.cpp:
2343         (WTF::printInternal):
2344         * dfg/DFGHeapLocation.h:
2345         * dfg/DFGOperations.cpp:
2346         * dfg/DFGOperations.h:
2347         * dfg/DFGSpeculativeJIT.cpp:
2348         (JSC::DFG::SpeculativeJIT::compileIsObjectOrNull):
2349         (JSC::DFG::SpeculativeJIT::compileIsFunction):
2350         (JSC::DFG::SpeculativeJIT::compileTypeOf):
2351         * dfg/DFGSpeculativeJIT.h:
2352         (JSC::DFG::SpeculativeJIT::blessedBooleanResult):
2353         (JSC::DFG::SpeculativeJIT::callOperation):
2354         * dfg/DFGSpeculativeJIT32_64.cpp:
2355         (JSC::DFG::SpeculativeJIT::compile):
2356         * dfg/DFGSpeculativeJIT64.cpp:
2357         (JSC::DFG::SpeculativeJIT::compile):
2358         * ftl/FTLCapabilities.cpp:
2359         (JSC::FTL::canCompile):
2360         * ftl/FTLIntrinsicRepository.h:
2361         * ftl/FTLLowerDFGToLLVM.cpp:
2362         (JSC::FTL::LowerDFGToLLVM::compileNode):
2363         (JSC::FTL::LowerDFGToLLVM::compileIsObjectOrNull):
2364         (JSC::FTL::LowerDFGToLLVM::compileIsFunction):
2365         (JSC::FTL::LowerDFGToLLVM::compileTypeOf):
2366         (JSC::FTL::LowerDFGToLLVM::buildTypeOf): Reusable TypeOf building for the FTL.
2367         (JSC::FTL::LowerDFGToLLVM::isExoticForTypeof):
2368         * ftl/FTLSwitchCase.h:
2369         (JSC::FTL::SwitchCase::SwitchCase):
2370         * jit/AssemblyHelpers.h:
2371         (JSC::AssemblyHelpers::branchIfNotEqual):
2372         (JSC::AssemblyHelpers::branchIfEqual):
2373         (JSC::AssemblyHelpers::branchIfNumber):
2374         (JSC::AssemblyHelpers::branchIfNotNumber):
2375         (JSC::AssemblyHelpers::branchIfBoolean):
2376         (JSC::AssemblyHelpers::branchIfNotBoolean):
2377         (JSC::AssemblyHelpers::boxBooleanPayload):
2378         (JSC::AssemblyHelpers::boxBoolean):
2379         (JSC::AssemblyHelpers::emitTypeOf): Reusable TypeOf building for assembly JITs.
2380         * jit/JITOperations.h:
2381         * runtime/SmallStrings.h:
2382         (JSC::SmallStrings::typeString):
2383         * runtime/TypeofType.cpp: Added.
2384         (WTF::printInternal):
2385         * runtime/TypeofType.h: Added.
2386         * tests/stress/type-of-functions-and-objects.js: Modified this test to give more comprehensive feedback.
2387
2388 2015-05-02  Filip Pizlo  <fpizlo@apple.com>
2389
2390         Unreviewed, add a FIXME referencing https://bugs.webkit.org/show_bug.cgi?id=144527.
2391
2392         * dfg/DFGLICMPhase.cpp:
2393         (JSC::DFG::LICMPhase::attemptHoist):
2394
2395 2015-05-02  Filip Pizlo  <fpizlo@apple.com>
2396
2397         Unreviewed, add FIXMEs referencing https://bugs.webkit.org/show_bug.cgi?id=144524 and
2398         https://bugs.webkit.org/show_bug.cgi?id=144525.
2399
2400         * dfg/DFGLICMPhase.cpp:
2401         (JSC::DFG::LICMPhase::attemptHoist):
2402         * dfg/DFGPhantomInsertionPhase.cpp:
2403
2404 2015-05-02  Yusuke Suzuki  <utatane.tea@gmail.com>
2405
2406         Static property hashtable should only lookup with non-symbol key
2407         https://bugs.webkit.org/show_bug.cgi?id=144438
2408
2409         Reviewed by Darin Adler.
2410
2411         Static property hashtable compares the Identifier's uid
2412         with the normal C string without interning it.
2413         So this comparison is performed in their contents.
2414         As the result, in this comparison, symbol-ness is not considered.
2415
2416         So if accidentally the hash collision occur with the symbol and the string
2417         and they have the same contents, the hash table entry is looked up incorrectly.
2418
2419         * runtime/Lookup.h:
2420         (JSC::HashTable::entry):
2421
2422 2015-05-01  Ryosuke Niwa  <rniwa@webkit.org>
2423
2424         Class syntax should allow string and numeric identifiers for method names
2425         https://bugs.webkit.org/show_bug.cgi?id=144254
2426
2427         Reviewed by Darin Adler.
2428
2429         Added the support for string and numeric identifiers in class syntax.
2430
2431         * parser/Parser.cpp:
2432         (JSC::Parser<LexerType>::parseFunctionInfo): Instead of using ConstructorKind to indicate whether we're
2433         inside a class or not, use the newly added SuperBinding argument instead. ConstructorKind is now None
2434         outside a class constructor as it should be.
2435         (JSC::Parser<LexerType>::parseFunctionDeclaration):
2436         (JSC::Parser<LexerType>::parseClass): No longer expects an identifier at the beginning of every class
2437         element to allow numeric and string method names. For both of those method names, parse it here instead
2438         of parseFunctionInfo since it doesn't support either type. Also pass in SuperBinding::Needed.
2439         (JSC::Parser<LexerType>::parsePropertyMethod): Call parseFunctionInfo with SuperBinding::NotNeeded since
2440         this function is never used to parse a class method.
2441         (JSC::Parser<LexerType>::parseGetterSetter): Pass in superBinding argument to parseFunctionInfo.
2442         (JSC::Parser<LexerType>::parsePrimaryExpression): Call parseFunctionInfo with SuperBinding::NotNeeded.
2443         * parser/Parser.h:
2444         * parser/SyntaxChecker.h:
2445         (JSC::SyntaxChecker::createProperty):
2446
2447 2015-05-01  Filip Pizlo  <fpizlo@apple.com>
2448
2449         FTL should use AI more
2450         https://bugs.webkit.org/show_bug.cgi?id=144500
2451
2452         Reviewed by Oliver Hunt.
2453         
2454         This makes our type check folding even more comprehensive by ensuring that even if the FTL
2455         decides to emit some checks, it will still do another query to the abstract interpreter to
2456         see if the check is necessary. This helps with cases where we decided early on to speculate
2457         one way, but later proved a more specific type of the value in question, and the constant
2458         folder didn't catch it.
2459         
2460         This also makes it more natural to query the abstract interpreter. For example, if you just
2461         want the proven type, you can now say provenType(node) or provenType(edge).
2462
2463         * dfg/DFGArrayMode.cpp:
2464         (JSC::DFG::ArrayMode::alreadyChecked):
2465         * dfg/DFGArrayMode.h:
2466         * ftl/FTLLowerDFGToLLVM.cpp:
2467         (JSC::FTL::LowerDFGToLLVM::compileBooleanToNumber):
2468         (JSC::FTL::LowerDFGToLLVM::compileToThis):
2469         (JSC::FTL::LowerDFGToLLVM::compileValueAdd):
2470         (JSC::FTL::LowerDFGToLLVM::compileArithAddOrSub):
2471         (JSC::FTL::LowerDFGToLLVM::compileArithPow):
2472         (JSC::FTL::LowerDFGToLLVM::compileArithNegate):
2473         (JSC::FTL::LowerDFGToLLVM::compileGetById):
2474         (JSC::FTL::LowerDFGToLLVM::compileCheckArray):
2475         (JSC::FTL::LowerDFGToLLVM::compilePutByVal):
2476         (JSC::FTL::LowerDFGToLLVM::compileToStringOrCallStringConstructor):
2477         (JSC::FTL::LowerDFGToLLVM::compileToPrimitive):
2478         (JSC::FTL::LowerDFGToLLVM::compileStringCharAt):
2479         (JSC::FTL::LowerDFGToLLVM::compileStringCharCodeAt):
2480         (JSC::FTL::LowerDFGToLLVM::compileCompareStrictEq):
2481         (JSC::FTL::LowerDFGToLLVM::compileSwitch):
2482         (JSC::FTL::LowerDFGToLLVM::compileIsBoolean):
2483         (JSC::FTL::LowerDFGToLLVM::compileIsNumber):
2484         (JSC::FTL::LowerDFGToLLVM::compileIsString):
2485         (JSC::FTL::LowerDFGToLLVM::compileIsObject):
2486         (JSC::FTL::LowerDFGToLLVM::compileInstanceOf):
2487         (JSC::FTL::LowerDFGToLLVM::numberOrNotCellToInt32):
2488         (JSC::FTL::LowerDFGToLLVM::baseIndex):
2489         (JSC::FTL::LowerDFGToLLVM::compareEqObjectOrOtherToObject):
2490         (JSC::FTL::LowerDFGToLLVM::typedArrayLength):
2491         (JSC::FTL::LowerDFGToLLVM::boolify):
2492         (JSC::FTL::LowerDFGToLLVM::equalNullOrUndefined):
2493         (JSC::FTL::LowerDFGToLLVM::lowInt32):
2494         (JSC::FTL::LowerDFGToLLVM::lowInt52):
2495         (JSC::FTL::LowerDFGToLLVM::lowCell):
2496         (JSC::FTL::LowerDFGToLLVM::lowBoolean):
2497         (JSC::FTL::LowerDFGToLLVM::lowDouble):
2498         (JSC::FTL::LowerDFGToLLVM::isCellOrMisc):
2499         (JSC::FTL::LowerDFGToLLVM::isNotCellOrMisc):
2500         (JSC::FTL::LowerDFGToLLVM::isNumber):
2501         (JSC::FTL::LowerDFGToLLVM::isNotNumber):
2502         (JSC::FTL::LowerDFGToLLVM::isNotCell):
2503         (JSC::FTL::LowerDFGToLLVM::isCell):
2504         (JSC::FTL::LowerDFGToLLVM::isNotMisc):
2505         (JSC::FTL::LowerDFGToLLVM::isMisc):
2506         (JSC::FTL::LowerDFGToLLVM::isNotBoolean):
2507         (JSC::FTL::LowerDFGToLLVM::isBoolean):
2508         (JSC::FTL::LowerDFGToLLVM::isNotOther):
2509         (JSC::FTL::LowerDFGToLLVM::isOther):
2510         (JSC::FTL::LowerDFGToLLVM::isProvenValue):
2511         (JSC::FTL::LowerDFGToLLVM::isObject):
2512         (JSC::FTL::LowerDFGToLLVM::isNotObject):
2513         (JSC::FTL::LowerDFGToLLVM::isNotString):
2514         (JSC::FTL::LowerDFGToLLVM::isString):
2515         (JSC::FTL::LowerDFGToLLVM::isFunction):
2516         (JSC::FTL::LowerDFGToLLVM::isNotFunction):
2517         (JSC::FTL::LowerDFGToLLVM::speculateObjectOrOther):
2518         (JSC::FTL::LowerDFGToLLVM::speculateStringObjectForStructureID):
2519         (JSC::FTL::LowerDFGToLLVM::speculateNotStringVar):
2520         (JSC::FTL::LowerDFGToLLVM::abstractValue):
2521         (JSC::FTL::LowerDFGToLLVM::provenType):
2522         (JSC::FTL::LowerDFGToLLVM::provenValue):
2523         (JSC::FTL::LowerDFGToLLVM::abstractStructure):
2524
2525 2015-05-01  Martin Robinson  <mrobinson@igalia.com>
2526
2527         USE(...) macro should expect unprefixed variables
2528         https://bugs.webkit.org/show_bug.cgi?id=144454
2529
2530         Reviewed by Daniel Bates.
2531
2532         * CMakeLists.txt: Replace all occurrences WTF_USE with USE.
2533
2534 2015-05-01  Jordan Harband  <ljharb@gmail.com>
2535
2536         String#startsWith/endsWith/includes don't handle Infinity position/endPosition args correctly
2537         https://bugs.webkit.org/show_bug.cgi?id=144314
2538
2539         Reviewed by Darin Adler.
2540
2541         Fixing handling of Infinity position args, per
2542         https://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.prototype.includes
2543         https://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.prototype.startswith
2544         https://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.prototype.endswith
2545
2546         * runtime/StringPrototype.cpp:
2547         (JSC::clampInt32):
2548         (JSC::stringProtoFuncStartsWith):
2549         (JSC::stringProtoFuncEndsWith):
2550         (JSC::stringProtoFuncIncludes):
2551
2552 2015-05-01  Basile Clement  <basile_clement@apple.com>
2553
2554         Math.abs() returns negative
2555         https://bugs.webkit.org/show_bug.cgi?id=137827
2556
2557         Reviewed by Michael Saboff.
2558
2559         Math.abs() on doubles was mistakenly assumed by the DFG AI to be the
2560         identity function.
2561
2562         * dfg/DFGAbstractInterpreterInlines.h:
2563         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2564         * tests/stress/math-abs-positive.js: Added, was previously failing.
2565         (foo):
2566
2567 2015-05-01  Basile Clement  <basile_clement@apple.com>
2568
2569         Function allocation sinking shouldn't be performed on singleton functions
2570         https://bugs.webkit.org/show_bug.cgi?id=144166
2571
2572         Reviewed by Geoffrey Garen.
2573
2574         Function allocations usually are free of any other side effects, but
2575         this is not the case for allocations performed while the underlying
2576         FunctionExecutable is still a singleton (as this allogation will fire
2577         watchpoints invalidating code that depends on it being a singleton).
2578         As the object allocation sinking phase assumes object allocation is
2579         free of side-effects, sinking these allocations is not correct.
2580
2581         This also means that when materializing a function allocation on OSR
2582         exit, that function's executable will never be a singleton, and we don't have
2583         to worry about its watchpoint, allowing us to use
2584         JSFunction::createWithInvalidatedRellocationWatchpoint instead of
2585         JSFunction::create.
2586
2587         * dfg/DFGObjectAllocationSinkingPhase.cpp:
2588         (JSC::DFG::ObjectAllocationSinkingPhase::handleNode):
2589         * ftl/FTLOperations.cpp:
2590         (JSC::FTL::operationMaterializeObjectInOSR):
2591
2592 2015-04-30  Jon Davis  <jond@apple.com>
2593
2594         Web Inspector: console should show an icon for console.info() messages
2595         https://bugs.webkit.org/show_bug.cgi?id=18530
2596
2597         Reviewed by Timothy Hatcher.
2598
2599         * inspector/ConsoleMessage.cpp:
2600         (Inspector::messageLevelValue):
2601         * inspector/protocol/Console.json:
2602         * runtime/ConsoleClient.cpp:
2603         (JSC::appendMessagePrefix):
2604         * runtime/ConsolePrototype.cpp:
2605         (JSC::ConsolePrototype::finishCreation):
2606         (JSC::consoleProtoFuncInfo):
2607         * runtime/ConsoleTypes.h:
2608
2609 2015-04-30  Filip Pizlo  <fpizlo@apple.com>
2610
2611         Move all of the branchIs<type> helpers from SpeculativeJIT into AssemblyHelpers
2612         https://bugs.webkit.org/show_bug.cgi?id=144462
2613
2614         Reviewed by Geoffrey Garen and Mark Lam.
2615         
2616         At some point we started adding representation-agnostic helpers for doing common type tests.
2617         We added some in SpeculativeJIT, and then some in AssemblyHelpers. Prior to this change,
2618         they had overlapping powers, though SpeculativeJIT was a bit better.
2619         
2620         This removes SpeculativeJIT's helpers and strengthens AssemblyHelpers' helpers. This is
2621         better because now all of these helpers can be used in all of the assembly-based JITs, not
2622         just the DFG. It also settles on what I find to be a slightly better naming convention.
2623         For example where we previously would have said branchIsString, now we say
2624         branchIfString. Similarly, branchNotString becomes branchIfNotString.
2625
2626         * dfg/DFGSpeculativeJIT.cpp:
2627         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectEquality):
2628         (JSC::DFG::SpeculativeJIT::compileValueToInt32):
2629         (JSC::DFG::SpeculativeJIT::compileInstanceOfForObject):
2630         (JSC::DFG::SpeculativeJIT::compileInstanceOf):
2631         (JSC::DFG::SpeculativeJIT::compileStringToUntypedEquality):
2632         (JSC::DFG::SpeculativeJIT::compileStringIdentToNotStringVarEquality):
2633         (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments):
2634         (JSC::DFG::SpeculativeJIT::compileToStringOrCallStringConstructorOnCell):
2635         (JSC::DFG::SpeculativeJIT::speculateObject):
2636         (JSC::DFG::SpeculativeJIT::speculateObjectOrOther):
2637         (JSC::DFG::SpeculativeJIT::speculateString):
2638         (JSC::DFG::SpeculativeJIT::speculateNotStringVar):
2639         (JSC::DFG::SpeculativeJIT::speculateNotCell):
2640         (JSC::DFG::SpeculativeJIT::speculateOther):
2641         (JSC::DFG::SpeculativeJIT::emitSwitchChar):
2642         (JSC::DFG::SpeculativeJIT::emitSwitchString):
2643         (JSC::DFG::SpeculativeJIT::branchIsObject): Deleted.
2644         (JSC::DFG::SpeculativeJIT::branchNotObject): Deleted.
2645         (JSC::DFG::SpeculativeJIT::branchIsString): Deleted.
2646         (JSC::DFG::SpeculativeJIT::branchNotString): Deleted.
2647         * dfg/DFGSpeculativeJIT.h:
2648         * dfg/DFGSpeculativeJIT32_64.cpp:
2649         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull):
2650         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull):
2651         (JSC::DFG::SpeculativeJIT::emitCall):
2652         (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
2653         (JSC::DFG::SpeculativeJIT::compileObjectEquality):
2654         (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality):
2655         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality):
2656         (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot):
2657         (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch):
2658         (JSC::DFG::SpeculativeJIT::compile):
2659         (JSC::DFG::SpeculativeJIT::branchIsCell): Deleted.
2660         (JSC::DFG::SpeculativeJIT::branchNotCell): Deleted.
2661         (JSC::DFG::SpeculativeJIT::branchIsOther): Deleted.
2662         (JSC::DFG::SpeculativeJIT::branchNotOther): Deleted.
2663         * dfg/DFGSpeculativeJIT64.cpp:
2664         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull):
2665         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull):
2666         (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
2667         (JSC::DFG::SpeculativeJIT::compileObjectEquality):
2668         (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality):
2669         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality):
2670         (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot):
2671         (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch):
2672         (JSC::DFG::SpeculativeJIT::compile):
2673         (JSC::DFG::SpeculativeJIT::writeBarrier):
2674         (JSC::DFG::SpeculativeJIT::branchIsCell): Deleted.
2675         (JSC::DFG::SpeculativeJIT::branchNotCell): Deleted.
2676         (JSC::DFG::SpeculativeJIT::branchIsOther): Deleted.
2677         (JSC::DFG::SpeculativeJIT::branchNotOther): Deleted.
2678         * jit/AssemblyHelpers.h:
2679         (JSC::AssemblyHelpers::branchIfCell):
2680         (JSC::AssemblyHelpers::branchIfOther):
2681         (JSC::AssemblyHelpers::branchIfNotOther):
2682         (JSC::AssemblyHelpers::branchIfObject):
2683         (JSC::AssemblyHelpers::branchIfNotObject):
2684         (JSC::AssemblyHelpers::branchIfType):
2685         (JSC::AssemblyHelpers::branchIfNotType):
2686         (JSC::AssemblyHelpers::branchIfString):
2687         (JSC::AssemblyHelpers::branchIfNotString):
2688         (JSC::AssemblyHelpers::branchIfSymbol):
2689         (JSC::AssemblyHelpers::branchIfNotSymbol):
2690         (JSC::AssemblyHelpers::branchIfFunction):
2691         (JSC::AssemblyHelpers::branchIfNotFunction):
2692         (JSC::AssemblyHelpers::branchIfEmpty):
2693         (JSC::AssemblyHelpers::branchIsEmpty): Deleted.
2694         (JSC::AssemblyHelpers::branchIfCellNotObject): Deleted.
2695         * jit/JITPropertyAccess.cpp:
2696         (JSC::JIT::emitScopedArgumentsGetByVal):
2697
2698 2015-04-30  Filip Pizlo  <fpizlo@apple.com>
2699
2700         js/regress/is-string-fold-tricky.html and js/regress/is-string-fold.html are crashing
2701         https://bugs.webkit.org/show_bug.cgi?id=144463
2702
2703         Reviewed by Benjamin Poulain.
2704         
2705         Fixup phase was super cleverly folding an IsString(@x) when @x is predicted SpecString
2706         into a Check(String:@x) followed by JSConstant(true). Then in these tests the
2707         ValueAdd(IsString(@x), @stuff) would try to turn this into an integer add by cleverly
2708         converting the boolean into an integer. But as part of doing that, it would try to
2709         short-circuit any profiling by leveraging the fact that the IsString is now a constant,
2710         and it would try to figure out if the addition might overflow. Part of that logic
2711         involved checking if the immediate is either a boolean or a sufficiently small integer.
2712         But: it would check if it's a sufficiently small integer before checking if it was a
2713         boolean, so it would try to call asNumber() on the boolean.
2714         
2715         All of this cleverness was very deliberate, but apparently the @stuff + booleanConstant
2716         case was previously never hit until I wrote these tests, and so we never knew that
2717         calling asNumber() on a boolean was wrong.
2718         
2719         The fix is super simple: the expression should just check for boolean first.
2720         
2721         This bug was benign in release builds. JSValue::asNumber() on a boolean would return
2722         garbage, and that's OK, since we'd take the boolean case anyway.
2723
2724         * dfg/DFGGraph.h:
2725         (JSC::DFG::Graph::addImmediateShouldSpeculateInt32):
2726
2727 2015-04-30  Filip Pizlo  <fpizlo@apple.com>
2728
2729         Unreviewed, add a FIXME comment referencing https://bugs.webkit.org/show_bug.cgi?id=144458.
2730
2731         * jit/JITOperations.cpp:
2732
2733 2015-04-30  Filip Pizlo  <fpizlo@apple.com>
2734
2735         Add a comment clarifying the behavior and semantics of getCallData/getConstructData, in
2736         particular that they cannot change their minds and may be called from compiler threads.
2737
2738         Rubber stamped by Geoffrey Garen.
2739
2740         * runtime/JSCell.h:
2741
2742 2015-04-29  Filip Pizlo  <fpizlo@apple.com>
2743
2744         DFG Is<Blah> versions of TypeOf should fold based on proven input type
2745         https://bugs.webkit.org/show_bug.cgi?id=144409
2746
2747         Reviewed by Geoffrey Garen.
2748         
2749         We were missing some obvious folding opportunities here. I don't know how this affects real
2750         code, but in general, we like to ensure that our constant folding is comprehensive. So this
2751         is more about placating my static analysis OCD than anything else.
2752         
2753         I added a bunch of speed/correctness tests for this in LayoutTests/js/regress.
2754
2755         * dfg/DFGAbstractInterpreterInlines.h:
2756         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2757
2758 2015-04-30  Yusuke Suzuki  <utatane.tea@gmail.com>
2759
2760         Use the default hash value for Symbolized StringImpl
2761         https://bugs.webkit.org/show_bug.cgi?id=144347
2762
2763         Reviewed by Darin Adler.
2764
2765         Before this patch, symbolized StringImpl* has a special hash value
2766         to avoid the hash collision with the other normal StringImpl*.
2767         I guess that it is introduced when private symbols are introduced.
2768         However, it prevents using symbolized StringImpl* in the other place
2769         For example, using it as WTFString cause a problem because of its special hash value.
2770
2771         When only using private symbols, they are not exposed to the outside of JSC,
2772         so we can handle it carefully. But now, it's extended to symbols.
2773         So I think storing a special hash value in StringImpl* causes an error.
2774
2775         To avoid this, I propose using the usual hash value in symbolized StringImpl*.
2776         And to provide significantly different hash value when using it as symbol,
2777         store the additional hash value in symbolized StringImpl*. It is used when
2778         the hash value is required by IdentifierRepHash.
2779
2780         * runtime/Identifier.h:
2781         (JSC::IdentifierRepHash::hash):
2782         * runtime/Lookup.h:
2783         (JSC::HashTable::entry):
2784         * runtime/PropertyMapHashTable.h:
2785         (JSC::PropertyTable::find):
2786         (JSC::PropertyTable::get):
2787         * runtime/Structure.cpp:
2788         (JSC::PropertyTable::checkConsistency):
2789
2790 2015-04-29  Benjamin Poulain  <bpoulain@apple.com>
2791
2792         [JSC] Remove RageConvert array conversion
2793         https://bugs.webkit.org/show_bug.cgi?id=144433
2794
2795         Reviewed by Filip Pizlo.
2796
2797         RageConvert was causing a subtle bug that was hitting the Kraken crypto tests
2798         pretty hard:
2799         -The indexing types shows that the array access varies between Int32 and DoubleArray.
2800         -ArrayMode::fromObserved() decided to use the most generic type: DoubleArray.
2801          An Arrayify node would convert the Int32 to that type.
2802         -Somewhere, a GetByVal or PutByVal would have the flag NodeBytecodeUsesAsInt. That
2803          node would use RageConvert instead of Convert.
2804         -The Arrayify for that GetByVal with RageConvert would not convert the array to
2805          Contiguous.
2806         -All the following array access that do not have the flag NodeBytecodeUsesAsInt would
2807          now expect a DoubleArray and always get a Contiguous Array. The CheckStructure
2808          fail systematically and we never get to run the later code.
2809
2810         Getting rid of RageConvert fixes the problem and does not seems to have any
2811         negative side effect on other benchmarks.
2812
2813         The improvments on Kraken are:
2814             -stanford-crypto-aes: definitely 1.0915x faster.
2815             -stanford-crypto-pbkdf2: definitely 1.2446x faster.
2816             -stanford-crypto-sha256-iterative: definitely 1.0544x faster.
2817
2818         * dfg/DFGAbstractInterpreterInlines.h:
2819         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2820         * dfg/DFGArrayMode.cpp:
2821         (JSC::DFG::ArrayMode::refine):
2822         (JSC::DFG::arrayConversionToString):
2823         * dfg/DFGArrayMode.h:
2824         * dfg/DFGArrayifySlowPathGenerator.h:
2825         * dfg/DFGFixupPhase.cpp:
2826         (JSC::DFG::FixupPhase::fixupNode):
2827         * dfg/DFGOperations.cpp:
2828         * dfg/DFGOperations.h:
2829         * dfg/DFGPredictionPropagationPhase.cpp:
2830         (JSC::DFG::PredictionPropagationPhase::propagate):
2831         * dfg/DFGTypeCheckHoistingPhase.cpp:
2832         (JSC::DFG::TypeCheckHoistingPhase::identifyRedundantStructureChecks):
2833         * ftl/FTLLowerDFGToLLVM.cpp:
2834         (JSC::FTL::LowerDFGToLLVM::compileArrayifyToStructure):
2835         * runtime/JSObject.cpp:
2836         (JSC::JSObject::convertDoubleToContiguous):
2837         (JSC::JSObject::ensureContiguousSlow):
2838         (JSC::JSObject::genericConvertDoubleToContiguous): Deleted.
2839         (JSC::JSObject::rageConvertDoubleToContiguous): Deleted.
2840         (JSC::JSObject::rageEnsureContiguousSlow): Deleted.
2841         * runtime/JSObject.h:
2842         (JSC::JSObject::rageEnsureContiguous): Deleted.
2843
2844 2015-04-29  Joseph Pecoraro  <pecoraro@apple.com>
2845
2846         Gracefully handle missing auto pause key on remote inspector setup
2847         https://bugs.webkit.org/show_bug.cgi?id=144411
2848
2849         Reviewed by Timothy Hatcher.
2850
2851         * inspector/remote/RemoteInspector.mm:
2852         (Inspector::RemoteInspector::receivedSetupMessage):
2853
2854 2015-04-29  Joseph Pecoraro  <pecoraro@apple.com>
2855
2856         NodeList has issues with Symbol and empty string
2857         https://bugs.webkit.org/show_bug.cgi?id=144310
2858
2859         Reviewed by Darin Adler.
2860
2861         * runtime/PropertyName.h:
2862         (JSC::PropertyName::isSymbol):
2863         Helper to check if the PropertyName is a string or symbol property.
2864
2865 2015-04-29  Alex Christensen  <achristensen@webkit.org>
2866
2867         Fix non-cygwin incremental builds on Windows.
2868         https://bugs.webkit.org/show_bug.cgi?id=143264
2869
2870         Reviewed by Brent Fulgham.
2871
2872         * generate-js-builtins:
2873         Remove stale headers before calling os.rename to replace them.
2874
2875 2015-04-29  Filip Pizlo  <fpizlo@apple.com>
2876
2877         JSTypeInfo should have an inline type flag to indicate of getCallData() has been overridden
2878         https://bugs.webkit.org/show_bug.cgi?id=144397
2879
2880         Reviewed by Andreas Kling.
2881         
2882         Add the flag to JSTypeInfo. It's an inline flag so that it's fast to query. Slap the flag on
2883         callback objects and internal functions. Modify the TypeOf operation to use this flag to avoid
2884         making a getCallData() call if it isn't necessary.
2885
2886         * API/JSCallbackObject.h:
2887         * runtime/InternalFunction.h:
2888         * runtime/JSTypeInfo.h:
2889         (JSC::TypeInfo::typeOfShouldCallGetCallData):
2890         * runtime/Operations.cpp:
2891         (JSC::jsTypeStringForValue):
2892         * tests/stress/type-of-functions-and-objects.js: Added.
2893         (foo):
2894         (bar):
2895         (baz):
2896         (fuzz):
2897         (expect):
2898         (test):
2899
2900 2015-04-28  Geoffrey Garen  <ggaren@apple.com>
2901
2902         It shouldn't take 1846 lines of code and 5 FIXMEs to sort an array.
2903         https://bugs.webkit.org/show_bug.cgi?id=144013
2904
2905         Reviewed by Mark Lam.
2906
2907         This patch implements Array.prototype.sort in JavaScript, removing the
2908         C++ implementations. It is simpler and less error-prone to express our
2909         operations in JavaScript, which provides memory safety, exception safety,
2910         and recursion safety.
2911
2912         The performance result is mixed, but net positive in my opinion. It's
2913         difficult to enumerate all the results, since we used to have so many
2914         different sorting modes, and there are lots of different data patterns
2915         across which you might want to measure sorting. Suffice it to say:
2916
2917             (*) The benchmarks we track are faster or unchanged.
2918
2919             (*) Sorting random input using a comparator -- which we think is
2920             common -- is 3X faster.
2921
2922             (*) Sorting random input in a non-array object -- which jQuery does
2923             -- is 4X faster.
2924
2925             (*) Sorting random input in a compact array of integers using a
2926             trivial pattern-matchable comparator is 2X *slower*.
2927
2928         * builtins/Array.prototype.js:
2929         (sort.min):
2930         (sort.stringComparator):
2931         (sort.compactSparse): Special case compaction for sparse arrays because
2932         we don't want to hang when sorting new Array(BIG).
2933
2934         (sort.compact):
2935         (sort.merge):
2936         (sort.mergeSort): Use merge sort because it's a reasonably efficient
2937         stable sort. We have evidence that some sites depend on stable sort,
2938         even though the ES6 spec does not mandate it. (See
2939         <http://trac.webkit.org/changeset/33967>.)
2940
2941         This is a textbook implementation of merge sort with three optimizations:
2942
2943             (1) Use iteration instead of recursion;
2944
2945             (2) Use array subscripting instead of array copying in order to
2946             create logical sub-lists without creating physical sub-lists;
2947
2948             (3) Swap src and dst at each iteration instead of copying src into
2949             dst, and only copy src into the subject array at the end if src is
2950             not the subject array.
2951
2952         (sort.inflate):
2953         (sort.comparatorSort):
2954         (sort): Sort in JavaScript for the win.
2955
2956         * builtins/BuiltinExecutables.cpp:
2957         (JSC::BuiltinExecutables::createExecutableInternal): Allow non-private
2958         names so we can use helper functions.
2959
2960         * bytecode/CodeBlock.h:
2961         (JSC::CodeBlock::isNumericCompareFunction): Deleted.
2962         * bytecode/UnlinkedCodeBlock.cpp:
2963         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
2964         * bytecode/UnlinkedCodeBlock.h:
2965         (JSC::UnlinkedCodeBlock::setIsNumericCompareFunction): Deleted.
2966         (JSC::UnlinkedCodeBlock::isNumericCompareFunction): Deleted.
2967         * bytecompiler/BytecodeGenerator.cpp:
2968         (JSC::BytecodeGenerator::setIsNumericCompareFunction): Deleted.
2969         * bytecompiler/BytecodeGenerator.h:
2970         * bytecompiler/NodesCodegen.cpp:
2971         (JSC::FunctionNode::emitBytecode): We don't do this special casing based
2972         on pattern matching anymore. This was mainly an optimization to avoid 
2973         the overhead of calling from C++ to JS, which we now avoid by
2974         sorting in JS.
2975
2976         * heap/Heap.cpp:
2977         (JSC::Heap::markRoots):
2978         (JSC::Heap::pushTempSortVector): Deleted.
2979         (JSC::Heap::popTempSortVector): Deleted.
2980         (JSC::Heap::visitTempSortVectors): Deleted.
2981         * heap/Heap.h: We don't have temp sort vectors anymore because we sort
2982         in JavaScript using a normal JavaScript array for our temporary storage.
2983
2984         * parser/Parser.cpp:
2985         (JSC::Parser<LexerType>::parseInner): Allow capturing so we can use
2986         helper functions.
2987
2988         * runtime/ArrayPrototype.cpp:
2989         (JSC::isNumericCompareFunction): Deleted.
2990         (JSC::attemptFastSort): Deleted.
2991         (JSC::performSlowSort): Deleted.
2992         (JSC::arrayProtoFuncSort): Deleted.
2993
2994         * runtime/CommonIdentifiers.h: New strings used by sort.
2995
2996         * runtime/JSArray.cpp:
2997         (JSC::compareNumbersForQSortWithInt32): Deleted.
2998         (JSC::compareNumbersForQSortWithDouble): Deleted.
2999         (JSC::compareNumbersForQSort): Deleted.
3000         (JSC::compareByStringPairForQSort): Deleted.
3001         (JSC::JSArray::sortNumericVector): Deleted.
3002         (JSC::JSArray::sortNumeric): Deleted.
3003         (JSC::ContiguousTypeAccessor::getAsValue): Deleted.
3004         (JSC::ContiguousTypeAccessor::setWithValue): Deleted.
3005         (JSC::ContiguousTypeAccessor::replaceDataReference): Deleted.
3006         (JSC::ContiguousTypeAccessor<ArrayWithDouble>::getAsValue): Deleted.
3007         (JSC::ContiguousTypeAccessor<ArrayWithDouble>::setWithValue): Deleted.
3008         (JSC::ContiguousTypeAccessor<ArrayWithDouble>::replaceDataReference): Deleted.
3009         (JSC::JSArray::sortCompactedVector): Deleted.
3010         (JSC::JSArray::sort): Deleted.
3011         (JSC::AVLTreeAbstractorForArrayCompare::get_less): Deleted.
3012         (JSC::AVLTreeAbstractorForArrayCompare::set_less): Deleted.
3013         (JSC::AVLTreeAbstractorForArrayCompare::get_greater): Deleted.
3014         (JSC::AVLTreeAbstractorForArrayCompare::set_greater): Deleted.
3015         (JSC::AVLTreeAbstractorForArrayCompare::get_balance_factor): Deleted.
3016         (JSC::AVLTreeAbstractorForArrayCompare::set_balance_factor): Deleted.
3017         (JSC::AVLTreeAbstractorForArrayCompare::compare_key_key): Deleted.
3018         (JSC::AVLTreeAbstractorForArrayCompare::compare_key_node): Deleted.
3019         (JSC::AVLTreeAbstractorForArrayCompare::compare_node_node): Deleted.
3020         (JSC::AVLTreeAbstractorForArrayCompare::null): Deleted.
3021         (JSC::JSArray::sortVector): Deleted.
3022         (JSC::JSArray::compactForSorting): Deleted.
3023         * runtime/JSArray.h:
3024
3025         * runtime/JSGlobalObject.cpp:
3026         (JSC::JSGlobalObject::init):
3027         * runtime/ObjectConstructor.cpp:
3028         (JSC::ObjectConstructor::finishCreation): Provide some builtins used
3029         by sort.
3030
3031 2015-04-29  Mark Lam  <mark.lam@apple.com>
3032
3033         Safari WebKit crash when loading Google Spreadsheet.
3034         https://bugs.webkit.org/show_bug.cgi?id=144020
3035
3036         Reviewed by Filip Pizlo.
3037
3038         The bug is that the object allocation sinking phase did not account for a case
3039         where a property of a sunken object is only initialized on one path and not
3040         another.  As a result, on the path where the property is not initialized, we'll
3041         encounter an Upsilon with a BottomValue (which is not allowed by definition).
3042
3043         The fix is to use a JSConstant(undefined) as the bottom value instead (of
3044         BottomValue).  If the property is uninitialized, it should still be accessible
3045         and have the value undefined.
3046
3047         * dfg/DFGObjectAllocationSinkingPhase.cpp:
3048         (JSC::DFG::ObjectAllocationSinkingPhase::promoteSunkenFields):
3049         * tests/stress/object-allocation-sinking-with-uninitialized-property-on-one-path.js: Added.
3050         (foo):
3051         (foo2):
3052
3053 2015-04-29  Yusuke Suzuki  <utatane.tea@gmail.com>
3054
3055         REGRESSION (r183373): ASSERT failed in wtf/SHA1.h
3056         https://bugs.webkit.org/show_bug.cgi?id=144257
3057
3058         Reviewed by Darin Adler.
3059
3060         SHA1 is used to calculate CodeBlockHash.
3061         To calculate hash value, we pass the source code UTF-8 CString to SHA1::addBytes.
3062         However, the source code can contain null character.
3063         So when performing `strlen` on the source code's CString, it returns the incorrect length.
3064         In SHA1::addBytes, there's assertion `input.length() == strlen(string)` and it fails.
3065
3066         In the template-literal-syntax.js, we perform `eval` with the script contains "\0".
3067         As the result, `strlen(string)` accidentally shortened by the contained "\0", and assertion fails.
3068
3069         CString will be changed not to contain a null-character[1]. However, inserting the assertion here
3070         is not correct. Because
3071
3072         1. If CString should not contain a null character, this should be asserted in CString side instead of SHA1::addBytes.
3073         2. If CString can contain a null character, this assertion becomes incorrect.
3074
3075         So this patch just drops the assertion.
3076
3077         In the current implementation, we once convert the entire source code to the newly allocated
3078         UTF-8 string and pass it to the SHA1 processing. However, this is memory consuming.
3079         Ideally, we should stream the decoded bytes into the SHA1 processing iteratively.
3080         We'll implement it in the separate patch[2].
3081
3082         [1]: https://bugs.webkit.org/show_bug.cgi?id=144339
3083         [2]: https://bugs.webkit.org/show_bug.cgi?id=144263
3084
3085         * tests/stress/eval-script-contains-null-character.js: Added.
3086         (shouldBe):
3087         (test):
3088         * tests/stress/template-literal-line-terminators.js:
3089         * tests/stress/template-literal-syntax.js:
3090         * tests/stress/template-literal.js:
3091
3092 2015-04-29  Filip Pizlo  <fpizlo@apple.com>
3093
3094         Evict IsEnvironmentRecord from inline type flags
3095         https://bugs.webkit.org/show_bug.cgi?id=144398
3096
3097         Reviewed by Mark Lam and Michael Saboff.
3098         
3099         In https://bugs.webkit.org/show_bug.cgi?id=144397, we'll need an extra bit in the inline
3100         type flags. This change picks the least important inline type flag - IsEnvironmentRecord -
3101         and evicts it into the out-of-line type flags. This change has no performance implications
3102         because we never even accessed IsEnvironmentRecord via the StructureIDBlob. The only place
3103         where we access it at all is in String.prototype.repeat, and there we already load the
3104         structure anyway.
3105
3106         * runtime/JSTypeInfo.h:
3107         (JSC::TypeInfo::implementsHasInstance):
3108         (JSC::TypeInfo::structureIsImmortal):
3109         (JSC::TypeInfo::isEnvironmentRecord):
3110
3111 2015-04-29  Darin Adler  <darin@apple.com>
3112
3113         [ES6] Implement Unicode code point escapes
3114         https://bugs.webkit.org/show_bug.cgi?id=144377
3115
3116         Reviewed by Antti Koivisto.
3117
3118         * parser/Lexer.cpp: Moved the UnicodeHexValue class in here from
3119         the header. Made it a non-member class so it doesn't need to be part
3120         of a template. Made it use UChar32 instead of int for the value to
3121         make it clearer what goes into this class.
3122         (JSC::ParsedUnicodeEscapeValue::isIncomplete): Added. Replaces the
3123         old type() function.
3124         (JSC::Lexer<CharacterType>::parseUnicodeEscape): Renamed from
3125         parseFourDigitUnicodeHex and added support for code point escapes.
3126         (JSC::isLatin1): Added an overload for UChar32.
3127         (JSC::isIdentStart): Changed this to take UChar32; no caller tries
3128         to call it with a UChar, so no need to overload for that type for now.
3129         (JSC::isNonLatin1IdentPart): Changed argument type to UChar32 for clarity.
3130         Also added FIXME about a subtle ES6 change that we might want to make later.
3131         (JSC::isIdentPart): Changed this to take UChar32; no caller tries
3132         to call it with a UChar, so no need to overload for that type for now.
3133         (JSC::isIdentPartIncludingEscapeTemplate): Made this a template so that we
3134         don't need to repeat the code twice. Added code to handle code point escapes.
3135         (JSC::isIdentPartIncludingEscape): Call the template instead of having the
3136         code in line.
3137         (JSC::Lexer<CharacterType>::recordUnicodeCodePoint): Added.
3138         (JSC::Lexer<CharacterType>::parseIdentifierSlowCase): Made small tweaks and
3139         updated to call parseUnicodeEscape instead of parseFourDigitUnicodeHex.
3140         (JSC::Lexer<CharacterType>::parseComplexEscape): Call parseUnicodeEscape
3141         instead of parseFourDigitUnicodeHex. Move the code to handle "\u" before
3142         the code that handles the escapes, since the code point escape code now
3143         consumes characters while parsing rather than peeking ahead. Test case
3144         covers this: Symptom would be that "\u{" would evaluate to "u" instead of
3145         giving a syntax error.
3146
3147         * parser/Lexer.h: Updated for above changes.
3148
3149         * runtime/StringConstructor.cpp:
3150         (JSC::stringFromCodePoint): Use ICU's UCHAR_MAX_VALUE instead of writing
3151         out 0x10FFFF; clearer this way.
3152
3153 2015-04-29  Martin Robinson  <mrobinson@igalia.com>
3154
3155         [CMake] [GTK] Organize and clean up unused CMake variables
3156         https://bugs.webkit.org/show_bug.cgi?id=144364
3157
3158         Reviewed by Gyuyoung Kim.
3159
3160         * PlatformGTK.cmake: Add variables specific to this project.
3161
3162 2015-04-28  Filip Pizlo  <fpizlo@apple.com>
3163
3164         TypeOf should return SpecStringIdent and the DFG should know this
3165         https://bugs.webkit.org/show_bug.cgi?id=144376
3166
3167         Reviewed by Andreas Kling.
3168         
3169         Make TypeOf return atomic strings. That's a simple change in SmallStrings.
3170         
3171         Make the DFG know this and use it for optimization. This makes Switch(TypeOf) a bit less
3172         bad.
3173
3174         * dfg/DFGAbstractInterpreterInlines.h:
3175         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3176         * dfg/DFGAbstractValue.cpp:
3177         (JSC::DFG::AbstractValue::setType):
3178         * dfg/DFGAbstractValue.h:
3179         (JSC::DFG::AbstractValue::setType):
3180         * dfg/DFGInPlaceAbstractState.cpp:
3181         (JSC::DFG::InPlaceAbstractState::initialize):
3182         * dfg/DFGPredictionPropagationPhase.cpp:
3183         (JSC::DFG::PredictionPropagationPhase::propagate):
3184         * runtime/SmallStrings.cpp:
3185         (JSC::SmallStrings::initialize):
3186         * tests/stress/switch-typeof-indirect.js: Added.
3187         (bar):
3188         (foo):
3189         (test):
3190         * tests/stress/switch-typeof-slightly-indirect.js: Added.
3191         (foo):
3192         (test):
3193         * tests/stress/switch-typeof.js: Added.
3194         (foo):
3195         (test):
3196
3197 2015-04-29  Joseph Pecoraro  <pecoraro@apple.com>
3198
3199         REGRESSION(181868): Windows Live SkyDrive cannot open an excel file
3200         https://bugs.webkit.org/show_bug.cgi?id=144373
3201
3202         Reviewed by Darin Adler.
3203
3204         Revert r181868 as it caused a failure on live.com. We can try
3205         re-enabling this exception after we make idl attributes configurable,
3206         which may have prevented this particular failure.
3207
3208         * runtime/ObjectPrototype.cpp:
3209         (JSC::objectProtoFuncDefineGetter):
3210         (JSC::objectProtoFuncDefineSetter):
3211
3212 2015-04-28  Joseph Pecoraro  <pecoraro@apple.com>
3213
3214         Deadlock on applications using JSContext on non-main thread
3215         https://bugs.webkit.org/show_bug.cgi?id=144370
3216
3217         Reviewed by Timothy Hatcher.
3218
3219         * inspector/remote/RemoteInspector.mm:
3220         (Inspector::RemoteInspector::singleton):
3221         Prevent a possible deadlock by assuming we can synchronously
3222         run something on the main queue at this time.
3223
3224 2015-04-28  Filip Pizlo  <fpizlo@apple.com>
3225
3226         FTL should fully support Switch (it currently lacks the SwitchString variant)
3227         https://bugs.webkit.org/show_bug.cgi?id=144348
3228
3229         Reviewed by Benjamin Poulain.
3230         
3231         This adds SwitchString support to the FTL. This is already tested by switch microbenchmarks
3232         in LayoutTests/js/regress.
3233
3234         * dfg/DFGCommon.cpp:
3235         (JSC::DFG::stringLessThan):
3236         * dfg/DFGCommon.h:
3237         * dfg/DFGOperations.cpp:
3238         * dfg/DFGOperations.h:
3239         * dfg/DFGSpeculativeJIT.cpp:
3240         (JSC::DFG::SpeculativeJIT::StringSwitchCase::operator<): Deleted.
3241         * dfg/DFGSpeculativeJIT.h:
3242         (JSC::DFG::SpeculativeJIT::StringSwitchCase::operator<):
3243         * ftl/FTLCapabilities.cpp:
3244         (JSC::FTL::canCompile):
3245         * ftl/FTLIntrinsicRepository.h:
3246         * ftl/FTLLowerDFGToLLVM.cpp:
3247         (JSC::FTL::LowerDFGToLLVM::compileSwitch):
3248         (JSC::FTL::LowerDFGToLLVM::switchString):
3249         (JSC::FTL::LowerDFGToLLVM::StringSwitchCase::StringSwitchCase):
3250         (JSC::FTL::LowerDFGToLLVM::StringSwitchCase::operator<):
3251         (JSC::FTL::LowerDFGToLLVM::CharacterCase::CharacterCase):
3252         (JSC::FTL::LowerDFGToLLVM::CharacterCase::operator<):
3253         (JSC::FTL::LowerDFGToLLVM::switchStringRecurse):
3254         (JSC::FTL::LowerDFGToLLVM::switchStringSlow):
3255         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
3256         * ftl/FTLOutput.cpp:
3257         (JSC::FTL::Output::check):
3258         * ftl/FTLOutput.h:
3259         * ftl/FTLWeight.h:
3260         (JSC::FTL::Weight::inverse):
3261         * jit/JITOperations.h:
3262
3263 2015-04-28  Michael Catanzaro  <mcatanzaro@igalia.com>
3264
3265         Fully replace ENABLE_LLINT_C_LOOP with ENABLE_JIT
3266         https://bugs.webkit.org/show_bug.cgi?id=144304
3267
3268         Reviewed by Geoffrey Garen.
3269
3270         * Configurations/FeatureDefines.xcconfig: Define ENABLE_JIT, enabled by default, instead of
3271         ENABLE_LLINT_C_LOOP, disabled by default.
3272         * llint/LLIntSlowPaths.cpp:
3273         (JSC::LLInt::LLINT_SLOW_PATH_DECL): Check ENABLE_JIT instead of ENABLE_LLINT_C_LOOP.
3274
3275 2015-04-28  Commit Queue  <commit-queue@webkit.org>
3276
3277         Unreviewed, rolling out r183514.
3278         https://bugs.webkit.org/show_bug.cgi?id=144359
3279
3280         It broke cloop test bots (Requested by mcatanzaro on #webkit).
3281
3282         Reverted changeset:
3283
3284         "Fully replace ENABLE_LLINT_C_LOOP with ENABLE_JIT"
3285         https://bugs.webkit.org/show_bug.cgi?id=144304
3286         http://trac.webkit.org/changeset/183514
3287
3288 2015-04-28  Michael Catanzaro  <mcatanzaro@igalia.com>
3289
3290         Fully replace ENABLE_LLINT_C_LOOP with ENABLE_JIT
3291         https://bugs.webkit.org/show_bug.cgi?id=144304
3292
3293         Reviewed by Geoffrey Garen.
3294
3295         * Configurations/FeatureDefines.xcconfig: Define ENABLE_JIT, enabled by default, instead of
3296         ENABLE_LLINT_C_LOOP, disabled by default.
3297         * llint/LLIntSlowPaths.cpp:
3298         (JSC::LLInt::LLINT_SLOW_PATH_DECL): Check ENABLE_JIT instead of ENABLE_LLINT_C_LOOP.
3299
3300 2015-04-28  Joseph Pecoraro  <pecoraro@apple.com>
3301
3302         Fix common typo "targetting" => "targeting"
3303         https://bugs.webkit.org/show_bug.cgi?id=144349
3304
3305         Reviewed by Daniel Bates.
3306
3307         * bytecode/ExecutionCounter.h:
3308
3309 2015-04-28  Yusuke Suzuki  <utatane.tea@gmail.com>
3310
3311         Update the features.json for WeakSet, WeakMap, Template literals, Tagged templates
3312         https://bugs.webkit.org/show_bug.cgi?id=144328
3313
3314         Reviewed by Andreas Kling.
3315
3316         Update the status of ES6 features.
3317
3318         * features.json:
3319
3320 2015-04-28  Filip Pizlo  <fpizlo@apple.com>
3321
3322         DFG should not use or preserve Phantoms during transformations
3323         https://bugs.webkit.org/show_bug.cgi?id=143736
3324
3325         Reviewed by Geoffrey Garen.
3326         
3327         Since http://trac.webkit.org/changeset/183207 and http://trac.webkit.org/changeset/183406, it is
3328         no longer necessary to preserve Phantoms during transformations. They are still useful just
3329         before FixupPhase to support backwards propagation analyses. They are still inserted late in the
3330         game in the DFG backend. But transformations don't need to worry about them. Inside a basic
3331         block, we can be sure that so long as the IR pinpoints the place where the value becomes
3332         available in a bytecode register (using MovHint) and so long as there is a SetLocal anytime some
3333         other block would need the value (either for OSR or for DFG execution), then we don't need any
3334         liveness markers.
3335         
3336         So, this removes any places where we inserted Phantoms just for liveness during transformation
3337         and it replaces convertToPhantom() with remove(), which just converts the node to a Check. A
3338         Check node only keeps its children so long as those children have checks.
3339         
3340         The fact that we no longer convertToPhantom() means that we have to be more careful when
3341         constant-folding GetLocal. Previously we would convertToPhantom() and use the fact that
3342         Phantom(Phi) was a valid construct. It's not valid anymore. So, when constant folding encounters
3343         a GetLocal it needs to insert a PhantomLocal directly. This allows us to simplify
3344         Graph::convertToConstant() a bit. Luckily, none of the other users of this method would see
3345         GetLocals.
3346         
3347         The only Phantom-like cruft left over after this patch is:
3348         
3349         - Phantoms before FixupPhase. I kind of like these. It means that before FixupPhase, we can do
3350           backwards analyses and rely on the fact that the users of a node in DFG IR are a superset of
3351           the users of the original local's live range in bytecode. This is essential for supporting our
3352           BackwardsPropagationPhase, which is an important optimization for things like asm.js.
3353         
3354         - PhantomLocals and GetLocals being NodeMustGenerate. See discussion in
3355           https://bugs.webkit.org/show_bug.cgi?id=144086. It appears that this is not as evil as the
3356           alternatives. The best long-term plan is to simply ditch the ThreadedCPS IR entirely and have
3357           the DFG use SSA. For now, so long as any new DFG optimizations we add are block-local and
3358           treat GetLocal/SetLocal conservatively, this should all be sound.
3359         
3360         This change should be perf-neutral although it does reduce the total work that the compiler
3361         does.
3362
3363         * CMakeLists.txt:
3364         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
3365         * JavaScriptCore.xcodeproj/project.pbxproj:
3366         * dfg/DFGAdjacencyList.h:
3367         (JSC::DFG::AdjacencyList::justChecks):
3368         * dfg/DFGArgumentsEliminationPhase.cpp:
3369         * dfg/DFGBasicBlock.cpp:
3370         (JSC::DFG::BasicBlock::replaceTerminal):
3371         * dfg/DFGBasicBlock.h:
3372         (JSC::DFG::BasicBlock::findTerminal):
3373         * dfg/DFGCFGSimplificationPhase.cpp:
3374         (JSC::DFG::CFGSimplificationPhase::keepOperandAlive):
3375         (JSC::DFG::CFGSimplificationPhase::mergeBlocks):
3376         * dfg/DFGCPSRethreadingPhase.cpp:
3377         (JSC::DFG::CPSRethreadingPhase::CPSRethreadingPhase):
3378         (JSC::DFG::CPSRethreadingPhase::clearVariables):
3379         (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor):
3380         (JSC::DFG::CPSRethreadingPhase::canonicalizeLocalsInBlock):
3381         * dfg/DFGCSEPhase.cpp:
3382         * dfg/DFGCleanUpPhase.cpp: Copied from Source/JavaScriptCore/dfg/DFGPhantomRemovalPhase.cpp.
3383         (JSC::DFG::CleanUpPhase::CleanUpPhase):
3384         (JSC::DFG::CleanUpPhase::run):
3385         (JSC::DFG::performCleanUp):
3386         (JSC::DFG::PhantomRemovalPhase::PhantomRemovalPhase): Deleted.
3387         (JSC::DFG::PhantomRemovalPhase::run): Deleted.
3388         (JSC::DFG::performPhantomRemoval): Deleted.
3389         * dfg/DFGCleanUpPhase.h: Copied from Source/JavaScriptCore/dfg/DFGPhantomRemovalPhase.h.
3390         * dfg/DFGConstantFoldingPhase.cpp:
3391         (JSC::DFG::ConstantFoldingPhase::foldConstants):
3392         (JSC::DFG::ConstantFoldingPhase::addBaseCheck):
3393         (JSC::DFG::ConstantFoldingPhase::fixUpsilons):
3394         * dfg/DFGDCEPhase.cpp:
3395         (JSC::DFG::DCEPhase::run):
3396         (JSC::DFG::DCEPhase::fixupBlock):
3397         (JSC::DFG::DCEPhase::cleanVariables):
3398         * dfg/DFGFixupPhase.cpp:
3399         (JSC::DFG::FixupPhase::fixupBlock):
3400         (JSC::DFG::FixupPhase::fixupNode):
3401         (JSC::DFG::FixupPhase::convertStringAddUse):
3402         (JSC::DFG::FixupPhase::attemptToMakeFastStringAdd):
3403         (JSC::DFG::FixupPhase::checkArray):
3404         (JSC::DFG::FixupPhase::fixIntConvertingEdge):
3405         (JSC::DFG::FixupPhase::fixIntOrBooleanEdge):
3406         (JSC::DFG::FixupPhase::fixDoubleOrBooleanEdge):
3407         (JSC::DFG::FixupPhase::injectTypeConversionsInBlock):
3408         (JSC::DFG::FixupPhase::tryToRelaxRepresentation):
3409         (JSC::DFG::FixupPhase::injectTypeConversionsForEdge):
3410         (JSC::DFG::FixupPhase::addRequiredPhantom): Deleted.
3411         (JSC::DFG::FixupPhase::addPhantomsIfNecessary): Deleted.
3412         * dfg/DFGGraph.cpp:
3413         (JSC::DFG::Graph::convertToConstant):
3414         (JSC::DFG::Graph::mergeRelevantToOSR): Deleted.
3415         * dfg/DFGGraph.h:
3416         * dfg/DFGInsertionSet.h:
3417         (JSC::DFG::InsertionSet::insertCheck):
3418         * dfg/DFGIntegerCheckCombiningPhase.cpp:
3419         (JSC::DFG::IntegerCheckCombiningPhase::handleBlock):
3420         * dfg/DFGLICMPhase.cpp:
3421         (JSC::DFG::LICMPhase::attemptHoist):
3422         * dfg/DFGNode.cpp:
3423         (JSC::DFG::Node::remove):
3424         * dfg/DFGNode.h:
3425         (JSC::DFG::Node::replaceWith):
3426         (JSC::DFG::Node::convertToPhantom): Deleted.
3427         (JSC::DFG::Node::convertToCheck): Deleted.
3428         (JSC::DFG::Node::willHaveCodeGenOrOSR): Deleted.
3429         * dfg/DFGNodeFlags.h:
3430         * dfg/DFGNodeType.h:
3431         * dfg/DFGObjectAllocationSinkingPhase.cpp:
3432         (JSC::DFG::ObjectAllocationSinkingPhase::lowerNonReadingOperationsOnPhantomAllocations):
3433         (JSC::DFG::ObjectAllocationSinkingPhase::handleNode):
3434         * dfg/DFGPhantomCanonicalizationPhase.cpp: Removed.
3435         * dfg/DFGPhantomCanonicalizationPhase.h: Removed.
3436         * dfg/DFGPhantomRemovalPhase.cpp: Removed.
3437         * dfg/DFGPhantomRemovalPhase.h: Removed.
3438         * dfg/DFGPlan.cpp:
3439         (JSC::DFG::Plan::compileInThreadImpl):
3440         * dfg/DFGPutStackSinkingPhase.cpp:
3441         * dfg/DFGResurrectionForValidationPhase.cpp: Removed.
3442         * dfg/DFGResurrectionForValidationPhase.h: Removed.
3443         * dfg/DFGSSAConversionPhase.cpp:
3444         (JSC::DFG::SSAConversionPhase::run):
3445         * dfg/DFGSpeculativeJIT64.cpp:
3446         (JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
3447         * dfg/DFGStoreBarrierElisionPhase.cpp:
3448         (JSC::DFG::StoreBarrierElisionPhase::elideBarrier):
3449         * dfg/DFGStrengthReductionPhase.cpp:
3450         (JSC::DFG::StrengthReductionPhase::handleNode):
3451         (JSC::DFG::StrengthReductionPhase::convertToIdentityOverChild):
3452         * dfg/DFGValidate.cpp:
3453         (JSC::DFG::Validate::validate):
3454         (JSC::DFG::Validate::validateCPS):
3455         (JSC::DFG::Validate::validateSSA):
3456         * dfg/DFGVarargsForwardingPhase.cpp:
3457         * ftl/FTLLink.cpp:
3458         (JSC::FTL::link):
3459         * ftl/FTLLowerDFGToLLVM.cpp:
3460         (JSC::FTL::LowerDFGToLLVM::compileNode):
3461         (JSC::FTL::LowerDFGToLLVM::compileNoOp):
3462         (JSC::FTL::LowerDFGToLLVM::compilePhantom): Deleted.
3463
3464 2015-04-28  Andreas Kling  <akling@apple.com>
3465
3466         DFG+FTL should generate efficient code for branching on a string's boolean value.
3467         <https://webkit.org/b/144317>
3468
3469         Reviewed by Geoff Garen & Filip Pizlo
3470
3471         Teach Branch nodes about StringUse and have them generate an efficient zero-length string check
3472         instead of dropping out to C++ whenever we branch on a string.
3473
3474         The FTL JIT already handled Branch nodes with StringUse through its use of boolify(), so only
3475         the DFG JIT gets some new codegen logic in this patch.
3476
3477         Test: js/regress/branch-on-string-as-boolean.js (~4.5x speedup)
3478
3479         * dfg/DFGFixupPhase.cpp:
3480         (JSC::DFG::FixupPhase::fixupNode):
3481         * dfg/DFGSpeculativeJIT.cpp:
3482         (JSC::DFG::SpeculativeJIT::emitStringBranch):
3483         * dfg/DFGSpeculativeJIT.h:
3484         * dfg/DFGSpeculativeJIT32_64.cpp:
3485         (JSC::DFG::SpeculativeJIT::emitBranch):
3486         * dfg/DFGSpeculativeJIT64.cpp:
3487         (JSC::DFG::SpeculativeJIT::emitBranch):
3488
3489 2015-04-28  Filip Pizlo  <fpizlo@apple.com>
3490
3491         VarargsForwardingPhase should only consider MovHints that have the candidate as a child
3492         https://bugs.webkit.org/show_bug.cgi?id=144340
3493
3494         Reviewed by Michael Saboff and Mark Lam.
3495         
3496         Since we were considering all MovHints, we'd assume that the CreateDirectArguments or
3497         CreateClosedArguments node was live so long as any MovHinted bytecode variable was alive.
3498         Basically, we'd keep it alive until the end of the block. This maximized the chances of
3499         there being an interfering operation, which would prevent elimination.
3500         
3501         The fix is to only consider MovHints that have the arguments candidate as a child. We only
3502         care to track the liveness of those bytecode locals that would need an arguments object
3503         recovery on OSR exit.
3504         
3505         This is a speed-up on V8Spider/raytrace and Octane/raytrace because it undoes the regression
3506         introduced in http://trac.webkit.org/changeset/183406.
3507
3508         * dfg/DFGVarargsForwardingPhase.cpp:
3509
3510 2015-04-28  Csaba Osztrogonác  <ossy@webkit.org>
3511
3512         Remove WinCE cruft from cmake build system
3513         https://bugs.webkit.org/show_bug.cgi?id=144325
3514
3515         Reviewed by Gyuyoung Kim.
3516
3517         * CMakeLists.txt:
3518         * create_jit_stubs: Removed.
3519
3520 2015-04-27  Andreas Kling  <akling@apple.com>
3521
3522         RegExp matches arrays should use contiguous indexing.
3523         <https://webkit.org/b/144286>
3524
3525         Reviewed by Geoffrey Garen.
3526
3527         We had a custom Structure being used for RegExp matches arrays that would
3528         put the arrays into SlowPutArrayStorageShape mode. This was just left
3529         from when matches arrays were custom, lazily initialized objects.
3530
3531         This change removes that Structure and switches the matches arrays to
3532         using the default ContiguousShape Structure. This allows the FTL JIT
3533         to compile the inner loop of the Octane/regexp benchmark.
3534
3535         Also made a version of initializeIndex() [inline] that takes the indexing
3536         type in an argument, allowing createRegExpMatchesArray() to initialize
3537         the entire array without branching on the indexing type for each entry.
3538
3539         ~3% progression on Octane/regexp.
3540
3541         * runtime/JSGlobalObject.cpp:
3542         (JSC::JSGlobalObject::init):
3543         (JSC::JSGlobalObject::visitChildren):
3544         * runtime/JSGlobalObject.h:
3545         (JSC::JSGlobalObject::mapStructure):
3546         (JSC::JSGlobalObject::regExpMatchesArrayStructure): Deleted.
3547         * runtime/JSObject.h:
3548         (JSC::JSObject::initializeIndex):
3549         * runtime/RegExpMatchesArray.cpp:
3550         (JSC::createRegExpMatchesArray):
3551
3552 2015-04-27  Filip Pizlo  <fpizlo@apple.com>
3553
3554         FTL failed to initialize arguments.callee on the slow path as well as the fast path
3555         https://bugs.webkit.org/show_bug.cgi?id=144293
3556
3557         Reviewed by Mark Lam.
3558         
3559         The slow path doesn't fully initialize DirectArguments - it leaves callee blank. So, we need
3560         to initialize the callee on the common path after the fast and slow path.
3561
3562         * ftl/FTLLowerDFGToLLVM.cpp:
3563         (JSC::FTL::LowerDFGToLLVM::compileCreateDirectArguments):
3564         * tests/stress/arguments-callee-uninitialized.js: Added.
3565         (foo):
3566
3567 2015-04-27  Benjamin Poulain  <bpoulain@apple.com>
3568
3569         [JSC] Add support for typed arrays to the Array profiling
3570         https://bugs.webkit.org/show_bug.cgi?id=143913
3571
3572         Reviewed by Filip Pizlo.
3573
3574         This patch adds ArrayModes for every typed arrays. Having that information
3575         let us generate better GetByVal and PutByVal when the type speculation
3576         are not good enough.
3577
3578         A typical case where this is useful is any basic block for which the type
3579         of the object is always more restrictive than the speculation (for example, 
3580         a basic block gated by a branch only taken for on type).
3581
3582         * bytecode/ArrayProfile.cpp:
3583         (JSC::dumpArrayModes):
3584         * bytecode/ArrayProfile.h:
3585         (JSC::arrayModeFromStructure):
3586         * dfg/DFGArrayMode.cpp:
3587         (JSC::DFG::ArrayMode::fromObserved):
3588         (JSC::DFG::ArrayMode::refine):
3589         Maintain the refine() semantic. We do not support OutOfBounds access
3590         for GetByVal on typed array.
3591
3592         * runtime/IndexingType.h:
3593         * tests/stress/typed-array-get-by-val-profiling.js: Added.
3594         (testArray.testCode):
3595         (testArray):
3596         * tests/stress/typed-array-put-by-val-profiling.js: Added.
3597         (testArray.testCode):
3598         (testArray):
3599
3600 2015-04-27  Filip Pizlo  <fpizlo@apple.com>
3601
3602         Unreviewed, roll out r183438 "RegExp matches arrays should use contiguous indexing". It
3603         causes many debug test failures.
3604
3605         * runtime/JSGlobalObject.cpp:
3606         (JSC::JSGlobalObject::init):
3607         (JSC::JSGlobalObject::visitChildren):
3608         * runtime/JSGlobalObject.h:
3609         (JSC::JSGlobalObject::regExpMatchesArrayStructure):
3610         * runtime/JSObject.h:
3611         (JSC::JSObject::initializeIndex):
3612         * runtime/RegExpMatchesArray.cpp:
3613         (JSC::createRegExpMatchesArray):
3614
3615 2015-04-27  Andreas Kling  <akling@apple.com>
3616
3617         RegExp matches arrays should use contiguous indexing.
3618         <https://webkit.org/b/144286>
3619
3620         Reviewed by Geoffrey Garen.
3621
3622         We had a custom Structure being used for RegExp matches arrays that would
3623         put the arrays into SlowPutArrayStorageShape mode. This was just left
3624         from when matches arrays were custom, lazily initialized objects.
3625
3626         This change removes that Structure and switches the matches arrays to
3627         using the default ContiguousShape Structure. This allows the FTL JIT
3628         to compile the inner loop of the Octane/regexp benchmark.
3629
3630         Also made a version of initializeIndex() [inline] that takes the indexing
3631         type in an argument, allowing createRegExpMatchesArray() to initialize
3632         the entire array without branching on the indexing type for each entry.
3633
3634         ~3% progression on Octane/regexp.
3635
3636         * runtime/JSGlobalObject.cpp:
3637         (JSC::JSGlobalObject::init):
3638         (JSC::JSGlobalObject::visitChildren):
3639         * runtime/JSGlobalObject.h:
3640         (JSC::JSGlobalObject::mapStructure):
3641         (JSC::JSGlobalObject::regExpMatchesArrayStructure): Deleted.
3642         * runtime/JSObject.h:
3643         (JSC::JSObject::initializeIndex):
3644         * runtime/RegExpMatchesArray.cpp:
3645         (JSC::createRegExpMatchesArray):
3646
3647 2015-04-27  Ryosuke Niwa  <rniwa@webkit.org>
3648
3649         REGRESSION (r183373): ASSERT failed in wtf/SHA1.h
3650         https://bugs.webkit.org/show_bug.cgi?id=144257
3651
3652         Temporarily disable skip these tests.
3653
3654         * tests/stress/template-literal-line-terminators.js:
3655         * tests/stress/template-literal-syntax.js:
3656         * tests/stress/template-literal.js:
3657
3658 2015-04-27  Basile Clement  <basile_clement@apple.com>
3659
3660         Function allocations shouldn't sink through Put operations
3661         https://bugs.webkit.org/show_bug.cgi?id=144176
3662
3663         Reviewed by Filip Pizlo.
3664
3665         By design, we don't support function allocation sinking through any
3666         related operation ; however object allocation can sink through PutByOffset et
3667         al.
3668
3669         Currently, the checks to prevent function allocation to sink through
3670         these are misguided and do not prevent anything ; function allocation sinking
3671         through these operations is prevented as a side effect of requiring an
3672         AllocatePropertyStorage through which the function allocation is seen as
3673         escaping.
3674
3675         This changes it so that ObjectAllocationSinkingPhase::handleNode()
3676         checks properly that only object allocations sink through related write
3677         operations.
3678
3679         * dfg/DFGObjectAllocationSinkingPhase.cpp:
3680         (JSC::DFG::ObjectAllocationSinkingPhase::lowerNonReadingOperationsOnPhantomAllocations):
3681         (JSC::DFG::ObjectAllocationSinkingPhase::handleNode):
3682
3683 2015-04-25  Filip Pizlo  <fpizlo@apple.com>
3684
3685         VarargsForwardingPhase should use bytecode liveness in addition to other uses to determine the last point that a candidate is used
3686         https://bugs.webkit.org/show_bug.cgi?id=143843
3687
3688         Reviewed by Geoffrey Garen.
3689         
3690         It will soon come to pass that Phantom isn't available at the time that
3691         VarargsForwardingPhase runs. So, it needs to use some other mechanism for discovering when
3692         a value dies for OSR.
3693         
3694         This is simplified by two things:
3695         
3696         1) The bytecode kill analysis is now reusable. This patch makes it even more reusable than
3697            before by polishing the API.
3698         
3699         2) This phase already operates on one node at a time and allows itself to do a full search
3700            of the enclosing basic block for that node. This is fine because CreateDirectArguments
3701            and friends is a rarely occurring node. The fact that it operates on one node at a time
3702            makes it even easier to reason about OSR liveness - we just track the list of locals in
3703            which it is live.
3704         
3705         This change has no effect right now but it is a necessary prerequisite to implementing
3706         https://bugs.webkit.org/show_bug.cgi?id=143736.
3707
3708         * dfg/DFGBasicBlock.h:
3709         (JSC::DFG::BasicBlock::tryAt):
3710         * dfg/DFGForAllKills.h:
3711         (JSC::DFG::forAllKilledOperands):
3712         * dfg/DFGPhantomInsertionPhase.cpp:
3713         * dfg/DFGVarargsForwardingPhase.cpp:
3714
3715 2015-04-27  Jordan Harband  <ljharb@gmail.com>
3716
3717         Map#entries and Map#keys error for non-Maps is swapped
3718         https://bugs.webkit.org/show_bug.cgi?id=144253
3719
3720         Reviewed by Simon Fraser.
3721
3722         Correcting error messages on Set/Map methods when called on
3723         incompatible objects.
3724
3725         * runtime/MapPrototype.cpp:
3726         (JSC::mapProtoFuncEntries):
3727         (JSC::mapProtoFuncKeys):
3728         * runtime/SetPrototype.cpp:
3729         (JSC::setProtoFuncEntries):
3730
3731 2015-04-24  Filip Pizlo  <fpizlo@apple.com>
3732
3733         Rationalize DFG DCE handling of nodes that perform checks that propagate through AI
3734         https://bugs.webkit.org/show_bug.cgi?id=144186
3735
3736         Reviewed by Geoffrey Garen.
3737         
3738         If I do ArithAdd(Int32Use, Int32Use, CheckOverflow) then AI will prove that this returns
3739         Int32. We may later perform code simplifications based on the proof that this is Int32, and
3740         we may kill all DFG users of this ArithAdd. Then we may prove that there is no exit site at
3741         which the ArithAdd is live. This seems like it is sufficient to then kill the ArithAdd,
3742         except that we still need the overflow check!
3743
3744         Previously we mishandled this:
3745
3746         - In places where we want the overflow check we need to use MustGenerate(@ArithAdd) as a hack
3747           to keep it alive. That's dirty and it's just indicative of a deeper issue.
3748
3749         - Our MovHint removal doesn't do Phantom canonicalization which essentially makes it
3750           powerless. This was sort of hiding the bug.
3751
3752         - Nodes that have checks that AI leverages should always be NodeMustGenerate. You can't kill
3753           something that you are relying on for subsequent simplifications.
3754         
3755         This fixes MovHint removal to also canonicalize Phantoms. This also adds ModeMustGenerate to
3756         nodes that may perform checks that are used by AI to guarantee the result type. As a result,
3757         we no longer need the weird MustGenerate node.
3758
3759         * dfg/DFGAbstractInterpreterInlines.h:
3760         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3761         * dfg/DFGArgumentsEliminationPhase.cpp:
3762         * dfg/DFGClobberize.h:
3763         (JSC::DFG::clobberize):
3764         * dfg/DFGDCEPhase.cpp:
3765         (JSC::DFG::DCEPhase::run):
3766         * dfg/DFGDoesGC.cpp:
3767         (JSC::DFG::doesGC):
3768         * dfg/DFGFixupPhase.cpp:
3769         (JSC::DFG::FixupPhase::fixupNode):
3770         (JSC::DFG::FixupPhase::tryToRelaxRepresentation):
3771         * dfg/DFGIntegerCheckCombiningPhase.cpp:
3772         (JSC::DFG::IntegerCheckCombiningPhase::handleBlock):
3773         (JSC::DFG::IntegerCheckCombiningPhase::insertMustAdd): Deleted.
3774         * dfg/DFGMayExit.cpp:
3775         (JSC::DFG::mayExit):
3776         * dfg/DFGNode.h:
3777         (JSC::DFG::Node::willHaveCodeGenOrOSR):
3778         * dfg/DFGNodeType.h:
3779         * dfg/DFGObjectAllocationSinkingPhase.cpp:
3780         (JSC::DFG::ObjectAllocationSinkingPhase::handleNode):
3781         * dfg/DFGPhantomCanonicalizationPhase.cpp:
3782         (JSC::DFG::PhantomCanonicalizationPhase::run):
3783         * dfg/DFGPhantomRemovalPhase.cpp:
3784         (JSC::DFG::PhantomRemovalPhase::run):
3785         * dfg/DFGPlan.cpp:
3786         (JSC::DFG::Plan::compileInThreadImpl):
3787         * dfg/DFGPredictionPropagationPhase.cpp:
3788         (JSC::DFG::PredictionPropagationPhase::propagate):
3789         * dfg/DFGSafeToExecute.h:
3790         (JSC::DFG::safeToExecute):
3791         * dfg/DFGSpeculativeJIT32_64.cpp:
3792         (JSC::DFG::SpeculativeJIT::compile):
3793         * dfg/DFGSpeculativeJIT64.cpp:
3794         (JSC::DFG::SpeculativeJIT::compile):
3795         * dfg/DFGTypeCheckHoistingPhase.cpp:
3796         (JSC::DFG::TypeCheckHoistingPhase::identifyRedundantStructureChecks):
3797         (JSC::DFG::TypeCheckHoistingPhase::identifyRedundantArrayChecks):
3798         * dfg/DFGVarargsForwardingPhase.cpp:
3799         * ftl/FTLCapabilities.cpp:
3800         (JSC::FTL::canCompile):
3801         * ftl/FTLLowerDFGToLLVM.cpp:
3802         (JSC::FTL::LowerDFGToLLVM::compileNode):
3803         * tests/stress/fold-based-on-int32-proof-mul-branch.js: Added.
3804         (foo):
3805         * tests/stress/fold-based-on-int32-proof-mul.js: Added.
3806         (foo):
3807         * tests/stress/fold-based-on-int32-proof-or-zero.js: Added.
3808         (foo):
3809         * tests/stress/fold-based-on-int32-proof.js: Added.
3810         (foo):
3811
3812 2015-04-26  Ryosuke Niwa  <rniwa@webkit.org>
3813
3814         Class body ending with a semicolon throws a SyntaxError
3815         https://bugs.webkit.org/show_bug.cgi?id=144244
3816
3817         Reviewed by Darin Adler.
3818
3819         The bug was caused by parseClass's inner loop for method definitions not moving onto the next iteration
3820         it encounters a semicolon. As a result, we always expected a method to appear after a semicolon. Fixed
3821         it by continue'ing when it encounters a semicolon.
3822
3823         * parser/Parser.cpp:
3824         (JSC::Parser<LexerType>::parseClass):
3825
3826 2015-04-26  Ryosuke Niwa  <rniwa@webkit.org>
3827
3828         Getter or setter method named "prototype" or "constrcutor" should throw SyntaxError
3829         https://bugs.webkit.org/show_bug.cgi?id=144243
3830
3831         Reviewed by Darin Adler.
3832
3833         Fixed the bug by adding explicit checks in parseGetterSetter when we're parsing class methods.
3834
3835         * parser/Parser.cpp:
3836         (JSC::Parser<LexerType>::parseGetterSetter):
3837
3838 2015-04-26  Jordan Harband  <ljharb@gmail.com>
3839
3840         Map#forEach does not pass "map" argument to callback.
3841         https://bugs.webkit.org/show_bug.cgi?id=144187
3842
3843         Reviewed by Darin Adler.
3844
3845         Per https://people.mozilla.org/~jorendorff/es6-draft.html#sec-map.prototype.foreach
3846         step 7.a.i., the callback should be called with three arguments.
3847
3848         * runtime/MapPrototype.cpp:
3849         (JSC::mapProtoFuncForEach):
3850
3851 2015-04-26  Yusuke Suzuki  <utatane.tea@gmail.com>
3852