db310373da903eb0d8ba4a76d40d1732410984e4
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2016-05-24  Filip Pizlo  <fpizlo@apple.com>
2
3         Map should not be in JSGlobalObject's static hashtable because it's initialized eagerly via FOR_EACH_SIMPLE_BUILTIN_TYPE_WITH_CONSTRUCTOR
4         https://bugs.webkit.org/show_bug.cgi?id=158031
5         rdar://problem/26353661
6
7         Reviewed by Geoffrey Garen.
8         
9         We were listing Map as being a lazy class structure. It's not. m_mapStructure is a WriteBarrier<>
10         not a LazyClassStructure<> and there is nothing lazy about it.
11
12         * runtime/JSGlobalObject.cpp: The fix is to remove Map here.
13         * runtime/Lookup.cpp: Add some dumping on the assert path.
14         (JSC::setUpStaticFunctionSlot):
15         * tests/stress/override-map-constructor.js: Added. This test used to crash.
16         (Map):
17
18 2016-05-24  Filip Pizlo  <fpizlo@apple.com>
19
20         LLInt64 should have typed array fast paths for get_by_val
21         https://bugs.webkit.org/show_bug.cgi?id=157931
22
23         Reviewed by Keith Miller.
24
25         I think that the LLInt should be able to access typed arrays more quickly than it does now.
26         Ideally we would have fast paths for every major typed array operation and we would use
27         inline cache optimizations. I don't want to do this all in one go, so my plan is to
28         incrementally add support for this as time allows.
29         
30         This change just adds the easy typed array fast paths for get_by_val in the 64-bit version
31         of LLInt.
32         
33         Another bug, https://bugs.webkit.org/show_bug.cgi?id=157922, tracks the overall task of
34         adding all typed array fast paths to both versions of the LLInt.
35         
36         This is a 30% speed-up on typed array benchmarks in LLInt. This is not a speed-up when the
37         JITs are enabled.
38
39         * llint/LLIntData.cpp:
40         (JSC::LLInt::Data::performAssertions):
41         * llint/LLIntOffsetsExtractor.cpp:
42         * llint/LowLevelInterpreter.asm:
43         * llint/LowLevelInterpreter64.asm:
44         * offlineasm/backends.rb:
45         * runtime/JSArrayBufferView.h:
46         * runtime/JSType.h:
47
48 2016-05-24  Saam barati  <sbarati@apple.com> and Yusuke Suzuki <utatane.tea@gmail.com>
49
50         ThisTDZMode is no longer needed
51         https://bugs.webkit.org/show_bug.cgi?id=157209
52
53         Reviewed by Saam Barati.
54
55         ThisTDZMode is no longer needed because we have ConstructorKind
56         and DerivedContextType. The value of ThisTDZMode is strictly less
57         expressive than the combination of those two values. We were
58         using those values anyways, and this patch just makes it official
59         by removing ThisTDZMode.
60
61         This patch also cleans up caching keys. We extract SourceCodeFlags
62         from SourceCodeKey and use it in EvalCodeCache. It correctly
63         contains needed cache attributes: EvalContextType, DerivedContextType,
64         etc. Here, we still use specialized keys for EvalCodeCache instead
65         of SourceCodeKey for performance; it does not include name String and
66         does not allocate SourceCode.
67
68         * bytecode/EvalCodeCache.h:
69         (JSC::EvalCodeCache::CacheKey::CacheKey):
70         (JSC::EvalCodeCache::CacheKey::operator==):
71         (JSC::EvalCodeCache::CacheKey::Hash::equal):
72         (JSC::EvalCodeCache::tryGet):
73         (JSC::EvalCodeCache::getSlow):
74         * bytecompiler/NodesCodegen.cpp:
75         (JSC::ThisNode::emitBytecode): Deleted.
76         * debugger/DebuggerCallFrame.cpp:
77         (JSC::DebuggerCallFrame::evaluateWithScopeExtension):
78         * interpreter/Interpreter.cpp:
79         (JSC::eval):
80         * parser/ASTBuilder.h:
81         (JSC::ASTBuilder::createThisExpr):
82         * parser/NodeConstructors.h:
83         (JSC::ThisNode::ThisNode):
84         * parser/Nodes.h:
85         * parser/Parser.cpp:
86         (JSC::Parser<LexerType>::Parser):
87         (JSC::Parser<LexerType>::parsePrimaryExpression):
88         * parser/Parser.h:
89         (JSC::parse):
90         * parser/ParserModes.h:
91         * parser/SourceCodeKey.h:
92         (JSC::SourceCodeFlags::SourceCodeFlags):
93         (JSC::SourceCodeFlags::operator==):
94         (JSC::SourceCodeKey::SourceCodeKey):
95         (JSC::SourceCodeKey::Hash::hash):
96         (JSC::SourceCodeKey::Hash::equal):
97         (JSC::SourceCodeKey::HashTraits::isEmptyValue):
98         (JSC::SourceCodeKeyHash::hash): Deleted.
99         (JSC::SourceCodeKeyHash::equal): Deleted.
100         (JSC::SourceCodeKeyHashTraits::isEmptyValue): Deleted.
101         * parser/SyntaxChecker.h:
102         (JSC::SyntaxChecker::createThisExpr):
103         * runtime/CodeCache.cpp:
104         (JSC::CodeCache::getGlobalCodeBlock):
105         (JSC::CodeCache::getProgramCodeBlock):
106         (JSC::CodeCache::getEvalCodeBlock):
107         (JSC::CodeCache::getModuleProgramCodeBlock):
108         (JSC::CodeCache::getFunctionExecutableFromGlobalCode):
109         * runtime/CodeCache.h:
110         * runtime/Executable.cpp:
111         (JSC::EvalExecutable::create):
112         * runtime/Executable.h:
113         * runtime/JSGlobalObject.cpp:
114         (JSC::JSGlobalObject::createEvalCodeBlock):
115         * runtime/JSGlobalObject.h:
116         * runtime/JSGlobalObjectFunctions.cpp:
117         (JSC::globalFuncEval):
118         * tests/stress/code-cache-incorrect-caching.js: Added.
119         (shouldBe):
120         (hello):
121         (catch):
122         (shouldBe.test.hello):
123         (globalEval.ok):
124         (global.hello.hello):
125
126 2016-05-23  Yusuke Suzuki  <utatane.tea@gmail.com>
127
128         Assertion failure for Reflect.get with Proxy and primitive value as explicit receiver
129         https://bugs.webkit.org/show_bug.cgi?id=157080
130
131         Reviewed by Saam Barati.
132
133         In custom accessor getter, the argument "thisValue" can be altered by using `Reflect.get`.
134         In this patch, we add a new parameter, "slotBase". This represents the base value offering
135         this custom getter. And use it in ProxyObject's performGet custom accessor getter.
136
137         * API/JSCallbackObject.h:
138         * API/JSCallbackObjectFunctions.h:
139         (JSC::JSCallbackObject<Parent>::staticFunctionGetter):
140         (JSC::JSCallbackObject<Parent>::callbackGetter):
141         * bytecode/PolymorphicAccess.cpp:
142         (JSC::AccessCase::generateImpl):
143         In PolymorphicAccess case, the thisValue and the slotBase are always cells.
144         This is because IC is enabled in the case that the base value is a cell.
145         And slotBase is always on the prototype chain from this base value.
146
147         * jit/CCallHelpers.h:
148         (JSC::CCallHelpers::setupArgumentsWithExecState):
149         * jsc.cpp:
150         (WTF::CustomGetter::customGetter):
151         (WTF::RuntimeArray::lengthGetter):
152         * runtime/CustomGetterSetter.cpp:
153         (JSC::callCustomSetter):
154         * runtime/JSBoundSlotBaseFunction.cpp:
155         (JSC::boundSlotBaseFunctionCall):
156         * runtime/JSFunction.cpp:
157         (JSC::JSFunction::argumentsGetter):
158         (JSC::JSFunction::callerGetter):
159         * runtime/JSFunction.h:
160         * runtime/JSModuleNamespaceObject.cpp:
161         (JSC::callbackGetter):
162         * runtime/PropertySlot.cpp:
163         (JSC::PropertySlot::customGetter):
164         * runtime/PropertySlot.h:
165         * runtime/ProxyObject.cpp:
166         (JSC::performProxyGet):
167         * runtime/RegExpConstructor.cpp:
168         (JSC::regExpConstructorDollar):
169         (JSC::regExpConstructorInput):
170         (JSC::regExpConstructorMultiline):
171         (JSC::regExpConstructorLastMatch):
172         (JSC::regExpConstructorLastParen):
173         (JSC::regExpConstructorLeftContext):
174         (JSC::regExpConstructorRightContext):
175         (JSC::regExpConstructorDollar1): Deleted.
176         (JSC::regExpConstructorDollar2): Deleted.
177         (JSC::regExpConstructorDollar3): Deleted.
178         (JSC::regExpConstructorDollar4): Deleted.
179         (JSC::regExpConstructorDollar5): Deleted.
180         (JSC::regExpConstructorDollar6): Deleted.
181         (JSC::regExpConstructorDollar7): Deleted.
182         (JSC::regExpConstructorDollar8): Deleted.
183         (JSC::regExpConstructorDollar9): Deleted.
184         * tests/stress/proxy-get-with-primitive-receiver.js: Added.
185         (shouldBe):
186
187 2016-05-23  Geoffrey Garen  <ggaren@apple.com>
188
189         REGRESSION (196374): deleting a global property is expensive
190         https://bugs.webkit.org/show_bug.cgi?id=158005
191
192         Reviewed by Chris Dumez.
193
194         * runtime/JSObject.cpp:
195         (JSC::JSObject::deleteProperty): We only need to reify static properties
196         if the name being deleted matches a static property. Otherwise, we can
197         be sure that delete won't observe any static properties.
198
199 2016-05-23  Saam barati  <sbarati@apple.com>
200
201         The baseline JIT crashes when compiling "(1,1)/1"
202         https://bugs.webkit.org/show_bug.cgi?id=157933
203
204         Reviewed by Benjamin Poulain.
205
206         op_div in the baseline JIT needed to better handle when both the lhs
207         and rhs are constants. It needs to make sure to load either the lhs or
208         the rhs into a register since the div generator can't handle both
209         the lhs and rhs being constants.
210
211         * jit/JITArithmetic.cpp:
212         (JSC::JIT::emit_op_div):
213         * tests/stress/jit-gracefully-handle-double-constants-in-math-operators.js: Added.
214         (assert):
215         (test):
216
217 2016-05-23  Saam barati  <sbarati@apple.com>
218
219         String template don't handle let initialization properly inside eval
220         https://bugs.webkit.org/show_bug.cgi?id=157991
221
222         Reviewed by Oliver Hunt.
223
224         The fix is to make sure we emit TDZ checks. 
225
226         * bytecompiler/NodesCodegen.cpp:
227         (JSC::TaggedTemplateNode::emitBytecode):
228         * tests/stress/tagged-template-tdz.js: Added.
229         (shouldThrowTDZ):
230         (test):
231
232 2016-05-22  Saam barati  <sbarati@apple.com>
233
234         Unreviewed. Fixed debug assertion failures from r201235.
235
236         * runtime/JSScope.cpp:
237         (JSC::abstractAccess):
238
239 2016-05-22  Brady Eidson  <beidson@apple.com>
240
241         Attempted Yosemite build fix after http://trac.webkit.org/changeset/201255
242
243         Suggested by and reviewed by Anders Carlsson.
244
245         * b3/B3CCallValue.h: Initialize the effects member more conventionally.
246
247 2016-05-22  Brady Eidson  <beidson@apple.com>
248
249         Move to C++14.
250         https://bugs.webkit.org/show_bug.cgi?id=157948
251
252         Reviewed by Michael Catanzaro.
253
254         * Configurations/Base.xcconfig:
255
256 2016-05-22  Saam barati  <sbarati@apple.com>
257
258         REGRESSION(r199075): String.prototype.replace fails after being used many times with different replace values
259         https://bugs.webkit.org/show_bug.cgi?id=157968
260         <rdar://problem/26404735>
261
262         Reviewed by Ryosuke Niwa and Filip Pizlo.
263
264         There was a bug in the DFG where we were checking a condition
265         on the wrong variable.
266
267         * dfg/DFGStrengthReductionPhase.cpp:
268         (JSC::DFG::StrengthReductionPhase::handleNode):
269
270 2016-05-22  Chris Dumez  <cdumez@apple.com>
271
272         Remove uses of PassRefPtr in JS bindings code
273         https://bugs.webkit.org/show_bug.cgi?id=157949
274
275         Reviewed by Andreas Kling.
276
277         Remove uses of PassRefPtr in JS bindings code.
278
279         * runtime/JSGlobalObject.cpp:
280         (JSC::JSGlobalObject::queueMicrotask):
281         * runtime/JSGlobalObject.h:
282
283 2016-05-20  Joseph Pecoraro  <pecoraro@apple.com>
284
285         Remove LegacyProfiler
286         https://bugs.webkit.org/show_bug.cgi?id=153565
287
288         Reviewed by Mark Lam.
289
290         JavaScriptCore now provides a sampling profiler and it is enabled
291         by all ports. Web Inspector switched months ago to using the
292         sampling profiler and displaying its data. Remove the legacy
293         profiler, as it is no longer being used by anything other then
294         console.profile and tests. We will update console.profile's
295         behavior soon to have new behavior and use the sampling data.
296
297         * API/JSProfilerPrivate.cpp: Removed.
298         * API/JSProfilerPrivate.h: Removed.
299         * CMakeLists.txt:
300         * JavaScriptCore.xcodeproj/project.pbxproj:
301         * bytecode/BytecodeList.json:
302         * bytecode/BytecodeUseDef.h:
303         (JSC::computeUsesForBytecodeOffset): Deleted.
304         (JSC::computeDefsForBytecodeOffset): Deleted.
305         * bytecode/CodeBlock.cpp:
306         (JSC::CodeBlock::dumpBytecode): Deleted.
307         * bytecode/UnlinkedFunctionExecutable.cpp:
308         (JSC::generateUnlinkedFunctionCodeBlock):
309         (JSC::UnlinkedFunctionExecutable::unlinkedCodeBlockFor):
310         * bytecode/UnlinkedFunctionExecutable.h:
311         * bytecompiler/BytecodeGenerator.cpp:
312         (JSC::BytecodeGenerator::BytecodeGenerator):
313         (JSC::BytecodeGenerator::emitCall):
314         (JSC::BytecodeGenerator::emitCallVarargs):
315         (JSC::BytecodeGenerator::emitCallVarargsInTailPosition):
316         (JSC::BytecodeGenerator::emitConstructVarargs):
317         (JSC::BytecodeGenerator::emitConstruct):
318         * bytecompiler/BytecodeGenerator.h:
319         (JSC::CallArguments::profileHookRegister): Deleted.
320         (JSC::BytecodeGenerator::shouldEmitProfileHooks): Deleted.
321         * bytecompiler/NodesCodegen.cpp:
322         (JSC::CallFunctionCallDotNode::emitBytecode):
323         (JSC::ApplyFunctionCallDotNode::emitBytecode):
324         (JSC::CallArguments::CallArguments): Deleted.
325         * dfg/DFGAbstractInterpreterInlines.h:
326         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): Deleted.
327         * dfg/DFGByteCodeParser.cpp:
328         (JSC::DFG::ByteCodeParser::parseBlock): Deleted.
329         * dfg/DFGCapabilities.cpp:
330         (JSC::DFG::capabilityLevel): Deleted.
331         * dfg/DFGClobberize.h:
332         (JSC::DFG::clobberize): Deleted.
333         * dfg/DFGDoesGC.cpp:
334         (JSC::DFG::doesGC): Deleted.
335         * dfg/DFGFixupPhase.cpp:
336         (JSC::DFG::FixupPhase::fixupNode): Deleted.
337         * dfg/DFGNodeType.h:
338         * dfg/DFGPredictionPropagationPhase.cpp:
339         * dfg/DFGSafeToExecute.h:
340         (JSC::DFG::safeToExecute): Deleted.
341         * dfg/DFGSpeculativeJIT32_64.cpp:
342         (JSC::DFG::SpeculativeJIT::compile): Deleted.
343         * dfg/DFGSpeculativeJIT64.cpp:
344         (JSC::DFG::SpeculativeJIT::compile): Deleted.
345         * inspector/InjectedScriptBase.cpp:
346         (Inspector::InjectedScriptBase::callFunctionWithEvalEnabled):
347         * interpreter/Interpreter.cpp:
348         (JSC::UnwindFunctor::operator()): Deleted.
349         (JSC::Interpreter::execute): Deleted.
350         (JSC::Interpreter::executeCall): Deleted.
351         (JSC::Interpreter::executeConstruct): Deleted.
352         * jit/JIT.cpp:
353         (JSC::JIT::privateCompileMainPass): Deleted.
354         * jit/JIT.h:
355         * jit/JITOpcodes.cpp:
356         (JSC::JIT::emit_op_profile_will_call): Deleted.
357         (JSC::JIT::emit_op_profile_did_call): Deleted.
358         * jit/JITOpcodes32_64.cpp:
359         (JSC::JIT::emit_op_profile_will_call): Deleted.
360         (JSC::JIT::emit_op_profile_did_call): Deleted.
361         * jit/JITOperations.cpp:
362         * jit/JITOperations.h:
363         * llint/LLIntSlowPaths.cpp:
364         (JSC::LLInt::LLINT_SLOW_PATH_DECL): Deleted.
365         * llint/LLIntSlowPaths.h:
366         * llint/LowLevelInterpreter.asm:
367         * parser/ParserModes.h:
368         * profiler/CallIdentifier.h: Removed.
369         * profiler/LegacyProfiler.cpp: Removed.
370         * profiler/LegacyProfiler.h: Removed.
371         * profiler/Profile.cpp: Removed.
372         * profiler/Profile.h: Removed.
373         * profiler/ProfileGenerator.cpp: Removed.
374         * profiler/ProfileGenerator.h: Removed.
375         * profiler/ProfileNode.cpp: Removed.
376         * profiler/ProfileNode.h: Removed.
377         * profiler/ProfilerJettisonReason.cpp:
378         (WTF::printInternal): Deleted.
379         * profiler/ProfilerJettisonReason.h:
380         * runtime/CodeCache.cpp:
381         (JSC::CodeCache::getGlobalCodeBlock):
382         (JSC::CodeCache::getProgramCodeBlock):
383         (JSC::CodeCache::getEvalCodeBlock):
384         (JSC::CodeCache::getModuleProgramCodeBlock):
385         * runtime/CodeCache.h:
386         * runtime/Executable.cpp:
387         (JSC::ScriptExecutable::newCodeBlockFor):
388         * runtime/JSGlobalObject.cpp:
389         (JSC::JSGlobalObject::createProgramCodeBlock):
390         (JSC::JSGlobalObject::createEvalCodeBlock):
391         (JSC::JSGlobalObject::createModuleProgramCodeBlock):
392         (JSC::JSGlobalObject::~JSGlobalObject): Deleted.
393         (JSC::JSGlobalObject::hasLegacyProfiler): Deleted.
394         * runtime/JSGlobalObject.h:
395         * runtime/Options.h:
396         * runtime/VM.cpp:
397         (JSC::VM::VM): Deleted.
398         (JSC::SetEnabledProfilerFunctor::operator()): Deleted.
399         (JSC::VM::setEnabledProfiler): Deleted.
400         * runtime/VM.h:
401         (JSC::VM::enabledProfiler): Deleted.
402         (JSC::VM::enabledProfilerAddress): Deleted.
403
404 2016-05-20  Joseph Pecoraro  <pecoraro@apple.com>
405
406         Remove LegacyProfiler
407         https://bugs.webkit.org/show_bug.cgi?id=153565
408
409         Reviewed by Saam Barati.
410
411         * inspector/protocol/Timeline.json:
412         * jsc.cpp:
413         * runtime/JSGlobalObject.cpp:
414         (JSC::JSGlobalObject::hasLegacyProfiler):
415         * runtime/JSGlobalObject.h:
416         (JSC::JSGlobalObject::supportsLegacyProfiling): Deleted.
417
418 2016-05-20  Saam barati  <sbarati@apple.com>
419
420         JSScope::abstractAccess doesn't need to copy the SymbolTableEntry, it can use it by reference
421         https://bugs.webkit.org/show_bug.cgi?id=157956
422
423         Reviewed by Geoffrey Garen.
424
425         A SymbolTableEntry may be a FatEntry. Copying a FatEntry is slow because we have to
426         malloc memory for it, then free the malloced memory once the entry goes out of
427         scope. abstractAccess uses a SymbolTableEntry temporarily when performing scope
428         accesses during bytecode linking. It copies out the SymbolTableEntry every time
429         it does a SymbolTable lookup. This is not cheap when the entry happens to be a
430         FatEntry. We should really just be using a reference to the entry because
431         there is no need to copy it in such a scenario.
432
433         * runtime/JSScope.cpp:
434         (JSC::abstractAccess):
435
436 2016-05-20  Joseph Pecoraro  <pecoraro@apple.com>
437
438         Web Inspector: retained size for typed arrays does not count native backing store
439         https://bugs.webkit.org/show_bug.cgi?id=157945
440         <rdar://problem/26392238>
441
442         Reviewed by Geoffrey Garen.
443
444         * runtime/JSArrayBuffer.h:
445         * runtime/JSArrayBuffer.cpp:
446         (JSC::JSArrayBuffer::estimatedSize):
447         Include an estimatedSize implementation for JSArrayBuffer.
448         ArrayBuffer has a unique path, different from other data
449         stored in the Heap.
450
451         * tests/heapProfiler/typed-array-sizes.js: Added.
452         Test sizes of TypedArray with and without an ArrayBuffer.
453         When the TypedArray is a view wrapping an ArrayBuffer, the
454         ArrayBuffer has the size.
455
456 2016-05-20  Geoffrey Garen  <ggaren@apple.com>
457
458         reifyAllStaticProperties makes two copies of every string
459         https://bugs.webkit.org/show_bug.cgi?id=157953
460
461         Reviewed by Mark Lam.
462
463         Let's not do that.
464
465         * runtime/JSObject.cpp:
466         (JSC::JSObject::reifyAllStaticProperties): Pass our Identifier to
467         reifyStaticProperty so it doesn't have to make its own.
468
469         * runtime/Lookup.h:
470         (JSC::reifyStaticProperty): No need to null check because callers never
471         pass null anymore. No need to make an identifier because callers pass
472         us one.
473
474         (JSC::reifyStaticProperties): Honor new interface.
475
476 2016-05-20  Geoffrey Garen  <ggaren@apple.com>
477
478         JSBench regression: CodeBlock linking always copies the symbol table
479         https://bugs.webkit.org/show_bug.cgi?id=157951
480
481         Reviewed by Saam Barati.
482
483         We always put a SymbolTable into the constant pool, even in simple
484         functions in which it won't be used -- i.e., there's on eval and there
485         are no captured variables and so on.
486
487         This is costly because linking must copy any provided symbol tables.
488
489         * bytecompiler/BytecodeGenerator.cpp:
490         (JSC::BytecodeGenerator::BytecodeGenerator):
491         (JSC::BytecodeGenerator::emitProfileType): Only add the symbol table
492         as a constant if we will use it at runtime.
493
494 2016-05-19  Benjamin Poulain  <bpoulain@apple.com>
495
496         [JSC] Improve int->float conversion in FTL
497         https://bugs.webkit.org/show_bug.cgi?id=157936
498
499         Reviewed by Filip Pizlo.
500
501         The integer -> floating point lowering was very barebone.
502
503         For example, converting a constant integer to double
504         was doing:
505             mov #const, %eax
506             xor %xmm0, %xmm0
507             cvtsi2sd %eax, %xmm0
508
509         Conversion from integer to float was also missing.
510         We were always converting to double then rounding the double
511         to float.
512
513         This patch adds the basics:
514         -Constant folding.
515         -Integer to Float opcode.
516         -Reducing int->double to int->float when used by DoubleToFloat.
517
518         * assembler/MacroAssemblerX86Common.h:
519         (JSC::MacroAssemblerX86Common::convertInt32ToFloat):
520         * assembler/MacroAssemblerX86_64.h:
521         (JSC::MacroAssemblerX86_64::convertInt64ToDouble):
522         (JSC::MacroAssemblerX86_64::convertInt64ToFloat):
523         * assembler/X86Assembler.h:
524         (JSC::X86Assembler::cvtsi2ss_rr):
525         (JSC::X86Assembler::cvtsi2ssq_rr):
526         (JSC::X86Assembler::cvtsi2sdq_mr):
527         (JSC::X86Assembler::cvtsi2ssq_mr):
528         (JSC::X86Assembler::cvtsi2ss_mr):
529         * assembler/MacroAssemblerARM64.h:
530         * b3/B3Const32Value.cpp:
531         (JSC::B3::Const32Value::iToDConstant):
532         (JSC::B3::Const32Value::iToFConstant):
533         * b3/B3Const32Value.h:
534         * b3/B3Const64Value.cpp:
535         (JSC::B3::Const64Value::iToDConstant):
536         (JSC::B3::Const64Value::iToFConstant):
537         * b3/B3Const64Value.h:
538         * b3/B3LowerToAir.cpp:
539         (JSC::B3::Air::LowerToAir::lower):
540         * b3/B3Opcode.cpp:
541         (WTF::printInternal):
542         * b3/B3Opcode.h:
543         * b3/B3ReduceDoubleToFloat.cpp:
544         * b3/B3ReduceStrength.cpp:
545         * b3/B3Validate.cpp:
546         * b3/B3Value.cpp:
547         (JSC::B3::Value::iToDConstant):
548         (JSC::B3::Value::iToFConstant):
549         (JSC::B3::Value::isRounded):
550         (JSC::B3::Value::effects):
551         (JSC::B3::Value::key):
552         (JSC::B3::Value::typeFor):
553         * b3/B3Value.h:
554         * b3/B3ValueKey.cpp:
555         (JSC::B3::ValueKey::materialize):
556         * b3/air/AirFixPartialRegisterStalls.cpp:
557         * b3/air/AirOpcode.opcodes:
558         * b3/testb3.cpp:
559         (JSC::B3::int64Operands):
560         (JSC::B3::testIToD64Arg):
561         (JSC::B3::testIToF64Arg):
562         (JSC::B3::testIToD32Arg):
563         (JSC::B3::testIToF32Arg):
564         (JSC::B3::testIToD64Mem):
565         (JSC::B3::testIToF64Mem):
566         (JSC::B3::testIToD32Mem):
567         (JSC::B3::testIToF32Mem):
568         (JSC::B3::testIToD64Imm):
569         (JSC::B3::testIToF64Imm):
570         (JSC::B3::testIToD32Imm):
571         (JSC::B3::testIToF32Imm):
572         (JSC::B3::testIToDReducedToIToF64Arg):
573         (JSC::B3::testIToDReducedToIToF32Arg):
574         (JSC::B3::run):
575
576 2016-05-19  Benjamin Poulain  <bpoulain@apple.com>
577
578         [JSC] FTL can crash on stack overflow
579         https://bugs.webkit.org/show_bug.cgi?id=157881
580         rdar://problem/24665964
581
582         Reviewed by Michael Saboff.
583
584         The VM's m_largestFTLStackSize was never set anywhere (updateFTLLargestStackSize()
585         was never called). We forgot to change that when implementing B3.
586
587         Even when it is set, we still have a problem on OSR Exit.
588         If the last frame is a FTL frame and it OSR Exits, the space required for
589         that frame becomes significantly larger. What happens is we crash in the OSR Exit
590         instead of the FTL frame (this is what happens in rdar://problem/24665964).
591
592         This patch changes the stack boundary checks in FTL to be the same as DFG:
593         we verify that we have enough space for the current optimized function but
594         also for the baseline version (including inlining) in case of exit.
595
596         * ftl/FTLLowerDFGToB3.cpp:
597         (JSC::FTL::DFG::LowerDFGToB3::lower):
598         (JSC::FTL::DFG::LowerDFGToB3::didOverflowStack): Deleted.
599         * runtime/VM.cpp:
600         (JSC::VM::VM): Deleted.
601         (JSC::VM::updateStackLimit): Deleted.
602         (JSC::VM::updateFTLLargestStackSize): Deleted.
603         * runtime/VM.h:
604         (JSC::VM::addressOfFTLStackLimit): Deleted.
605
606 2016-05-18  Filip Pizlo  <fpizlo@apple.com>
607
608         DFG::LICMPhase shouldn't hoist type checks unless it knows that the check will succeed at the loop pre-header
609         https://bugs.webkit.org/show_bug.cgi?id=144527
610
611         Reviewed by Saam Barati.
612         
613         This adds a control flow equivalence analysis (called ControlEquivalenceAnalysis) based on
614         dominator analysis over the backwards CFG. Two basic blocks are control flow equivalent if
615         the execution of one implies that the other one must also execute. It means that the two
616         blocks' forward and backward dominance are reciprocated: (A dom B and B backdom A) or (B dom
617         A and A backdom B). LICM now uses it to become more conservative about hoisting checks, if
618         this has caused problems in the past. If we hoist something that may exit from a block that
619         was not control equivalent to the pre-header then it's possible that the node's speculation
620         will fail even though it wouldn't have if it wasn't hoisted. So, we flag these nodes'
621         origins as being "wasHoisted" and we track all of their exits as "HoistingFailed". LICM will
622         turn off such speculative hoisting if the CodeBlock from which we are hoisting had the
623         HoistingFailed exit kind.
624         
625         Note that this deliberately still allows us to hoist things that may exit even if they are
626         not control equivalent to the pre-header. This is necessary because the profitability of
627         hoisting is so huge in all of the cases that we're aware of that it's worth giving it a
628         shot.
629         
630         This is neutral on macrobenchmarks since none of the benchmarks we track have a hoistable
631         operation that would exit only if hoisted. I added microbenchmarks to illustrate the problem
632         and two of them speed up by ~40% while one of them is neutral (Int52 saves us from having
633         problems on that program even though LICM previously did the wrong thing).
634
635         * JavaScriptCore.xcodeproj/project.pbxproj:
636         * bytecode/ExitKind.cpp:
637         (JSC::exitKindToString):
638         * bytecode/ExitKind.h:
639         * dfg/DFGAtTailAbstractState.h:
640         (JSC::DFG::AtTailAbstractState::operator bool):
641         (JSC::DFG::AtTailAbstractState::initializeTo):
642         * dfg/DFGBackwardsCFG.h: Added.
643         (JSC::DFG::BackwardsCFG::BackwardsCFG):
644         * dfg/DFGBackwardsDominators.h: Added.
645         (JSC::DFG::BackwardsDominators::BackwardsDominators):
646         * dfg/DFGCommon.h:
647         (JSC::DFG::checkAndSet): Deleted.
648         * dfg/DFGControlEquivalenceAnalysis.h: Added.
649         (JSC::DFG::ControlEquivalenceAnalysis::ControlEquivalenceAnalysis):
650         (JSC::DFG::ControlEquivalenceAnalysis::dominatesEquivalently):
651         (JSC::DFG::ControlEquivalenceAnalysis::areEquivalent):
652         * dfg/DFGGraph.cpp:
653         (JSC::DFG::Graph::dump):
654         (JSC::DFG::Graph::dumpBlockHeader):
655         (JSC::DFG::Graph::invalidateCFG):
656         (JSC::DFG::Graph::substituteGetLocal):
657         (JSC::DFG::Graph::handleAssertionFailure):
658         (JSC::DFG::Graph::ensureDominators):
659         (JSC::DFG::Graph::ensurePrePostNumbering):
660         (JSC::DFG::Graph::ensureNaturalLoops):
661         (JSC::DFG::Graph::ensureBackwardsCFG):
662         (JSC::DFG::Graph::ensureBackwardsDominators):
663         (JSC::DFG::Graph::ensureControlEquivalenceAnalysis):
664         (JSC::DFG::Graph::methodOfGettingAValueProfileFor):
665         * dfg/DFGGraph.h:
666         (JSC::DFG::Graph::hasDebuggerEnabled):
667         * dfg/DFGInPlaceAbstractState.h:
668         (JSC::DFG::InPlaceAbstractState::operator bool):
669         (JSC::DFG::InPlaceAbstractState::createValueForNode):
670         (JSC::DFG::InPlaceAbstractState::forNode):
671         * dfg/DFGLICMPhase.cpp:
672         (JSC::DFG::LICMPhase::run):
673         (JSC::DFG::LICMPhase::attemptHoist):
674         * dfg/DFGMayExit.cpp:
675         (JSC::DFG::mayExit):
676         * dfg/DFGMayExit.h:
677         * dfg/DFGNode.h:
678         * dfg/DFGNodeOrigin.cpp:
679         (JSC::DFG::NodeOrigin::dump):
680         * dfg/DFGNodeOrigin.h:
681         (JSC::DFG::NodeOrigin::takeValidExit):
682         (JSC::DFG::NodeOrigin::withWasHoisted):
683         (JSC::DFG::NodeOrigin::forInsertingAfter):
684         * dfg/DFGNullAbstractState.h: Added.
685         (JSC::DFG::NullAbstractState::NullAbstractState):
686         (JSC::DFG::NullAbstractState::operator bool):
687         (JSC::DFG::NullAbstractState::forNode):
688         * dfg/DFGOSRExit.cpp:
689         (JSC::DFG::OSRExit::OSRExit):
690         * dfg/DFGOSRExitBase.cpp:
691         (JSC::DFG::OSRExitBase::considerAddingAsFrequentExitSiteSlow):
692         * dfg/DFGOSRExitBase.h:
693         (JSC::DFG::OSRExitBase::OSRExitBase):
694         * dfg/DFGTypeCheckHoistingPhase.cpp:
695         (JSC::DFG::TypeCheckHoistingPhase::run):
696         * ftl/FTLOSRExit.cpp:
697         (JSC::FTL::OSRExitDescriptor::prepareOSRExitHandle):
698         (JSC::FTL::OSRExit::OSRExit):
699         * ftl/FTLOSRExit.h:
700
701 2016-05-19  Mark Lam  <mark.lam@apple.com>
702
703         Code that null checks the VM pointer before any use should ref the VM.
704         https://bugs.webkit.org/show_bug.cgi?id=157864
705
706         Reviewed by Filip Pizlo and Keith Miller.
707
708         JSLock::willReleaseLock() and HeapTimer::timerDidFire() need to reference the VM
709         through a RefPtr.  Otherwise, there's no guarantee that the VM won't be deleted
710         after their null checks.
711
712         * bytecode/CodeBlock.h:
713         (JSC::CodeBlock::vm):
714         (JSC::CodeBlock::setVM): Deleted.
715         - Not used, and suggests that it can be changed during the lifetime of the
716           CodeBlock (which should not be).
717
718         * heap/HeapTimer.cpp:
719         (JSC::HeapTimer::timerDidFire):
720         * runtime/JSLock.cpp:
721         (JSC::JSLock::willReleaseLock):
722         - Store the VM pointer in a RefPtr first, and null check the RefPtr instead of
723           the raw VM pointer.  This makes the null check a strong guarantee that the
724           VM pointer is valid while these functions are using it.
725
726 2016-05-19  Saam barati  <sbarati@apple.com>
727
728         arrow function lexical environment should reuse the same environment as the function's lexical environment where possible
729         https://bugs.webkit.org/show_bug.cgi?id=157908
730
731         Reviewed by Filip Pizlo.
732
733         We can safely combine these two environment when we have
734         a simple parameter list (no default parameters, no destructring parameters).
735
736         * bytecompiler/BytecodeGenerator.cpp:
737         (JSC::BytecodeGenerator::BytecodeGenerator):
738         (JSC::BytecodeGenerator::initializeDefaultParameterValuesAndSetupFunctionScopeStack):
739         (JSC::BytecodeGenerator::initializeArrowFunctionContextScopeIfNeeded):
740         * bytecompiler/BytecodeGenerator.h:
741
742 2016-05-19  Michael Saboff  <msaboff@apple.com>
743
744         Unreviewed build fix.
745
746         Skipping this new test as it times out on the bots.
747
748         Issue tracked in https://bugs.webkit.org/show_bug.cgi?id=157903
749
750         * tests/stress/regress-157595.js:
751         (MyRegExp):
752
753 2016-05-19  Guillaume Emont  <guijemont@igalia.com>
754
755         JSC: DFG::SpeculativeJIT::compile special case for MIPS for PutByValWithThis
756         https://bugs.webkit.org/show_bug.cgi?id=157741
757
758         Reviewed by Saam Barati.
759
760         The PutByValWithThis case needs a special case for MIPS because we
761         don't have enough registers. The special case needs to be different
762         from the x86 one because we have a different ABI.
763
764         * dfg/DFGSpeculativeJIT32_64.cpp:
765         (JSC::DFG::SpeculativeJIT::compile):
766
767 2016-05-19  Brian Burg  <bburg@apple.com>
768
769         Web Inspector: use a consistent prefix for injected scripts
770         https://bugs.webkit.org/show_bug.cgi?id=157715
771         <rdar://problem/26287188>
772
773         Reviewed by Timothy Hatcher.
774
775         * CMakeLists.txt:
776         * DerivedSources.make:
777         * inspector/InjectedScriptSource.js:
778
779 2016-05-19  Csaba Osztrogonác  <ossy@webkit.org>
780
781         [ARM] Remove redefined macro after r200606
782         https://bugs.webkit.org/show_bug.cgi?id=157890
783
784         Reviewed by Michael Saboff.
785
786         * bytecode/PolymorphicAccess.cpp:
787         * jit/CCallHelpers.h:
788
789 2016-05-18  Saam barati  <sbarati@apple.com>
790
791         Function with default parameter values that are arrow functions that capture this isn't working
792         https://bugs.webkit.org/show_bug.cgi?id=157786
793         <rdar://problem/26327329>
794
795         Reviewed by Geoffrey Garen.
796
797         To make the scopes ordered properly, I needed to initialize the arrow 
798         function lexical environment before initializing default parameter values.
799         I also made the code easier to reason about by never reusing the function's
800         var lexical environment for the arrow function lexical environment. The
801         reason for this is that that code was wrong, and we just didn't have code to
802         that properly tested it. It was easy for that code to be wrong because
803         sometimes the function's lexical environment isn't the top-most scope
804         (namely, when a function's parameter list is non-simple) and sometimes
805         it is (when the function's parameter list is simple).
806
807         Also, because a function's default parameter values may capture the
808         'arguments' variable inside an arrow function, I needed to take care
809         to initialize the 'arguments' variable as part of whichever scope
810         is the top-most scope. It's either the function's var environment
811         if the parameter list is simple, or it's the function's parameter
812         environment if the parameter list is non-simple.
813
814         * bytecompiler/BytecodeGenerator.cpp:
815         (JSC::BytecodeGenerator::BytecodeGenerator):
816         (JSC::BytecodeGenerator::initializeDefaultParameterValuesAndSetupFunctionScopeStack):
817         (JSC::BytecodeGenerator::initializeArrowFunctionContextScopeIfNeeded):
818         (JSC::BytecodeGenerator::initializeParameters):
819         (JSC::BytecodeGenerator::initializeVarLexicalEnvironment):
820         (JSC::BytecodeGenerator::visibleNameForParameter):
821         * bytecompiler/BytecodeGenerator.h:
822         * tests/stress/arrow-functions-as-default-parameter-values.js: Added.
823         (assert):
824         (test):
825         (test.foo):
826         * tests/stress/op-push-name-scope-crashes-profiler.js:
827         (test):
828
829 2016-05-18  Michael Saboff  <msaboff@apple.com>
830
831         r199812 broke test262
832         https://bugs.webkit.org/show_bug.cgi?id=157595
833
834         Reviewed by Filip Pizlo.
835
836         Added a reasonable limit to the size of the match result array to catch possible
837         infinite loops when matching.
838         Added a new tests that creates an infinite loop in RegExp.prototype.[Symbol.match]
839         by creating a subclass of RegExp where the base RegExp's global flag is false and
840         the subclass overrides .global with a getter that always returns true.
841
842         * builtins/RegExpPrototype.js:
843         (match):
844         * tests/stress/regress-157595.js: Added.
845         (MyRegExp):
846         (MyRegExp.prototype.get global):
847         (test):
848         (catch):
849
850 2016-05-18  Yusuke Suzuki  <utatane.tea@gmail.com>
851
852         [ES6] Namespace object re-export should be handled as local export
853         https://bugs.webkit.org/show_bug.cgi?id=157806
854
855         Reviewed by Mark Lam.
856
857         We align the implementation of ExportEntry to the spec; remove Type::Namespace.
858         This Type::Namespace is used for re-exported namespace object binding. For example,
859
860             import * as namespace from "namespace.js"
861             export { namespace }
862
863         In the above case, we used ExportEntry(Type::Namespace). In this patch, we drop this
864         and use normal local export (Type::Local) instead because namespace object actually has
865         the local binding in the above module environment. And this handling strictly meets the
866         spec (Sec 15.2.1.16.1 step 11-a-ii-2-b).
867
868         And we also clean up the ExportEntry implementation; dropping unnecessary information.
869         This change fixes the test262/test/language/module-code/instn-star-equality.js crash.
870
871         * parser/ModuleAnalyzer.cpp:
872         (JSC::ModuleAnalyzer::exportVariable):
873         * runtime/JSModuleRecord.cpp:
874         (JSC::getExportedNames):
875         (JSC::JSModuleRecord::dump): Deleted.
876         * runtime/JSModuleRecord.h:
877         * tests/modules/namespace-re-export.js: Added.
878         * tests/modules/namespace-re-export/namespace-re-export-fixture.js: Added.
879         * tests/modules/namespace-re-export/namespace-re-export.js: Added.
880         * tests/modules/resources/assert.js:
881         (export.shouldNotBe):
882
883 2016-05-17  Filip Pizlo  <fpizlo@apple.com>
884
885         JSC should detect the right default locale even when it's not embedded in WebCore
886         https://bugs.webkit.org/show_bug.cgi?id=157755
887         rdar://problem/24665424
888
889         Reviewed by Keith Miller.
890         
891         This makes JSC try to use WTF's platform user preferred language detection if the DOM did
892         not register a defaultLanguage callback. The result is that when JSC runs standalone it
893         will detect the platform user preferred language almost the same way as when it's embedded
894         in WebCore. The only difference is that WebCore may have its own additional overrides via
895         the WK API. But in the absence of overrides, WebCore uses the same WTF logic that JSC falls
896         back to.
897         
898         We first found this bug because on iOS, the intl tests would fail because ICU would report
899         a somewhat bogus locale on that platform. Prior to this change, standalone JSC would fall
900         back to ICU's locale detection. It turns out that the ICU default locale is also bogus on
901         OS X, just less so. For example, setting things to Poland did not result in the jsc shell
902         printing dates Polish-style. Now it will print them Polish-style if your system preferences
903         say so. Also, the tests don't fail on iOS anymore.
904         
905         * runtime/IntlObject.cpp:
906         (JSC::defaultLocale):
907
908 2016-05-17  Dean Jackson  <dino@apple.com>
909
910         Remove ES6_GENERATORS flag
911         https://bugs.webkit.org/show_bug.cgi?id=157815
912         <rdar://problem/26332894>
913
914         Reviewed by Geoffrey Garen.
915
916         This flag isn't needed. Generators are enabled everywhere and
917         part of a stable specification.
918
919         * Configurations/FeatureDefines.xcconfig:
920         * parser/Parser.cpp:
921         (JSC::Parser<LexerType>::parseFunctionDeclaration): Deleted.
922         (JSC::Parser<LexerType>::parseClass): Deleted.
923         (JSC::Parser<LexerType>::parseExportDeclaration): Deleted.
924         (JSC::Parser<LexerType>::parseAssignmentExpression): Deleted.
925         (JSC::Parser<LexerType>::parseProperty): Deleted.
926         (JSC::Parser<LexerType>::parseFunctionExpression): Deleted.
927
928 2016-05-17  Keith Miller  <keith_miller@apple.com>
929
930         Rollout r200426 since it causes PLT regressions.
931         https://bugs.webkit.org/show_bug.cgi?id=157812
932
933         Unreviewed rollout of r200426 since the bots see a ~.6% PLT regression from the patch.
934
935 2016-05-17  Keith Miller  <keith_miller@apple.com>
936
937         Add test262 harness support code
938         https://bugs.webkit.org/show_bug.cgi?id=157797
939
940         Reviewed by Filip Pizlo.
941
942         This patch adds some new tooling needed to run Test262 with the jsc
943         CLI. There were three options that needed to be added for Test262:
944
945         1) "--test262-async" This option overrides the print function in the test runner to look for
946         'Test262:AsyncTestComplete' instead of printing the passed text. If test262-async mode is on
947         and that string is not passed then the test is marked as failing.
948
949         2) "--strict-file=<file>" This option appends `"use strict";\n` to the beginning of the
950         passed file before passing the source code to the VM. This option can, in theory, be passed
951         multiple times.
952
953         3) "--exception=<name>" This option asserts that at the end of the last script file passed
954         the VM has an uncaught exception with its name property equal to the passed name.
955
956         * jsc.cpp:
957         (Script::Script):
958         (fillBufferWithContentsOfFile):
959         (functionPrint):
960         (checkUncaughtException):
961         (runWithScripts):
962         (printUsageStatement):
963         (CommandLine::parseArguments):
964         (runJSC):
965
966 2016-05-17  Filip Pizlo  <fpizlo@apple.com>
967
968         WTF should know about Language
969         https://bugs.webkit.org/show_bug.cgi?id=157756
970
971         Reviewed by Geoffrey Garen.
972
973         Teach our scripts that a ObjC class beginning with WTF is totally cool.
974
975         * JavaScriptCore.xcodeproj/project.pbxproj:
976
977 2016-05-17  Joseph Pecoraro  <pecoraro@apple.com>
978
979         console namespace breaks putting properties on console.__proto__
980         https://bugs.webkit.org/show_bug.cgi?id=157782
981         <rdar://problem/26250526>
982
983         Reviewed by Geoffrey Garen.
984
985         Some websites currently depend on console.__proto__ existing and being
986         a separate object from Object.prototype. This patch adds back a basic
987         console.__proto__ object, but all the console functions are left on
988         the ConsoleObject itself.
989
990         * runtime/JSGlobalObject.cpp:
991         (JSC::createConsoleProperty):
992
993 2016-05-17  Yusuke Suzuki  <utatane.tea@gmail.com>
994
995         Unreviewed, dump more information when math-pow-stable-results.js failed
996         https://bugs.webkit.org/show_bug.cgi?id=157168
997
998         * tests/stress/math-pow-stable-results.js:
999
1000 2016-05-16  Saam barati  <sbarati@apple.com>
1001
1002         ShadowChicken crashes when reading a scope from the frame during a stack overflow exception
1003         https://bugs.webkit.org/show_bug.cgi?id=157770
1004
1005         Reviewed by Filip Pizlo.
1006
1007         ShadowChicken was reading the scope from a half formed
1008         frame as it threw a stack overflow exception. The frame had
1009         a valid CodeBlock pointer, but it did not have a valid scope.
1010         The code in ShadowChicken's throw packet logging mechanism didn't
1011         account for this. The fix is to respect whether genericUnwind wants
1012         to unwind from the current frame or the caller's frame. For stack
1013         overflow errors, we always unwind the caller's frame.
1014
1015         * jit/JITExceptions.cpp:
1016         (JSC::genericUnwind):
1017
1018 2016-05-16  Yusuke Suzuki  <utatane.tea@gmail.com>
1019
1020         REGRESSION(r200208): It made 2 JSC stress tests fail on x86
1021         https://bugs.webkit.org/show_bug.cgi?id=157168
1022
1023         Reviewed by Benjamin Poulain.
1024
1025         The fast path in operationMathPow produces different results between x87 and the other environments.
1026         This is because x87 calculates the double value in 80bit precision.
1027         The situation is the following: in x86 32bit environment, floating point operations are compiled to
1028         x87 operations by default even if we can use SSE2. But in DFG environment, we aggressively use SSE2
1029         if the cpuid reports SSE2 is available. As a result, the implementations differ between C runtime
1030         and DFG JIT code. The C runtime uses x87 while DFG JIT code uses SSE2. This causes a precision
1031         problem since x87 has 80bit precision while SSE2 has 64bit precision.
1032
1033         In this patch, in x86 32bit environment, we use `volatile double` if the `-mfpmath=sse and -msse2 (or later)`
1034         is not specified. This will round the x87 value into 64bit per multiplying. Note that this problem does not
1035         occur in OS X clang 32bit environment. This is because `-mfpmath=sse` is enabled by default in OS X clang 32bit.
1036
1037         * b3/B3MathExtras.cpp:
1038         (JSC::B3::powDoubleInt32):
1039         * runtime/MathCommon.cpp:
1040         (JSC::operationMathPow):
1041
1042 2016-05-16  Benjamin Poulain  <bpoulain@apple.com>
1043
1044         [JSC] "return this" in a constructor does not need a branch on isObject(this)
1045         https://bugs.webkit.org/show_bug.cgi?id=157775
1046
1047         Reviewed by Saam Barati and Ryosuke Niwa.
1048
1049         When returning "this" in a constructor, the bytecode generator was generating:
1050             is_object         locX, this
1051             jtrue             locX, 5(->second ret)
1052             ret               this
1053             ret               this
1054
1055         That code is eliminated in DFG but it is pretty costly lower tiers.
1056
1057         This patch changes bytecode generation to avoid the is_object test
1058         when possible and not generate two ret if they encode the same thing.
1059
1060         * bytecompiler/BytecodeGenerator.cpp:
1061         (JSC::BytecodeGenerator::emitReturn):
1062
1063 2016-05-16  Benjamin Poulain  <bpoulain@apple.com>
1064
1065         [JSC] Remove the index check from op_get_by_val/op_put_by_val when the index is constant
1066         https://bugs.webkit.org/show_bug.cgi?id=157766
1067
1068         Reviewed by Geoffrey Garen.
1069
1070         If the index is an integer constant, do not generate the index check.
1071
1072         * jit/JITPropertyAccess.cpp:
1073         (JSC::JIT::emit_op_get_by_val):
1074         (JSC::JIT::emitSlow_op_get_by_val):
1075         (JSC::JIT::emit_op_put_by_val):
1076         (JSC::JIT::emitSlow_op_put_by_val):
1077
1078 2016-05-16  Benjamin Poulain  <bpoulain@apple.com>
1079
1080         [JSC][DFG] Fill spilled Int32 as Int32 instead of JSInt32
1081         https://bugs.webkit.org/show_bug.cgi?id=157700
1082
1083         Reviewed by Michael Saboff.
1084
1085         In general, fillSpeculateInt32() originate from SpeculateInt32
1086         and the user does not care about the tag.
1087
1088         This is particularily obvious on Sunspider's math-spectral-norm.js.
1089         In that test, registers are frequently spilled because of x86's DIV.
1090
1091         When they are re-filled, they were always tagged.
1092         Since the loops are small, all the tagging adds up.
1093
1094         * dfg/DFGSpeculativeJIT64.cpp:
1095         (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal):
1096
1097 2016-05-16  Saam barati  <sbarati@apple.com>
1098
1099         Unreviewed Cloop build fix.
1100
1101         * bytecode/CodeBlock.cpp:
1102         (JSC::CodeBlock::bytecodeOffsetFromCallSiteIndex):
1103
1104 2016-05-16  Saam barati  <sbarati@apple.com>
1105
1106         Hook up ShadowChicken to the debugger to show tail deleted frames
1107         https://bugs.webkit.org/show_bug.cgi?id=156685
1108         <rdar://problem/25770521>
1109
1110         Reviewed by Filip Pizlo and Mark Lam and Joseph Pecoraro.
1111
1112         The heart of this patch hooks up ShadowChicken to DebuggerCallFrame to
1113         allow the Web Inspector to display the ShadowChicken's shadow stack.
1114         This means the Web Inspector can now display tail deleted frames.
1115         To make this work, I made the necessary changes to ShadowChicken and
1116         DebuggerCallFrame to allow DebuggerCallFrame to keep the same API
1117         when representing both machine frames and tail deleted frames.
1118
1119         - ShadowChicken prologue packets now log the current scope. Tail packets
1120           log the current scope, the 'this' value, the CodeBlock, and the
1121           CallSiteIndex. This allows the inspector to not only show the
1122           tail deleted frame, but also show exactly where the tail call happened (line and column numbers),
1123           with which scope it executed, and with which 'this' value. This
1124           patch also allows DebuggerCallFrame to execute console statements
1125           in a tail deleted frame.
1126
1127         - I changed ShadowChicken's stack resizing algorithm. ShadowChicken
1128           now only keeps a maximum number of tail deleted frames in its shadow stack.
1129           It will happily represent all machine frames without limit. Right now, the
1130           maximum number of tail deleted frames I chose to keep alive is 128.
1131           We will keep frames alive starting from the top of the stack. This
1132           allows us to have a strong defense against runaway memory usage. We will only
1133           keep around at most 128 "shadow" frames that wouldn't have naturally been kept
1134           alive by the executing program. We can play around with this number
1135           if we find that 128 is either too many or too few frames.
1136
1137         - DebuggerCallFrame is no longer a cheap class to create. When it is created,
1138           we will eagerly create the entire virtual debugger stack. So I modified the
1139           existing code to lazily create DebuggerCallFrames only when necessary. We
1140           used to eagerly create them at each op_debug statement even though we would
1141           just throw them away if we didn't hit a breakpoint.
1142
1143         - A valid DebuggerCallFrame will always have a valid CallFrame* pointer
1144           into the stack. This pointer won't always refer to the logical frame
1145           that the DebuggerCallFrame represents because a DebuggerCallFrame can
1146           now represent a tail deleted frame. To do this, DebuggerCallFrame now
1147           has a ShadowChicken::Frame member variable. This allows DebuggerCallFrame
1148           to know when it represents a tail deleted frame and gives DebuggerCallFrame
1149           a mechanism to ask the tail deleted frame for interesting information
1150           (like its 'this' value, scope, CodeBlock, etc). A tail deleted frame's
1151           machine frame pointer will be the machine caller of the tail deleted frame
1152           (or the machine caller of the first of a series of consecutive tail calls).
1153
1154         - I added a new flag to UnlinkedCodeBlock to indicate when it is compiled
1155           with debugging opcodes. I did this because ShadowChicken may read a JSScope
1156           from the machine stack. This is only safe if the machine CodeBlock was
1157           compiled with debugging opcodes. This is safer than asking if the
1158           CodeBlock's global object has an interactive debugger enabled because
1159           it's theoretically possible for the debugger to be enabled while code
1160           compiled without a debugger is still live on the stack. This field is
1161           also now used to indicate to the DFGGraph that the interactive debugger
1162           is enabled.
1163
1164         - Finally, this patch adds a new field to the Inspector's CallFrame protocol
1165           object called 'isTailDeleted' to allow the Inspector to know when a
1166           CallFrame represents a tail deleted frame.
1167
1168         * JavaScriptCore.xcodeproj/project.pbxproj:
1169         * bytecode/BytecodeList.json:
1170         * bytecode/BytecodeUseDef.h:
1171         (JSC::computeUsesForBytecodeOffset):
1172         * bytecode/CodeBlock.cpp:
1173         (JSC::CodeBlock::dumpBytecode):
1174         (JSC::CodeBlock::findPC):
1175         (JSC::CodeBlock::bytecodeOffsetFromCallSiteIndex):
1176         * bytecode/CodeBlock.h:
1177         (JSC::CodeBlock::clearDebuggerRequests):
1178         (JSC::CodeBlock::wasCompiledWithDebuggingOpcodes):
1179         * bytecode/UnlinkedCodeBlock.cpp:
1180         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
1181         * bytecode/UnlinkedCodeBlock.h:
1182         (JSC::UnlinkedCodeBlock::wasCompiledWithDebuggingOpcodes):
1183         (JSC::UnlinkedCodeBlock::finishCreation):
1184         (JSC::UnlinkedGlobalCodeBlock::UnlinkedGlobalCodeBlock):
1185         * bytecode/UnlinkedFunctionExecutable.cpp:
1186         (JSC::generateUnlinkedFunctionCodeBlock):
1187         * bytecompiler/BytecodeGenerator.cpp:
1188         (JSC::BytecodeGenerator::generate):
1189         (JSC::BytecodeGenerator::BytecodeGenerator):
1190         (JSC::BytecodeGenerator::emitEnter):
1191         (JSC::BytecodeGenerator::emitLogShadowChickenPrologueIfNecessary):
1192         (JSC::BytecodeGenerator::emitLogShadowChickenTailIfNecessary):
1193         (JSC::BytecodeGenerator::emitCallDefineProperty):
1194         * debugger/Debugger.cpp:
1195         (JSC::DebuggerPausedScope::DebuggerPausedScope):
1196         (JSC::DebuggerPausedScope::~DebuggerPausedScope):
1197         (JSC::Debugger::didReachBreakpoint):
1198         (JSC::Debugger::currentDebuggerCallFrame):
1199         * debugger/Debugger.h:
1200         * debugger/DebuggerCallFrame.cpp:
1201         (JSC::LineAndColumnFunctor::operator()):
1202         (JSC::DebuggerCallFrame::create):
1203         (JSC::DebuggerCallFrame::DebuggerCallFrame):
1204         (JSC::DebuggerCallFrame::callerFrame):
1205         (JSC::DebuggerCallFrame::globalExec):
1206         (JSC::DebuggerCallFrame::vmEntryGlobalObject):
1207         (JSC::DebuggerCallFrame::sourceID):
1208         (JSC::DebuggerCallFrame::functionName):
1209         (JSC::DebuggerCallFrame::scope):
1210         (JSC::DebuggerCallFrame::type):
1211         (JSC::DebuggerCallFrame::thisValue):
1212         (JSC::DebuggerCallFrame::evaluateWithScopeExtension):
1213         (JSC::DebuggerCallFrame::invalidate):
1214         (JSC::DebuggerCallFrame::currentPosition):
1215         (JSC::DebuggerCallFrame::positionForCallFrame):
1216         (JSC::DebuggerCallFrame::sourceIDForCallFrame):
1217         (JSC::FindCallerMidStackFunctor::FindCallerMidStackFunctor): Deleted.
1218         (JSC::FindCallerMidStackFunctor::operator()): Deleted.
1219         (JSC::FindCallerMidStackFunctor::getCallerFrame): Deleted.
1220         (JSC::DebuggerCallFrame::thisValueForCallFrame): Deleted.
1221         * debugger/DebuggerCallFrame.h:
1222         (JSC::DebuggerCallFrame::isValid):
1223         (JSC::DebuggerCallFrame::isTailDeleted):
1224         (JSC::DebuggerCallFrame::create): Deleted.
1225         (JSC::DebuggerCallFrame::exec): Deleted.
1226         * dfg/DFGByteCodeParser.cpp:
1227         (JSC::DFG::ByteCodeParser::parseBlock):
1228         * dfg/DFGFixupPhase.cpp:
1229         (JSC::DFG::FixupPhase::fixupNode):
1230         * dfg/DFGGraph.cpp:
1231         (JSC::DFG::Graph::Graph):
1232         (JSC::DFG::Graph::~Graph):
1233         * dfg/DFGJITCompiler.h:
1234         (JSC::DFG::JITCompiler::addCallSite):
1235         (JSC::DFG::JITCompiler::emitStoreCodeOrigin):
1236         (JSC::DFG::JITCompiler::emitStoreCallSiteIndex):
1237         * dfg/DFGSpeculativeJIT32_64.cpp:
1238         (JSC::DFG::SpeculativeJIT::compile):
1239         * dfg/DFGSpeculativeJIT64.cpp:
1240         (JSC::DFG::SpeculativeJIT::compile):
1241         * ftl/FTLAbstractHeapRepository.h:
1242         * ftl/FTLLowerDFGToB3.cpp:
1243         (JSC::FTL::DFG::LowerDFGToB3::compileLogShadowChickenPrologue):
1244         (JSC::FTL::DFG::LowerDFGToB3::compileLogShadowChickenTail):
1245         (JSC::FTL::DFG::LowerDFGToB3::compileRecordRegExpCachedResult):
1246         (JSC::FTL::DFG::LowerDFGToB3::allocateJSArray):
1247         (JSC::FTL::DFG::LowerDFGToB3::ensureShadowChickenPacket):
1248         (JSC::FTL::DFG::LowerDFGToB3::setupShadowChickenPacket): Deleted.
1249         * inspector/InjectedScriptSource.js:
1250         (InjectedScript.CallFrameProxy):
1251         * inspector/JSJavaScriptCallFrame.cpp:
1252         (Inspector::JSJavaScriptCallFrame::thisObject):
1253         (Inspector::JSJavaScriptCallFrame::isTailDeleted):
1254         (Inspector::JSJavaScriptCallFrame::type):
1255         * inspector/JSJavaScriptCallFrame.h:
1256         * inspector/JSJavaScriptCallFramePrototype.cpp:
1257         (Inspector::JSJavaScriptCallFramePrototype::finishCreation):
1258         (Inspector::jsJavaScriptCallFramePrototypeFunctionEvaluateWithScopeExtension):
1259         (Inspector::jsJavaScriptCallFrameAttributeType):
1260         (Inspector::jsJavaScriptCallFrameIsTailDeleted):
1261         * inspector/JavaScriptCallFrame.h:
1262         (Inspector::JavaScriptCallFrame::type):
1263         (Inspector::JavaScriptCallFrame::scopeChain):
1264         (Inspector::JavaScriptCallFrame::vmEntryGlobalObject):
1265         (Inspector::JavaScriptCallFrame::isTailDeleted):
1266         (Inspector::JavaScriptCallFrame::thisValue):
1267         (Inspector::JavaScriptCallFrame::evaluateWithScopeExtension):
1268         * inspector/ScriptDebugServer.cpp:
1269         (Inspector::ScriptDebugServer::evaluateBreakpointAction):
1270         * inspector/protocol/Debugger.json:
1271         * interpreter/ShadowChicken.cpp:
1272         (JSC::ShadowChicken::update):
1273         (JSC::ShadowChicken::visitChildren):
1274         (JSC::ShadowChicken::reset):
1275         * interpreter/ShadowChicken.h:
1276         (JSC::ShadowChicken::Packet::throwMarker):
1277         (JSC::ShadowChicken::Packet::prologue):
1278         (JSC::ShadowChicken::Packet::tail):
1279         (JSC::ShadowChicken::Frame::Frame):
1280         (JSC::ShadowChicken::Frame::operator==):
1281         * jit/CCallHelpers.cpp:
1282         (JSC::CCallHelpers::logShadowChickenProloguePacket):
1283         (JSC::CCallHelpers::logShadowChickenTailPacket):
1284         (JSC::CCallHelpers::ensureShadowChickenPacket):
1285         (JSC::CCallHelpers::setupShadowChickenPacket): Deleted.
1286         * jit/CCallHelpers.h:
1287         * jit/JITOpcodes.cpp:
1288         (JSC::JIT::emit_op_profile_type):
1289         (JSC::JIT::emit_op_log_shadow_chicken_prologue):
1290         (JSC::JIT::emit_op_log_shadow_chicken_tail):
1291         (JSC::JIT::emit_op_get_enumerable_length):
1292         (JSC::JIT::emit_op_resume):
1293         * jit/JITOpcodes32_64.cpp:
1294         (JSC::JIT::emit_op_profile_type):
1295         (JSC::JIT::emit_op_log_shadow_chicken_prologue):
1296         (JSC::JIT::emit_op_log_shadow_chicken_tail):
1297         * jit/RegisterSet.cpp:
1298         (JSC::RegisterSet::webAssemblyCalleeSaveRegisters):
1299         (JSC::RegisterSet::argumentGPRS):
1300         (JSC::RegisterSet::registersToNotSaveForJSCall):
1301         * jit/RegisterSet.h:
1302         * llint/LLIntData.cpp:
1303         (JSC::LLInt::Data::performAssertions):
1304         * llint/LLIntSlowPaths.cpp:
1305         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
1306         * llint/LowLevelInterpreter.asm:
1307         * llint/LowLevelInterpreter32_64.asm:
1308         * llint/LowLevelInterpreter64.asm:
1309         * runtime/CodeCache.cpp:
1310         (JSC::CodeCache::getGlobalCodeBlock):
1311         * runtime/Options.h:
1312         * tests/stress/shadow-chicken-enabled.js:
1313         (test5a.foo):
1314         (test5a):
1315         (test5b.foo):
1316         (test5b):
1317         (test6.foo):
1318         (test6):
1319
1320 2016-05-16  Saam barati  <sbarati@apple.com>
1321
1322         TypeSet/StructureShape have a flawed sense of JS prototype chains
1323         https://bugs.webkit.org/show_bug.cgi?id=157760
1324
1325         Reviewed by Joseph Pecoraro.
1326
1327         There was an assumption that we would bottom out in "Object". This is
1328         not true for many reasons. JS objects may not end in Object.prototype.
1329         Also, our mechanism of grabbing an Object's class name may also not
1330         bottom out in "Object". We were seeing this in the JS objects we use
1331         in the InjectedScriptSource.js inspector script.
1332
1333         * runtime/TypeSet.cpp:
1334         (JSC::StructureShape::leastCommonAncestor):
1335         * tests/typeProfiler/weird-prototype-chain.js: Added.
1336         (wrapper.foo):
1337         (wrapper.let.o2):
1338         (wrapper):
1339
1340 2016-05-16  Joseph Pecoraro  <pecoraro@apple.com>
1341
1342         Unreviewed rollout r200924. Caused js/regress/string-replace-generic.html to fail.
1343
1344         * API/JSProfilerPrivate.cpp: Copied from Source/JavaScriptCore/profiler/ProfilerJettisonReason.h.
1345         (JSStartProfiling):
1346         (JSEndProfiling):
1347         * API/JSProfilerPrivate.h: Copied from Source/JavaScriptCore/profiler/ProfilerJettisonReason.h.
1348         * CMakeLists.txt:
1349         * JavaScriptCore.xcodeproj/project.pbxproj:
1350         * bytecode/BytecodeList.json:
1351         * bytecode/BytecodeUseDef.h:
1352         (JSC::computeUsesForBytecodeOffset):
1353         (JSC::computeDefsForBytecodeOffset):
1354         * bytecode/CodeBlock.cpp:
1355         (JSC::CodeBlock::dumpBytecode):
1356         * bytecode/UnlinkedFunctionExecutable.cpp:
1357         (JSC::generateUnlinkedFunctionCodeBlock):
1358         (JSC::UnlinkedFunctionExecutable::unlinkedCodeBlockFor):
1359         * bytecode/UnlinkedFunctionExecutable.h:
1360         * bytecompiler/BytecodeGenerator.cpp:
1361         (JSC::BytecodeGenerator::BytecodeGenerator):
1362         (JSC::BytecodeGenerator::emitCall):
1363         (JSC::BytecodeGenerator::emitCallVarargs):
1364         (JSC::BytecodeGenerator::emitCallVarargsInTailPosition):
1365         (JSC::BytecodeGenerator::emitConstructVarargs):
1366         (JSC::BytecodeGenerator::emitConstruct):
1367         * bytecompiler/BytecodeGenerator.h:
1368         (JSC::CallArguments::profileHookRegister):
1369         (JSC::BytecodeGenerator::shouldEmitProfileHooks):
1370         * bytecompiler/NodesCodegen.cpp:
1371         (JSC::CallArguments::CallArguments):
1372         (JSC::CallFunctionCallDotNode::emitBytecode):
1373         (JSC::ApplyFunctionCallDotNode::emitBytecode):
1374         * dfg/DFGAbstractInterpreterInlines.h:
1375         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1376         * dfg/DFGByteCodeParser.cpp:
1377         (JSC::DFG::ByteCodeParser::parseBlock):
1378         * dfg/DFGCapabilities.cpp:
1379         (JSC::DFG::capabilityLevel):
1380         * dfg/DFGClobberize.h:
1381         (JSC::DFG::clobberize):
1382         * dfg/DFGDoesGC.cpp:
1383         (JSC::DFG::doesGC):
1384         * dfg/DFGFixupPhase.cpp:
1385         (JSC::DFG::FixupPhase::fixupNode):
1386         * dfg/DFGNodeType.h:
1387         * dfg/DFGPredictionPropagationPhase.cpp:
1388         * dfg/DFGSafeToExecute.h:
1389         (JSC::DFG::safeToExecute):
1390         * dfg/DFGSpeculativeJIT32_64.cpp:
1391         (JSC::DFG::SpeculativeJIT::compile):
1392         * dfg/DFGSpeculativeJIT64.cpp:
1393         (JSC::DFG::SpeculativeJIT::compile):
1394         * inspector/InjectedScriptBase.cpp:
1395         (Inspector::InjectedScriptBase::callFunctionWithEvalEnabled):
1396         * inspector/protocol/Timeline.json:
1397         * interpreter/Interpreter.cpp:
1398         (JSC::UnwindFunctor::operator()):
1399         (JSC::Interpreter::execute):
1400         (JSC::Interpreter::executeCall):
1401         (JSC::Interpreter::executeConstruct):
1402         * jit/JIT.cpp:
1403         (JSC::JIT::privateCompileMainPass):
1404         * jit/JIT.h:
1405         * jit/JITOpcodes.cpp:
1406         (JSC::JIT::emit_op_profile_will_call):
1407         (JSC::JIT::emit_op_profile_did_call):
1408         * jit/JITOpcodes32_64.cpp:
1409         (JSC::JIT::emit_op_profile_will_call):
1410         (JSC::JIT::emit_op_profile_did_call):
1411         * jit/JITOperations.cpp:
1412         * jit/JITOperations.h:
1413         * jsc.cpp:
1414         * llint/LLIntSlowPaths.cpp:
1415         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
1416         * llint/LLIntSlowPaths.h:
1417         * llint/LowLevelInterpreter.asm:
1418         * parser/ParserModes.h:
1419         * profiler/CallIdentifier.h: Added.
1420         (JSC::CallIdentifier::CallIdentifier):
1421         (JSC::CallIdentifier::functionName):
1422         (JSC::CallIdentifier::url):
1423         (JSC::CallIdentifier::lineNumber):
1424         (JSC::CallIdentifier::columnNumber):
1425         (JSC::CallIdentifier::operator==):
1426         (JSC::CallIdentifier::operator!=):
1427         (JSC::CallIdentifier::Hash::hash):
1428         (JSC::CallIdentifier::Hash::equal):
1429         (JSC::CallIdentifier::hash):
1430         (JSC::CallIdentifier::operator const char*):
1431         (JSC::CallIdentifier::c_str):
1432         (WTF::HashTraits<JSC::CallIdentifier>::constructDeletedValue):
1433         (WTF::HashTraits<JSC::CallIdentifier>::isDeletedValue):
1434         * profiler/LegacyProfiler.cpp: Added.
1435         (JSC::LegacyProfiler::profiler):
1436         (JSC::LegacyProfiler::startProfiling):
1437         (JSC::LegacyProfiler::stopProfiling):
1438         (JSC::callFunctionForProfilesWithGroup):
1439         (JSC::LegacyProfiler::suspendProfiling):
1440         (JSC::LegacyProfiler::unsuspendProfiling):
1441         (JSC::LegacyProfiler::willExecute):
1442         (JSC::LegacyProfiler::didExecute):
1443         (JSC::LegacyProfiler::exceptionUnwind):
1444         (JSC::LegacyProfiler::createCallIdentifier):
1445         (JSC::createCallIdentifierFromFunctionImp):
1446         * profiler/LegacyProfiler.h: Added.
1447         (JSC::LegacyProfiler::currentProfiles):
1448         * profiler/Profile.cpp: Added.
1449         (JSC::Profile::create):
1450         (JSC::Profile::Profile):
1451         (JSC::Profile::~Profile):
1452         (JSC::Profile::debugPrint):
1453         (JSC::functionNameCountPairComparator):
1454         (JSC::Profile::debugPrintSampleStyle):
1455         * profiler/Profile.h: Copied from Source/JavaScriptCore/profiler/ProfilerJettisonReason.h.
1456         * profiler/ProfileGenerator.cpp: Added.
1457         (JSC::ProfileGenerator::create):
1458         (JSC::ProfileGenerator::ProfileGenerator):
1459         (JSC::AddParentForConsoleStartFunctor::AddParentForConsoleStartFunctor):
1460         (JSC::AddParentForConsoleStartFunctor::foundParent):
1461         (JSC::AddParentForConsoleStartFunctor::operator()):
1462         (JSC::ProfileGenerator::addParentForConsoleStart):
1463         (JSC::ProfileGenerator::title):
1464         (JSC::ProfileGenerator::beginCallEntry):
1465         (JSC::ProfileGenerator::endCallEntry):
1466         (JSC::ProfileGenerator::willExecute):
1467         (JSC::ProfileGenerator::didExecute):
1468         (JSC::ProfileGenerator::exceptionUnwind):
1469         (JSC::ProfileGenerator::stopProfiling):
1470         (JSC::ProfileGenerator::removeProfileStart):
1471         (JSC::ProfileGenerator::removeProfileEnd):
1472         * profiler/ProfileGenerator.h: Added.
1473         (JSC::ProfileGenerator::profile):
1474         (JSC::ProfileGenerator::origin):
1475         (JSC::ProfileGenerator::profileGroup):
1476         (JSC::ProfileGenerator::setIsSuspended):
1477         * profiler/ProfileNode.cpp: Added.
1478         (JSC::ProfileNode::ProfileNode):
1479         (JSC::ProfileNode::addChild):
1480         (JSC::ProfileNode::removeChild):
1481         (JSC::ProfileNode::spliceNode):
1482         (JSC::ProfileNode::traverseNextNodePostOrder):
1483         (JSC::ProfileNode::debugPrint):
1484         (JSC::ProfileNode::debugPrintSampleStyle):
1485         (JSC::ProfileNode::debugPrintRecursively):
1486         (JSC::ProfileNode::debugPrintSampleStyleRecursively):
1487         * profiler/ProfileNode.h: Added.
1488         (JSC::ProfileNode::create):
1489         (JSC::ProfileNode::Call::Call):
1490         (JSC::ProfileNode::Call::startTime):
1491         (JSC::ProfileNode::Call::setStartTime):
1492         (JSC::ProfileNode::Call::elapsedTime):
1493         (JSC::ProfileNode::Call::setElapsedTime):
1494         (JSC::ProfileNode::operator==):
1495         (JSC::ProfileNode::callerCallFrame):
1496         (JSC::ProfileNode::callIdentifier):
1497         (JSC::ProfileNode::id):
1498         (JSC::ProfileNode::functionName):
1499         (JSC::ProfileNode::url):
1500         (JSC::ProfileNode::lineNumber):
1501         (JSC::ProfileNode::columnNumber):
1502         (JSC::ProfileNode::parent):
1503         (JSC::ProfileNode::setParent):
1504         (JSC::ProfileNode::calls):
1505         (JSC::ProfileNode::lastCall):
1506         (JSC::ProfileNode::appendCall):
1507         (JSC::ProfileNode::children):
1508         (JSC::ProfileNode::firstChild):
1509         (JSC::ProfileNode::lastChild):
1510         (JSC::ProfileNode::nextSibling):
1511         (JSC::ProfileNode::setNextSibling):
1512         (JSC::ProfileNode::forEachNodePostorder):
1513         (JSC::CalculateProfileSubtreeDataFunctor::operator()):
1514         (JSC::CalculateProfileSubtreeDataFunctor::returnValue):
1515         * profiler/ProfilerJettisonReason.cpp:
1516         (WTF::printInternal):
1517         * profiler/ProfilerJettisonReason.h:
1518         * runtime/CodeCache.cpp:
1519         (JSC::CodeCache::getGlobalCodeBlock):
1520         (JSC::CodeCache::getProgramCodeBlock):
1521         (JSC::CodeCache::getEvalCodeBlock):
1522         (JSC::CodeCache::getModuleProgramCodeBlock):
1523         * runtime/CodeCache.h:
1524         * runtime/Executable.cpp:
1525         (JSC::ScriptExecutable::newCodeBlockFor):
1526         * runtime/JSGlobalObject.cpp:
1527         (JSC::JSGlobalObject::~JSGlobalObject):
1528         (JSC::JSGlobalObject::hasLegacyProfiler):
1529         (JSC::JSGlobalObject::createProgramCodeBlock):
1530         (JSC::JSGlobalObject::createEvalCodeBlock):
1531         (JSC::JSGlobalObject::createModuleProgramCodeBlock):
1532         * runtime/JSGlobalObject.h:
1533         (JSC::JSGlobalObject::supportsLegacyProfiling):
1534         * runtime/Options.h:
1535         * runtime/VM.cpp:
1536         (JSC::VM::VM):
1537         (JSC::SetEnabledProfilerFunctor::operator()):
1538         (JSC::VM::setEnabledProfiler):
1539         * runtime/VM.h:
1540         (JSC::VM::enabledProfiler):
1541         (JSC::VM::enabledProfilerAddress):
1542
1543 2016-05-16  Konstantin Tokarev  <annulen@yandex.ru>
1544
1545         Unreviewed, fixed typo in a comment.
1546
1547         * assembler/MacroAssembler.h: Replaced "onvenience" with
1548         "convenience".
1549
1550 2016-05-16  Filip Pizlo  <fpizlo@apple.com>
1551
1552         FixupPhase should be more eager to demote bit math to untyped
1553         https://bugs.webkit.org/show_bug.cgi?id=157746
1554
1555         Reviewed by Mark Lam.
1556         
1557         This just makes the logic for how we fixup bit math match the way we do it in other places.
1558         This doesn't affect performance on any major benchmark but it's a big win on new
1559         microbenchmarks added in this change.
1560         
1561         Details:
1562
1563         object-and                                     11.1610+-0.7602     ^      4.8105+-0.1690        ^ definitely 2.3201x faster
1564         object-or                                      11.0845+-0.2487     ^      4.7146+-0.0374        ^ definitely 2.3511x faster
1565         object-xor                                     10.2946+-0.9946     ^      4.7278+-0.0814        ^ definitely 2.1775x faster
1566         object-lshift                                  10.4896+-1.0867     ^      4.7699+-0.0721        ^ definitely 2.1991x faster
1567         object-rshift                                  11.1239+-0.5010     ^      4.7194+-0.0445        ^ definitely 2.3570x faster
1568         object-urshift                                 10.9745+-0.1315     ^      4.7848+-0.0479        ^ definitely 2.2936x faster
1569
1570         * dfg/DFGFixupPhase.cpp:
1571         (JSC::DFG::FixupPhase::fixupNode):
1572
1573 2016-05-15  Michael Saboff  <msaboff@apple.com>
1574
1575         RegExp /y flag incorrect handling of mixed-length alternation
1576         https://bugs.webkit.org/show_bug.cgi?id=157723
1577
1578         Reviewed by Filip Pizlo.
1579
1580         Previously for sticky patterns, we were bailing out and exiting when backtracking
1581         alternatives with dissimilar match lengths.  Deleted that code.  Instead, for
1582         sticky patterns we need to process the backtracking except for advancing to the
1583         next input index.
1584
1585         * yarr/YarrJIT.cpp:
1586         (JSC::Yarr::YarrGenerator::backtrack):
1587
1588 2016-05-15  Filip Pizlo  <fpizlo@apple.com>
1589
1590         DFG::Plan shouldn't read from its VM once it's been cancelled
1591         https://bugs.webkit.org/show_bug.cgi?id=157726
1592
1593         Reviewed by Saam Barati.
1594         
1595         Plan::vm was a reference, not a pointer, and so wasn't nulled by Plan::cancel(). So, a
1596         cancelled plan may have a dangling pointer to a VM: we could delete the VM after cancelling
1597         the plan.
1598         
1599         Prior to http://trac.webkit.org/changeset/200705, this was probably fine because nobody
1600         would read Plan::vm if the plan was cancelled. But r200705 changed that. It was a hard
1601         regression to spot because usually a cancelled plan will still refer to a valid VM.
1602         
1603         This change fixes the regression and makes it a lot easier to spot the regression in the
1604         future. Plan::vm is now a pointer and we null it in Plan::cancel(). Now if you make this
1605         mistake, you will get a crash anytime the Plan is cancelled, not just anytime the plan is
1606         cancelled and the VM gets deleted. Also, it's now very clear what to do when you want to
1607         use Plan::vm on the cancel path: you can null-check vm; if it's null, assume the worst.
1608         
1609         Because we null the VM of a cancelled plan, we cannot have Safepoint::vm() return the
1610         plan's VM anymore. That's because when we cancel a plan that is at a safepoint, we use the
1611         safepoint's VM to determine whether this is one of our safepoints *after* the plan is
1612         already cancelled. So, Safepoint now has its own copy of m_vm, and that copy gets nulled
1613         when the Safepoint is cancelled. The Safepoint's m_vm will be nulled moments after Plan's
1614         vm gets nulled (see Worklist::removeDeadPlans(), which has a cancel path for Plans in one
1615         loop and a cancel path for Safepoints in the loop after it).
1616
1617         * dfg/DFGJITFinalizer.cpp:
1618         (JSC::DFG::JITFinalizer::finalizeCommon):
1619         * dfg/DFGPlan.cpp:
1620         (JSC::DFG::Plan::Plan):
1621         (JSC::DFG::Plan::computeCompileTimes):
1622         (JSC::DFG::Plan::reportCompileTimes):
1623         (JSC::DFG::Plan::compileInThreadImpl):
1624         (JSC::DFG::Plan::reallyAdd):
1625         (JSC::DFG::Plan::notifyCompiling):
1626         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
1627         (JSC::DFG::Plan::cancel):
1628         * dfg/DFGPlan.h:
1629         (JSC::DFG::Plan::canTierUpAndOSREnter):
1630         * dfg/DFGSafepoint.cpp:
1631         (JSC::DFG::Safepoint::cancel):
1632         (JSC::DFG::Safepoint::vm):
1633         * dfg/DFGSafepoint.h:
1634         * dfg/DFGWorklist.cpp:
1635         (JSC::DFG::Worklist::isActiveForVM):
1636         (JSC::DFG::Worklist::waitUntilAllPlansForVMAreReady):
1637         (JSC::DFG::Worklist::removeAllReadyPlansForVM):
1638         (JSC::DFG::Worklist::rememberCodeBlocks):
1639         (JSC::DFG::Worklist::visitWeakReferences):
1640         (JSC::DFG::Worklist::removeDeadPlans):
1641         (JSC::DFG::Worklist::runThread):
1642         * ftl/FTLJITFinalizer.cpp:
1643         (JSC::FTL::JITFinalizer::finalizeFunction):
1644
1645 2016-05-15  Yusuke Suzuki  <utatane.tea@gmail.com>
1646
1647         Modernize Intl constructors; using InternalFunction::createSubclassStructure
1648         https://bugs.webkit.org/show_bug.cgi?id=157082
1649
1650         Reviewed by Darin Adler.
1651
1652         Previously, Intl constructors retrieve "prototype" to inherit the "new.target".
1653         At that time, this mis-assumed that getDirect() always returns meaningful JS value.
1654         Actually, it returns an empty value if a property does not exist.
1655
1656         Instead of fixing this assertion, we now use InternalFunction::createSubclassStructure
1657         in Intl constructors. It is modern and preferable way since it can cache the derived
1658         structures in InternalFunction.
1659
1660         This patch also cleans up the workaround in Intl.NumberFormat and Intl.DateTimeFormat.
1661         Those code are largely duplicate. This is now extracted into
1662         constructIntlInstanceWithWorkaroundForLegacyIntlConstructor. This clean up does not
1663         have any behavior changes. They are already tested in LayoutTests/js/intl-datetimeformat
1664         and LayoutTests/js/intl-numberformat.
1665
1666         * JavaScriptCore.xcodeproj/project.pbxproj:
1667         * runtime/IntlCollator.cpp:
1668         (JSC::IntlCollator::create):
1669         * runtime/IntlCollator.h:
1670         * runtime/IntlCollatorConstructor.cpp:
1671         (JSC::constructIntlCollator):
1672         (JSC::callIntlCollator):
1673         * runtime/IntlDateTimeFormat.cpp:
1674         (JSC::IntlDateTimeFormat::create):
1675         * runtime/IntlDateTimeFormat.h:
1676         * runtime/IntlDateTimeFormatConstructor.cpp:
1677         (JSC::constructIntlDateTimeFormat):
1678         (JSC::callIntlDateTimeFormat):
1679         * runtime/IntlDateTimeFormatPrototype.cpp:
1680         (JSC::IntlDateTimeFormatPrototypeGetterFormat):
1681         (JSC::IntlDateTimeFormatPrototypeFuncResolvedOptions):
1682         * runtime/IntlNumberFormat.cpp:
1683         (JSC::IntlNumberFormat::create):
1684         * runtime/IntlNumberFormat.h:
1685         * runtime/IntlNumberFormatConstructor.cpp:
1686         (JSC::constructIntlNumberFormat):
1687         (JSC::callIntlNumberFormat):
1688         * runtime/IntlNumberFormatPrototype.cpp:
1689         (JSC::IntlNumberFormatPrototypeGetterFormat):
1690         (JSC::IntlNumberFormatPrototypeFuncResolvedOptions):
1691         * runtime/IntlObjectInlines.h: Added.
1692         (JSC::constructIntlInstanceWithWorkaroundForLegacyIntlConstructor):
1693         * tests/stress/intl-constructors-with-proxy.js: Added.
1694         (shouldBe):
1695         (throw.new.Error.Empty):
1696         (throw.new.Error):
1697         (shouldBe.Empty):
1698
1699 2016-05-14  Joseph Pecoraro  <pecoraro@apple.com>
1700
1701         Remove LegacyProfiler
1702         https://bugs.webkit.org/show_bug.cgi?id=153565
1703
1704         Reviewed by Mark Lam.
1705
1706         JavaScriptCore now provides a sampling profiler and it is enabled
1707         by all ports. Web Inspector switched months ago to using the
1708         sampling profiler and displaying its data. Remove the legacy
1709         profiler, as it is no longer being used by anything other then
1710         console.profile and tests. We will update console.profile's
1711         behavior soon to have new behavior and use the sampling data.
1712
1713         * API/JSProfilerPrivate.cpp: Removed.
1714         * API/JSProfilerPrivate.h: Removed.
1715         * CMakeLists.txt:
1716         * JavaScriptCore.xcodeproj/project.pbxproj:
1717         * bytecode/BytecodeList.json:
1718         * bytecode/BytecodeUseDef.h:
1719         (JSC::computeUsesForBytecodeOffset): Deleted.
1720         (JSC::computeDefsForBytecodeOffset): Deleted.
1721         * bytecode/CodeBlock.cpp:
1722         (JSC::CodeBlock::dumpBytecode): Deleted.
1723         * bytecode/UnlinkedFunctionExecutable.cpp:
1724         (JSC::generateUnlinkedFunctionCodeBlock):
1725         (JSC::UnlinkedFunctionExecutable::unlinkedCodeBlockFor):
1726         * bytecode/UnlinkedFunctionExecutable.h:
1727         * bytecompiler/BytecodeGenerator.cpp:
1728         (JSC::BytecodeGenerator::BytecodeGenerator):
1729         (JSC::BytecodeGenerator::emitCall):
1730         (JSC::BytecodeGenerator::emitCallVarargs):
1731         (JSC::BytecodeGenerator::emitCallVarargsInTailPosition):
1732         (JSC::BytecodeGenerator::emitConstructVarargs):
1733         (JSC::BytecodeGenerator::emitConstruct):
1734         * bytecompiler/BytecodeGenerator.h:
1735         (JSC::CallArguments::profileHookRegister): Deleted.
1736         (JSC::BytecodeGenerator::shouldEmitProfileHooks): Deleted.
1737         * bytecompiler/NodesCodegen.cpp:
1738         (JSC::CallFunctionCallDotNode::emitBytecode):
1739         (JSC::ApplyFunctionCallDotNode::emitBytecode):
1740         (JSC::CallArguments::CallArguments): Deleted.
1741         * dfg/DFGAbstractInterpreterInlines.h:
1742         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): Deleted.
1743         * dfg/DFGByteCodeParser.cpp:
1744         (JSC::DFG::ByteCodeParser::parseBlock): Deleted.
1745         * dfg/DFGCapabilities.cpp:
1746         (JSC::DFG::capabilityLevel): Deleted.
1747         * dfg/DFGClobberize.h:
1748         (JSC::DFG::clobberize): Deleted.
1749         * dfg/DFGDoesGC.cpp:
1750         (JSC::DFG::doesGC): Deleted.
1751         * dfg/DFGFixupPhase.cpp:
1752         (JSC::DFG::FixupPhase::fixupNode): Deleted.
1753         * dfg/DFGNodeType.h:
1754         * dfg/DFGPredictionPropagationPhase.cpp:
1755         * dfg/DFGSafeToExecute.h:
1756         (JSC::DFG::safeToExecute): Deleted.
1757         * dfg/DFGSpeculativeJIT32_64.cpp:
1758         (JSC::DFG::SpeculativeJIT::compile): Deleted.
1759         * dfg/DFGSpeculativeJIT64.cpp:
1760         (JSC::DFG::SpeculativeJIT::compile): Deleted.
1761         * inspector/InjectedScriptBase.cpp:
1762         (Inspector::InjectedScriptBase::callFunctionWithEvalEnabled):
1763         * inspector/protocol/Timeline.json:
1764         * interpreter/Interpreter.cpp:
1765         (JSC::UnwindFunctor::operator()): Deleted.
1766         (JSC::Interpreter::execute): Deleted.
1767         (JSC::Interpreter::executeCall): Deleted.
1768         (JSC::Interpreter::executeConstruct): Deleted.
1769         * jit/JIT.cpp:
1770         (JSC::JIT::privateCompileMainPass): Deleted.
1771         * jit/JIT.h:
1772         * jit/JITOpcodes.cpp:
1773         (JSC::JIT::emit_op_profile_will_call): Deleted.
1774         (JSC::JIT::emit_op_profile_did_call): Deleted.
1775         * jit/JITOpcodes32_64.cpp:
1776         (JSC::JIT::emit_op_profile_will_call): Deleted.
1777         (JSC::JIT::emit_op_profile_did_call): Deleted.
1778         * jit/JITOperations.cpp:
1779         * jit/JITOperations.h:
1780         * jsc.cpp:
1781         * llint/LLIntSlowPaths.cpp:
1782         (JSC::LLInt::LLINT_SLOW_PATH_DECL): Deleted.
1783         * llint/LLIntSlowPaths.h:
1784         * llint/LowLevelInterpreter.asm:
1785         * parser/ParserModes.h:
1786         * profiler/CallIdentifier.h: Removed.
1787         * profiler/LegacyProfiler.cpp: Removed.
1788         * profiler/LegacyProfiler.h: Removed.
1789         * profiler/Profile.cpp: Removed.
1790         * profiler/Profile.h: Removed.
1791         * profiler/ProfileGenerator.cpp: Removed.
1792         * profiler/ProfileGenerator.h: Removed.
1793         * profiler/ProfileNode.cpp: Removed.
1794         * profiler/ProfileNode.h: Removed.
1795         * profiler/ProfilerJettisonReason.cpp:
1796         (WTF::printInternal): Deleted.
1797         * profiler/ProfilerJettisonReason.h:
1798         * runtime/CodeCache.cpp:
1799         (JSC::CodeCache::getGlobalCodeBlock):
1800         (JSC::CodeCache::getProgramCodeBlock):
1801         (JSC::CodeCache::getEvalCodeBlock):
1802         (JSC::CodeCache::getModuleProgramCodeBlock):
1803         * runtime/CodeCache.h:
1804         * runtime/Executable.cpp:
1805         (JSC::ScriptExecutable::newCodeBlockFor):
1806         * runtime/JSGlobalObject.cpp:
1807         (JSC::JSGlobalObject::createProgramCodeBlock):
1808         (JSC::JSGlobalObject::createEvalCodeBlock):
1809         (JSC::JSGlobalObject::createModuleProgramCodeBlock):
1810         (JSC::JSGlobalObject::~JSGlobalObject): Deleted.
1811         (JSC::JSGlobalObject::hasLegacyProfiler): Deleted.
1812         * runtime/JSGlobalObject.h:
1813         (JSC::JSGlobalObject::supportsLegacyProfiling): Deleted.
1814         * runtime/Options.h:
1815         * runtime/VM.cpp:
1816         (JSC::VM::VM): Deleted.
1817         (JSC::SetEnabledProfilerFunctor::operator()): Deleted.
1818         (JSC::VM::setEnabledProfiler): Deleted.
1819         * runtime/VM.h:
1820         (JSC::VM::enabledProfiler): Deleted.
1821         (JSC::VM::enabledProfilerAddress): Deleted.
1822
1823 2016-05-13  Joseph Pecoraro  <pecoraro@apple.com>
1824
1825         jsc: samplingProfilerStackTraces() without starting sampling should not cause jsc to crash
1826         https://bugs.webkit.org/show_bug.cgi?id=157704
1827
1828         Reviewed by Saam Barati.
1829
1830         * jsc.cpp:
1831         (functionStartSamplingProfiler):
1832         (functionSamplingProfilerStackTraces):
1833         Throw an exception instead of crashing if we haven't started sampling.
1834
1835         * inspector/agents/InspectorScriptProfilerAgent.cpp:
1836         (Inspector::InspectorScriptProfilerAgent::startTracking):
1837         * runtime/VM.h:
1838         * runtime/VM.cpp:
1839         (JSC::VM::ensureSamplingProfiler):
1840         Switch ensure to returning a reference, like most other ensures.
1841
1842 2016-05-13  Saam barati  <sbarati@apple.com>
1843
1844         DFG/FTL have a few bugs in their reasoning about the scope
1845         https://bugs.webkit.org/show_bug.cgi?id=157696
1846
1847         Reviewed by Benjamin Poulain.
1848
1849         1. When the debugger is enabled, it is easier for the DFG to reason
1850         about the scope register by simply claiming all nodes read the scope
1851         register. This prevents us from ever entering the runtime where we
1852         may take a stack trace but there isn't a scope on the stack.
1853
1854         2. This patch fixes a bug where the FTL compilation wasn't properly
1855         setting the CodeBlock register. It was only doing this when there
1856         was inline data, but when the debugger is enabled, we never inline.
1857         So this code just needed to be removed from that loop. It was never
1858         right for it to be inside the loop.
1859
1860         * dfg/DFGClobberize.h:
1861         (JSC::DFG::clobberize):
1862         * ftl/FTLCompile.cpp:
1863         (JSC::FTL::compile):
1864
1865 2016-05-13  Benjamin Poulain  <bpoulain@apple.com>
1866
1867         [JSC] SetLocal without exit do not need phantoms
1868         https://bugs.webkit.org/show_bug.cgi?id=157653
1869
1870         Reviewed by Filip Pizlo.
1871
1872         I made a mistake in r200498.
1873
1874         If a SetLocal cannot possibly exit, we were not clearing
1875         the source of the operand. As a result, we sometime kept
1876         a value alive up to the end of the block.
1877
1878         That's uncommon because SetLocal typically appear
1879         toward the end of blocks. That's probably why there was
1880         no perf impact with that fix.
1881
1882         * dfg/DFGPhantomInsertionPhase.cpp:
1883
1884 2016-05-13  Benjamin Poulain  <bpoulain@apple.com>
1885
1886         [JSC] Move the CheckTierUp function calls out of the main path
1887         https://bugs.webkit.org/show_bug.cgi?id=157668
1888
1889         Reviewed by Mark Lam.
1890
1891         If you have a tiny tiny loop (for example, Sunspider's bits-in-byte),
1892         the size of CheckTierUp is a problem.
1893
1894         On multi-issue CPUs, the node is so big that we do not
1895         get to run anything from the loop in the instruction fetch.
1896
1897         On x86, having a bigger loop also pushes us out of the LSD.
1898
1899         This is a 6% improvement on bits-in-byte. Other Sunspider tests
1900         only improves marginally.
1901
1902         * dfg/DFGSpeculativeJIT.cpp:
1903         (JSC::DFG::SpeculativeJIT::addSlowPathGenerator):
1904         (JSC::DFG::SpeculativeJIT::runSlowPathGenerators):
1905         * dfg/DFGSpeculativeJIT.h:
1906         (JSC::DFG::SpeculativeJIT::silentSpill):
1907         (JSC::DFG::SpeculativeJIT::silentFill):
1908         * dfg/DFGSpeculativeJIT64.cpp:
1909         (JSC::DFG::SpeculativeJIT::compile):
1910
1911 2016-05-13  Benjamin Poulain  <bpoulain@apple.com>
1912
1913         [JSC] Emit the loads of emitLoadWithStructureCheck() in the order they are used
1914         https://bugs.webkit.org/show_bug.cgi?id=157671
1915
1916         Reviewed by Mark Lam.
1917
1918         This improves the chances of having a value
1919         when issuing the TEST.
1920
1921         * jit/JITPropertyAccess.cpp:
1922         (JSC::JIT::emitLoadWithStructureCheck):
1923
1924 2016-05-13  Joseph Pecoraro  <pecoraro@apple.com>
1925
1926         Web Inspector: Inform augmenting client when inspector controller is destroyed
1927         https://bugs.webkit.org/show_bug.cgi?id=157688
1928         <rdar://problem/25832724>
1929
1930         Reviewed by Timothy Hatcher.
1931
1932         * inspector/JSGlobalObjectInspectorController.cpp:
1933         (Inspector::JSGlobalObjectInspectorController::~JSGlobalObjectInspectorController):
1934         * inspector/augmentable/AugmentableInspectorControllerClient.h:
1935         There is a weak relationship between the InspectorController and the
1936         AugmentingClient. Let the augmenting client know when the controller
1937         is destroyed so it doesn't try to use us anymore.
1938
1939 2016-05-13  Geoffrey Garen  <ggaren@apple.com>
1940
1941         Runaway malloc memory usage in this simple JSC program
1942         https://bugs.webkit.org/show_bug.cgi?id=157682
1943
1944         Reviewed by Mark Lam.
1945
1946         * heap/WeakSet.cpp:
1947         (JSC::WeakSet::sweep): Whenever we might add a block to
1948         m_logicallyEmptyWeakBlocks, be sure also to sweep a block in
1949         m_logicallyEmptyWeakBlocks. Otherwise, additions might outpace removals
1950         even when all memory is freed.
1951
1952         We do this whenever we *might* add a block and not just whenever we *do*
1953         add a block because we'd like to sweep the entries in
1954         m_logicallyEmptyWeakBlocks promptly even when it's not growing, and this
1955         is a reasonably rate-limited opportunity to do so.
1956
1957 2016-05-13  Mark Lam  <mark.lam@apple.com>
1958
1959         We should have one calleeSaveRegistersBuffer per VMEntryFrame, not one per VM.
1960         https://bugs.webkit.org/show_bug.cgi?id=157537
1961         <rdar://problem/24794845>
1962
1963         Reviewed by Michael Saboff.
1964
1965         The pre-existing code behaves this way:
1966
1967         1. When JS code throws an exception, it saves callee save registers in
1968            the VM calleeSaveRegistersBuffer.  These values are meant to be restored
1969            to the callee save registers later either at the catch handler or at the
1970            uncaught exception handler.
1971
1972         2. If the Inspector is enable, the VM will invoke inspector C++ code to inspect
1973            the exception.  That C++ code can change the values of the callee save
1974            registers.
1975
1976            The inspector code in turn re-enters the VM to execute JS inspector code.
1977
1978            The JS inspector code can run hot enough that we do an enterOptimizationCheck
1979            on it.  The enterOptimizationCheck first saves all callee save registers
1980            into the VM calleeSaveRegistersBuffer.
1981
1982            This effectively overwrites the values in the VM calleeSaveRegistersBuffer
1983            from (1).
1984
1985         3. Eventually, execution returns to the catch handler or the uncaught exception
1986            handler which restores the overwritten values in the VM
1987            calleeSaveRegistersBuffer to the callee save registers.
1988
1989            When execution returns to the C++ code that entered the VM before (1), the
1990            values in the callee registers are not what that code expects, and badness
1991            and/or crashes ensues.
1992
1993         This patch applies the following fix:
1994         
1995         1. Allocate space in the VMEntryFrame for the calleeSaveRegistersBuffer.
1996            This ensures that each VM entry session has its own buffer to use, and will
1997            not corrupt the one from the previous VM entry session.
1998
1999            Delete the VM calleeSaveRegistersBuffer.
2000
2001         2. Change all locations that uses the VM calleeSaveRegistersBuffer to use the
2002            calleeSaveRegistersBuffer in the current VMEntryFrame.
2003
2004         3. Renamed all uses of the term "VMCalleeSavesBuffer" to
2005            "VMEntryFrameCalleeSavesBuffer".
2006
2007         This fix has been tested on the following configurations:
2008         1. JSC and layout tests on a debug ASan build for 64-bit x86_64.
2009         2. JSC tests on a release ASan build for 32-bit x86.
2010         3. JSC tests on a release normal (non-ASan) build for ARM64.
2011         4. JSC tests on a release normal (non-ASan) build for ARMv7 and ARMv7s.
2012         5. JSC tests on a release ASan CLOOP build for x86_64.
2013
2014         These test runs did not produce any new crashes.  The ASan CLOOP has some
2015         pre-existing crashes which are not due to this patch.
2016
2017         This bug can be tested by running the inspector/debugger/regress-133182.html test
2018         on an ASan build.
2019
2020         * bytecode/PolymorphicAccess.cpp:
2021         (JSC::AccessGenerationState::emitExplicitExceptionHandler):
2022         * dfg/DFGJITCompiler.cpp:
2023         (JSC::DFG::JITCompiler::compileExceptionHandlers):
2024         * dfg/DFGOSREntry.cpp:
2025         (JSC::DFG::prepareOSREntry):
2026         * dfg/DFGOSRExitCompiler.cpp:
2027         * dfg/DFGOSRExitCompiler32_64.cpp:
2028         (JSC::DFG::OSRExitCompiler::compileExit):
2029         * dfg/DFGOSRExitCompiler64.cpp:
2030         (JSC::DFG::OSRExitCompiler::compileExit):
2031         * dfg/DFGThunks.cpp:
2032         (JSC::DFG::osrEntryThunkGenerator):
2033         * ftl/FTLCompile.cpp:
2034         (JSC::FTL::compile):
2035         * ftl/FTLLowerDFGToB3.cpp:
2036         (JSC::FTL::DFG::LowerDFGToB3::lower):
2037         * ftl/FTLOSRExitCompiler.cpp:
2038         (JSC::FTL::compileStub):
2039         * interpreter/Interpreter.cpp:
2040         (JSC::UnwindFunctor::operator()):
2041         (JSC::UnwindFunctor::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer):
2042         (JSC::UnwindFunctor::copyCalleeSavesToVMCalleeSavesBuffer): Deleted.
2043         * interpreter/Interpreter.h:
2044         (JSC::NativeCallFrameTracer::NativeCallFrameTracer):
2045         * interpreter/VMEntryRecord.h:
2046         (JSC::VMEntryRecord::calleeSaveRegistersBufferOffset):
2047         (JSC::VMEntryRecord::prevTopCallFrame):
2048         (JSC::VMEntryRecord::unsafePrevTopCallFrame):
2049         (JSC::VMEntryFrame::vmEntryRecordOffset):
2050         (JSC::VMEntryFrame::calleeSaveRegistersBufferOffset):
2051         * jit/AssemblyHelpers.cpp:
2052         (JSC::AssemblyHelpers::emitRandomThunk):
2053         (JSC::AssemblyHelpers::restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer):
2054         (JSC::AssemblyHelpers::restoreCalleeSavesFromVMCalleeSavesBuffer): Deleted.
2055         * jit/AssemblyHelpers.h:
2056         (JSC::AssemblyHelpers::emitRestoreSavedTagRegisters):
2057         (JSC::AssemblyHelpers::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer):
2058         (JSC::AssemblyHelpers::copyCalleeSavesFromFrameOrRegisterToVMEntryFrameCalleeSavesBuffer):
2059         (JSC::AssemblyHelpers::copyCalleeSavesToVMCalleeSavesBuffer): Deleted.
2060         (JSC::AssemblyHelpers::copyCalleeSavesFromFrameOrRegisterToVMCalleeSavesBuffer): Deleted.
2061         * jit/JIT.cpp:
2062         (JSC::JIT::emitEnterOptimizationCheck):
2063         (JSC::JIT::privateCompileExceptionHandlers):
2064         * jit/JITOpcodes.cpp:
2065         (JSC::JIT::emit_op_throw):
2066         (JSC::JIT::emit_op_catch):
2067         (JSC::JIT::emitSlow_op_loop_hint):
2068         * jit/JITOpcodes32_64.cpp:
2069         (JSC::JIT::emit_op_throw):
2070         (JSC::JIT::emit_op_catch):
2071         * jit/ThunkGenerators.cpp:
2072         (JSC::throwExceptionFromCallSlowPathGenerator):
2073         (JSC::nativeForGenerator):
2074         * llint/LLIntThunks.cpp:
2075         (JSC::vmEntryRecord):
2076         * llint/LowLevelInterpreter.asm:
2077         * llint/LowLevelInterpreter32_64.asm:
2078         * llint/LowLevelInterpreter64.asm:
2079         * runtime/VM.h:
2080         (JSC::VM::getCTIStub):
2081         (JSC::VM::calleeSaveRegistersBufferOffset): Deleted.
2082         * wasm/WASMFunctionCompiler.h:
2083         (JSC::WASMFunctionCompiler::endFunction):
2084
2085 2016-05-13  Beth Dakin  <bdakin@apple.com>
2086
2087         Add dyldSPI.h for linked on or after checks, and add one for link preview
2088         https://bugs.webkit.org/show_bug.cgi?id=157401
2089         -and corresponding-
2090         rdar://problem/26253396
2091
2092         Reviewed by Darin Adler.
2093
2094         Import #import <wtf/spi/darwin/dyldSPI.h> which now declares all of the 
2095         needed dyld code.
2096         * API/JSWrapperMap.mm:
2097
2098 2016-05-13  Yusuke Suzuki  <utatane.tea@gmail.com>
2099
2100         Assertion failure for direct eval in non-class method
2101         https://bugs.webkit.org/show_bug.cgi?id=157138
2102
2103         Reviewed by Saam Barati.
2104
2105         This assertion was incorrect. In method definitions in object literals,
2106         it can be sloppy mode, but its DerivedContextType may not be DerivedContextType::None.
2107
2108         * bytecode/EvalCodeCache.h:
2109         (JSC::EvalCodeCache::CacheKey::CacheKey):
2110         (JSC::EvalCodeCache::CacheKey::operator==):
2111         (JSC::EvalCodeCache::CacheKey::Hash::equal):
2112         (JSC::EvalCodeCache::tryGet):
2113         (JSC::EvalCodeCache::getSlow):
2114         * interpreter/Interpreter.cpp:
2115         (JSC::eval):
2116         * tests/stress/direct-eval-in-object-literal-methods.js: Added.
2117         (shouldBe):
2118         (throw.new.Error):
2119         (shouldBe.Parent.prototype.l):
2120         (shouldBe.Parent):
2121         (shouldBe.Derived.prototype.m):
2122         (shouldBe.Derived):
2123
2124 2016-05-13  Skachkov Oleksandr  <gskachkov@gmail.com>
2125
2126         Assertion failure for super() call in arrow function default parameters
2127         https://bugs.webkit.org/show_bug.cgi?id=157079
2128
2129         Reviewed by Saam Barati.
2130
2131         Root of the issue that in arrow function we load bounded variables this/super/new.target just after 
2132         input parameters were initialized, and did not covered case of default values for 
2133         function parameters. 
2134         Current patch tried to fix issue and allow to load bounded variables earlier, before the input 
2135         parameters are assigned by default values.
2136
2137         * bytecompiler/BytecodeGenerator.cpp:
2138         (JSC::BytecodeGenerator::BytecodeGenerator):
2139         * tests/stress/arrowfunction-lexical-bind-this-2.js:
2140
2141 2016-05-12  Mark Lam  <mark.lam@apple.com>
2142
2143         Baseline and DFG's JSC_report...CompileTimes needs CodeBlock hashes.
2144         https://bugs.webkit.org/show_bug.cgi?id=157643
2145
2146         Reviewed by Keith Miller.
2147
2148         * runtime/Options.cpp:
2149         (JSC::recomputeDependentOptions):
2150
2151 2016-05-12  Csaba Osztrogonác  <ossy@webkit.org>
2152
2153         Remove ENABLE(ES6_ARROWFUNCTION_SYNTAX) guards
2154         https://bugs.webkit.org/show_bug.cgi?id=157564
2155
2156         Reviewed by Darin Adler.
2157
2158         * Configurations/FeatureDefines.xcconfig:
2159         * parser/Parser.cpp:
2160
2161 2016-05-12  Joseph Pecoraro  <pecoraro@apple.com>
2162
2163         Web Inspector: CRASH getting internal properties of function with no bound arguments causes
2164         https://bugs.webkit.org/show_bug.cgi?id=157613
2165         <rdar://problem/26238754>
2166
2167         Reviewed by Timothy Hatcher.
2168
2169         * inspector/JSInjectedScriptHost.cpp:
2170         (Inspector::JSInjectedScriptHost::getInternalProperties):
2171         Gracefully handle a JSBoundFunction with no bound arguments.
2172         In this case boundArgs is JSValue() which we don't want to
2173         expose as the value of the internal property.
2174
2175 2016-05-11  Benjamin Poulain  <bpoulain@apple.com>
2176
2177         [JSC] Make sure StringRange is passed to Vector by register
2178         https://bugs.webkit.org/show_bug.cgi?id=157603
2179
2180         Reviewed by Darin Adler.
2181
2182         This is bizarre, but on my SDK, Vector::append(StringRange)
2183         is passing the values on the stack.
2184         The two integers are written to the stack, the address given
2185         to append(), then append() reads it back and store it.
2186
2187         This patch changes the code to use constructAndAppend(), ensuring
2188         the values are used directly.
2189
2190         On my machine, this helps Sunspider and Octane.
2191         This might be something wrong with my SDK but the fix is so easy
2192         that we might as well do this.
2193
2194         * runtime/StringPrototype.cpp:
2195         (JSC::removeUsingRegExpSearch):
2196         (JSC::replaceUsingRegExpSearch):
2197
2198 2016-05-11  Zan Dobersek  <zdobersek@igalia.com>
2199
2200         ARMv7Assembler: suppress a -Wnarrowing warning when compiling with GCC
2201         https://bugs.webkit.org/show_bug.cgi?id=157576
2202
2203         Reviewed by Csaba Osztrogonác.
2204
2205         * assembler/ARMv7Assembler.h:
2206         (JSC::ARMv7Assembler::revertJumpTo_movT3movtcmpT2): Explicitly cast the
2207         `OP_CMP_reg_T2 | left` value to uint16_t, avoiding a narrowing conversion
2208         warning that's being reported when compiling with GCC. The warning is sprung
2209         due to RegisterID (which is the type of `left`) being an enum based on int,
2210         even when the enum itself only declares 23 values.
2211
2212 2016-05-11  Joseph Pecoraro  <pecoraro@apple.com>
2213
2214         Web Inspector: `this` in Scope Chain Sidebar does not have preview, looks poor
2215         https://bugs.webkit.org/show_bug.cgi?id=157602
2216
2217         Reviewed by Timothy Hatcher.
2218
2219         * inspector/InjectedScriptSource.js:
2220         (InjectedScript.CallFrameProxy):
2221         Include a preview when creating the RemoteObject for `this`.
2222
2223 2016-05-11  Keith Miller  <keith_miller@apple.com>
2224
2225         Unreviewed, correct the title of the ChangeLog for r200667.
2226
2227 2016-05-11  Joseph Pecoraro  <pecoraro@apple.com>
2228
2229         JSC test stress/reflect-set.js failing after 200694
2230         https://bugs.webkit.org/show_bug.cgi?id=157586
2231
2232         Unreviewed test rebaseline.
2233
2234         * tests/stress/reflect-set.js:
2235         Update the expected error message. We are in strict mode, so the
2236         improved error message makes sense.
2237
2238 2016-05-11  Filip Pizlo  <fpizlo@apple.com>
2239
2240         Beef up JSC profiler event log
2241         https://bugs.webkit.org/show_bug.cgi?id=157584
2242
2243         Reviewed by Saam Barati.
2244         
2245         Also log more about compilation.
2246
2247         * bytecode/ExecutionCounter.cpp: Changed the meaning of codeBlock to be the codeBlock that is doing the profiling. This will now get the baseline version if it needs it. This is needed for logging the threshold checking event.
2248         (JSC::applyMemoryUsageHeuristics):
2249         (JSC::ExecutionCounter<countingVariant>::hasCrossedThreshold):
2250         * dfg/DFGJITCode.cpp: Pass the right codeBlock.
2251         (JSC::DFG::JITCode::checkIfOptimizationThresholdReached):
2252         (JSC::DFG::JITCode::optimizeNextInvocation):
2253         (JSC::DFG::JITCode::dontOptimizeAnytimeSoon):
2254         (JSC::DFG::JITCode::optimizeSoon):
2255         (JSC::DFG::JITCode::forceOptimizationSlowPathConcurrently):
2256         * dfg/DFGPlan.cpp: Log things about compile times and whether the compiler succeeded or failed.
2257         (JSC::DFG::Plan::computeCompileTimes):
2258         (JSC::DFG::Plan::reportCompileTimes):
2259         (JSC::DFG::Plan::compileInThread):
2260         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
2261         * jit/ExecutableAllocatorFixedVMPool.cpp: Make it possible to look at memory usage, though separately from the log, for now.
2262         (JSC::ExecutableAllocator::allocate):
2263         * runtime/Options.h:
2264
2265 2016-05-11  Saam barati  <sbarati@apple.com>
2266
2267         Air may decide to put the result register of an arithmetic snippet in the tag register
2268         https://bugs.webkit.org/show_bug.cgi?id=157548
2269
2270         Reviewed by Filip Pizlo.
2271
2272         This patch adds a new ValueRep to B3 called LateRegister. The semantics
2273         are similar to Register in that it can be used to pin an argument to
2274         a particular register. It differs from ValueRep::Register in that the semantics of
2275         LateRegister are that it is used after the result of the node its an argument to
2276         is computed. This means that a LateRegister argument will interfere with the result
2277         of a node. LateRegister is not a valid result ValueRep.
2278
2279         This was needed because there was a bug where B3/Air would assign the
2280         result of a patchpoint to the TagTypeNumber register. This broke our
2281         code when we would box a double into a JSValue in a snippet when the
2282         result is the same as the TagTypeNumber register. To fix the issue,
2283         we pass TagMaskRegister and TagTypeNumberRegister as ValueRep::LateRegister
2284         arguments to various patchpoints.
2285
2286         * b3/B3LowerToAir.cpp:
2287         (JSC::B3::Air::LowerToAir::fillStackmap):
2288         * b3/B3PatchpointSpecial.cpp:
2289         (JSC::B3::PatchpointSpecial::admitsStack):
2290         * b3/B3StackmapSpecial.cpp:
2291         (JSC::B3::StackmapSpecial::forEachArgImpl):
2292         (JSC::B3::StackmapSpecial::isArgValidForRep):
2293         * b3/B3Validate.cpp:
2294         * b3/B3ValueRep.cpp:
2295         (JSC::B3::ValueRep::addUsedRegistersTo):
2296         (JSC::B3::ValueRep::dump):
2297         (JSC::B3::ValueRep::emitRestore):
2298         (JSC::B3::ValueRep::recoveryForJSValue):
2299         (WTF::printInternal):
2300         * b3/B3ValueRep.h:
2301         (JSC::B3::ValueRep::reg):
2302         (JSC::B3::ValueRep::lateReg):
2303         (JSC::B3::ValueRep::stack):
2304         (JSC::B3::ValueRep::operator==):
2305         (JSC::B3::ValueRep::isSomeRegister):
2306         (JSC::B3::ValueRep::isReg):
2307         * b3/testb3.cpp:
2308         (JSC::B3::testSpillUseLargerThanDef):
2309         (JSC::B3::testLateRegister):
2310         (JSC::B3::zero):
2311         (JSC::B3::run):
2312         * ftl/FTLLowerDFGToB3.cpp:
2313         (JSC::FTL::DFG::LowerDFGToB3::lower):
2314         (JSC::FTL::DFG::LowerDFGToB3::compileIn):
2315         (JSC::FTL::DFG::LowerDFGToB3::getById):
2316         (JSC::FTL::DFG::LowerDFGToB3::emitBinarySnippet):
2317         (JSC::FTL::DFG::LowerDFGToB3::emitBinaryBitOpSnippet):
2318         (JSC::FTL::DFG::LowerDFGToB3::emitRightShiftSnippet):
2319
2320 2016-05-11  Joseph Pecoraro  <pecoraro@apple.com>
2321
2322         Improve error messages for accessing arguments.callee and similar getters in strict mode
2323         https://bugs.webkit.org/show_bug.cgi?id=157545
2324
2325         Reviewed by Mark Lam.
2326
2327         * runtime/ClonedArguments.cpp:
2328         (JSC::ClonedArguments::getOwnPropertySlot):
2329         (JSC::ClonedArguments::materializeSpecials):
2330         Provide better error GetterSetter in strict mode.
2331
2332         * runtime/JSFunction.cpp:
2333         (JSC::getThrowTypeErrorGetterSetter):
2334         (JSC::JSFunction::defineOwnProperty):
2335         Provide better error GetterSetter in strict mode.
2336
2337         * runtime/JSGlobalObject.cpp:
2338         (JSC::JSGlobalObject::init):
2339         (JSC::JSGlobalObject::visitChildren):
2340         * runtime/JSGlobalObject.h:
2341         (JSC::JSGlobalObject::throwTypeErrorGetterSetter):
2342         (JSC::JSGlobalObject::throwTypeErrorCalleeAndCallerGetterSetter):
2343         (JSC::JSGlobalObject::throwTypeErrorArgumentsAndCallerInStrictModeGetterSetter):
2344         (JSC::JSGlobalObject::throwTypeErrorArgumentsAndCallerInClassContextGetterSetter):
2345         (JSC::JSGlobalObject::throwTypeErrorArgumentsAndCallerGetterSetter): Deleted.
2346         * runtime/JSGlobalObjectFunctions.cpp:
2347         (JSC::globalFuncThrowTypeErrorCalleeAndCaller):
2348         (JSC::globalFuncThrowTypeErrorArgumentsAndCallerInStrictMode):
2349         (JSC::globalFuncThrowTypeErrorArgumentsAndCallerInClassContext):
2350         (JSC::globalFuncThrowTypeErrorArgumentsAndCaller): Deleted.
2351         * runtime/JSGlobalObjectFunctions.h:
2352         Rename and expose new handles for new error getter setter native functions.
2353
2354 2016-05-11  Commit Queue  <commit-queue@webkit.org>
2355
2356         Unreviewed, rolling out r200481.
2357         https://bugs.webkit.org/show_bug.cgi?id=157573
2358
2359         it's bad news for asm.js (Requested by pizlo on #webkit).
2360
2361         Reverted changeset:
2362
2363         "Reduce maximum JIT pool size on X86_64."
2364         http://trac.webkit.org/changeset/200481
2365
2366 2016-05-10  Keith Miller  <keith_miller@apple.com>
2367
2368         TypedArray.prototype.slice should not use the byteLength of the passed array for memmove
2369         https://bugs.webkit.org/show_bug.cgi?id=157551
2370         <rdar://problem/26179914>
2371
2372         Reviewed by Michael Saboff.
2373
2374         The TypedArray.prototype.slice function would use the byteLength of the passed array
2375         to determine the amount of data to copy. It should have been using the passed length
2376         times the size of each element. This fixes a crash on JavaPoly.com
2377
2378         * runtime/JSGenericTypedArrayViewInlines.h:
2379         (JSC::JSGenericTypedArrayView<Adaptor>::set):
2380         * tests/stress/typedarray-slice.js:
2381
2382 2016-05-10  Michael Saboff  <msaboff@apple.com>
2383
2384         REGRESSION(r200447): Unable to build C_LOOP with clang version 800.0.12 or higher
2385         https://bugs.webkit.org/show_bug.cgi?id=157549
2386
2387         Reviewed by Keith Miller.
2388
2389         Disable debug annotations for C_LOOP builds.  They are inline assembly directives,
2390         unnecessary and they cause syntax errors.
2391
2392         * offlineasm/asm.rb:
2393
2394 2016-05-10  Filip Pizlo  <fpizlo@apple.com>
2395
2396         Internal JSC profiler should have a timestamped log of events for each code block
2397         https://bugs.webkit.org/show_bug.cgi?id=157538
2398
2399         Reviewed by Benjamin Poulain.
2400         
2401         For example, in 3d-cube, I can query the events for MMulti and I get:
2402
2403         1462917476.17083  MMulti#DTZ7qc                          installCode        
2404         1462917476.179663 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline installCode        
2405         1462917476.179664 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline osrEntry           at bc#49
2406         1462917476.185651 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 1011.214233/1717.000000, -707
2407         1462917476.187913 MMulti#DTZ7qc MMulti#DTZ7qc-2-DFG      installCode        
2408         1462917476.187917 MMulti#DTZ7qc MMulti#DTZ7qc-2-DFG      osrEntry           at bc#49
2409         1462917476.205365 MMulti#DTZ7qc MMulti#DTZ7qc-2-DFG      jettison           due to OSRExit, counting = true, detail = (null)
2410         1462917476.205368 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline frequentExit       bc#65: BadCache/FromDFG
2411         1462917476.205369 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline installCode        
2412         1462917476.205482 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 1013.000000/3434.000000, -1000
2413         1462917476.211547 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 2013.000000/3434.000000, -1000
2414         1462917476.213721 MMulti#DTZ7qc MMulti#DTZ7qc-3-DFG      installCode        
2415         1462917476.213726 MMulti#DTZ7qc MMulti#DTZ7qc-3-DFG      osrEntry           at bc#49
2416         1462917476.223976 MMulti#DTZ7qc MMulti#DTZ7qc-3-DFG      jettison           due to OSRExit, counting = true, detail = (null)
2417         1462917476.223981 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline frequentExit       bc#77: BadCache/FromDFG
2418         1462917476.223982 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline frequentExit       bc#94: BadCache/FromDFG
2419         1462917476.223982 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline installCode        
2420         1462917476.224064 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 1013.000000/6868.000000, -1000
2421         1462917476.224151 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 2013.000000/6868.000000, -1000
2422         1462917476.224258 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 3013.000000/6868.000000, -1000
2423         1462917476.224337 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 4023.000000/6868.000000, -1000
2424         1462917476.224425 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 5023.000000/6868.000000, -1000
2425         1462917476.224785 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 6023.396484/6868.000000, -862
2426         1462917476.227669 MMulti#DTZ7qc MMulti#DTZ7qc-4-DFG      installCode        
2427         1462917476.227675 MMulti#DTZ7qc MMulti#DTZ7qc-4-DFG      osrEntry           at bc#0
2428         
2429         The output is ugly but useful. We can make it less ugly later.
2430
2431         * CMakeLists.txt:
2432         * JavaScriptCore.xcodeproj/project.pbxproj:
2433         * bytecode/CodeBlock.cpp:
2434         (JSC::CodeBlock::jettison):
2435         * bytecode/CodeBlock.h:
2436         (JSC::ScriptExecutable::forEachCodeBlock):
2437         * bytecode/DFGExitProfile.cpp:
2438         (JSC::DFG::ExitProfile::add):
2439         * dfg/DFGJITFinalizer.cpp:
2440         (JSC::DFG::JITFinalizer::finalizeCommon):
2441         * dfg/DFGOperations.cpp:
2442         * ftl/FTLJITFinalizer.cpp:
2443         (JSC::FTL::JITFinalizer::finalizeFunction):
2444         * jit/JIT.cpp:
2445         (JSC::JIT::privateCompile):
2446         * jit/JITOperations.cpp:
2447         * llint/LLIntSlowPaths.cpp:
2448         (JSC::LLInt::jitCompileAndSetHeuristics):
2449         (JSC::LLInt::entryOSR):
2450         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
2451         * profiler/ProfilerCompilation.cpp:
2452         (JSC::Profiler::Compilation::Compilation):
2453         (JSC::Profiler::Compilation::setJettisonReason):
2454         (JSC::Profiler::Compilation::dump):
2455         (JSC::Profiler::Compilation::toJS):
2456         * profiler/ProfilerCompilation.h:
2457         (JSC::Profiler::Compilation::uid):
2458         * profiler/ProfilerDatabase.cpp:
2459         (JSC::Profiler::Database::ensureBytecodesFor):
2460         (JSC::Profiler::Database::notifyDestruction):
2461         (JSC::Profiler::Database::addCompilation):
2462         (JSC::Profiler::Database::toJS):
2463         (JSC::Profiler::Database::registerToSaveAtExit):
2464         (JSC::Profiler::Database::logEvent):
2465         (JSC::Profiler::Database::addDatabaseToAtExit):
2466         * profiler/ProfilerDatabase.h:
2467         * profiler/ProfilerEvent.cpp: Added.
2468         (JSC::Profiler::Event::dump):
2469         (JSC::Profiler::Event::toJS):
2470         * profiler/ProfilerEvent.h: Added.
2471         (JSC::Profiler::Event::Event):
2472         (JSC::Profiler::Event::operator bool):
2473         (JSC::Profiler::Event::time):
2474         (JSC::Profiler::Event::bytecodes):
2475         (JSC::Profiler::Event::compilation):
2476         (JSC::Profiler::Event::summary):
2477         (JSC::Profiler::Event::detail):
2478         * profiler/ProfilerUID.cpp: Added.
2479         (JSC::Profiler::UID::create):
2480         (JSC::Profiler::UID::dump):
2481         (JSC::Profiler::UID::toJS):
2482         * profiler/ProfilerUID.h: Added.
2483         (JSC::Profiler::UID::UID):
2484         (JSC::Profiler::UID::fromInt):
2485         (JSC::Profiler::UID::toInt):
2486         (JSC::Profiler::UID::operator==):
2487         (JSC::Profiler::UID::operator!=):
2488         (JSC::Profiler::UID::operator bool):
2489         (JSC::Profiler::UID::isHashTableDeletedValue):
2490         (JSC::Profiler::UID::hash):
2491         (JSC::Profiler::UIDHash::hash):
2492         (JSC::Profiler::UIDHash::equal):
2493         * runtime/CommonIdentifiers.h:
2494         * runtime/Executable.cpp:
2495         (JSC::ScriptExecutable::installCode):
2496         * runtime/VM.h:
2497         (JSC::VM::bytecodeIntrinsicRegistry):
2498         (JSC::VM::shadowChicken):
2499         * runtime/VMInlines.h:
2500         (JSC::VM::shouldTriggerTermination):
2501         (JSC::VM::logEvent):
2502
2503 2016-05-10  Joseph Pecoraro  <pecoraro@apple.com>
2504
2505         Web Inspector: Backend should initiate timeline recordings on page navigations to ensure nothing is missed
2506         https://bugs.webkit.org/show_bug.cgi?id=157504
2507         <rdar://problem/26188642>
2508
2509         Reviewed by Brian Burg.
2510
2511         * inspector/protocol/Timeline.json:
2512         Add protocol commands to enable/disable auto capture and list the
2513         instruments that should be enabled when auto capture starts.
2514         Add protocol event for when the backend starts an auto capture.
2515
2516 2016-05-10  Joseph Pecoraro  <pecoraro@apple.com>
2517
2518         Make the different evaluateWithScopeExtension implementations more consistent
2519         https://bugs.webkit.org/show_bug.cgi?id=157536
2520
2521         Reviewed by Timothy Hatcher.
2522
2523         * inspector/JSInjectedScriptHost.cpp:
2524         (Inspector::JSInjectedScriptHost::evaluateWithScopeExtension):
2525         Throw the exception consistent with JSJavaScriptCallFrame.
2526
2527         * inspector/JSJavaScriptCallFrame.cpp:
2528         (Inspector::JSJavaScriptCallFrame::evaluateWithScopeExtension):
2529         Better error message consistent with InjectedScriptHost.
2530
2531         * runtime/Completion.h:
2532         * runtime/Completion.cpp:
2533         (JSC::evaluateWithScopeExtension):
2534         Give this an Exception out parameter like other evaluations
2535         so the caller can decide what to do with it.
2536
2537 2016-05-10  Benjamin Poulain  <bpoulain@apple.com>
2538
2539         [JSC] FTL can produce GetByVal nodes without proper bounds checking
2540         https://bugs.webkit.org/show_bug.cgi?id=157502
2541         rdar://problem/26027027
2542
2543         Reviewed by Filip Pizlo.
2544
2545         It was possible for FTL to generates GetByVal on arbitrary offsets
2546         without any bounds checking.
2547
2548         The bug is caused by the order of optimization phases:
2549         -First, the Integer Range Optimization proves that a CheckInBounds
2550          test can never fail.
2551          This proof is based on control flow or preceeding instructions
2552          inside a loop.
2553         -The Loop Invariant Code Motion phase finds that the GetByVal does not
2554          depend on anything in the loop and hoist it out of the loop.
2555         -> As a result, the conditions that were necessary to eliminate
2556            the CheckInBounds are no longer met before the GetByVal.
2557
2558         This patch just moves the Integer Range Optimization phase after
2559         Loop Invariant Code Motion to make sure no code is moved after
2560         its integer ranges bounds proofs have been used.
2561
2562         * dfg/DFGPlan.cpp:
2563         (JSC::DFG::Plan::compileInThreadImpl):
2564         * tests/stress/bounds-check-not-eliminated-by-licm.js: Added.
2565         (testInLoopTests):
2566
2567 2016-05-10  Joseph Pecoraro  <pecoraro@apple.com>
2568
2569         Web Inspector: Eliminate the crazy code for evaluateOnCallFrame
2570         https://bugs.webkit.org/show_bug.cgi?id=157510
2571         <rdar://problem/26191332>
2572
2573         Reviewed by Timothy Hatcher.
2574
2575         * debugger/DebuggerCallFrame.cpp:
2576         (JSC::DebuggerCallFrame::evaluateWithScopeExtension):
2577         Set and clear an optional scope extension object.
2578
2579         * inspector/InjectedScriptSource.js:
2580         (InjectedScript.prototype.evaluate):
2581         (InjectedScript.prototype._evaluateOn):
2582         (InjectedScript.prototype.evaluateOnCallFrame):
2583         Unify the code to use the passed in evaluate function and object.
2584         When evaluating on a call frame the evaluate function ends up being
2585         DebuggerCallFrame::evaluateWithScopeExtension. When evaluating globally
2586         this ends up being JSInjectedScriptHost::evaluateWithScopeExtension.
2587         In both cases "object" is the preferred this object to use.
2588
2589         * debugger/DebuggerCallFrame.h:
2590         * inspector/JSJavaScriptCallFrame.cpp:
2591         (Inspector::JSJavaScriptCallFrame::evaluateWithScopeExtension):
2592         (Inspector::JSJavaScriptCallFrame::evaluate): Deleted.
2593         * inspector/JSJavaScriptCallFrame.h:
2594         * inspector/JSJavaScriptCallFramePrototype.cpp:
2595         (Inspector::JSJavaScriptCallFramePrototype::finishCreation):
2596         (Inspector::jsJavaScriptCallFramePrototypeFunctionEvaluateWithScopeExtension):
2597         * inspector/JavaScriptCallFrame.h:
2598         (Inspector::JavaScriptCallFrame::evaluateWithScopeExtension):
2599         (Inspector::JavaScriptCallFrame::evaluate): Deleted.
2600         Pass through to DebuggerCallFrame with the proper arguments.
2601
2602         * debugger/Debugger.cpp:
2603         (JSC::Debugger::hasBreakpoint):
2604         * inspector/ScriptDebugServer.cpp:
2605         (Inspector::ScriptDebugServer::evaluateBreakpointAction):
2606         Use the new evaluate on call frame method name and no scope extension object.
2607
2608 2016-05-10  Saam barati  <sbarati@apple.com>
2609
2610         Make super-property-access.js test run for less time because it was timing out in debug builds.
2611
2612         Rubber stamped by Filip Pizlo.
2613
2614         * tests/stress/super-property-access.js:
2615         (test):
2616         (test.value):
2617         (test.foo):
2618         (test.B.prototype.bar):
2619         (test.B):
2620
2621 2016-05-10  Csaba Osztrogonác  <ossy@webkit.org>
2622
2623         [JSC] Fix the !ENABLE(DFG_JIT) build
2624         https://bugs.webkit.org/show_bug.cgi?id=157512
2625
2626         Reviewed by Mark Lam.
2627
2628         * jit/Repatch.cpp:
2629
2630 2016-05-09  Joseph Pecoraro  <pecoraro@apple.com>
2631
2632         Web Inspector: CRASH under JSC::DebuggerCallFrame::thisValue when hitting breakpoint
2633         https://bugs.webkit.org/show_bug.cgi?id=157442
2634         <rdar://problem/24172015>
2635
2636         Reviewed by Saam Barati.
2637
2638         * debugger/DebuggerCallFrame.cpp:
2639         (JSC::DebuggerCallFrame::thisValueForCallFrame):
2640         When the thisValue is JSValue() return undefined and avoid calling
2641         toThisValue which would lead to a crash. Having `this` be an empty
2642         JSValue could happen inside an ES6 class constructor, before
2643         calling super.
2644
2645 2016-05-09  Filip Pizlo  <fpizlo@apple.com>
2646
2647         Unreviewed, fix cloop.
2648
2649         * bytecode/ValueProfile.cpp:
2650         (JSC::ResultProfile::emitDetectNumericness):
2651         (JSC::ResultProfile::emitSetNonNumber):
2652         * bytecode/ValueProfile.h:
2653         (JSC::ResultProfile::addressOfFlags):
2654         (JSC::ResultProfile::addressOfSpecialFastPathCount):
2655         (JSC::ResultProfile::detectNumericness):
2656         (JSC::ResultProfile::hasBits):
2657
2658 2016-05-09  Michael Saboff  <msaboff@apple.com>
2659
2660         Crash beneath ObjCCallbackFunctionImpl::call
2661         https://bugs.webkit.org/show_bug.cgi?id=157491
2662
2663         Reviewed by Saam Barati.
2664
2665         Clear any exceptions after the micro task runs.
2666
2667         Tried creating a test case, but I don't have source for the app.
2668         I can't seem to find the right combination of Promises and ObjC code.
2669
2670         * runtime/JSJob.cpp:
2671         (JSC::JSJobMicrotask::run):
2672
2673 2016-05-09  Filip Pizlo  <fpizlo@apple.com>
2674
2675         Polymorphic operands in operators coerces downstream values to double.
2676         https://bugs.webkit.org/show_bug.cgi?id=151793
2677
2678         Reviewed by Mark Lam.
2679         
2680         Previously if an object flowed into arithmetic, the prediction propagation phase would either
2681         assume that the output of the arithmetic had to be double or sometimes it would assume that it
2682         couldn't be double. We want it to only assume that the output is double if it actually had been.
2683         
2684         The first part of this patch is to roll out http://trac.webkit.org/changeset/200502. That removed
2685         some of the machinery that we had in place to detect whether the output of an operation is int or
2686         double. That changeset claimed that the machinery was "fundamentally broken". It actually wasn't.
2687         The reason why it didn't work was that ByteCodeParser was ignoring it if likelyToTakeSlowCase was
2688         false. I think this was a complete goof-up: the code in ByteCodeParser::makeSafe was structured
2689         in a way that made it non-obvious that the method is a no-op if !likelyToTakeSlowCase. So, this
2690         change rolls out r200502 and makes ResultProfile do its job by reshaping how makeSafe processes
2691         it.
2692         
2693         This also makes two other changes to shore up ResultProfile:
2694         - OSR exit can now refine a ResultProfile the same way that it refines ValueProfile.
2695         - Baseline JIT slow paths now set bits in ResultProfile.
2696         
2697         Based on this stuff, the DFG now predicts int/double/string in op_add/op_sub/op_mul based on
2698         ResultProfiles. To be conservative, we still only use the ResultProfiles if the incoming
2699         prediction is not number-or-boolean. This ensures that we exactly retain our old behavior in
2700         those cases for which it was tuned. But I hope to remove this soon. I believe that ResultProfile
2701         is already strictly better than what prediction propagation was doing before.
2702         
2703         This can be an enormous win. This patch adds some simple microbenchmarks that demonstrate the
2704         problem of assuming that arithmetic on objects returns double. The most extreme of these speeds
2705         up 8x with this change (object-int-add-array).
2706         
2707         * CMakeLists.txt:
2708         * JavaScriptCore.xcodeproj/project.pbxproj:
2709         * bytecode/CodeBlock.h:
2710         (JSC::CodeBlock::addFrequentExitSite):
2711         (JSC::CodeBlock::hasExitSite):
2712         * bytecode/DFGExitProfile.cpp:
2713         (JSC::DFG::FrequentExitSite::dump):
2714         (JSC::DFG::ExitProfile::ExitProfile):
2715         (JSC::DFG::ExitProfile::~ExitProfile):
2716         (JSC::DFG::ExitProfile::add):
2717         * bytecode/DFGExitProfile.h:
2718         (JSC::DFG::FrequentExitSite::isHashTableDeletedValue):
2719         * bytecode/MethodOfGettingAValueProfile.cpp:
2720         (JSC::MethodOfGettingAValueProfile::fromLazyOperand):
2721         (JSC::MethodOfGettingAValueProfile::emitReportValue):
2722         (JSC::MethodOfGettingAValueProfile::getSpecFailBucket): Deleted.
2723         * bytecode/MethodOfGettingAValueProfile.h:
2724         (JSC::MethodOfGettingAValueProfile::MethodOfGettingAValueProfile):
2725         (JSC::MethodOfGettingAValueProfile::operator bool):
2726         (JSC::MethodOfGettingAValueProfile::operator!): Deleted.
2727         * bytecode/PolymorphicAccess.cpp:
2728         (JSC::AccessCase::generateImpl):
2729         * bytecode/ValueProfile.cpp:
2730         (JSC::ResultProfile::emitDetectBitsLight):
2731         (JSC::ResultProfile::emitSetDouble):
2732         (JSC::ResultProfile::emitSetNonNumber):
2733         (WTF::printInternal):
2734         * bytecode/ValueProfile.h:
2735         (JSC::ResultProfile::ResultProfile):
2736         (JSC::ResultProfile::bytecodeOffset):
2737         (JSC::ResultProfile::specialFastPathCount):
2738         (JSC::ResultProfile::didObserveNonInt32):
2739         (JSC::ResultProfile::didObserveDouble):
2740         (JSC::ResultProfile::didObserveNonNegZeroDouble):
2741         (JSC::ResultProfile::didObserveNegZeroDouble):
2742         (JSC::ResultProfile::didObserveNonNumber):
2743         (JSC::ResultProfile::didObserveInt32Overflow):
2744         (JSC::ResultProfile::didObserveInt52Overflow):
2745         (JSC::ResultProfile::setObservedNonNegZeroDouble):
2746         (JSC::ResultProfile::setObservedNegZeroDouble):
2747         (JSC::ResultProfile::setObservedNonNumber):
2748         (JSC::ResultProfile::setObservedInt32Overflow):
2749         (JSC::ResultProfile::addressOfFlags):
2750         (JSC::ResultProfile::addressOfSpecialFastPathCount):
2751         (JSC::ResultProfile::detectBitsLight):
2752         (JSC::ResultProfile::hasBits):
2753         * dfg/DFGByteCodeParser.cpp:
2754         (JSC::DFG::ByteCodeParser::makeSafe):
2755         * dfg/DFGFixupPhase.cpp:
2756         (JSC::DFG::FixupPhase::fixupNode):
2757         * dfg/DFGGraph.cpp:
2758         (JSC::DFG::Graph::ensureNaturalLoops):
2759         (JSC::DFG::Graph::methodOfGettingAValueProfileFor):
2760         (JSC::DFG::Graph::valueProfileFor): Deleted.
2761         * dfg/DFGGraph.h:
2762         (JSC::DFG::Graph::hasExitSite):
2763         (JSC::DFG::Graph::numBlocks):
2764         * dfg/DFGNode.h:
2765         (JSC::DFG::Node::arithNodeFlags):
2766         (JSC::DFG::Node::mayHaveNonIntResult):
2767         (JSC::DFG::Node::mayHaveDoubleResult):
2768         (JSC::DFG::Node::mayHaveNonNumberResult):
2769         (JSC::DFG::Node::hasConstantBuffer):
2770         * dfg/DFGNodeFlags.cpp:
2771         (JSC::DFG::dumpNodeFlags):
2772         * dfg/DFGNodeFlags.h:
2773         * dfg/DFGOSRExitCompiler32_64.cpp:
2774         (JSC::DFG::OSRExitCompiler::compileExit):
2775         * dfg/DFGOSRExitCompiler64.cpp:
2776         (JSC::DFG::OSRExitCompiler::compileExit):
2777         * dfg/DFGOperations.cpp:
2778         * dfg/DFGOperations.h:
2779         * dfg/DFGPredictionPropagationPhase.cpp:
2780         * dfg/DFGSpeculativeJIT.h:
2781         (JSC::DFG::SpeculativeJIT::callOperation):
2782         * ftl/FTLOSRExitCompiler.cpp:
2783         (JSC::FTL::compileStub):
2784         * jit/AssemblyHelpers.h:
2785         (JSC::AssemblyHelpers::branchIfEqual):
2786         (JSC::AssemblyHelpers::branchIfNotCell):
2787         (JSC::AssemblyHelpers::branchIfNotNumber):
2788         (JSC::AssemblyHelpers::branchIfNotDoubleKnownNotInt32):
2789         (JSC::AssemblyHelpers::branchIfBoolean):
2790         (JSC::AssemblyHelpers::branchIfEmpty):
2791         (JSC::AssemblyHelpers::branchStructure):
2792         * jit/CCallHelpers.h:
2793         (JSC::CCallHelpers::CCallHelpers):
2794         (JSC::CCallHelpers::setupArguments):
2795         (JSC::CCallHelpers::setupArgumentsWithExecState):
2796         * jit/IntrinsicEmitter.cpp:
2797         (JSC::AccessCase::emitIntrinsicGetter):
2798         * jit/JIT.h:
2799         * jit/JITAddGenerator.cpp:
2800         (JSC::JITAddGenerator::generateFastPath):
2801         * jit/JITAddGenerator.h:
2802         (JSC::JITAddGenerator::JITAddGenerator):
2803         * jit/JITArithmetic.cpp:
2804         (JSC::JIT::emit_op_add):
2805         (JSC::JIT::emitSlow_op_add):
2806         (JSC::JIT::emit_op_div):
2807         (JSC::JIT::emit_op_mul):
2808         (JSC::JIT::emitSlow_op_mul):
2809         (JSC::JIT::emit_op_sub):
2810         (JSC::JIT::emitSlow_op_sub):
2811         * jit/JITInlines.h:
2812         (JSC::JIT::callOperation):
2813         (JSC::JIT::callOperationNoExceptionCheck):
2814         * jit/JITMulGenerator.cpp:
2815         (JSC::JITMulGenerator::generateFastPath):
2816         * jit/JITOperations.cpp:
2817         * jit/JITOperations.h:
2818         * jit/JITSubGenerator.cpp:
2819         (JSC::JITSubGenerator::generateFastPath):
2820         * jit/JITSubGenerator.h:
2821         (JSC::JITSubGenerator::JITSubGenerator):
2822         * jit/TagRegistersMode.cpp: Added.
2823         (WTF::printInternal):
2824         * jit/TagRegistersMode.h: Added.
2825         * runtime/CommonSlowPaths.cpp:
2826         (JSC::updateResultProfileForBinaryArithOp):
2827
2828 2016-05-09  Keith Miller  <keith_miller@apple.com>
2829
2830         CallObjectConstructor should not call operationToThis in the FTL
2831         https://bugs.webkit.org/show_bug.cgi?id=157492
2832         <rdar://problem/26149904>
2833
2834         Reviewed by Mark Lam.
2835
2836         At some point when I was working on intrinsifying the Object
2837         constructor, I realized that the Object constructor was different
2838         from the ToObject operation. I fixed the DFG but I guess I didn't
2839         fix the FTL.
2840
2841         This patch fixes an issue with www.wunderground.com not loading
2842         the 10-day forecast and local map.
2843
2844         * ftl/FTLLowerDFGToB3.cpp:
2845         (JSC::FTL::DFG::LowerDFGToB3::compileCallObjectConstructor):
2846         * tests/stress/call-object-constructor.js: Added.
2847         (test):
2848         (assert):
2849
2850 2016-05-09  Saam barati  <sbarati@apple.com>
2851
2852         Getter and setter on super are called with wrong "this" object
2853         https://bugs.webkit.org/show_bug.cgi?id=147064
2854         <rdar://problem/21885916>
2855
2856         Reviewed by Filip Pizlo.
2857
2858         This patch implements calls to 'super' getters and setters.
2859         The problem before is we were passing the 'super' (i.e, the prototype
2860         object) as the this value to these getters/setters, which is wrong. 
2861         We should be passing the caller's this value.
2862
2863         To implement this behavior, I've introduced four new opcodes and their corresponding DFG nodes:
2864         - op_get_by_id_with_this | GetByIdWithThis
2865         - op_put_by_id_with_this | PutByIdWithThis
2866         - op_get_by_val_with_this | GetByValWithThis
2867         - op_put_by_val_with_this | PutByValWithThis
2868
2869         These are implemented with no optimizations. The future plan is 
2870         to unite them with the *by_id and *by_val opcodes and nodes:
2871         https://bugs.webkit.org/show_bug.cgi?id=157215
2872
2873         * bytecode/BytecodeList.json:
2874         * bytecode/BytecodeUseDef.h:
2875         (JSC::computeUsesForBytecodeOffset):
2876         (JSC::computeDefsForBytecodeOffset):
2877         * bytecode/CodeBlock.cpp:
2878         (JSC::CodeBlock::dumpBytecode):
2879         * bytecompiler/BytecodeGenerator.cpp:
2880         (JSC::BytecodeGenerator::emitGetById):
2881         (JSC::BytecodeGenerator::emitPutById):
2882         (JSC::BytecodeGenerator::emitDirectPutById):
2883         (JSC::BytecodeGenerator::emitGetByVal):
2884         (JSC::BytecodeGenerator::emitPutByVal):
2885         (JSC::BytecodeGenerator::emitDirectPutByVal):
2886         (JSC::BytecodeGenerator::emitLoadDerivedConstructorFromArrowFunctionLexicalEnvironment):
2887         (JSC::BytecodeGenerator::ensureThis):
2888         (JSC::BytecodeGenerator::isThisUsedInInnerArrowFunction):
2889         * bytecompiler/BytecodeGenerator.h:
2890         * bytecompiler/NodesCodegen.cpp:
2891         (JSC::ThisNode::emitBytecode):
2892         (JSC::emitHomeObjectForCallee):
2893         (JSC::emitSuperBaseForCallee):
2894         (JSC::emitGetSuperFunctionForConstruct):
2895         (JSC::SuperNode::emitBytecode):
2896         (JSC::NewTargetNode::emitBytecode):
2897         (JSC::TaggedTemplateNode::emitBytecode):
2898         (JSC::BracketAccessorNode::emitBytecode):
2899         (JSC::DotAccessorNode::emitBytecode):
2900         (JSC::FunctionCallValueNode::emitBytecode):
2901         (JSC::FunctionCallBracketNode::emitBytecode):
2902         (JSC::FunctionCallDotNode::emitBytecode):
2903         (JSC::CallFunctionCallDotNode::emitBytecode):
2904         (JSC::ApplyFunctionCallDotNode::emitBytecode):
2905         (JSC::PostfixNode::emitBracket):
2906         (JSC::PostfixNode::emitDot):
2907         (JSC::PrefixNode::emitBracket):
2908         (JSC::PrefixNode::emitDot):
2909         (JSC::AssignDotNode::emitBytecode):
2910         (JSC::ReadModifyDotNode::emitBytecode):
2911         (JSC::AssignBracketNode::emitBytecode):
2912         (JSC::ReadModifyBracketNode::emitBytecode):
2913         (JSC::ForInNode::emitLoopHeader):
2914         (JSC::ForOfNode::emitBytecode):
2915         (JSC::AssignmentElementNode::bindValue):
2916         * dfg/DFGAbstractInterpreterInlines.h:
2917         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2918         * dfg/DFGByteCodeParser.cpp:
2919         (JSC::DFG::ByteCodeParser::parseBlock):
2920         * dfg/DFGCapabilities.cpp:
2921         (JSC::DFG::capabilityLevel):
2922         * dfg/DFGClobberize.h:
2923         (JSC::DFG::clobberize):
2924         * dfg/DFGDoesGC.cpp:
2925         (JSC::DFG::doesGC):
2926         * dfg/DFGFixupPhase.cpp:
2927         (JSC::DFG::FixupPhase::fixupNode):
2928         * dfg/DFGNode.h:
2929         (JSC::DFG::Node::hasIdentifier):
2930         * dfg/DFGNodeType.h:
2931         * dfg/DFGOperations.cpp:
2932         (JSC::DFG::newTypedArrayWithSize):
2933         (JSC::DFG::putWithThis):
2934         * dfg/DFGOperations.h:
2935         * dfg/DFGPredictionPropagationPhase.cpp:
2936         * dfg/DFGSafeToExecute.h:
2937         (JSC::DFG::safeToExecute):
2938         * dfg/DFGSpeculativeJIT.h:
2939         (JSC::DFG::SpeculativeJIT::callOperation):
2940         * dfg/DFGSpeculativeJIT32_64.cpp:
2941         (JSC::DFG::SpeculativeJIT::compile):
2942         * dfg/DFGSpeculativeJIT64.cpp:
2943         (JSC::DFG::SpeculativeJIT::compile):
2944         * ftl/FTLCapabilities.cpp:
2945         (JSC::FTL::canCompile):
2946         * ftl/FTLLowerDFGToB3.cpp:
2947         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
2948         (JSC::FTL::DFG::LowerDFGToB3::compileGetById):
2949         (JSC::FTL::DFG::LowerDFGToB3::compileGetByIdWithThis):
2950         (JSC::FTL::DFG::LowerDFGToB3::compileGetByValWithThis):
2951         (JSC::FTL::DFG::LowerDFGToB3::compilePutByIdWithThis):
2952         (JSC::FTL::DFG::LowerDFGToB3::compilePutByValWithThis):
2953         (JSC::FTL::DFG::LowerDFGToB3::compilePutById):
2954         * jit/CCallHelpers.cpp:
2955         (JSC::CCallHelpers::setupShadowChickenPacket):
2956         (JSC::CCallHelpers::setupFourStubArgsGPR):
2957         * jit/CCallHelpers.h:
2958         (JSC::CCallHelpers::setupArgumentsWithExecState):
2959         (JSC::CCallHelpers::setupThreeStubArgsGPR):
2960         (JSC::CCallHelpers::setupTwoStubArgsFPR):
2961         (JSC::CCallHelpers::setupStubArguments134):
2962         * jit/GPRInfo.h:
2963         (JSC::argumentRegisterFor): Deleted.
2964         * jit/JIT.cpp:
2965         (JSC::JIT::privateCompileMainPass):
2966         * jit/JIT.h:
2967         * jit/JITOperations.h:
2968         * jit/JITPropertyAccess.cpp:
2969         (JSC::JIT::emit_op_put_by_val):
2970         (JSC::JIT::emit_op_put_by_val_with_this):
2971         (JSC::JIT::emitGenericContiguousPutByVal):
2972         (JSC::JIT::emit_op_get_by_id):
2973         (JSC::JIT::emit_op_get_by_id_with_this):
2974         (JSC::JIT::emit_op_get_by_val_with_this):
2975         (JSC::JIT::emitSlow_op_get_by_id):
2976         (JSC::JIT::emit_op_put_by_id):
2977         (JSC::JIT::emit_op_put_by_id_with_this):
2978         (JSC::JIT::emitSlow_op_put_by_id):
2979         * jit/JITPropertyAccess32_64.cpp:
2980         (JSC::JIT::emit_op_put_to_arguments):
2981         (JSC::JIT::emit_op_get_by_id_with_this):
2982         (JSC::JIT::emit_op_get_by_val_with_this):
2983         (JSC::JIT::emit_op_put_by_id_with_this):
2984         (JSC::JIT::emit_op_put_by_val_with_this):
2985         * llint/LowLevelInterpreter.asm:
2986         * runtime/CommonSlowPaths.cpp:
2987         (JSC::SLOW_PATH_DECL):
2988         * runtime/CommonSlowPaths.h:
2989         * tests/stress/super-property-access-exceptions.js: Added.
2990         (assert):
2991         (test):
2992         (test.fooProp):
2993         (test.A.prototype.get foo):
2994         (test.A.prototype.get x):
2995         (test.A):
2996         (test.B):
2997         (test.B.prototype.bar):
2998         (test.B.prototype.baz):
2999         (test.foo):
3000         (test.func):
3001         (test.A.prototype.set foo):
3002         * tests/stress/super-property-access-tdz.js: Added.
3003         (assert):
3004         (test):
3005         (shouldThrowTDZ):
3006         (test.A.prototype.get foo):
3007         (test.A.prototype.set foo):
3008         (test.A):
3009         (test.fooProp):
3010         (test.B):
3011         (test.C):
3012         (test.D):
3013         (test.E):
3014         (test.F):
3015         * tests/stress/super-property-access.js: Added.
3016         (assert):
3017         (test):
3018         (func):
3019         (test.A):
3020         (test.A.prototype.set value):
3021         (test.A.prototype.get value):
3022         (test.B.prototype.set value):
3023         (test.B.prototype.get value):
3024         (test.B):
3025         (test.value):
3026         (test.A.prototype.get func):
3027         (test.B.prototype.inc):
3028         (test.B.prototype.dec):
3029         (test.B.prototype.preInc):
3030         (test.B.prototype.preDec):
3031         (test.B.prototype.plusEq):
3032         (test.B.prototype.minusEq):
3033         (test.B.prototype.timesEq):
3034         (test.B.prototype.divEq):
3035         (test.B.prototype.funcDot):
3036         (test.B.prototype.funcBracket):
3037         (test.foo):
3038         (test.B.prototype.baz):
3039         (test.B.prototype.jaz):
3040         (test.B.prototype.bar):
3041         (test.B.prototype.index):
3042         (test.):
3043         (test.prototype.bar):
3044         (test.A.prototype.set foo):
3045         (test.A.prototype.get array):
3046         (test.A.prototype.get foo):
3047         (test.obj):
3048         (test.A.prototype.get call):
3049         (test.A.prototype.get apply):
3050         (test.B.prototype.foo):
3051         (test.A.prototype.get i):
3052
3053 2016-05-08  Chris Dumez  <cdumez@apple.com>
3054
3055         [COCOA] Disable HAVE_DTRACE at build time
3056         https://bugs.webkit.org/show_bug.cgi?id=157433
3057         <rdar://problem/26148841>
3058
3059         Reviewed by Mark Lam.
3060
3061         Drop DTRACE-related code from JSC since it is very old and seems
3062         unused.
3063
3064         * JavaScriptCore.xcodeproj/project.pbxproj:
3065         * PlatformMac.cmake:
3066         * heap/Heap.cpp:
3067         (JSC::Heap::collectImpl): Deleted.
3068         (JSC::Heap::didFinishCollection): Deleted.
3069         * profiler/ProfileGenerator.cpp:
3070         (JSC::ProfileGenerator::willExecute): Deleted.
3071         (JSC::ProfileGenerator::didExecute): Deleted.
3072         * runtime/Tracing.d: Removed.
3073         * runtime/Tracing.h: Removed.
3074
3075 2016-05-07  Mark Lam  <mark.lam@apple.com>
3076
3077         Add JSC options bytecodeRangeToJITCompile and jitWhitelist.
3078         https://bugs.webkit.org/show_bug.cgi?id=157428
3079
3080         Reviewed by Michael Saboff.
3081
3082         1. Added Options::bytecodeRangeToJITCompile and Options::jitWhitelist options.
3083
3084         2. Moved DFGFunctionWhitelist* to FunctionWhitelist* and made it generic so that
3085            it can be used for more than one whitelist instance.  In this case, we now have
3086            two: the dfgWhitelist and the jitWhitelist.
3087
3088         3. Added "can compile" checks in LLInt::shouldJIT() to check
3089            Options::bytecodeRangeToJITCompile and Options::jitWhitelist.
3090
3091         * CMakeLists.txt:
3092         * JavaScriptCore.xcodeproj/project.pbxproj:
3093         * dfg/DFGDriver.cpp:
3094         (JSC::DFG::getNumCompilations):
3095         (JSC::DFG::ensureGlobalDFGWhitelist):
3096         (JSC::DFG::compileImpl):
3097         * dfg/DFGFunctionWhitelist.cpp: Removed.
3098         * dfg/DFGFunctionWhitelist.h: Removed.
3099
3100         * llint/LLIntSlowPaths.cpp:
3101         (JSC::LLInt::ensureGlobalJITWhitelist):
3102         (JSC::LLInt::shouldJIT):
3103
3104         * runtime/Options.h:
3105
3106         * tools/FunctionWhitelist.cpp: Copied from Source/JavaScriptCore/dfg/DFGFunctionWhitelist.cpp.
3107         (JSC::FunctionWhitelist::FunctionWhitelist):
3108         (JSC::FunctionWhitelist::contains):
3109         (JSC::DFG::FunctionWhitelist::ensureGlobalWhitelist): Deleted.
3110         (JSC::DFG::FunctionWhitelist::FunctionWhitelist): Deleted.
3111         (JSC::DFG::FunctionWhitelist::parseFunctionNamesInFile): Deleted.
3112         (JSC::DFG::FunctionWhitelist::contains): Deleted.
3113         * tools/FunctionWhitelist.h: Copied from Source/JavaScriptCore/dfg/DFGFunctionWhitelist.h.
3114
3115 2016-05-07  Benjamin Poulain  <bpoulain@apple.com>
3116
3117         [JSC][32bit] stress/tagged-templates-template-object.js fails in debug
3118         https://bugs.webkit.org/show_bug.cgi?id=157436
3119
3120         Reviewed by Filip Pizlo.
3121
3122         * dfg/DFGSpeculativeJIT32_64.cpp:
3123         (JSC::DFG::SpeculativeJIT::compile):
3124         The node OverridesHasInstance had a speculation after a jump.
3125
3126 2016-05-06  Joseph Pecoraro  <pecoraro@apple.com>
3127
3128         Web Inspector: Misc CommandLineAPI cleanup
3129         https://bugs.webkit.org/show_bug.cgi?id=157450
3130
3131         Reviewed by Ryosuke Niwa.
3132
3133         * inspector/InjectedScriptSource.js:
3134         (BasicCommandLineAPI):
3135         Fix mistake in r200533, and modernize related code.
3136
3137 2016-05-06  Joseph Pecoraro  <pecoraro@apple.com>
3138
3139         Web Inspector: Improve console.count()
3140         https://bugs.webkit.org/show_bug.cgi?id=157439
3141         <rdar://problem/26152654>
3142
3143         Reviewed by Timothy Hatcher.
3144
3145           - make console.count() increment an unnamed global counter.
3146           - make console.count(label) increment a counter with that label name.
3147
3148         * inspector/agents/InspectorConsoleAgent.cpp:
3149         (Inspector::InspectorConsoleAgent::count):
3150
3151 2016-05-06  Simon Fraser  <simon.fraser@apple.com>
3152
3153         Enable IOS_TEXT_AUTOSIZING on Mac and make it testable
3154         https://bugs.webkit.org/show_bug.cgi?id=157432
3155         rdar://problem/16406720
3156
3157         Reviewed by Dean Jackson.
3158
3159         Enable IOS_TEXT_AUTOSIZING on Mac so it can be tested.
3160
3161         * Configurations/FeatureDefines.xcconfig:
3162
3163 2016-05-06  Joseph Pecoraro  <pecoraro@apple.com>
3164
3165         Web Inspector: Console: Variables defined with let/const aren't accessible outside of console's scope
3166         https://bugs.webkit.org/show_bug.cgi?id=150752
3167         <rdar://problem/23343385>
3168
3169         Reviewed by Mark Lam.
3170
3171         This approach allows Web Inspector to hang a "Scope Extension", a
3172         WithObjectScope, off the GlobalObject. When resolving identifiers
3173         in fails to resolve anything in the normal scope chain, consult
3174         the scope extension.
3175
3176         This allows us to eliminate the `with (commandLineAPI) { ... }`
3177         block in global console evaluations, and instead makes it a full
3178         program evaluation, with the commandLineAPI available and safely
3179         shadowed by actual variables as expected.
3180
3181         * inspector/InjectedScriptSource.js:
3182         (InjectedScript.prototype._evaluateOn):
3183         Use the new evaluateWithScopeExtension and provide the CommandLineAPI
3184         object as the scope extension object.
3185
3186         (BasicCommandLineAPI):
3187         (BasicCommandLineAPI.inScopeVariables): Deleted.
3188         Simplify now that we don't need to check for variable shadowing ourselves.
3189
3190         * inspector/JSInjectedScriptHost.cpp:
3191         (Inspector::JSInjectedScriptHost::evaluateWithScopeExtension):
3192         * inspector/JSInjectedScriptHost.h:
3193         * inspector/JSInjectedScriptHostPrototype.cpp:
3194         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
3195         (Inspector::jsInjectedScriptHostPrototypeFunctionEvaluateWithScopeExtension):
3196         Provide a new InjectedScriptHost method to evaluate a program
3197         with a scope extension.
3198
3199         * runtime/Completion.cpp:
3200         (JSC::evaluateWithScopeExtension):
3201         * runtime/Completion.h:
3202         General JSC::evaluate function to evaluate a program with a scope extension.
3203
3204         * runtime/JSGlobalObject.cpp:
3205         (JSC::JSGlobalObject::setGlobalScopeExtension):
3206         (JSC::JSGlobalObject::clearGlobalScopeExtension):
3207         (JSC::JSGlobalObject::visitChildren):
3208         * runtime/JSGlobalObject.h:
3209         (JSC::JSGlobalObject::globalScopeExtension):
3210         Hang a scope extension off the global object.
3211
3212         * runtime/JSScope.cpp:
3213         (JSC::JSScope::resolve):
3214         Consult the scope extension when resolve fails to find anything normally.
3215
3216 2016-05-06  Mark Lam  <mark.lam@apple.com>
3217
3218         Add JSC options reportBaselineCompileTimes and reportDFGCompileTimes.
3219         https://bugs.webkit.org/show_bug.cgi?id=157427
3220
3221         Reviewed by Filip Pizlo and Keith Miller.
3222
3223         The compile times reporting options are now:
3224             reportCompileTimes         -> report compile times in all tiers.
3225             reportBaselineCompileTimes -> report compile times in baseline JIT.
3226             reportDFGCompileTimes      -> report compile times in DFG and FTL.
3227             reportFTLCompileTimes      -> report compile times in FTL.
3228
3229         Also updated reportTotalCompileTimes() to collect stats that include the baseline
3230         JIT.  compileTimeStats() is now moved into JIT.cpp (from DFGPlan.cpp). 
3231
3232         * dfg/DFGPlan.cpp:
3233         (JSC::DFG::Plan::reportCompileTimes):
3234         (JSC::DFG::Plan::compileInThread):
3235         (JSC::DFG::Plan::compileInThreadImpl):
3236         (JSC::DFG::Plan::cancel):
3237         (JSC::DFG::Plan::compileTimeStats): Deleted.
3238         * dfg/DFGPlan.h:
3239         (JSC::DFG::Plan::compileTimeStats): Deleted.
3240         * jit/JIT.cpp:
3241         (JSC::ctiPatchCallByReturnAddress):
3242         (JSC::JIT::privateCompile):
3243         (JSC::JIT::stackPointerOffsetFor):
3244         (JSC::JIT::reportCompileTimes):
3245         (JSC::JIT::computeCompileTimes):
3246         (JSC::JIT::compileTimeStats):
3247         * jit/JIT.h:
3248         (JSC::JIT::shouldEmitProfiling):
3249         * jsc.cpp:
3250         (runJSC):
3251         * runtime/Options.h:
3252
3253 2016-05-05  Benjamin Poulain  <bpoulain@apple.com>
3254
3255         [JSC] Get rid of NonNegZeroDouble, it is broken
3256         https://bugs.webkit.org/show_bug.cgi?id=157399
3257         rdar://problem/25339647
3258
3259         Reviewed by Mark Lam.
3260
3261         The profile "NonNegZeroDouble" is fundamentally broken.
3262
3263         It is used by DFG to predict the result of ArithMul as being a Double
3264         or Int32.
3265         The problem is you are likely to mispredict, and when you do, you are
3266         guaranteed to end up in a recompile loop.
3267
3268         The compile loops usually happen like this:
3269         -We speculate you have Int32 despite producing doubles.
3270         -We OSR exit on another node (ValueToInt32 for example) from the result of this ArithMul.
3271         -When we compile this block again, ArithMul will do the same misprediction
3272          because it unconditionally predicts Int32.
3273
3274         The flag NonNegZeroDouble was very unlikely to be set correctly
3275         in the first place.
3276
3277         In LLINT, the flag is only set on the slow path.
3278         Since double*double is on the fast path, those cases are ignored.
3279
3280         In Baseline, the flag is set for any case that falls back on double
3281         multiplication. BUT, the DFG flag was only set for nodes that spend
3282         many iteration in slow path, which obviously does not apply to double*double.
3283
3284         Given the perf drawbacks and the recompile loops, I removed
3285         the whole flag for now.
3286
3287         * bytecode/ValueProfile.cpp:
3288         (WTF::printInternal):
3289         * bytecode/ValueProfile.h:
3290         (JSC::ResultProfile::didObserveNonInt32): Deleted.
3291         (JSC::ResultProfile::didObserveDouble): Deleted.
3292         (JSC::ResultProfile::didObserveNonNegZeroDouble): Deleted.
3293         (JSC::ResultProfile::setObservedNonNegZeroDouble): Deleted.
3294         * dfg/DFGByteCodeParser.cpp:
3295         (JSC::DFG::ByteCodeParser::makeSafe): Deleted.
3296         * dfg/DFGNode.h:
3297         (JSC::DFG::Node::mayHaveNonIntResult): Deleted.
3298         * dfg/DFGNodeFlags.cpp:
3299         (JSC::DFG::dumpNodeFlags): Deleted.
3300         * dfg/DFGNodeFlags.h:
3301         * dfg/DFGPredictionPropagationPhase.cpp:
3302         * jit/JITMulGenerator.cpp:
3303         (JSC::JITMulGenerator::generateFastPath): Deleted.
3304         * runtime/CommonSlowPaths.cpp:
3305         (JSC::updateResultProfileForBinaryArithOp): Deleted.
3306
3307 2016-05-05  Joseph Pecoraro  <pecoraro@apple.com>
3308
3309         REGRESSION(r200422): Web Inspector: Make new Array Iterator objects play nice with Web Inspector
3310         https://bugs.webkit.org/show_bug.cgi?id=157361
3311         <rdar://problem/26099793>
3312
3313         Reviewed by Timothy Hatcher.
3314
3315         * builtins/ArrayPrototype.js:
3316         (createArrayIterator):
3317         (values):
3318         (keys):
3319         (entries):
3320         * builtins/TypedArrayPrototype.js:
3321         (values):
3322         (keys):
3323         (entries):
3324         * runtime/CommonIdentifiers.h:
3325         Set the kind on the iterator object, that can be shown
3326         to the inspector if the object is shown in the console.
3327
3328         * inspector/InjectedScriptSource.js:
3329         (InjectedScript.prototype._describe):
3330         Get a better name for the new Array Iterator which is just an Object.
3331
3332         * inspector/JSInjectedScriptHost.cpp:
3333         (Inspector::JSInjectedScriptHost::subtype):
3334         (Inspector::JSInjectedScriptHost::getInternalProperties):
3335         Detect and handle ArrayIterator object instances. Porting the code
3336         from the JSArrayIterator code path.
3337
3338 2016-05-05  Benjamin Poulain  <bpoulain@apple.com>
3339
3340         [JSC] In DFG, an OSR Exit on SetLocal can trash its child node
3341         https://bugs.webkit.org/show_bug.cgi?id=157358
3342         rdar://problem/25339647
3343
3344         Reviewed by Filip Pizlo.
3345
3346         When we OSR Exit on SetLocal, the child is never restored if its representation
3347         was changed since the MovHint.
3348
3349         For example, say we have:
3350             @1 = SomethingProducingDouble()
3351             @2 = MovHint(@1)
3352             @3 = ValueRep(@1)
3353             @4 = SetLocal(@3, FlushedInt32)
3354
3355         When we lower SetLocal(), we start by speculating that @3 is an Int32.
3356         Now this can fail if @1 was really a double.
3357         When that happens, we go over the VariableEventStream to find where values
3358         are, and @1 died at @3. Since the speculation failure happens before
3359         the SetLocal event, we don't do anything with @3.
3360
3361         In this patch, I extend the PhantomInsertion phase to keep the MovHint
3362         alive past the SetLocal.
3363
3364         * dfg/DFGPhantomInsertionPhase.cpp:
3365         * tests/stress/multiply-typed-double-and-object.js: Added.
3366         (otherObject.valueOf):
3367         (targetDFG.multiply):
3368         (targetFTL.multiply):
3369
3370 2016-05-05  Oliver Hunt  <oliver@apple.com>
3371
3372         Enable separated heap by default on ios
3373         https://bugs.webkit.org/show_bug.cgi?id=156720
3374
3375         Reviewed by Geoffrey Garen.
3376
3377         We've fixed the xnu side of things, so we can reland this.
3378
3379         * runtime/Options.cpp:
3380         (JSC::recomputeDependentOptions):
3381
3382 2016-05-05  Joseph Pecoraro  <pecoraro@apple.com>
3383
3384         JSContext Inspector: Better CommandLineAPI in JSContext inspection
3385         https://bugs.webkit.org/show_bug.cgi?id=157387
3386         <rdar://problem/22630583>
3387
3388         Reviewed by Timothy Hatcher.
3389
3390         * inspector/InjectedScriptSource.js:
3391         (InjectedScript.prototype._evaluateOn):
3392         (BasicCommandLineAPI.inScopeVariables):
3393         (BasicCommandLineAPI):
3394         When creating a BasicCommandLineAPI, pass the call frame so
3395         that we don't shadow variables in the callstack.
3396
3397         (BasicCommandLineAPI.methods):
3398         (clear):
3399         (table):
3400         (profile):
3401         (profileEnd):
3402         (keys):
3403         (values):
3404         Some just pass through to console, others are tiny methods.
3405         Implement them, and give them the expected toString string.
3406
3407 2016-05-05  Filip Pizlo  <fpizlo@apple.com>
3408
3409         Reduce maximum JIT pool size on X86_64.
3410
3411         Rubber stamped by Geoffrey Garen.
3412         
3413         This changes our maximum pool size to 100MB. The problem with letting a page allocate much
3414         more than this is that we will sometimes call deleteAllCode() or one of its friends. Deleting
3415         a huge amount of memory is expensive in our allocator.
3416         
3417         So long as we allow for such large-scale code death to happen, and so long as it's expensive,
3418         we should bound the amount of code we end up with in the first place.
3419         
3420         In the long run, we should fix our executable allocator so that it's not so expensive to kill
3421         all code.
3422         
3423         * jit/ExecutableAllocator.h:
3424
3425 2016-05-05  Filip Pizlo  <fpizlo@apple.com>
3426
3427         Reduce thresholds that control the maximum IC stub size.
3428
3429         Rubber stamped by Chris Dumez and Benjamin Poulain.
3430         
3431         This reduces the thresholds to before the megamorphic load optimizations to see if that
3432         recovers a PLT regression.
3433
3434         * runtime/Options.h:
3435
3436 2016-05-05  Filip Pizlo  <fpizlo@apple.com>
3437
3438         We shouldn't crash if DFG AI proved that something was unreachable on one run but then decided not to prove it on another run
3439         https://bugs.webkit.org/show_bug.cgi?id=157379
3440
3441         Reviewed by Mark Lam.
3442         
3443         Any run of DFG AI is a fixpoint that loosens the proof until it can't find any more
3444         counterexamples to the proof.  It errs on the side of loosening proofs, i.e., on the side of
3445         proving fewer things.
3446
3447         We run this fixpoint multiple times since there are multiple points in the DFG optimization
3448         pipeline when we run DFG AI.  Each of those runs completes a fixpoint and produces the
3449         tightest proof it can that did not result in counterexamples being found.
3450
3451         It's possible that on run K of DFG AI, we prove some property, but on run K+1, we don't prove
3452         that property. The code could have changed between the two runs due to other phases. Other
3453         phases may modify the code in such a way that it's less amenable to AI's analysis. Our design
3454         allows this because DFG AI is not 100% precise. It defends itself from making unsound choices
3455         or running forever by sometimes punting on proving some property. It must be able to do this,
3456         and so therefore, it might sometimes prove fewer things on a later run.
3457
3458         Currently in trunk if the property that AI proves on run K but fails to prove on run K+1 is
3459         the reachability of a piece of code, then run K+1 will crash on an assertion at the
3460         Unreachable node. It will complain that it reached an Unreachable. But it might be reaching
3461         that Unreachable because it failed to prove that something earlier was always exiting. That's
3462         OK, see above.
3463
3464         So, we should remove the assertion that AI doesn't see Unreachable.
3465         
3466         No new tests because I don't know how to make this happen. I believe that this happens in the
3467         wild based on crash logs.
3468
3469         * dfg/DFGAbstractInterpreterInlines.h:
3470         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3471
3472 2016-05-05  Joseph Pecoraro  <pecoraro@apple.com>
3473
3474         Crash if you type "debugger" in the console and continue
3475         https://bugs.webkit.org/show_bug.cgi?id=156924
3476         <rdar://problem/25884189>
3477
3478         Reviewed by Mark Lam.
3479
3480         * inspector/agents/InspectorDebuggerAgent.cpp:
3481         (Inspector::InspectorDebuggerAgent::evaluateOnCallFrame):
3482         Bail with an error when we are not paused.
3483
3484         * inspector/agents/InspectorRuntimeAgent.cpp:
3485         (Inspector::InspectorRuntimeAgent::callFunctionOn):
3486         (Inspector::InspectorRuntimeAgent::getProperties):
3487         (Inspector::InspectorRuntimeAgent::getDisplayableProperties):
3488         (Inspector::InspectorRuntimeAgent::getCollectionEntries):
3489         (Inspector::InspectorRuntimeAgent::saveResult):
3490         Update poor error message.
3491
3492 2016-05-05  Keith Miller  <keith_miller@apple.com>
3493
3494         Add support for delete by value to the DFG
3495         https://bugs.webkit.org/show_bug.cgi?id=157372
3496
3497         Reviewed by Filip Pizlo.
3498
3499         This patch adds basic support for delete by value to the DFG. delete by value
3500         just calls out to a C++ operation on each execution. Additionally, this patch
3501         fixes an issue with delete by id where we would crash if the base was null
3502         or undefined.
3503
3504         * dfg/DFGAbstractInterpreterInlines.h:
3505         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3506         * dfg/DFGByteCodeParser.cpp:
3507         (JSC::DFG::ByteCodeParser::parseBlock):
3508         * dfg/DFGCapabilities.cpp:
3509         (JSC::DFG::capabilityLevel):
3510         * dfg/DFGClobberize.h:
3511         (JSC::DFG::clobberize):
3512         * dfg/DFGDoesGC.cpp:
3513         (JSC::DFG::doesGC):
3514         * dfg/DFGFixupPhase.cpp:
3515         (JSC::DFG::FixupPhase::fixupNode):
3516         * dfg/DFGNodeType.h:
3517         * dfg/DFGPredictionPropagationPhase.cpp:
3518         * dfg/DFGSafeToExecute.h:
3519         (JSC::DFG::safeToExecute):
3520         * dfg/DFGSpeculativeJIT.cpp:
3521         (JSC::DFG::SpeculativeJIT::compileDeleteById):
3522         (JSC::DFG::SpeculativeJIT::compileDeleteByVal):
3523         * dfg/DFGSpeculativeJIT.h:
3524         (JSC::DFG::SpeculativeJIT::callOperation):
3525         * dfg/DFGSpeculativeJIT32_64.cpp:
3526         (JSC::DFG::SpeculativeJIT::compile):
3527         * dfg/DFGSpeculativeJIT64.cpp:
3528         (JSC::DFG::SpeculativeJIT::compile):
3529         * jit/JIT.cpp:
3530         (JSC::JIT::privateCompileMainPass):
3531         * jit/JIT.h:
3532         * jit/JITOperations.cpp:
3533         * jit/JITOperations.h:
3534         * jit/JITPropertyAccess.cpp:
3535         (JSC::JIT::emit_op_del_by_val):
3536         * jit/JITPropertyAccess32_64.cpp:
3537         (JSC::JIT::emit_op_del_by_val):
3538         * tests/stress/delete-by-val.js: Added.
3539         (assert):
3540         (test):
3541         * tests/stress/delete-to-object-exception.js: Added.
3542         (assert):
3543         (test):
3544
3545 2016-05-05  Michael Saboff  <msaboff@apple.com>
3546
3547         Unreviewed build fix after change set r200447.
3548
3549         Made the detection of clang version XCode build specific.
3550         Now shouldEnableDebugAnnotations() should return false for all other build types.
3551
3552         * offlineasm/config.rb:
3553
3554 2016-05-05  Joseph Pecoraro  <pecoraro@apple.com>
3555
3556         Create console object lazily
3557         https://bugs.webkit.org/show_bug.cgi?id=157328
3558
3559         Reviewed by Geoffrey Garen.
3560
3561         * runtime/CommonIdentifiers.h:
3562         * runtime/JSGlobalObject.cpp:
3563         (JSC::createConsoleProperty):
3564         (JSC::JSGlobalObject::init): Deleted.
3565
3566 2016-05-04  Michael Saboff  <msaboff@apple.com>
3567
3568         Enable Dwarf2 debug information in offline assembler for clang compiler
3569         https://bugs.webkit.org/show_bug.cgi?id=157364.
3570
3571         Reviewed by Mark Lam.
3572
3573         Added a new function shouldEnableDebugAnnotations() that determines if
3574         we are using clang and a new enough version to support the debug annotations.
3575
3576         * offlineasm/config.rb:
3577         (shouldEnableDebugAnnotations): Added.
3578
3579 2016-05-04  Keith Miller  <keith_miller@apple.com>
3580
3581         Unreviewed, fix test for new ArrayIteratorPrototype.next() error message.
3582
3583         * tests/stress/array-iterators-next-with-call.js:
3584
3585 2016-05-04  Filip Pizlo  <fpizlo@apple.com>
3586
3587         Speed up JSGlobalObject initialization by making some properties lazy
3588         https://bugs.webkit.org/show_bug.cgi?id=157045
3589
3590         Reviewed by Keith Miller.
3591         
3592         This makes about half of JSGlobalObject's state lazy. There are three categories of
3593         state in JSGlobalObject:
3594         
3595         1) C++ fields in JSGlobalObject.
3596         2) JS object properties in JSGlobalObject's JSObject superclass.
3597         3) JS variables in JSGlobalObject's JSSegmentedVariableObject superclass.
3598         
3599         State held in JS variables cannot yet be made lazy. That's why this patch only goes
3600         half-way.
3601         
3602         State in JS object properties can be made lazy if we move it to the static property
3603         hashtable. JSGlobalObject already had one of those. This patch makes static property
3604         hashtables a lot more powerful, by adding three new kinds of static properties. These
3605         new kinds allow us to make almost all of JSGlobalObject's object properties lazy.
3606         
3607         State in C++ fields can now be made lazy thanks in part to WTF's support for stateless
3608         lambdas. You can of course make anything lazy by hand, but there are many C++ fields in
3609         JSGlobalObject and we are adding more all the time. We don't want to require that each
3610         of these has a getter with an initialization check and a corresponding out-of-line slow
3611         path that does the initialization. We want this kind of boilerplate to be handled by
3612         some abstractions.
3613         
3614         The primary abstraction introduced in this patch is LazyProperty<Type>. Currently, this
3615         only works where Type is a subclass of JSCell. Such a property holds a pointer to Type.
3616         You can use it like you would a WriteBarrier<Type>. It even has set() and get() methods,
3617         so it's almost a drop-in replacement.
3618         
3619         The key to LazyProperty<Type>'s power is that you can do this:
3620         
3621             class Bar {
3622                 ...
3623                 LazyProperty<Foo> m_foo;
3624             };
3625             ...
3626             m_foo.initLater(
3627                 [] (const LazyProperty<Foo>::Initializer<Bar>& init) {
3628                     init.set(Foo::create(init.vm, init.owner));
3629                 });
3630         
3631         This initLater() call requires that you pass a stateless lambda (see WTF changelog for
3632         the definition). Miraculously, this initLater() call is guaranteed to compile to a store
3633         of a pointer constant to m_foo, as in:
3634         
3635             movabsq 0xBLAH, %rax
3636             movq %rax, &m_foo
3637         
3638         This magical pointer constant points to a callback that was generated by the template
3639         instantiation of initLater(). That callback knows to call your stateless lambda, but
3640         also does some other bookkeeping: it makes sure that you indeed initialized the property
3641         inside the callback and it manages recursive initializations. It's totally legal to call
3642         m_foo.get() inside the initLater() callback. If you do that before you call init.set(),
3643         m_foo.get() will return null. This is an excellent escape hatch if we ever find
3644         ourselves in a dependency cycle. I added this feature because I already had to create a
3645         dependency cycle.
3646         
3647         Note that using LazyProperties from DFG threads is super awkward. It's going to be hard
3648         to get this right. The DFG thread cannot initialize those fields, so it has to make sure
3649         that it does conservative things. But for some nodes this could mean adding a lot of new
3650         logic, like NewTypedArray, which currently is written in such a way that it assumes that
3651         we always have the typed array structure. Currently we take a two-fold approach: for
3652         typed arrays we don't handle the NewTypedArray intrinsic if the structure isn't
3653         initialized, and for everything else we don't make the properties lazy if the DFG needs
3654         them. As we optimize this further we might need to teach the DFG to handle more lazy
3655         properties. I tried to do this for RegExp but found it to be very confusing. With typed
3656         arrays I got lucky.
3657         
3658         There is also a somewhat more powerful construct called LazyClassStructure. We often
3659         need to keep around the structure of some standard JS class, like Date. We also need to
3660         make sure that the constructor ends up in the global object's property table. And we
3661         often need to keep the original value of the constructor for ourselves. In this case, we
3662         want to make sure that the creation of the structure-prototype-constructor constellation
3663         is atomic. We don't want code to start looking at the structure if it points to a
3664         prototype that doesn't have its "constructor" property set yet, for example.
3665         LazyClassStructure solves this by abstracting that whole initialization. You provide the
3666         callback that allocates everything, since we are super inconsistent about the way we
3667         initialize things, but LazyClassStructure establishes the workflow and helps you not
3668         mess up.
3669         
3670         Finally, the new static hashtable attributes allow for all of this to work with the JS
3671         property table:
3672         
3673         PropertyCallback: if you use this attribute, the second column in the table should be
3674         the name of a function to call to initialize this property. This is useful for things
3675         like the Math property. The Math object turns out to be very expensive to allocate.
3676         Delaying its allocation is super easy with the PropertyCallback attribute.
3677         
3678         CellProperty: with this attribute the second column should be a C++ field name like
3679         JSGlobalObject::m_evalErrorConstructor. The static hashtable will grab the offset of
3680         this property, and when it needs to be initialized, Lookup will assume you have a
3681         LazyProperty<JSCell> and call its get() method. It will initialize the property to
3682         whatever get() returned. Note that it's legal to cast a LazyProperty<Anything> to
3683         LazyProperty<JSCell> for the purpose of calling get() because the get() method will just
3684         call whatever callback function pointer is encoded in the property and it does not need
3685         to know anything about what type that callback will instantiate.
3686         
3687         ClassStructure: with this attribute the second column should be a C++ field name. The
3688         static hashtable will initialize the property by treating the field as a
3689         LazyClassStructure and it will call get(). LazyClassStructure completely owns the whole
3690         initialization workflow, so Lookup assumes that when LazyClassStructure::get() returns,
3691         the property in question will already be set. By convention, we have LazyClassStructure
3692         initialize the property with a pointer to the constructor, since that's how all of our
3693         classes work: "globalObject.Date" points to the DateConstructor.
3694         
3695         This is a 2x speed-up in JSGlobalObject initialization time in a microbenchmark that
3696         calls our C API. This is a 1% speed-up on SunSpider and JSRegress.
3697         
3698         Rolling this back in after fixing the function pointer alignment issue. The last version
3699         relied on function pointers being aligned to a 4-byte boundary. We cannot rely on this,
3700         especially since ARMv7 uses the low bit of function pointers as a tag to indicate the
3701         instruction set. This version adds an extra indirection, so that
3702         LazyProperty<>::m_pointer points to a pointer that points to the function. A pointer to
3703         a pointer is guaranteed to be at least 4-byte aligned.
3704
3705         * API/JSCallbackFunction.cpp:
3706         (JSC::JSCallbackFunction::create):
3707         * API/ObjCCallbackFunction.h:
3708         (JSC::ObjCCallbackFunction::impl):
3709         * API/ObjCCallbackFunction.mm:
3710         (JSC::ObjCCallbackFunction::ObjCCallbackFunction):
3711         (JSC::ObjCCallbackFunction::create):
3712         * CMakeLists.txt:
3713         * JavaScriptCore.xcodeproj/project.pbxproj:
3714         * create_hash_table:
3715         * debugger/DebuggerScope.cpp:
3716         (JSC::DebuggerScope::create):
3717         (JSC::DebuggerScope::DebuggerScope):
3718         * debugger/DebuggerScope.h:
3719         (JSC::DebuggerScope::jsScope):
3720         (JSC::DebuggerScope::create): Deleted.
3721         * dfg/DFGAbstractInterpreterInlines.h:
3722         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3723         * dfg/DFGAbstractValue.cpp:
3724         (JSC::DFG::AbstractValue::set):
3725         * dfg/DFGArrayMode.cpp:
3726         (JSC::DFG::ArrayMode::originalArrayStructure):
3727         * dfg/DFGByteCodeParser.cpp:
3728         (JSC::DFG::ByteCodeParser::handleTypedArrayConstructor):
3729         * dfg/DFGSpeculativeJIT.cpp:
3730         (JSC::DFG::SpeculativeJIT::compileNewTypedArray):
3731         * dfg/DFGSpeculativeJIT32_64.cpp:
3732         (JSC::DFG::SpeculativeJIT::compile):
3733         * dfg/DFGSpeculativeJIT64.cpp:
3734         (JSC::DFG::SpeculativeJIT::compile):
3735         * dfg/DFGStructureRegistrationPhase.cpp:
3736         (JSC::DFG::StructureRegistrationPhase::run):
3737         * ftl/FTLLowerDFGToB3.cpp:
3738         (JSC::FTL::DFG::LowerDFGToB3::compileNewTypedArray):
3739         * runtime/ClonedArguments.cpp:
3740         (JSC::ClonedArguments::getOwnPropertySlot):
3741         (JSC::ClonedArguments::materializeSpecials):
3742         * runtime/CommonSlowPaths.cpp:
3743         (JSC::SLOW_PATH_DECL):
3744         * runtime/FunctionPrototype.cpp:
3745         (JSC::functionProtoFuncToString):
3746         * runtime/InternalFunction.cpp:
3747         (JSC::InternalFunction::visitChildren):
3748         (JSC::InternalFunction::name):
3749         (JSC::InternalFunction::calculatedDisplayName):
3750         (JSC::InternalFunction::createSubclassStructure):
3751         * runtime/InternalFunction.h:
3752         * runtime/JSBoundFunction.cpp:
3753         (JSC::JSBoundFunction::finishCreation):
3754         (JSC::JSBoundFunction::visitChildren):
3755         * runtime/JSBoundSlotBaseFunction.cpp:
3756         (JSC::JSBoundSlotBaseFunction::create):
3757         * runtime/JSFunction.cpp:
3758         (JSC::retrieveCallerFunction):
3759         (JSC::getThrowTypeErrorGetterSetter):
3760         (JSC::JSFunction::callerGetter):
3761         (JSC::JSFunction::getOwnPropertySlot):
3762         (JSC::JSFunction::defineOwnProperty):
3763         * runtime/JSGenericTypedArrayViewConstructorInlines.h:
3764         (JSC::constructGenericTypedArrayView):
3765         * runtime/JSGlobalObject.cpp:
3766         (JSC::createProxyProperty):
3767         (JSC::createJSONProperty):
3768         (JSC::createMathProperty):
3769         (JSC::JSGlobalObject::init):
3770         (JSC::JSGlobalObject::stringPrototypeChainIsSane):
3771         (JSC::JSGlobalObject::resetPrototype):
3772         (JSC::JSGlobalObject::visitChildren):
3773         (JSC::JSGlobalObject::toThis):
3774         (JSC::JSGlobalObject::getOwnPropertySlot):
3775         (JSC::JSGlobalObject::createThrowTypeError): Deleted.
3776         (JSC::JSGlobalObject::createThrowTypeErrorArgumentsAndCaller): Deleted.
3777         * runtime/JSGlobalObject.h:
3778         (JSC::JSGlobalObject::objectConstructor):
3779         (JSC::JSGlobalObject::promiseConstructor):
3780         (JSC::JSGlobalObject::internalPromiseConstructor):
3781         (JSC::JSGlobalObject::evalErrorConstructor):
3782         (JSC::JSGlobalObject::rangeErrorConstructor):
3783         (JSC::JSGlobalObject::referenceErrorConstructor):
3784         (JSC::JSGlobalObject::syntaxErrorConstructor):
3785         (JSC::JSGlobalObject::typeErrorConstructor):
3786         (JSC::JSGlobalObject::URIErrorConstructor):
3787         (JSC::JSGlobalObject::nullGetterFunction):
3788         (JSC::JSGlobalObject::nullSetterFunction):
3789         (JSC::JSGlobalObject::callFunction):
3790         (JSC::JSGlobalObject::applyFunction):
3791         (JSC::JSGlobalObject::definePropertyFunction):
3792         (JSC::JSGlobalObject::arrayProtoValuesFunction):
3793         (JSC::JSGlobalObject::initializePromiseFunction):
3794         (JSC::JSGlobalObject::newPromiseCapabilityFunction):
3795         (JSC::JSGlobalObject::functionProtoHasInstanceSymbolFunction):
3796         (JSC::JSGlobalObject::regExpProtoExecFunction):
3797         (JSC::JSGlobalObject::regExpProtoSymbolReplaceFunction):
3798         (JSC::JSGlobalObject::regExpProtoGlobalGetter):
3799         (JSC::JSGlobalObject::regExpProtoUnicodeGetter):
3800         (JSC::JSGlobalObject::throwTypeErrorGetterSetter):
3801         (JSC::JSGlobalObject::throwTypeErrorArgumentsAndCallerGetterSetter):
3802         (JSC::JSGlobalObject::moduleLoader):
3803         (JSC::JSGlobalObject::objectPrototype):
3804         (JSC::JSGlobalObject::functionPrototype):
3805         (JSC::JSGlobalObject::arrayPrototype):
3806         (JSC::JSGlobalObject::booleanPrototype):
3807         (JSC::JSGlobalObject::stringPrototype):
3808         (JSC::JSGlobalObject::symbolPrototype):
3809         (JSC::JSGlobalObject::numberPrototype):
3810         (JSC::JSGlobalObject::datePrototype):
3811         (JSC::JSGlobalObject::regExpPrototype):
3812         (JSC::JSGlobalObject::errorPrototype):
3813         (JSC::JSGlobalObject::iteratorPrototype):
3814         (JSC::JSGlobalObject::generatorFunctionPrototype):
3815         (JSC::JSGlobalObject::generatorPrototype):
3816         (JSC::JSGlobalObject::debuggerScopeStructure):
3817         (JSC::JSGlobalObject::withScopeStructure):
3818         (JSC::JSGlobalObject::strictEvalActivationStructure):
3819         (JSC::JSGlobalObject::activationStructure):
3820         (JSC::JSGlobalObject::moduleEnvironmentStructure):
3821         (JSC::JSGlobalObject::directArgumentsStructure):
3822         (JSC::JSGlobalObject::scopedArgumentsStructure):
3823         (JSC::JSGlobalObject::clonedArgumentsStructure):
3824         (JSC::JSGlobalObject::isOriginalArrayStructure):
3825         (JSC::JSGlobalObject::booleanObjectStructure):
3826         (JSC::JSGlobalObject::callbackConstructorStructure):
3827         (JSC::JSGlobalObject::callbackFunctionStructure):
3828         (JSC::JSGlobalObject::callbackObjectStructure):
3829         (JSC::JSGlobalObject::propertyNameIteratorStructure):
3830         (JSC::JSGlobalObject::objcCallbackFunctionStructure):
3831         (JSC::JSGlobalObject::objcWrapperObjectStructure):
3832         (JSC::JSGlobalObject::dateStructure):
3833         (JSC::JSGlobalObject::nullPrototypeObjectStructure):
3834         (JSC::JSGlobalObject::errorStructure):
3835         (JSC::JSGlobalObject::calleeStructure):
3836         (JSC::JSGlobalObject::functionStructure):
3837         (JSC::JSGlobalObject::boundFunctionStructure):
3838         (JSC::JSGlobalObject::boundSlotBaseFunctionStructure):
3839         (JSC::JSGlobalObject::getterSetterStructure):
3840         (JSC::JSGlobalObject::nativeStdFunctionStructure):
3841         (JSC::JSGlobalObject::namedFunctionStructure):
3842         (JSC::JSGlobalObject::functionNameOffset):
3843         (JSC::JSGlobalObject::numberObjectStructure):
3844         (JSC::JSGlobalObject::privateNameStructure):
3845         (JSC::JSGlobalObject::mapStructure):
3846         (JSC::JSGlobalObject::regExpStructure):
3847         (JSC::JSGlobalObject::generatorFunctionStructure):
3848         (JSC::JSGlobalObject::setStructure):
3849         (JSC::JSGlobalObject::stringObjectStructure):
3850         (JSC::JSGlobalObject::symbolObjectStructure):
3851         (JSC::JSGlobalObject::iteratorResultObjectStructure):
3852         (JSC::JSGlobalObject::lazyTypedArrayStructure):
3853         (JSC::JSGlobalObject::typedArrayStructure):
3854         (JSC::JSGlobalObject::typedArrayStructureConcurrently):
3855         (JSC::JSGlobalObject::isOriginalTypedArrayStructure):
3856         (JSC::JSGlobalObject::typedArrayConstructor):
3857         (JSC::JSGlobalObject::actualPointerFor):
3858         (JSC::JSGlobalObject::internalFunctionStructure): Deleted.
3859         * runtime/JSNativeStdFunction.cpp:
3860         (JSC::JSNativeStdFunction::create):
3861         * runtime/JSWithScope.cpp:
3862         (JSC::JSWithScope::create):
3863         (JSC::JSWithScope::visitChildren):
3864         (JSC::JSWithScope::createStructure):
3865         (JSC::JSWithScope::JSWithScope):
3866         * runtime/JSWithScope.h:
3867         (JSC::JSWithScope::object):
3868         (JSC::JSWithScope::create): Deleted.
3869         (JSC::JSWithScope::createStructure): Deleted.
3870         (JSC::JSWithScope::JSWithScope): Deleted.
3871         * runtime/LazyClassStructure.cpp: Added.
3872         (JSC::LazyClassStructure::Initializer::Initializer):
3873         (JSC::LazyClassStructure::Initializer::setPrototype):
3874         (JSC::LazyClassStructure::Initializer::setStructure):
3875         (JSC::LazyClassStructure::Initializer::setConstructor):
3876         (JSC::LazyClassStructure::visit):
3877         (JSC::LazyClassStructure::dump):
3878         * runtime/LazyClassStructure.h: Added.
3879         (JSC::LazyClassStructure::LazyClassStructure):