1eccd0b188e5230368eb63f15297cc81fccb7ea1
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2013-11-26  Filip Pizlo  <fpizlo@apple.com>
2
3         Restructure global variable constant inference so that it could work for any kind of symbol table variable
4         https://bugs.webkit.org/show_bug.cgi?id=124760
5
6         Reviewed by Oliver Hunt.
7         
8         This changes the way global variable constant inference works so that it can be reused
9         for closure variable constant inference. Some of the premises that originally motivated
10         this patch are somewhat wrong, but it led to some simplifications anyway and I suspect
11         that we'll be able to fix those premises in the future. The main point of this patch is
12         to make it easy to reuse global variable constant inference for closure variable
13         constant inference, and this will be possible provided we can also either (a) infer
14         one-shot closures (easy) or (b) infer closure variables that are always assigned prior
15         to first use.
16         
17         One of the things that this patch is meant to enable is constant inference for closure
18         variables that may be part of a multi-shot closure. Closure variables may be
19         instantiated multiple times, like:
20         
21             function foo() {
22                 var WIDTH = 45;
23                 function bar() {
24                     ... use WIDTH ...
25                 }
26                 ...
27             }
28         
29         Even if foo() is called many times and WIDTH is assigned to multiple times, that
30         doesn't change the fact that it's a constant. The goal of closure variable constant
31         inference is to catch any case where a closure variable has been assigned at least once
32         and its value has never changed. This patch doesn't implement that, but it does change
33         global variable constant inference to have most of the powers needed to do that. Note
34         that most likely we will use this functionality only to implement constant inference
35         for one-shot closures, but the resulting machinery is still simpler than what we had
36         before.
37         
38         This involves three changes:
39         
40             - The watchpoint object now contains the inferred value. This involves creating a
41               new kind of watchpoint set, the VariableWatchpointSet. We will reuse this object
42               for closure variables.
43         
44             - Writing to a variable that is watchpointed still involves these three states that
45               we proceed through monotonically (Uninitialized->Initialized->Invalidated) but
46               now, the Initialized->Invalidated state transition only happens if we change the
47               variable's value, rather than store to the variable. Repeatedly storing the same
48               value won't change the variable's state.
49         
50             - On 64-bit systems (the only systems on which we do concurrent JIT), you no longer
51               need fancy fencing to get a consistent view of the watchpoint in the JIT. The
52               state of the VariableWatchpointSet for the purposes of constant folding is
53               entirely encapsulated in the VariableWatchpointSet::m_inferredValue. If that is
54               JSValue() then you cannot fold (either because the set is uninitialized or
55               because it's invalidated - doesn't matter which); on the other hand if the value
56               is anything other than JSValue() then you can fold, and that's the value you fold
57               to. Simple!
58         
59         This also changes the way that DFG IR deals with variable watchpoints. It's now
60         oblivious to global variables. You install a watchpoint using VariableWatchpoint and
61         you notify write using NotifyWrite. Easy!
62         
63         Note that this will requires some more tweaks because of the fact that op_enter will
64         store Undefined into every captured variable. Hence it won't even work for one-shot
65         closures. One-shot closures are easily fixed by introducing another state (so we'll
66         have Uninitialized->Undefined->Initialized->Invalidated). Multi-shot closures will
67         require static analysis. One-shot closures are clearly a higher priority.
68
69         * GNUmakefile.list.am:
70         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
71         * JavaScriptCore.xcodeproj/project.pbxproj:
72         * bytecode/Instruction.h:
73         * bytecode/VariableWatchpointSet.h: Added.
74         (JSC::VariableWatchpointSet::VariableWatchpointSet):
75         (JSC::VariableWatchpointSet::~VariableWatchpointSet):
76         (JSC::VariableWatchpointSet::inferredValue):
77         (JSC::VariableWatchpointSet::notifyWrite):
78         (JSC::VariableWatchpointSet::invalidate):
79         (JSC::VariableWatchpointSet::finalizeUnconditionally):
80         (JSC::VariableWatchpointSet::addressOfInferredValue):
81         * bytecode/Watchpoint.h:
82         * dfg/DFGAbstractInterpreterInlines.h:
83         (JSC::DFG::::executeEffects):
84         * dfg/DFGByteCodeParser.cpp:
85         (JSC::DFG::ByteCodeParser::parseBlock):
86         * dfg/DFGCSEPhase.cpp:
87         (JSC::DFG::CSEPhase::performNodeCSE):
88         * dfg/DFGClobberize.h:
89         (JSC::DFG::clobberize):
90         * dfg/DFGFixupPhase.cpp:
91         (JSC::DFG::FixupPhase::fixupNode):
92         * dfg/DFGNode.h:
93         (JSC::DFG::Node::hasRegisterPointer):
94         (JSC::DFG::Node::hasVariableWatchpointSet):
95         (JSC::DFG::Node::variableWatchpointSet):
96         * dfg/DFGNodeType.h:
97         * dfg/DFGOperations.cpp:
98         * dfg/DFGOperations.h:
99         * dfg/DFGPredictionPropagationPhase.cpp:
100         (JSC::DFG::PredictionPropagationPhase::propagate):
101         * dfg/DFGSafeToExecute.h:
102         (JSC::DFG::safeToExecute):
103         * dfg/DFGSpeculativeJIT.cpp:
104         (JSC::DFG::SpeculativeJIT::compileArithMod):
105         * dfg/DFGSpeculativeJIT.h:
106         (JSC::DFG::SpeculativeJIT::callOperation):
107         * dfg/DFGSpeculativeJIT32_64.cpp:
108         (JSC::DFG::SpeculativeJIT::compile):
109         * dfg/DFGSpeculativeJIT64.cpp:
110         (JSC::DFG::SpeculativeJIT::compile):
111         * dfg/DFGWatchpointCollectionPhase.cpp:
112         (JSC::DFG::WatchpointCollectionPhase::handle):
113         * ftl/FTLCapabilities.cpp:
114         (JSC::FTL::canCompile):
115         * ftl/FTLLowerDFGToLLVM.cpp:
116         (JSC::FTL::LowerDFGToLLVM::compileNode):
117         (JSC::FTL::LowerDFGToLLVM::compileNotifyWrite):
118         * jit/JIT.h:
119         * jit/JITOperations.h:
120         * jit/JITPropertyAccess.cpp:
121         (JSC::JIT::emitNotifyWrite):
122         (JSC::JIT::emitPutGlobalVar):
123         * jit/JITPropertyAccess32_64.cpp:
124         (JSC::JIT::emitNotifyWrite):
125         (JSC::JIT::emitPutGlobalVar):
126         * llint/LowLevelInterpreter32_64.asm:
127         * llint/LowLevelInterpreter64.asm:
128         * runtime/JSGlobalObject.cpp:
129         (JSC::JSGlobalObject::addGlobalVar):
130         (JSC::JSGlobalObject::addFunction):
131         * runtime/JSGlobalObject.h:
132         * runtime/JSScope.h:
133         (JSC::ResolveOp::ResolveOp):
134         * runtime/JSSymbolTableObject.h:
135         (JSC::symbolTablePut):
136         (JSC::symbolTablePutWithAttributes):
137         * runtime/SymbolTable.cpp:
138         (JSC::SymbolTableEntry::inferredValue):
139         (JSC::SymbolTableEntry::prepareToWatch):
140         (JSC::SymbolTableEntry::addWatchpoint):
141         (JSC::SymbolTableEntry::notifyWriteSlow):
142         (JSC::SymbolTable::visitChildren):
143         (JSC::SymbolTable::WatchpointCleanup::WatchpointCleanup):
144         (JSC::SymbolTable::WatchpointCleanup::~WatchpointCleanup):
145         (JSC::SymbolTable::WatchpointCleanup::finalizeUnconditionally):
146         * runtime/SymbolTable.h:
147         (JSC::SymbolTableEntry::watchpointSet):
148         (JSC::SymbolTableEntry::notifyWrite):
149
150 2013-11-24  Filip Pizlo  <fpizlo@apple.com>
151
152         Create a new SymbolTable every time code is loaded so that the watchpoints don't get reused
153         https://bugs.webkit.org/show_bug.cgi?id=124824
154
155         Reviewed by Oliver Hunt.
156         
157         This helps with one shot closure inference as well as closure variable constant
158         inference, since without this, if code was reloaded from the cache then we would
159         think that the first run was actually an Nth run. This would cause us to think that
160         the watchpoint(s) should all be invalidated.
161
162         * bytecode/CodeBlock.cpp:
163         (JSC::CodeBlock::CodeBlock):
164         (JSC::CodeBlock::stronglyVisitStrongReferences):
165         * bytecode/CodeBlock.h:
166         (JSC::CodeBlock::symbolTable):
167         * runtime/Executable.cpp:
168         (JSC::FunctionExecutable::symbolTable):
169         * runtime/Executable.h:
170         * runtime/SymbolTable.cpp:
171         (JSC::SymbolTable::clone):
172         * runtime/SymbolTable.h:
173
174 2013-11-26  Oliver Hunt  <oliver@apple.com>
175
176         Crash in JSC::ASTBuilder::Expression JSC::Parser<JSC::Lexer<unsigned char> >::parseUnaryExpression<JSC::ASTBuilder>(JSC::ASTBuilder&)
177         https://bugs.webkit.org/show_bug.cgi?id=124886
178
179         Reviewed by Sam Weinig.
180
181         Make sure the error macros propagate an existing error before
182         trying to create a new error message.  We need to do this as
183         the parser state may not be safe for any specific error message
184         if we are already unwinding due to an error.
185
186         * parser/Parser.cpp:
187
188 2013-11-26  Nadav Rotem  <nrotem@apple.com>
189
190         Optimize away OR with zero - a common ASM.js pattern.
191         https://bugs.webkit.org/show_bug.cgi?id=124869
192
193         Reviewed by Filip Pizlo.
194
195         * dfg/DFGFixupPhase.cpp:
196         (JSC::DFG::FixupPhase::fixupNode):
197
198 2013-11-25  Julien Brianceau  <jbriance@cisco.com>
199
200         [arm][mips] Fix crash in dfg-arrayify-elimination layout jsc test.
201         https://bugs.webkit.org/show_bug.cgi?id=124839
202
203         Reviewed by Michael Saboff.
204
205         In ARM EABI and MIPS, 64-bit values have to be aligned on stack too.
206
207         * jit/CCallHelpers.h:
208         (JSC::CCallHelpers::setupArgumentsWithExecState):
209         * jit/JITInlines.h:
210         (JSC::JIT::callOperation): Add missing EABI_32BIT_DUMMY_ARG.
211
212 2013-11-23  Filip Pizlo  <fpizlo@apple.com>
213
214         Fix more fallout from failed attempts at div/mod DFG strength reductions
215         https://bugs.webkit.org/show_bug.cgi?id=124813
216
217         Reviewed by Geoffrey Garen.
218
219         * dfg/DFGSpeculativeJIT.cpp:
220         (JSC::DFG::SpeculativeJIT::compileArithMod):
221
222 2013-11-22  Mark Hahnenberg  <mhahnenberg@apple.com>
223
224         JSC Obj-C API should have real documentation
225         https://bugs.webkit.org/show_bug.cgi?id=124805
226
227         Reviewed by Geoffrey Garen.
228
229         Massaging the header comments into proper headerdocs.
230
231         * API/JSContext.h:
232         * API/JSExport.h:
233         * API/JSManagedValue.h:
234         * API/JSValue.h:
235         * API/JSVirtualMachine.h:
236
237 2013-11-22  Filip Pizlo  <fpizlo@apple.com>
238
239         CodeBlock::m_numCalleeRegisters shouldn't also mean frame size, frame size needed for exit, or any other unrelated things
240         https://bugs.webkit.org/show_bug.cgi?id=124793
241
242         Reviewed by Mark Hahnenberg.
243         
244         Now m_numCalleeRegisters always refers to the number of locals that the attached
245         bytecode uses. It never means anything else.
246         
247         For frame size, we now have it lazily computed from m_numCalleeRegisters for the
248         baseline engines and we have it stored in DFG::CommonData for the optimizing JITs.
249         
250         For frame-size-needed-at-exit, we store that in DFG::CommonData, too.
251         
252         The code no longer implies that there is any arithmetic relationship between
253         m_numCalleeRegisters and frameSize. Previously it implied that the latter is greater
254         than the former.
255         
256         The code no longer implies that there is any arithmetic relationship between the
257         frame Size and the frame-size-needed-at-exit. Previously it implied that the latter
258         is greater that the former.
259
260         * bytecode/CodeBlock.cpp:
261         (JSC::CodeBlock::frameRegisterCount):
262         * bytecode/CodeBlock.h:
263         * dfg/DFGCommonData.h:
264         (JSC::DFG::CommonData::CommonData):
265         (JSC::DFG::CommonData::requiredRegisterCountForExecutionAndExit):
266         * dfg/DFGGraph.cpp:
267         (JSC::DFG::Graph::frameRegisterCount):
268         (JSC::DFG::Graph::requiredRegisterCountForExit):
269         (JSC::DFG::Graph::requiredRegisterCountForExecutionAndExit):
270         * dfg/DFGGraph.h:
271         * dfg/DFGJITCompiler.cpp:
272         (JSC::DFG::JITCompiler::link):
273         (JSC::DFG::JITCompiler::compileFunction):
274         * dfg/DFGOSREntry.cpp:
275         (JSC::DFG::prepareOSREntry):
276         * dfg/DFGSpeculativeJIT.cpp:
277         (JSC::DFG::SpeculativeJIT::SpeculativeJIT):
278         * dfg/DFGVirtualRegisterAllocationPhase.cpp:
279         (JSC::DFG::VirtualRegisterAllocationPhase::run):
280         * ftl/FTLLink.cpp:
281         (JSC::FTL::link):
282         * ftl/FTLLowerDFGToLLVM.cpp:
283         (JSC::FTL::LowerDFGToLLVM::compileCallOrConstruct):
284         * ftl/FTLOSREntry.cpp:
285         (JSC::FTL::prepareOSREntry):
286         * interpreter/CallFrame.cpp:
287         (JSC::CallFrame::frameExtentInternal):
288         * interpreter/JSStackInlines.h:
289         (JSC::JSStack::pushFrame):
290         * jit/JIT.h:
291         (JSC::JIT::frameRegisterCountFor):
292         * jit/JITOperations.cpp:
293         * llint/LLIntEntrypoint.cpp:
294         (JSC::LLInt::frameRegisterCountFor):
295         * llint/LLIntEntrypoint.h:
296
297 2013-11-21  Filip Pizlo  <fpizlo@apple.com>
298
299         Combine SymbolTable and SharedSymbolTable
300         https://bugs.webkit.org/show_bug.cgi?id=124761
301
302         Reviewed by Geoffrey Garen.
303         
304         SymbolTable was never used directly; we now always used SharedSymbolTable. So, this
305         gets rid of SymbolTable and renames SharedSymbolTable to SymbolTable.
306
307         * bytecode/CodeBlock.h:
308         (JSC::CodeBlock::symbolTable):
309         * bytecode/UnlinkedCodeBlock.h:
310         (JSC::UnlinkedFunctionExecutable::symbolTable):
311         (JSC::UnlinkedCodeBlock::symbolTable):
312         (JSC::UnlinkedCodeBlock::finishCreation):
313         * bytecompiler/BytecodeGenerator.h:
314         (JSC::BytecodeGenerator::symbolTable):
315         * dfg/DFGSpeculativeJIT32_64.cpp:
316         (JSC::DFG::SpeculativeJIT::compile):
317         * dfg/DFGSpeculativeJIT64.cpp:
318         (JSC::DFG::SpeculativeJIT::compile):
319         * dfg/DFGStackLayoutPhase.cpp:
320         (JSC::DFG::StackLayoutPhase::run):
321         * jit/AssemblyHelpers.h:
322         (JSC::AssemblyHelpers::symbolTableFor):
323         * runtime/Arguments.h:
324         (JSC::Arguments::finishCreation):
325         * runtime/Executable.h:
326         (JSC::FunctionExecutable::symbolTable):
327         * runtime/JSActivation.h:
328         (JSC::JSActivation::create):
329         (JSC::JSActivation::JSActivation):
330         (JSC::JSActivation::registersOffset):
331         (JSC::JSActivation::allocationSize):
332         * runtime/JSSymbolTableObject.h:
333         (JSC::JSSymbolTableObject::symbolTable):
334         (JSC::JSSymbolTableObject::JSSymbolTableObject):
335         (JSC::JSSymbolTableObject::finishCreation):
336         * runtime/JSVariableObject.h:
337         (JSC::JSVariableObject::JSVariableObject):
338         * runtime/SymbolTable.cpp:
339         (JSC::SymbolTable::destroy):
340         (JSC::SymbolTable::SymbolTable):
341         * runtime/SymbolTable.h:
342         (JSC::SymbolTable::create):
343         (JSC::SymbolTable::createStructure):
344         * runtime/VM.cpp:
345         (JSC::VM::VM):
346         * runtime/VM.h:
347
348 2013-11-22  Mark Lam  <mark.lam@apple.com>
349
350         Remove residual references to "dynamicGlobalObject".
351         https://bugs.webkit.org/show_bug.cgi?id=124787.
352
353         Reviewed by Filip Pizlo.
354
355         * JavaScriptCore.order:
356         * interpreter/CallFrame.h:
357
358 2013-11-22  Mark Lam  <mark.lam@apple.com>
359
360         Ensure that arity fixups honor stack alignment requirements.
361         https://bugs.webkit.org/show_bug.cgi?id=124756.
362
363         Reviewed by Geoffrey Garen.
364
365         The LLINT and all the JITs rely on CommonSlowPaths::arityCheckFor() to
366         compute the arg count adjustment for the arity fixup. We take advantage
367         of this choke point and introduce the stack alignment padding there in
368         the guise of additional args.
369
370         The only cost of this approach is that the padding will also be
371         initialized to undefined values as if they were args. Since arity fixups
372         are considered a slow path that is rarely taken, this cost is not a
373         concern.
374
375         * runtime/CommonSlowPaths.h:
376         (JSC::CommonSlowPaths::arityCheckFor):
377         * runtime/VM.h:
378         (JSC::VM::isSafeToRecurse):
379
380 2013-11-21  Filip Pizlo  <fpizlo@apple.com>
381
382         BytecodeGenerator should align the stack according to native conventions
383         https://bugs.webkit.org/show_bug.cgi?id=124735
384
385         Reviewed by Mark Lam.
386         
387         Rolling this back in because it actually fixed fast/dom/gc-attribute-node.html, but
388         our infrastructure misleads peole into thinking that fixing a test constitutes
389         breaking it.
390
391         * bytecompiler/BytecodeGenerator.h:
392         (JSC::CallArguments::registerOffset):
393         (JSC::CallArguments::argumentCountIncludingThis):
394         * bytecompiler/NodesCodegen.cpp:
395         (JSC::CallArguments::CallArguments):
396
397 2013-11-21  Filip Pizlo  <fpizlo@apple.com>
398
399         Get rid of CodeBlock::dumpStatistics()
400         https://bugs.webkit.org/show_bug.cgi?id=124762
401
402         Reviewed by Mark Hahnenberg.
403
404         * bytecode/CodeBlock.cpp:
405         (JSC::CodeBlock::CodeBlock):
406         (JSC::CodeBlock::~CodeBlock):
407         * bytecode/CodeBlock.h:
408
409 2013-11-22  Commit Queue  <commit-queue@webkit.org>
410
411         Unreviewed, rolling out r159652.
412         http://trac.webkit.org/changeset/159652
413         https://bugs.webkit.org/show_bug.cgi?id=124778
414
415         broke fast/dom/gc-attribute-node.html (Requested by ap on
416         #webkit).
417
418         * bytecompiler/BytecodeGenerator.cpp:
419         (JSC::BytecodeGenerator::emitCall):
420         (JSC::BytecodeGenerator::emitConstruct):
421         * bytecompiler/BytecodeGenerator.h:
422         (JSC::CallArguments::registerOffset):
423         (JSC::CallArguments::argumentCountIncludingThis):
424         * bytecompiler/NodesCodegen.cpp:
425         (JSC::CallArguments::CallArguments):
426         (JSC::CallArguments::newArgument):
427
428 2013-11-21  Filip Pizlo  <fpizlo@apple.com>
429
430         Fix a typo (requriements->requirements).
431
432         * runtime/StackAlignment.h:
433
434 2013-11-21  Mark Lam  <mark.lam@apple.com>
435
436         CodeBlock::m_numCalleeRegisters need to honor native stack alignment.
437         https://bugs.webkit.org/show_bug.cgi?id=124754.
438
439         Reviewed by Filip Pizlo.
440
441         * bytecompiler/BytecodeGenerator.cpp:
442         (JSC::BytecodeGenerator::newRegister):
443         * dfg/DFGVirtualRegisterAllocationPhase.cpp:
444         (JSC::DFG::VirtualRegisterAllocationPhase::run):
445
446 2013-11-21  Mark Rowe  <mrowe@apple.com>
447
448         <https://webkit.org/b/124702> Stop overriding VALID_ARCHS.
449
450         All modern versions of Xcode set it appropriately for our needs.
451
452         Reviewed by Alexey Proskuryakov.
453
454         * Configurations/Base.xcconfig:
455
456 2013-11-21  Mark Rowe  <mrowe@apple.com>
457
458         <https://webkit.org/b/124701> Fix an error in a few Xcode configuration setting files.
459
460         Reviewed by Alexey Proskuryakov.
461
462         * Configurations/Base.xcconfig:
463
464 2013-11-21  Michael Saboff  <msaboff@apple.com>
465
466         ARM64: Implement push/pop equivalents in LLInt
467         https://bugs.webkit.org/show_bug.cgi?id=124721
468
469         Reviewed by Filip Pizlo.
470
471         Added pushLRAndFP and popLRAndFP that push and pop the link register and frame pointer register.
472         These ops emit code just like what the compiler emits in the prologue and epilogue.  Also changed
473         pushCalleeSaves and popCalleeSaves to use the same store pair and load pair instructions to do
474         the actually pushing and popping.  Finally changed the implementation of push and pop to raise
475         an exception since we don't have (or need) a single register push or pop.
476
477         * llint/LowLevelInterpreter64.asm:
478         * offlineasm/arm64.rb:
479         * offlineasm/instructions.rb:
480
481 2013-11-21  Michael Saboff  <msaboff@apple.com>
482
483         JSC: Removed unused opcodes from offline assembler
484         https://bugs.webkit.org/show_bug.cgi?id=124749
485
486         Reviewed by Mark Hahnenberg.
487
488         Removed the unused, X86 only peekq and pokeq.
489
490         * offlineasm/instructions.rb:
491         * offlineasm/x86.rb:
492
493 2013-11-21  Michael Saboff  <msaboff@apple.com>
494
495         REGRESSION(159395) Fix branch8(…, AbsoluteAddress, …) in ARM64 MacroAssembler
496         https://bugs.webkit.org/show_bug.cgi?id=124688
497
498         Reviewed by Geoffrey Garen.
499
500         Changed handling of the address for the load8() in the branch8(AbsoluteAddress) to be like
501         the rest of the branchXX(AbsoluteAddress) fucntions.
502
503         * assembler/MacroAssemblerARM64.h:
504         (JSC::MacroAssemblerARM64::branch8):
505
506 2013-11-21  Filip Pizlo  <fpizlo@apple.com>
507
508         BytecodeGenerator should align the stack according to native conventions
509         https://bugs.webkit.org/show_bug.cgi?id=124735
510
511         Reviewed by Mark Lam.
512
513         * bytecompiler/BytecodeGenerator.h:
514         (JSC::CallArguments::registerOffset):
515         (JSC::CallArguments::argumentCountIncludingThis):
516         * bytecompiler/NodesCodegen.cpp:
517         (JSC::CallArguments::CallArguments):
518
519 2013-11-21  Filip Pizlo  <fpizlo@apple.com>
520
521         Unreviewed, preemptive build fix.
522
523         * runtime/StackAlignment.h:
524         (JSC::stackAlignmentBytes):
525         (JSC::stackAlignmentRegisters):
526
527 2013-11-21  Filip Pizlo  <fpizlo@apple.com>
528
529         JSC should know what the stack alignment conventions are
530         https://bugs.webkit.org/show_bug.cgi?id=124736
531
532         Reviewed by Mark Lam.
533
534         * GNUmakefile.list.am:
535         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
536         * JavaScriptCore.xcodeproj/project.pbxproj:
537         * runtime/StackAlignment.h: Added.
538         (JSC::stackAlignmentBytes):
539         (JSC::stackAlignmentRegisters):
540
541 2013-11-21  Balazs Kilvady  <kilvadyb@homejinni.com>
542
543         [MIPS] Build fails since r159545.
544         https://bugs.webkit.org/show_bug.cgi?id=124716
545
546         Reviewed by Michael Saboff.
547
548         Add missing implementations in MacroAssembler and LLInt for MIPS.
549
550         * assembler/MIPSAssembler.h:
551         (JSC::MIPSAssembler::sync):
552         * assembler/MacroAssemblerMIPS.h:
553         (JSC::MacroAssemblerMIPS::store8):
554         (JSC::MacroAssemblerMIPS::memoryFence):
555         * offlineasm/mips.rb:
556
557 2013-11-21  Julien Brianceau  <jbriance@cisco.com>
558
559         Fix sh4 build after r159545.
560         https://bugs.webkit.org/show_bug.cgi?id=124713
561
562         Reviewed by Michael Saboff.
563
564         Add missing implementations in macro assembler and LLINT for sh4.
565
566         * assembler/MacroAssemblerSH4.h:
567         (JSC::MacroAssemblerSH4::load8):
568         (JSC::MacroAssemblerSH4::store8):
569         (JSC::MacroAssemblerSH4::memoryFence):
570         * assembler/SH4Assembler.h:
571         (JSC::SH4Assembler::synco):
572         * offlineasm/sh4.rb: Handle "memfence" opcode.
573
574 2013-11-20  Mark Lam  <mark.lam@apple.com>
575
576         Introducing VMEntryScope to update the VM stack limit.
577         https://bugs.webkit.org/show_bug.cgi?id=124634.
578
579         Reviewed by Geoffrey Garen.
580
581         1. Introduced USE(SEPARATE_C_AND_JS_STACK) (defined in Platform.h).
582            Currently, it is hardcoded to use separate C and JS stacks. Once we
583            switch to using the C stack for JS frames, we'll need to fix this to
584            only be enabled when ENABLE(LLINT_C_LOOP).
585
586         2. Stack limits are now tracked in the VM.
587
588            Logically, there are 2 stack limits:
589            a. m_stackLimit for the native C stack, and
590            b. m_jsStackLimit for the JS stack.
591
592            If USE(SEPARATE_C_AND_JS_STACK), then the 2 limits are the same
593            value, and are implemented as 2 fields in a union.
594
595         3. The VM native stackLimit is set as follows:
596            a. Initially, the VM sets it to the limit of the stack of the thread that
597               instantiated the VM. This allows the parser and bytecode generator to
598               run before we enter the VM to execute JS code.
599
600            b. Upon entry into the VM to execute JS code (via one of the
601               Interpreter::execute...() functions), we instantiate a VMEntryScope
602               that sets the VM's stackLimit to the limit of the current thread's
603               stack. The VMEntryScope will automatically restore the previous
604               entryScope and stack limit upon destruction.
605
606            If USE(SEPARATE_C_AND_JS_STACK), the JSStack's methods will set the VM's
607            jsStackLimit whenever it grows or shrinks.
608
609         4. The VM now provides a isSafeToRecurse() function that compares the
610            current stack pointer against its native stackLimit. This subsumes and
611            obsoletes the VMStackBounds class.
612
613         5. The VMEntryScope class also subsumes DynamicGlobalObjectScope for
614            tracking the JSGlobalObject that we last entered the VM with.
615
616         6. Renamed dynamicGlobalObject() to vmEntryGlobalObject() since that is
617            the value that the function retrieves.
618
619         7. Changed JIT and LLINT code to do stack checks against the jsStackLimit
620            in the VM class instead of the JSStack.
621
622         * API/JSBase.cpp:
623         (JSEvaluateScript):
624         (JSCheckScriptSyntax):
625         * API/JSContextRef.cpp:
626         (JSGlobalContextRetain):
627         (JSGlobalContextRelease):
628         * CMakeLists.txt:
629         * GNUmakefile.list.am:
630         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
631         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
632         * JavaScriptCore.xcodeproj/project.pbxproj:
633         * bytecompiler/BytecodeGenerator.cpp:
634         (JSC::BytecodeGenerator::BytecodeGenerator):
635         * bytecompiler/BytecodeGenerator.h:
636         (JSC::BytecodeGenerator::emitNode):
637         (JSC::BytecodeGenerator::emitNodeInConditionContext):
638         * debugger/Debugger.cpp:
639         (JSC::Debugger::detach):
640         (JSC::Debugger::recompileAllJSFunctions):
641         (JSC::Debugger::pauseIfNeeded):
642         * debugger/DebuggerCallFrame.cpp:
643         (JSC::DebuggerCallFrame::vmEntryGlobalObject):
644         * debugger/DebuggerCallFrame.h:
645         * dfg/DFGJITCompiler.cpp:
646         (JSC::DFG::JITCompiler::compileFunction):
647         * dfg/DFGOSREntry.cpp:
648         * ftl/FTLLink.cpp:
649         (JSC::FTL::link):
650         * ftl/FTLOSREntry.cpp:
651         * heap/Heap.cpp:
652         (JSC::Heap::lastChanceToFinalize):
653         (JSC::Heap::deleteAllCompiledCode):
654         * interpreter/CachedCall.h:
655         (JSC::CachedCall::CachedCall):
656         * interpreter/CallFrame.cpp:
657         (JSC::CallFrame::vmEntryGlobalObject):
658         * interpreter/CallFrame.h:
659         * interpreter/Interpreter.cpp:
660         (JSC::unwindCallFrame):
661         (JSC::Interpreter::unwind):
662         (JSC::Interpreter::execute):
663         (JSC::Interpreter::executeCall):
664         (JSC::Interpreter::executeConstruct):
665         (JSC::Interpreter::prepareForRepeatCall):
666         (JSC::Interpreter::debug):
667         * interpreter/JSStack.cpp:
668         (JSC::JSStack::JSStack):
669         (JSC::JSStack::growSlowCase):
670         * interpreter/JSStack.h:
671         * interpreter/JSStackInlines.h:
672         (JSC::JSStack::shrink):
673         (JSC::JSStack::grow):
674         - Moved these inlined functions here from JSStack.h. It reduces some
675           #include dependencies of JSSTack.h which had previously resulted
676           in some EWS bots' unhappiness with this patch.
677         (JSC::JSStack::updateStackLimit):
678         * jit/JIT.cpp:
679         (JSC::JIT::privateCompile):
680         * jit/JITCall.cpp:
681         (JSC::JIT::compileLoadVarargs):
682         * jit/JITCall32_64.cpp:
683         (JSC::JIT::compileLoadVarargs):
684         * jit/JITOperations.cpp:
685         * llint/LLIntSlowPaths.cpp:
686         * llint/LowLevelInterpreter.asm:
687         * parser/Parser.cpp:
688         (JSC::::Parser):
689         * parser/Parser.h:
690         (JSC::Parser::canRecurse):
691         * runtime/CommonSlowPaths.h:
692         * runtime/Completion.cpp:
693         (JSC::evaluate):
694         * runtime/FunctionConstructor.cpp:
695         (JSC::constructFunctionSkippingEvalEnabledCheck):
696         * runtime/JSGlobalObject.cpp:
697         * runtime/JSGlobalObject.h:
698         * runtime/StringRecursionChecker.h:
699         (JSC::StringRecursionChecker::performCheck):
700         * runtime/VM.cpp:
701         (JSC::VM::VM):
702         (JSC::VM::releaseExecutableMemory):
703         (JSC::VM::throwException):
704         * runtime/VM.h:
705         (JSC::VM::addressOfJSStackLimit):
706         (JSC::VM::jsStackLimit):
707         (JSC::VM::setJSStackLimit):
708         (JSC::VM::stackLimit):
709         (JSC::VM::setStackLimit):
710         (JSC::VM::isSafeToRecurse):
711         * runtime/VMEntryScope.cpp: Added.
712         (JSC::VMEntryScope::VMEntryScope):
713         (JSC::VMEntryScope::~VMEntryScope):
714         (JSC::VMEntryScope::requiredCapacity):
715         * runtime/VMEntryScope.h: Added.
716         (JSC::VMEntryScope::globalObject):
717         * runtime/VMStackBounds.h: Removed.
718
719 2013-11-20  Michael Saboff  <msaboff@apple.com>
720
721         [Win] JavaScript JIT crash (with DFG enabled).
722         https://bugs.webkit.org/show_bug.cgi?id=124675
723
724         Reviewed by Geoffrey Garen.
725
726         Similar to the change in r159427, changed linkClosureCall to use regT0/regT1 (payload/tag) for the callee.
727         linkForThunkGenerator already expected the callee in regT0/regT1, but changed the comment to reflect that.
728
729         * jit/Repatch.cpp:
730         (JSC::linkClosureCall):
731         * jit/ThunkGenerators.cpp:
732         (JSC::linkForThunkGenerator):
733
734 2013-11-20  Michael Saboff  <msaboff@apple.com>
735
736         ARMv7: Crash due to use after free of AssemblerBuffer
737         https://bugs.webkit.org/show_bug.cgi?id=124611
738
739         Reviewed by Geoffrey Garen.
740
741         Changed JITFinalizer constructor to take a MacroAssemblerCodePtr instead of a Label.
742         In finalizeFunction(), we use that value instead of calculating it from the label.
743
744         * assembler/MacroAssembler.cpp:
745         * dfg/DFGJITFinalizer.cpp:
746         (JSC::DFG::JITFinalizer::JITFinalizer):
747         (JSC::DFG::JITFinalizer::finalizeFunction):
748         * dfg/DFGJITFinalizer.h:
749
750 2013-11-20  Julien Brianceau  <jbriance@cisco.com>
751
752         Fix CPU(ARM_TRADITIONAL) build after r159545.
753         https://bugs.webkit.org/show_bug.cgi?id=124649
754
755         Reviewed by Michael Saboff.
756
757         Add missing memoryFence, load8 and store8 implementations in macro assembler.
758
759         * assembler/ARMAssembler.h:
760         (JSC::ARMAssembler::dmbSY):
761         * assembler/MacroAssemblerARM.h:
762         (JSC::MacroAssemblerARM::load8):
763         (JSC::MacroAssemblerARM::store8):
764         (JSC::MacroAssemblerARM::memoryFence):
765
766 2013-11-20  Julien Brianceau  <jbriance@cisco.com>
767
768         [armv7][arm64] Speculative build fix after r159545.
769         https://bugs.webkit.org/show_bug.cgi?id=124646
770
771         Reviewed by Filip Pizlo.
772
773         * assembler/ARMv7Assembler.h:
774         * assembler/MacroAssemblerARM64.h:
775         (JSC::MacroAssemblerARM64::memoryFence):
776         * assembler/MacroAssemblerARMv7.h:
777         (JSC::MacroAssemblerARMv7::memoryFence):
778
779 2013-11-19  Ryosuke Niwa  <rniwa@webkit.org>
780
781         Enable HTMLTemplateElement on Mac port
782         https://bugs.webkit.org/show_bug.cgi?id=124637
783
784         Reviewed by Tim Horton.
785
786         * Configurations/FeatureDefines.xcconfig:
787
788 2013-11-19  Filip Pizlo  <fpizlo@apple.com>
789
790         Unreviewed, remove completely bogus assertion.
791
792         * runtime/JSGlobalObject.cpp:
793         (JSC::JSGlobalObject::addFunction):
794
795 2013-11-19  Filip Pizlo  <fpizlo@apple.com>
796
797         Unreviewed, debug build fix.
798
799         * runtime/JSGlobalObject.cpp:
800         (JSC::JSGlobalObject::addFunction):
801
802 2013-11-19  Filip Pizlo  <fpizlo@apple.com>
803
804         Infer constant global variables
805         https://bugs.webkit.org/show_bug.cgi?id=124464
806
807         Reviewed by Sam Weinig.
808         
809         All global variables that are candidates for watchpoint-based constant inference (i.e.
810         not 'const' variables) will now have WatchpointSet's associated with them and those
811         are used to drive the inference by tracking three states of each variable:
812         
813         Uninitialized: the variable's value is Undefined and the WatchpointSet state is
814             ClearWatchpoint.
815         
816         Initialized: the variable's value was set to something (could even be explicitly set
817             to Undefined) and the WatchpointSet state is IsWatching.
818         
819         Invalidated: the variable's value was set to something else (could even be the same
820             thing as before but the point is that a put operation did execute again) and the
821             WatchpointSet is IsInvalidated.
822         
823         If the compiler tries to compile a GetGlobalVar and the WatchpointSet state is
824         IsWatching, then the current value of the variable can be folded in place of the get,
825         and a watchpoint on the variable can be registered.
826         
827         We handle race conditions between the mutator and compiler by mandating that:
828         
829         - The mutator changes the WatchpointSet state after executing the put.
830         
831         - There is no opportunity to install code or call functions between when the mutator
832           executes a put and changes the WatchpointSet state.
833         
834         - The compiler checks the WatchpointSet state prior to reading the value.
835         
836         The concrete algorithm used by the mutator is:
837         
838             1. Store the new value into the variable.
839             --- Execute a store-store fence.
840             2. Bump the state (ClearWatchpoing becomes IsWatching, IsWatching becomes
841                IsInvalidated); the IsWatching->IsInvalidated transition may end up firing
842                watchpoints.
843         
844         The concrete algorithm that the compiler uses is:
845         
846             1. Load the state. If it's *not* IsWatching, then give up on constant inference.
847             --- Execute a load-load fence.
848             2. Load the value of the variable and use that for folding, while also registering
849                a DesiredWatchpoint. The various parts of this step can be done in any order.
850         
851         The desired watchpoint registration will fail if the watchpoint set is already
852         invalidated. Now consider the following interesting interleavings:
853         
854         Uninitialized->M1->M2->C1->C2: Compiler sees IsWatching because of the mutator's store
855             operation, and the variable is folded. The fencing ensures that C2 sees the value
856             stored in M1 - i.e. we fold on the value that will actually be watchpointed. If
857             before the compilation is installed the mutator executes another store then we
858             will be sure that it will be a complete sequence of M1+M2 since compilations get
859             installed at safepoints and never "in the middle" of a put_to_scope. Hence that
860             compilation installation will be invalidated. If the M1+M2 sequence happens after
861             the code is installed, then the code will be invalidated by triggering a jettison.
862         
863         Uninitialized->M1->C1->C2->M2: Compiler sees Uninitialized and will not fold. This is
864             a sensible outcome since if the compiler read the variable's value, it would have
865             seen Undefined.
866         
867         Uninitialized->C1->C2->M1->M2: Compiler sees Uninitialized and will not fold.
868         Uninitialized->C1->M1->C2->M2: Compiler sees Uninitialized and will not fold.
869         Uninitialized->C1->M1->M2->C2: Compiler sees Uninitialized and will not fold.
870         Uninitialized->M1->C1->M2->C2: Compiler sees Uninitialized and will not fold.
871         
872         IsWatched->M1->M2->C1->C2: Compiler sees IsInvalidated and will not fold.
873         
874         IsWatched->M1->C1->C2->M2: Compiler will fold, but will also register a desired
875             watchpoint, and that watchpoint will get invalidated before the code is installed.
876         
877         IsWatched->M1->C1->M2->C2: As above, will fold but the code will get invalidated.
878         IsWatched->C1->C2->M1->M2: As above, will fold but the code will get invalidated.
879         IsWatched->C1->M1->C2->M2: As above, will fold but the code will get invalidated.
880         IsWatched->C1->M1->M2->C2: As above, will fold but the code will get invalidated.
881         
882         Note that this kind of reasoning shows why having the mutator first bump the state and
883         then store the new value would be wrong. If we had done that (M1 = bump state, M2 =
884         execute put) then we could have the following deadly interleavings:
885         
886         Uninitialized->M1->C1->C2->M2:
887         Uninitialized->M1->C1->M2->C2: Mutator bumps the state to IsWatched and then the
888             compiler folds Undefined, since M2 hasn't executed yet. Although C2 will set the
889             watchpoint, M1 didn't notify it - it mearly initiated watching. M2 then stores a
890             value other than Undefined, and you're toast.
891         
892         You could fix this sort of thing by making the Desired Watchpoints machinery more
893         sophisticated, for example having it track the value that was folded; if the global
894         variable's value was later found to be different then we could invalidate the
895         compilation. You could also fix it by having the compiler also check that the value of
896         the variable is not Undefined before folding. While those all sound great, I decided
897         to instead just use the right interleaving since that results in less code and feels
898         more intuitive.
899         
900         This is a 0.5% speed-up on SunSpider, mostly due to a 20% speed-up on math-cordic.
901         It's a 0.6% slow-down on LongSpider, mostly due to a 25% slow-down on 3d-cube. This is
902         because 3d-cube takes global variable assignment slow paths very often. Note that this
903         3d-cube slow-down doesn't manifest as much in SunSpider (only 6% there). This patch is
904         also a 1.5% speed-up on V8v7 and a 2.8% speed-up on Octane v1, mostly due to deltablue
905         (3.7%), richards (4%), and mandreel (26%). This is a 2% speed-up on Kraken, mostly due
906         to a 17.5% speed-up on imaging-gaussian-blur. Something that really illustrates the
907         slam-dunk-itude of this patch is the wide range of speed-ups on JSRegress. Casual JS
908         programming often leads to global-var-based idioms and those variables tend to be
909         assigned once, leading to excellent constant folding opportunities in an optimizing
910         JIT. This is very evident in the speed-ups on JSRegress.
911
912         * assembler/ARM64Assembler.h:
913         (JSC::ARM64Assembler::dmbSY):
914         * assembler/ARMv7Assembler.h:
915         (JSC::ARMv7Assembler::dmbSY):
916         * assembler/MacroAssemblerARM64.h:
917         (JSC::MacroAssemblerARM64::memfence):
918         * assembler/MacroAssemblerARMv7.h:
919         (JSC::MacroAssemblerARMv7::load8):
920         (JSC::MacroAssemblerARMv7::memfence):
921         * assembler/MacroAssemblerX86.h:
922         (JSC::MacroAssemblerX86::load8):
923         (JSC::MacroAssemblerX86::store8):
924         * assembler/MacroAssemblerX86Common.h:
925         (JSC::MacroAssemblerX86Common::getUnusedRegister):
926         (JSC::MacroAssemblerX86Common::store8):
927         (JSC::MacroAssemblerX86Common::memoryFence):
928         * assembler/MacroAssemblerX86_64.h:
929         (JSC::MacroAssemblerX86_64::load8):
930         (JSC::MacroAssemblerX86_64::store8):
931         * assembler/X86Assembler.h:
932         (JSC::X86Assembler::movb_rm):
933         (JSC::X86Assembler::movzbl_mr):
934         (JSC::X86Assembler::mfence):
935         (JSC::X86Assembler::X86InstructionFormatter::threeByteOp):
936         (JSC::X86Assembler::X86InstructionFormatter::oneByteOp8):
937         * bytecode/CodeBlock.cpp:
938         (JSC::CodeBlock::CodeBlock):
939         * bytecode/Watchpoint.cpp:
940         (JSC::WatchpointSet::WatchpointSet):
941         (JSC::WatchpointSet::add):
942         (JSC::WatchpointSet::notifyWriteSlow):
943         * bytecode/Watchpoint.h:
944         (JSC::WatchpointSet::state):
945         (JSC::WatchpointSet::isStillValid):
946         (JSC::WatchpointSet::addressOfSetIsNotEmpty):
947         * dfg/DFGAbstractInterpreterInlines.h:
948         (JSC::DFG::::executeEffects):
949         * dfg/DFGByteCodeParser.cpp:
950         (JSC::DFG::ByteCodeParser::getJSConstantForValue):
951         (JSC::DFG::ByteCodeParser::getJSConstant):
952         (JSC::DFG::ByteCodeParser::parseBlock):
953         * dfg/DFGClobberize.h:
954         (JSC::DFG::clobberize):
955         * dfg/DFGFixupPhase.cpp:
956         (JSC::DFG::FixupPhase::fixupNode):
957         * dfg/DFGNode.h:
958         (JSC::DFG::Node::isStronglyProvedConstantIn):
959         (JSC::DFG::Node::hasIdentifierNumberForCheck):
960         (JSC::DFG::Node::hasRegisterPointer):
961         * dfg/DFGNodeFlags.h:
962         * dfg/DFGNodeType.h:
963         * dfg/DFGOperations.cpp:
964         * dfg/DFGOperations.h:
965         * dfg/DFGPredictionPropagationPhase.cpp:
966         (JSC::DFG::PredictionPropagationPhase::propagate):
967         * dfg/DFGSafeToExecute.h:
968         (JSC::DFG::safeToExecute):
969         * dfg/DFGSpeculativeJIT.cpp:
970         (JSC::DFG::SpeculativeJIT::compileNotifyPutGlobalVar):
971         * dfg/DFGSpeculativeJIT.h:
972         (JSC::DFG::SpeculativeJIT::callOperation):
973         * dfg/DFGSpeculativeJIT32_64.cpp:
974         (JSC::DFG::SpeculativeJIT::compile):
975         * dfg/DFGSpeculativeJIT64.cpp:
976         (JSC::DFG::SpeculativeJIT::compile):
977         * ftl/FTLAbbreviatedTypes.h:
978         * ftl/FTLAbbreviations.h:
979         (JSC::FTL::buildFence):
980         * ftl/FTLCapabilities.cpp:
981         (JSC::FTL::canCompile):
982         * ftl/FTLIntrinsicRepository.h:
983         * ftl/FTLLowerDFGToLLVM.cpp:
984         (JSC::FTL::LowerDFGToLLVM::compileNode):
985         (JSC::FTL::LowerDFGToLLVM::compileNotifyPutGlobalVar):
986         * ftl/FTLOutput.h:
987         (JSC::FTL::Output::fence):
988         * jit/JIT.h:
989         * jit/JITOperations.h:
990         * jit/JITPropertyAccess.cpp:
991         (JSC::JIT::emitPutGlobalVar):
992         (JSC::JIT::emit_op_put_to_scope):
993         (JSC::JIT::emitSlow_op_put_to_scope):
994         * jit/JITPropertyAccess32_64.cpp:
995         (JSC::JIT::emitPutGlobalVar):
996         (JSC::JIT::emit_op_put_to_scope):
997         (JSC::JIT::emitSlow_op_put_to_scope):
998         * llint/LowLevelInterpreter32_64.asm:
999         * llint/LowLevelInterpreter64.asm:
1000         * llvm/LLVMAPIFunctions.h:
1001         * offlineasm/arm.rb:
1002         * offlineasm/arm64.rb:
1003         * offlineasm/cloop.rb:
1004         * offlineasm/instructions.rb:
1005         * offlineasm/x86.rb:
1006         * runtime/JSGlobalObject.cpp:
1007         (JSC::JSGlobalObject::addGlobalVar):
1008         (JSC::JSGlobalObject::addFunction):
1009         * runtime/JSGlobalObject.h:
1010         (JSC::JSGlobalObject::addVar):
1011         (JSC::JSGlobalObject::addConst):
1012         * runtime/JSScope.cpp:
1013         (JSC::abstractAccess):
1014         * runtime/JSSymbolTableObject.h:
1015         (JSC::symbolTablePut):
1016         (JSC::symbolTablePutWithAttributes):
1017         * runtime/SymbolTable.cpp:
1018         (JSC::SymbolTableEntry::couldBeWatched):
1019         (JSC::SymbolTableEntry::prepareToWatch):
1020         (JSC::SymbolTableEntry::notifyWriteSlow):
1021         * runtime/SymbolTable.h:
1022
1023 2013-11-19  Michael Saboff  <msaboff@apple.com>
1024
1025         REGRESSION(158384) ARMv7 point checks too restrictive for native calls to traditional ARM code
1026         https://bugs.webkit.org/show_bug.cgi?id=124612
1027
1028         Reviewed by Geoffrey Garen.
1029
1030         Removed ASSERT checks (i.e. lower bit set) for ARM Thumb2 destination addresses related to
1031         calls since we are calling native ARM traditional functions like sin() and cos().
1032
1033         * assembler/ARMv7Assembler.h:
1034         (JSC::ARMv7Assembler::linkCall):
1035         (JSC::ARMv7Assembler::relinkCall):
1036         * assembler/MacroAssemblerCodeRef.h:
1037
1038 2013-11-19  Commit Queue  <commit-queue@webkit.org>
1039
1040         Unreviewed, rolling out r159459.
1041         http://trac.webkit.org/changeset/159459
1042         https://bugs.webkit.org/show_bug.cgi?id=124616
1043
1044         tons of assertions on launch (Requested by thorton on
1045         #webkit).
1046
1047         * API/JSContext.mm:
1048         (-[JSContext setException:]):
1049         (-[JSContext wrapperForObjCObject:]):
1050         (-[JSContext wrapperForJSObject:]):
1051         * API/JSContextRef.cpp:
1052         (JSContextGroupRelease):
1053         (JSGlobalContextRelease):
1054         * API/JSManagedValue.mm:
1055         (-[JSManagedValue initWithValue:]):
1056         (-[JSManagedValue value]):
1057         * API/JSObjectRef.cpp:
1058         (JSObjectIsFunction):
1059         (JSObjectCopyPropertyNames):
1060         * API/JSValue.mm:
1061         (containerValueToObject):
1062         * API/JSWrapperMap.mm:
1063         (tryUnwrapObjcObject):
1064
1065 2013-11-19  Filip Pizlo  <fpizlo@apple.com>
1066
1067         Rename WatchpointSet::notifyWrite() should be renamed to WatchpointSet::fireAll()
1068         https://bugs.webkit.org/show_bug.cgi?id=124609
1069
1070         Rubber stamped by Mark Lam.
1071         
1072         notifyWrite() is a thing that SymbolTable does. WatchpointSet uses that terminology
1073         because it was original designed to match exactly SymbolTable's semantics. But now
1074         it's a confusing term.
1075
1076         * bytecode/Watchpoint.cpp:
1077         (JSC::WatchpointSet::fireAllSlow):
1078         * bytecode/Watchpoint.h:
1079         (JSC::WatchpointSet::fireAll):
1080         (JSC::InlineWatchpointSet::fireAll):
1081         * interpreter/Interpreter.cpp:
1082         (JSC::Interpreter::execute):
1083         * runtime/JSFunction.cpp:
1084         (JSC::JSFunction::put):
1085         (JSC::JSFunction::defineOwnProperty):
1086         * runtime/JSGlobalObject.cpp:
1087         (JSC::JSGlobalObject::haveABadTime):
1088         * runtime/Structure.h:
1089         (JSC::Structure::notifyTransitionFromThisStructure):
1090         * runtime/SymbolTable.cpp:
1091         (JSC::SymbolTableEntry::notifyWriteSlow):
1092
1093 2013-11-18  Michael Saboff  <msaboff@apple.com>
1094
1095         REGRESSION (r159395): Error compiling for ARMv7
1096         https://bugs.webkit.org/show_bug.cgi?id=124552
1097
1098         Reviewed by Geoffrey Garen.
1099
1100         Fixed the implementation of branch8(RelationalCondition cond, AbsoluteAddress address, TrustedImm32 right)
1101         to materialize and use address similar to other ARMv7 branchXX() functions.
1102
1103         * assembler/MacroAssemblerARMv7.h:
1104         (JSC::MacroAssemblerARMv7::branch8):
1105
1106 2013-11-19  Mark Lam  <mark.lam@apple.com>
1107
1108         Add tracking of endColumn for Executables.
1109         https://bugs.webkit.org/show_bug.cgi?id=124245.
1110
1111         Reviewed by Geoffrey Garen.
1112
1113         1. Fixed computation of columns to take into account the startColumn from
1114            <script> tags. Previously, we were only computing the column relative
1115            to the char after the <script> tag. Now, the column number that JSC
1116            computes is always the column number you'll see when viewing the source
1117            in a text editor (assuming the first column position is 1, not 0).
1118
1119         2. Previously, unlinkedExecutables kept the a base-1 startColumn for
1120            ProgramExecutables and EvalExecutables, but uses base-0 columns for
1121            FunctionExecutables. This has been fixed so that they all use base-0
1122            columns. When the executable gets linked, the column is adjusted into
1123            a base-1 value.
1124
1125         3. In the UnlinkedFunctionExecutable, renamed m_functionStartOffset to
1126            m_unlinkedFunctionNameStart because it actually points to the start
1127            column in the name part of the function declaration.
1128
1129            Similarly, renamed m_functionStartColumn to m_unlinkedBodyStartColumn
1130            because it points to the first character in the function body. This is
1131            usually '{' except for functions created from "global code" which
1132            excludes its braces. See FunctionExecutable::fromGlobalCode().
1133
1134                The exclusion of braces for the global code case is needed so that
1135            computed start and end columns will more readily map to what a JS
1136            developer would expect them to be. Otherwise, the first column of the
1137            function source will not be 1 (includes prepended characters added in
1138            constructFunctionSkippingEvalEnabledCheck()).
1139
1140            Also, similarly, a m_unlinkedBodyEndColumn has been added to track the
1141            end column of the UnlinkedFunctionExecutable.
1142
1143         4. For unlinked executables, end column values are either:
1144            a. Relative to the start of the last line if (last line != first line).
1145            b. Relative to the start column position if (last line == first line).
1146
1147            The second case is needed so that we can add an appropriate adjustment
1148            to the end column value (just like we do for the start column) when we
1149            link the executable.
1150
1151         5. This is not new to this patch, but it worth noting that the lineCount
1152            values used through this patch has the following meaning:
1153            - a lineCount of 0 means the source for this code block is on 1 line.
1154            - a lineCount of N means there are N + l lines of source.
1155
1156            This interpretation is janky, but was present before this patch. We can
1157            clean that up later in another patch.
1158
1159
1160         * JavaScriptCore.xcodeproj/project.pbxproj:
1161         - In order to implement WebCore::Internals::parserMetaData(), we need to
1162           move some seemingly unrelated header files from the Project section to
1163           the Private section so that they can be #include'd by the forwarding
1164           CodeBlock.h from WebCore.
1165         * bytecode/CodeBlock.cpp:
1166         (JSC::CodeBlock::sourceCodeForTools):
1167         (JSC::CodeBlock::CodeBlock):
1168         * bytecode/UnlinkedCodeBlock.cpp:
1169         (JSC::generateFunctionCodeBlock):
1170         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1171         - m_isFromGlobalCode is needed to support the exclusion of the open brace /
1172           prepended code for functions created from "global code".
1173         (JSC::UnlinkedFunctionExecutable::link):
1174         (JSC::UnlinkedFunctionExecutable::fromGlobalCode):
1175         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
1176         * bytecode/UnlinkedCodeBlock.h:
1177         (JSC::UnlinkedFunctionExecutable::create):
1178         (JSC::UnlinkedFunctionExecutable::unlinkedFunctionNameStart):
1179         (JSC::UnlinkedFunctionExecutable::unlinkedBodyStartColumn):
1180         (JSC::UnlinkedFunctionExecutable::unlinkedBodyEndColumn):
1181         (JSC::UnlinkedFunctionExecutable::recordParse):
1182         (JSC::UnlinkedCodeBlock::recordParse):
1183         (JSC::UnlinkedCodeBlock::endColumn):
1184         * bytecompiler/NodesCodegen.cpp:
1185         (JSC::FunctionBodyNode::emitBytecode):
1186         * parser/ASTBuilder.h:
1187         (JSC::ASTBuilder::createFunctionBody):
1188         (JSC::ASTBuilder::setFunctionNameStart):
1189         * parser/Lexer.cpp:
1190         (JSC::::shiftLineTerminator):
1191         - Removed an unused SourceCode Lexer<T>::sourceCode() function.
1192         * parser/Lexer.h:
1193         (JSC::Lexer::positionBeforeLastNewline):
1194         (JSC::Lexer::prevTerminator):
1195         - Added tracking of m_positionBeforeLastNewline in the Lexer to enable us
1196           to exclude the close brace / appended code for functions created from "global
1197           code".
1198         * parser/Nodes.cpp:
1199         (JSC::ProgramNode::ProgramNode):
1200         (JSC::ProgramNode::create):
1201         (JSC::EvalNode::EvalNode):
1202         (JSC::EvalNode::create):
1203         (JSC::FunctionBodyNode::FunctionBodyNode):
1204         (JSC::FunctionBodyNode::create):
1205         (JSC::FunctionBodyNode::setEndPosition):
1206         - setEndPosition() is needed to fixed up the end position so that we can
1207           exclude the close brace / appended code for functions created from "global
1208           code".
1209         * parser/Nodes.h:
1210         (JSC::ProgramNode::startColumn):
1211         (JSC::ProgramNode::endColumn):
1212         (JSC::EvalNode::startColumn):
1213         (JSC::EvalNode::endColumn):
1214         (JSC::FunctionBodyNode::setFunctionNameStart):
1215         (JSC::FunctionBodyNode::functionNameStart):
1216         (JSC::FunctionBodyNode::endColumn):
1217         * parser/Parser.cpp:
1218         (JSC::::parseFunctionBody):
1219         (JSC::::parseFunctionInfo):
1220         * parser/Parser.h:
1221         (JSC::Parser::positionBeforeLastNewline):
1222         (JSC::::parse):
1223         - Subtracted 1 from startColumn here to keep the node column values consistently
1224           base-0. See note 2 above.
1225         (JSC::parse):
1226         * parser/SourceProviderCacheItem.h:
1227         (JSC::SourceProviderCacheItem::SourceProviderCacheItem):
1228         * parser/SyntaxChecker.h:
1229         (JSC::SyntaxChecker::createFunctionBody):
1230         (JSC::SyntaxChecker::setFunctionNameStart):
1231         * runtime/CodeCache.cpp:
1232         (JSC::CodeCache::getGlobalCodeBlock):
1233         (JSC::CodeCache::getProgramCodeBlock):
1234         (JSC::CodeCache::getEvalCodeBlock):
1235         (JSC::CodeCache::getFunctionExecutableFromGlobalCode):
1236         * runtime/CodeCache.h:
1237         * runtime/Executable.cpp:
1238         (JSC::ScriptExecutable::newCodeBlockFor):
1239         (JSC::FunctionExecutable::FunctionExecutable):
1240         (JSC::ProgramExecutable::initializeGlobalProperties):
1241         (JSC::FunctionExecutable::fromGlobalCode):
1242         * runtime/Executable.h:
1243         (JSC::ExecutableBase::isEvalExecutable):
1244         (JSC::ExecutableBase::isProgramExecutable):
1245         (JSC::ScriptExecutable::ScriptExecutable):
1246         (JSC::ScriptExecutable::endColumn):
1247         (JSC::ScriptExecutable::recordParse):
1248         (JSC::FunctionExecutable::create):
1249         (JSC::FunctionExecutable::bodyIncludesBraces):
1250         * runtime/FunctionConstructor.cpp:
1251         (JSC::constructFunctionSkippingEvalEnabledCheck):
1252         * runtime/FunctionPrototype.cpp:
1253         (JSC::insertSemicolonIfNeeded):
1254         (JSC::functionProtoFuncToString):
1255         * runtime/JSGlobalObject.cpp:
1256         (JSC::JSGlobalObject::createProgramCodeBlock):
1257         (JSC::JSGlobalObject::createEvalCodeBlock):
1258
1259 2013-11-19  Dean Jackson  <dino@apple.com>
1260
1261         MarkedSpace::resumeAllocating needs to delay release
1262         https://bugs.webkit.org/show_bug.cgi?id=124596
1263
1264         Reviewed by Geoffrey Garen.
1265
1266         * heap/MarkedSpace.cpp:
1267         (JSC::MarkedSpace::resumeAllocating): Add DelayedReleaseScope protection.
1268
1269 2013-11-19  Mark Hahnenberg  <mhahnenberg@apple.com>
1270
1271         IncrementalSweeper needs to use DelayedReleaseScope too
1272         https://bugs.webkit.org/show_bug.cgi?id=124558
1273
1274         Reviewed by Filip Pizlo.
1275
1276         It does sweeping too, so it needs to use it. Also refactored an
1277         ASSERT that should have caught this sooner.
1278
1279         * heap/DelayedReleaseScope.h:
1280         (JSC::DelayedReleaseScope::isInEffectFor):
1281         * heap/IncrementalSweeper.cpp:
1282         (JSC::IncrementalSweeper::doSweep):
1283         * heap/MarkedBlock.cpp:
1284         (JSC::MarkedBlock::sweep):
1285         * heap/MarkedSpace.cpp:
1286         (JSC::MarkedSpace::sweep):
1287
1288 2013-11-18  Michael Saboff  <msaboff@apple.com>
1289
1290         ARM64 CRASH: Debug builds crash in emitPointerValidation()
1291         https://bugs.webkit.org/show_bug.cgi?id=124545
1292
1293         Reviewed by Filip Pizlo.
1294
1295         Changed emitPointerValidation() to use pushToSave() and popToRestore() as
1296         all macro assemblers have an implementation of these functions.
1297
1298         * jit/ThunkGenerators.cpp:
1299         (JSC::emitPointerValidation):
1300
1301 2013-11-18  Michael Saboff  <msaboff@apple.com>
1302
1303         ARM64: Update getHostCallReturnValue() to use architected frame pointer register
1304         https://bugs.webkit.org/show_bug.cgi?id=124520
1305
1306         Reviewed by Filip Pizlo.
1307
1308         Changed from using the prior JSC specific x25 callframe register to the ARM64
1309         architected x29 (fp) register.  This change should have been done as part of
1310         https://bugs.webkit.org/show_bug.cgi?id=123956.
1311
1312         * jit/JITOperations.cpp:
1313
1314 2013-11-18  Filip Pizlo  <fpizlo@apple.com>
1315
1316         put_to_scope[5] should not point to the structure if it's a variable access, but it should point to the WatchpointSet
1317         https://bugs.webkit.org/show_bug.cgi?id=124539
1318
1319         Reviewed by Mark Hahnenberg.
1320         
1321         This is in preparation for getting put_to_scope to directly invalidate the watchpoint set
1322         on stores, which will allow us to run constant inference on all globals.
1323
1324         * bytecode/CodeBlock.cpp:
1325         (JSC::CodeBlock::CodeBlock):
1326         (JSC::CodeBlock::finalizeUnconditionally):
1327         * bytecode/Instruction.h:
1328         * dfg/DFGByteCodeParser.cpp:
1329         (JSC::DFG::ByteCodeParser::parseBlock):
1330         * runtime/JSScope.cpp:
1331         (JSC::abstractAccess):
1332         (JSC::JSScope::abstractResolve):
1333         * runtime/JSScope.h:
1334         (JSC::ResolveOp::ResolveOp):
1335         * runtime/SymbolTable.h:
1336         (JSC::SymbolTableEntry::watchpointSet):
1337
1338 2013-11-18  Mark Hahnenberg  <mhahnenberg@apple.com>
1339
1340         APIEntryShims need some love
1341         https://bugs.webkit.org/show_bug.cgi?id=124540
1342
1343         Reviewed by Filip Pizlo.
1344
1345         We were missing them in key places which some other hacking revealed. These could have manifested as
1346         race conditions for VMs being used in multithreaded environments.
1347
1348         * API/JSContext.mm:
1349         (-[JSContext setException:]):
1350         (-[JSContext wrapperForObjCObject:]):
1351         (-[JSContext wrapperForJSObject:]):
1352         * API/JSContextRef.cpp:
1353         (JSContextGroupRelease):
1354         (JSGlobalContextRelease):
1355         * API/JSManagedValue.mm:
1356         (-[JSManagedValue initWithValue:]):
1357         (-[JSManagedValue value]):
1358         * API/JSObjectRef.cpp:
1359         (JSObjectIsFunction):
1360         (JSObjectCopyPropertyNames):
1361         * API/JSValue.mm:
1362         (containerValueToObject):
1363         * API/JSWrapperMap.mm:
1364         (tryUnwrapObjcObject):
1365
1366 2013-11-18  Filip Pizlo  <fpizlo@apple.com>
1367
1368         Allow the FTL debug dumps to include the new size field
1369         https://bugs.webkit.org/show_bug.cgi?id=124479
1370
1371         Reviewed by Mark Hahnenberg.
1372
1373         * ftl/FTLStackMaps.cpp:
1374         (JSC::FTL::StackMaps::Location::parse):
1375         (JSC::FTL::StackMaps::Location::dump):
1376         * ftl/FTLStackMaps.h:
1377
1378 2013-11-18  peavo@outlook.com  <peavo@outlook.com>
1379
1380         [Win] Link fails when DFG JIT is enabled.
1381         https://bugs.webkit.org/show_bug.cgi?id=123614
1382
1383         Reviewed by Brent Fulgham.
1384
1385         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Added new files.
1386         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
1387
1388 2013-11-18  Julien Brianceau  <jbriance@cisco.com>
1389
1390         [sh4] Add missing implementation in MacroAssembler to fix build (broken since r159395).
1391         https://bugs.webkit.org/show_bug.cgi?id=124484
1392
1393         Reviewed by Michael Saboff.
1394
1395         * assembler/MacroAssemblerSH4.h:
1396         (JSC::MacroAssemblerSH4::load8):
1397         (JSC::MacroAssemblerSH4::branch8):
1398
1399 2013-11-18  Michael Saboff  <msaboff@apple.com>
1400
1401         ARM64 CRASH: Improper offset in getHostCallReturnValue() to access callerFrame in CallFrame
1402         https://bugs.webkit.org/show_bug.cgi?id=124481
1403
1404         Reviewed by Mark Lam.
1405
1406         Fixed the offset to access CallerFrame in the ARM64 version of getHostCallReturnValue() to be 0
1407         to correspond with the change in CallFrame layout done in r158315.
1408
1409         * jit/JITOperations.cpp:
1410
1411 2013-11-18  Michael Saboff  <msaboff@apple.com>
1412
1413         Crash in virtualForThunkGenerator generated code on ARM64
1414         https://bugs.webkit.org/show_bug.cgi?id=124447
1415
1416         Reviewed by Geoffrey Garen.
1417
1418         The baseline JIT generates slow path call code with the caller in regT0.  The DFG
1419         generates call code with the caller in nonArgGPR0.  The virtualForThunkGenerator
1420         generates code with the caller in nonArgGPR0.  For X86 and X86_64, regT0 and nonArgGPR0
1421         are the same CPU register, eax.  For other platforms this isn't the case.  The same
1422         issue exists for JSVALUE32_64 ports as well, where there also is an issue with the callee
1423         tag registers being regT1 and nonArgGPR1 in the various locations.
1424
1425         Changed nonArgGPR0, nonArgGPR1 and nonArgGPR2 for X86 and X86_64 to not match up with
1426         regT0-2.  Changing these registers will cause a crash on all ports should we have a
1427         similar problem in the future.  Changed the DFG call generating code to use regT0 and
1428         regT1.  Now all slow path call code is generated using regT0 and for JSVALUE32_64 regT1.
1429         Added r12 to X86_64 as a new temp register (regT9) and moved r13 down to regT10.
1430         The new temp register decreases the likelihood of inadvertant register overlap.
1431
1432         * dfg/DFGSpeculativeJIT32_64.cpp:
1433         (JSC::DFG::SpeculativeJIT::emitCall):
1434         * dfg/DFGSpeculativeJIT64.cpp:
1435         (JSC::DFG::SpeculativeJIT::emitCall):
1436         * jit/GPRInfo.h:
1437         (JSC::GPRInfo::toRegister):
1438         (JSC::GPRInfo::toIndex):
1439         * jit/ThunkGenerators.cpp:
1440         (JSC::virtualForThunkGenerator):
1441
1442 2013-11-18  Balazs Kilvady  <kilvadyb@homejinni.com>
1443
1444         Add missing load8/branch8 with AbsoluteAddress parameter to MIPS port.
1445
1446         [MIPS] Build fails since r159395.
1447         https://bugs.webkit.org/show_bug.cgi?id=124491
1448
1449         Reviewed by Michael Saboff.
1450
1451         * assembler/MacroAssemblerMIPS.h:
1452         (JSC::MacroAssemblerMIPS::load8):
1453         (JSC::MacroAssemblerMIPS::branch8):
1454
1455 2013-11-18  Csaba Osztrogonác  <ossy@webkit.org>
1456
1457         REGRESSION(r159351): It made zillion tests assert on !CF platforms
1458         https://bugs.webkit.org/show_bug.cgi?id=124490
1459
1460         Reviewed by Mark Hahnenberg.
1461
1462         * heap/MarkedSpace.cpp:
1463         (JSC::MarkedSpace::sweep):
1464
1465 2013-11-18  Julien Brianceau  <jbriance@cisco.com>
1466
1467         Remove architecture specific code in LowLevelInterpreter.
1468         https://bugs.webkit.org/show_bug.cgi?id=124501
1469
1470         Reviewed by Michael Saboff.
1471
1472         * llint/LowLevelInterpreter.asm: Use generic path instead of sh4 specific code.
1473         * llint/LowLevelInterpreter32_64.asm: Merge sh4/mips path with arm path. The
1474         "move t0, a0" is not needed for arm because t0 == a0 with this architecture.
1475         * offlineasm/sh4.rb: Handle move opcode with pr register.
1476
1477 2013-11-18  Julien Brianceau  <jbriance@cisco.com>
1478
1479         [arm] Add missing implementation in MacroAssembler to fix build (broken since r159395).
1480         https://bugs.webkit.org/show_bug.cgi?id=124488
1481
1482         Reviewed by Zoltan Herczeg.
1483
1484         * assembler/MacroAssemblerARM.h:
1485         (JSC::MacroAssemblerARM::branch8):
1486
1487 2013-11-17  Julien Brianceau  <jbriance@cisco.com>
1488
1489         [sh4] Fix revertJumpReplacementToBranchPtrWithPatch in MacroAssembler.
1490         https://bugs.webkit.org/show_bug.cgi?id=124468
1491
1492         Reviewed by Michael Saboff.
1493
1494         Current implementation of revertJumpReplacementToBranchPtrWithPatch is wrong in
1495         the sh4 MacroAssembler part, leading to random instabilities. This patch fixes it
1496         and also renames the bad-named revertJumpToMove to revertJumpReplacementToBranchPtrWithPatch
1497         in the SH4Assembler.
1498
1499         * assembler/MacroAssemblerSH4.h:
1500         (JSC::MacroAssemblerSH4::revertJumpReplacementToBranchPtrWithPatch):
1501         * assembler/SH4Assembler.h:
1502         (JSC::SH4Assembler::replaceWithJump):
1503         (JSC::SH4Assembler::revertJumpReplacementToBranchPtrWithPatch):
1504
1505 2013-11-16  Filip Pizlo  <fpizlo@apple.com>
1506
1507         Simplify WatchpointSet state tracking
1508         https://bugs.webkit.org/show_bug.cgi?id=124465
1509
1510         Reviewed by Sam Weinig.
1511         
1512         We previously represented the state of watchpoint sets using two booleans. But that
1513         makes it awkward to case over the state.
1514         
1515         We also previously supported a watchpoint set being both watched and invalidated. We
1516         never used that capability, and its presence was just purely confusing.
1517         
1518         This turns the whole thing into an enum.
1519
1520         * assembler/MacroAssemblerARM64.h:
1521         (JSC::MacroAssemblerARM64::branch8):
1522         * assembler/MacroAssemblerARMv7.h:
1523         (JSC::MacroAssemblerARMv7::branch8):
1524         * assembler/MacroAssemblerX86.h:
1525         (JSC::MacroAssemblerX86::branch8):
1526         * assembler/MacroAssemblerX86_64.h:
1527         (JSC::MacroAssemblerX86_64::branch8):
1528         * bytecode/Watchpoint.cpp:
1529         (JSC::WatchpointSet::WatchpointSet):
1530         (JSC::WatchpointSet::add):
1531         (JSC::WatchpointSet::notifyWriteSlow):
1532         (JSC::InlineWatchpointSet::inflateSlow):
1533         * bytecode/Watchpoint.h:
1534         (JSC::WatchpointSet::state):
1535         (JSC::WatchpointSet::isStillValid):
1536         (JSC::WatchpointSet::startWatching):
1537         (JSC::WatchpointSet::notifyWrite):
1538         (JSC::WatchpointSet::addressOfState):
1539         (JSC::InlineWatchpointSet::InlineWatchpointSet):
1540         (JSC::InlineWatchpointSet::hasBeenInvalidated):
1541         (JSC::InlineWatchpointSet::startWatching):
1542         (JSC::InlineWatchpointSet::notifyWrite):
1543         (JSC::InlineWatchpointSet::decodeState):
1544         (JSC::InlineWatchpointSet::encodeState):
1545         * jit/JITPropertyAccess.cpp:
1546         (JSC::JIT::emitVarInjectionCheck):
1547         * jit/JITPropertyAccess32_64.cpp:
1548         (JSC::JIT::emitVarInjectionCheck):
1549         * llint/LowLevelInterpreter.asm:
1550         * llint/LowLevelInterpreter32_64.asm:
1551         * llint/LowLevelInterpreter64.asm:
1552         * runtime/JSFunction.cpp:
1553         (JSC::JSFunction::JSFunction):
1554         * runtime/JSFunctionInlines.h:
1555         (JSC::JSFunction::JSFunction):
1556         * runtime/JSGlobalObject.cpp:
1557         (JSC::JSGlobalObject::JSGlobalObject):
1558         * runtime/Structure.cpp:
1559         (JSC::Structure::Structure):
1560         * runtime/SymbolTable.cpp:
1561         (JSC::SymbolTableEntry::attemptToWatch):
1562         * runtime/SymbolTable.h:
1563
1564 2013-11-16  Filip Pizlo  <fpizlo@apple.com>
1565
1566         FTL should have an explicit notion of bytecode liveness
1567         https://bugs.webkit.org/show_bug.cgi?id=124181
1568
1569         Reviewed by Sam Weinig.
1570         
1571         This makes FTL OSR exit use bytecode liveness analysis to determine which variables
1572         to include values for. The decision of how to get the values of variables is based on
1573         forward propagation of MovHints and SetLocals.
1574         
1575         This fixes a bunch of bugs (like https://bugs.webkit.org/show_bug.cgi?id=124138 but
1576         also others that I noticed when I started writing more targetted tests) and allows us
1577         to remove some sketchy code.
1578
1579         * CMakeLists.txt:
1580         * GNUmakefile.list.am:
1581         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
1582         * JavaScriptCore.xcodeproj/project.pbxproj:
1583         * bytecode/BytecodeBasicBlock.h:
1584         * bytecode/BytecodeLivenessAnalysis.cpp:
1585         (JSC::isValidRegisterForLiveness):
1586         (JSC::setForOperand):
1587         (JSC::computeUsesForBytecodeOffset):
1588         (JSC::computeDefsForBytecodeOffset):
1589         (JSC::stepOverInstruction):
1590         (JSC::computeLocalLivenessForBytecodeOffset):
1591         (JSC::BytecodeLivenessAnalysis::runLivenessFixpoint):
1592         (JSC::BytecodeLivenessAnalysis::operandIsLiveAtBytecodeOffset):
1593         (JSC::getLivenessInfo):
1594         (JSC::BytecodeLivenessAnalysis::getLivenessInfoAtBytecodeOffset):
1595         (JSC::BytecodeLivenessAnalysis::computeFullLiveness):
1596         * bytecode/BytecodeLivenessAnalysis.h:
1597         * bytecode/BytecodeLivenessAnalysisInlines.h: Added.
1598         (JSC::operandIsAlwaysLive):
1599         (JSC::operandThatIsNotAlwaysLiveIsLive):
1600         (JSC::operandIsLive):
1601         * bytecode/CodeBlock.h:
1602         (JSC::CodeBlock::captureCount):
1603         (JSC::CodeBlock::captureStart):
1604         (JSC::CodeBlock::captureEnd):
1605         * bytecode/CodeOrigin.cpp:
1606         (JSC::InlineCallFrame::dumpInContext):
1607         * bytecode/FullBytecodeLiveness.h: Added.
1608         (JSC::FullBytecodeLiveness::FullBytecodeLiveness):
1609         (JSC::FullBytecodeLiveness::getOut):
1610         (JSC::FullBytecodeLiveness::operandIsLive):
1611         (JSC::FullBytecodeLiveness::getLiveness):
1612         * dfg/DFGAvailability.cpp: Added.
1613         (JSC::DFG::Availability::dump):
1614         (JSC::DFG::Availability::dumpInContext):
1615         * dfg/DFGAvailability.h: Added.
1616         (JSC::DFG::Availability::Availability):
1617         (JSC::DFG::Availability::unavailable):
1618         (JSC::DFG::Availability::withFlush):
1619         (JSC::DFG::Availability::withNode):
1620         (JSC::DFG::Availability::withUnavailableNode):
1621         (JSC::DFG::Availability::nodeIsUndecided):
1622         (JSC::DFG::Availability::nodeIsUnavailable):
1623         (JSC::DFG::Availability::hasNode):
1624         (JSC::DFG::Availability::node):
1625         (JSC::DFG::Availability::flushedAt):
1626         (JSC::DFG::Availability::operator!):
1627         (JSC::DFG::Availability::operator==):
1628         (JSC::DFG::Availability::merge):
1629         (JSC::DFG::Availability::mergeNodes):
1630         (JSC::DFG::Availability::unavailableMarker):
1631         * dfg/DFGBasicBlock.h:
1632         * dfg/DFGByteCodeParser.cpp:
1633         (JSC::DFG::ByteCodeParser::parseBlock):
1634         * dfg/DFGDisassembler.cpp:
1635         (JSC::DFG::Disassembler::Disassembler):
1636         * dfg/DFGFlushFormat.cpp:
1637         (WTF::printInternal):
1638         * dfg/DFGFlushFormat.h:
1639         (JSC::DFG::resultFor):
1640         (JSC::DFG::useKindFor):
1641         (JSC::DFG::dataFormatFor):
1642         * dfg/DFGFlushedAt.cpp:
1643         (JSC::DFG::FlushedAt::dump):
1644         * dfg/DFGFlushedAt.h:
1645         (JSC::DFG::FlushedAt::FlushedAt):
1646         (JSC::DFG::FlushedAt::merge):
1647         * dfg/DFGGraph.cpp:
1648         (JSC::DFG::Graph::dump):
1649         (JSC::DFG::Graph::livenessFor):
1650         (JSC::DFG::Graph::isLiveInBytecode):
1651         * dfg/DFGGraph.h:
1652         (JSC::DFG::Graph::baselineCodeBlockFor):
1653         * dfg/DFGOSRAvailabilityAnalysisPhase.cpp:
1654         (JSC::DFG::OSRAvailabilityAnalysisPhase::run):
1655         * dfg/DFGOSRAvailabilityAnalysisPhase.h:
1656         * dfg/DFGPlan.cpp:
1657         (JSC::DFG::Plan::compileInThreadImpl):
1658         * dfg/DFGResurrectionForValidationPhase.cpp: Added.
1659         (JSC::DFG::ResurrectionForValidationPhase::ResurrectionForValidationPhase):
1660         (JSC::DFG::ResurrectionForValidationPhase::run):
1661         (JSC::DFG::performResurrectionForValidation):
1662         * dfg/DFGResurrectionForValidationPhase.h: Added.
1663         * dfg/DFGSSAConversionPhase.cpp:
1664         (JSC::DFG::SSAConversionPhase::run):
1665         * dfg/DFGValueSource.h:
1666         (JSC::DFG::ValueSource::forFlushFormat):
1667         * dfg/DFGVariableAccessData.h:
1668         * ftl/FTLExitValue.cpp:
1669         (JSC::FTL::ExitValue::dumpInContext):
1670         * ftl/FTLInlineCacheSize.cpp:
1671         (JSC::FTL::sizeOfGetById):
1672         * ftl/FTLLocation.cpp:
1673         (JSC::FTL::Location::gpr):
1674         (JSC::FTL::Location::fpr):
1675         (JSC::FTL::Location::directGPR):
1676         * ftl/FTLLowerDFGToLLVM.cpp:
1677         (JSC::FTL::LowerDFGToLLVM::LowerDFGToLLVM):
1678         (JSC::FTL::LowerDFGToLLVM::compileBlock):
1679         (JSC::FTL::LowerDFGToLLVM::compileNode):
1680         (JSC::FTL::LowerDFGToLLVM::compileSetLocal):
1681         (JSC::FTL::LowerDFGToLLVM::compileZombieHint):
1682         (JSC::FTL::LowerDFGToLLVM::compilePutById):
1683         (JSC::FTL::LowerDFGToLLVM::compileInvalidationPoint):
1684         (JSC::FTL::LowerDFGToLLVM::initializeOSRExitStateForBlock):
1685         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
1686         (JSC::FTL::LowerDFGToLLVM::emitOSRExitCall):
1687         (JSC::FTL::LowerDFGToLLVM::buildExitArguments):
1688         (JSC::FTL::LowerDFGToLLVM::addExitArgumentForNode):
1689         (JSC::FTL::LowerDFGToLLVM::observeMovHint):
1690         * ftl/FTLOutput.h:
1691         (JSC::FTL::Output::alloca):
1692         * ftl/FTLValueSource.cpp: Removed.
1693         * ftl/FTLValueSource.h: Removed.
1694         * llvm/LLVMAPIFunctions.h:
1695         * runtime/DumpContext.cpp:
1696         (JSC::DumpContext::DumpContext):
1697         * runtime/DumpContext.h:
1698         * runtime/Options.h:
1699         * runtime/SymbolTable.h:
1700         (JSC::SharedSymbolTable::captureStart):
1701         (JSC::SharedSymbolTable::captureEnd):
1702         (JSC::SharedSymbolTable::captureCount):
1703
1704 2013-11-16  Filip Pizlo  <fpizlo@apple.com>
1705
1706         Fix indentation of JSActivation.h.
1707
1708         Rubber stamped by Mark Hahnenberg.
1709
1710         * runtime/JSActivation.h:
1711
1712 2013-11-16  Filip Pizlo  <fpizlo@apple.com>
1713
1714         Fix indentation of JSVariableObject.h.
1715
1716         Rubber stamped by Mark Hahnenberg.
1717         
1718         I'm about to do some damage to this file. I wanted to give it some sanity first.
1719
1720         * runtime/JSVariableObject.h:
1721
1722 2013-11-16  Julien Brianceau  <jbriance@cisco.com>
1723
1724         [sh4] Fix build (broken since r159346).
1725         https://bugs.webkit.org/show_bug.cgi?id=124455
1726
1727         Reviewed by Oliver Hunt.
1728
1729         Fix LLINT implementation for sh4 architecture to handle properly load and store operations with pr register.
1730
1731         * offlineasm/sh4.rb:
1732
1733 2013-11-15  Alexey Proskuryakov  <ap@apple.com>
1734
1735         Support exporting symmetric keys as JWK
1736         https://bugs.webkit.org/show_bug.cgi?id=124442
1737
1738         Reviewed by Sam Weinig.
1739
1740         * runtime/JSONObject.h: Export JSONStringify.
1741
1742 2013-11-15  peavo@outlook.com  <peavo@outlook.com>
1743
1744         [Win] JavaScript crashes on 64-bit with JIT enabled.
1745         https://bugs.webkit.org/show_bug.cgi?id=124409
1746
1747         Reviewed by Michael Saboff.
1748
1749         These are issues found with JIT on 64-bit:
1750         - The registers rsi and rdi in callToJavaScript needs to be saved and restored. This is required by the Windows 64-bit ABI.
1751         - The getHostCallReturnValue function needs to be updated according to it's GCC counterpart.
1752         - The poke argument offset needs to be 20h, because Windows 64-bit ABI requires stack space allocated for the 4 argument registers.
1753
1754         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Re-added JITStubsMSVC64.asm to project.
1755         * jit/CCallHelpers.h: Set poke argument offset.
1756         (JSC::CCallHelpers::setupArguments): Compile fix, added needed method.
1757         * jit/JITStubsMSVC64.asm: Save and restore registers rsi and rdi.
1758                                   Update getHostCallReturnValue according to the GCC version.
1759
1760 2013-11-14  David Farler  <dfarler@apple.com>
1761
1762         Copy ASAN flag settings to WebCore and JavaScriptCore intermediate build tools
1763         https://bugs.webkit.org/show_bug.cgi?id=124362
1764
1765         Reviewed by David Kilzer.
1766
1767         * Configurations/ToolExecutable.xcconfig:
1768         Use ASAN_C*FLAGS.
1769
1770 2013-11-15  Mark Hahnenberg  <mhahnenberg@apple.com>
1771
1772         Remove JSChunk
1773         https://bugs.webkit.org/show_bug.cgi?id=124435
1774
1775         Reviewed by Geoffrey Garen.
1776
1777         It's empty and has been since it was added 3 years ago.
1778
1779         * CMakeLists.txt:
1780         * runtime/JSChunk.cpp: Removed.
1781         * runtime/JSChunk.h: Removed.
1782
1783 2013-11-15  Mark Hahnenberg  <mhahnenberg@apple.com>
1784
1785         Remove VTableSpectrum
1786         https://bugs.webkit.org/show_bug.cgi?id=124427
1787
1788         Reviewed by Filip Pizlo.
1789
1790         * CMakeLists.txt:
1791         * GNUmakefile.list.am:
1792         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
1793         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
1794         * JavaScriptCore.xcodeproj/project.pbxproj:
1795         * heap/Heap.cpp:
1796         (JSC::Heap::lastChanceToFinalize):
1797         * heap/Heap.h:
1798         * heap/MarkedBlock.cpp:
1799         (JSC::MarkedBlock::callDestructor):
1800         * heap/SlotVisitor.cpp:
1801         (JSC::visitChildren):
1802         * heap/SlotVisitor.h:
1803         * heap/VTableSpectrum.cpp: Removed.
1804         * heap/VTableSpectrum.h: Removed.
1805
1806 2013-11-14  Mark Hahnenberg  <mhahnenberg@apple.com>
1807
1808         -dealloc callbacks from wrapped Objective-C objects can happen at bad times
1809         https://bugs.webkit.org/show_bug.cgi?id=123821
1810
1811         Reviewed by Darin Adler.
1812
1813         Currently with the JSC Obj-C API, JS wrappers for client Obj-C objects retain their associated Obj-C 
1814         object. When they are swept, they release their Obj-C objects which can trigger a call to that 
1815         object's -dealloc method. These -dealloc methods can then call back into the same VM, which is not 
1816         allowed during sweeping or VM shutdown.
1817
1818         We can handle this case by creating our own pool of Obj-C objects to be released when it is safe to do so.
1819         This is accomplished by using DelayedReleaseScope, an RAII-style object that will retain all objects
1820         that are unsafe to release until the end of the DelayedReleaseScope.
1821
1822         * API/APIShims.h:
1823         (JSC::APICallbackShim::APICallbackShim):
1824         (JSC::APICallbackShim::vmForDropAllLocks):
1825         (JSC::APICallbackShim::execForDropAllLocks):
1826         * API/JSAPIWrapperObject.mm:
1827         (JSAPIWrapperObjectHandleOwner::finalize):
1828         * API/ObjCCallbackFunction.mm:
1829         (JSC::ObjCCallbackFunctionImpl::destroy):
1830         (JSC::ObjCCallbackFunction::destroy):
1831         * API/tests/testapi.mm:
1832         (-[TinyDOMNode initWithVirtualMachine:]):
1833         (-[TinyDOMNode dealloc]):
1834         (-[TinyDOMNode appendChild:]):
1835         (-[TinyDOMNode removeChildAtIndex:]):
1836         (-[EvilAllocationObject initWithContext:]):
1837         (-[EvilAllocationObject dealloc]):
1838         (-[EvilAllocationObject doEvilThingsWithContext:]):
1839         * JavaScriptCore.xcodeproj/project.pbxproj:
1840         * heap/DelayedReleaseScope.h: Added.
1841         (JSC::DelayedReleaseScope::DelayedReleaseScope):
1842         (JSC::DelayedReleaseScope::~DelayedReleaseScope):
1843         (JSC::DelayedReleaseScope::releaseSoon):
1844         (JSC::MarkedSpace::releaseSoon):
1845         * heap/Heap.cpp:
1846         (JSC::Heap::collectAllGarbage):
1847         * heap/Heap.h:
1848         (JSC::Heap::releaseSoon):
1849         * heap/MarkedAllocator.cpp:
1850         (JSC::MarkedAllocator::allocateSlowCase):
1851         * heap/MarkedSpace.cpp:
1852         (JSC::MarkedSpace::MarkedSpace):
1853         (JSC::MarkedSpace::lastChanceToFinalize):
1854         (JSC::MarkedSpace::sweep):
1855         * heap/MarkedSpace.h:
1856
1857 2013-11-15  Michael Saboff  <msaboff@apple.com>
1858
1859         REGRESSION (r158586): callToJavaScript needs to save return PC to Sentinel frame
1860         https://bugs.webkit.org/show_bug.cgi?id=124420
1861
1862         Reviewed by Filip Pizlo.
1863
1864         Save the return PC into the sentinel frame.
1865
1866         * jit/JITStubsMSVC64.asm:
1867         * jit/JITStubsX86.h:
1868         * llint/LowLevelInterpreter32_64.asm:
1869         * llint/LowLevelInterpreter64.asm:
1870
1871 2013-11-14  Oliver Hunt  <oliver@apple.com>
1872
1873         Make CLoop easier to build, and make it work
1874         https://bugs.webkit.org/show_bug.cgi?id=124359
1875
1876         Reviewed by Geoffrey Garen.
1877
1878         Add --cloop to build-jsc, build-webkit and friends.
1879
1880         Also make CLoop build and work again - This meant adding a
1881         couple of missing ENABLE(DFG_JIT) blocks, and fixing a few 
1882         other references.
1883
1884         * Configurations/FeatureDefines.xcconfig:
1885         * bytecode/BytecodeLivenessAnalysis.cpp:
1886         (JSC::computeUsesForBytecodeOffset):
1887         (JSC::computeDefsForBytecodeOffset):
1888         * bytecode/DFGExitProfile.cpp:
1889         * dfg/DFGCapabilities.cpp:
1890         * dfg/DFGCompilationKey.cpp:
1891         * dfg/DFGCompilationMode.cpp:
1892         * jit/JITExceptions.cpp:
1893         (JSC::genericUnwind):
1894
1895 2013-11-14  Michael Saboff  <msaboff@apple.com>
1896
1897         REGRESSION (r159276): Fix lots of crashes for arm_traditional architecture.
1898         https://bugs.webkit.org/show_bug.cgi?id=124365
1899
1900         Reviewed by Oliver Hunt.
1901
1902         Crashes were caused by a mixup between regular registers and temporary registers in ARM_EXTRA_GPRS.
1903
1904         * llint/LowLevelInterpreter32_64.asm: Warning, t3 != a3. It's safer to use an implementation using aX
1905         registers like the MIPS one for cCallX macros.
1906         * offlineasm/arm.rb: Rearrange ARM_EXTRA_GPRS according to the new register distribution in LLINT.
1907
1908 2013-11-14  Michael Saboff  <msaboff@apple.com>
1909
1910         REGRESSION (r159276): rbp register overwritten in Win 64 version of callToJavascript stub
1911         https://bugs.webkit.org/show_bug.cgi?id=124361
1912
1913         Reviewed by Oliver Hunt.
1914
1915         Swapped operand ordering to: mov rax, rbp
1916
1917         * jit/JITStubsMSVC64.asm:
1918
1919 2013-11-14  Julien Brianceau  <jbriance@cisco.com>
1920
1921         REGRESSION (r159276): Fix lots of crashes for sh4 architecture.
1922         https://bugs.webkit.org/show_bug.cgi?id=124347
1923
1924         Reviewed by Michael Saboff.
1925
1926         Since r159276, we have (t4 == a0 == r4) and (t5 == a1 == r5) in LLINT for sh4.
1927         This leads to argument register trampling in cCallX macros, especially with cCall2
1928         macro when arg1 == t4.
1929
1930         * llint/LowLevelInterpreter32_64.asm: Use a new "setargs" pseudo-op to setup arguments for sh4.
1931         * offlineasm/instructions.rb:
1932         * offlineasm/sh4.rb: Lower "setargs" pseudo-op to setup argument registers and prevent register trampling issues.
1933
1934 2013-11-14  Julien Brianceau  <jbriance@cisco.com>
1935
1936         Fix build for sh4 architectures (broken since r159276).
1937         https://bugs.webkit.org/show_bug.cgi?id=124344
1938
1939         Reviewed by Csaba Osztrogonác.
1940
1941         * offlineasm/sh4.rb: There is no fp alias for r14 register for sh4.
1942
1943 2013-11-13  Michael Saboff  <msaboff@apple.com>
1944
1945         Change callToJavaScript thunk into an offline assembled stub
1946         https://bugs.webkit.org/show_bug.cgi?id=124251
1947
1948         Reviewed by Geoffrey Garen.
1949
1950         Changed callToJavaScript and throwNotCaught into stubs generated by the offline assembler.
1951         Added popCalleeSaves and pushCalleeSaves pseudo ops to the offline assembler to handle
1952         the saving and restoring of callee save registers.  Fixed callFrameRegister differences
1953         between arm traditional (r11) and arm Thumb2 (r7) in GPRInfo.h.  Also fixed implementation
1954         of pop & push in arm.rb.
1955
1956         Since the offline assembler and therefore the LLInt don't work on Windows, the Windows stubs
1957         are handled as inline assembly in JITStubsX86.h and JITStubsMSVC64.asm.
1958
1959         * dfg/DFGDriver.cpp:
1960         (JSC::DFG::compileImpl):
1961         * jit/GPRInfo.h:
1962         (JSC::GPRInfo::toIndex):
1963         (JSC::GPRInfo::debugName):
1964         * jit/JITCode.cpp:
1965         (JSC::JITCode::execute):
1966         * jit/JITExceptions.cpp:
1967         (JSC::genericUnwind):
1968         * jit/JITStubs.h:
1969         * jit/JITStubsMSVC64.asm:
1970         * jit/JITStubsX86.h:
1971         * jit/ThunkGenerators.cpp:
1972         * jit/ThunkGenerators.h:
1973         * llint/LLIntThunks.h:
1974         * llint/LowLevelInterpreter.asm:
1975         * llint/LowLevelInterpreter32_64.asm:
1976         * llint/LowLevelInterpreter64.asm:
1977         * offlineasm/arm.rb:
1978         * offlineasm/arm64.rb:
1979         * offlineasm/instructions.rb:
1980         * offlineasm/mips.rb:
1981         * offlineasm/registers.rb:
1982         * offlineasm/sh4.rb:
1983         * offlineasm/x86.rb:
1984         * runtime/VM.cpp:
1985         (JSC::VM::VM):
1986         * runtime/VM.h:
1987
1988 2013-11-13  Andy Estes  <aestes@apple.com>
1989
1990         Fix the ARM64 build after recent JavaScriptCore changes
1991         https://bugs.webkit.org/show_bug.cgi?id=124315
1992
1993         Reviewed by Michael Saboff.
1994
1995         Based on patches by myself, Filip Pizlo, Benjamin Poulain, and Michael Saboff.
1996
1997         * Configurations/JavaScriptCore.xcconfig: Hid the symbol for
1998         std::bad_function_call.
1999         * JavaScriptCore.xcodeproj/project.pbxproj: Marked
2000         MacroAssemblerARM64.h and ARM64Assembler.h as Private headers.
2001         * assembler/ARM64Assembler.h:
2002         (JSC::ARM64Assembler::executableOffsetFor):
2003         * assembler/MacroAssemblerARM64.h: Removed ARM64's executableCopy(),
2004         which was removed from other assembler backends in r157690.
2005         (JSC::MacroAssemblerARM64::shouldBlindForSpecificArch): Added.
2006         (JSC::MacroAssemblerARM64::lshift64): Added.
2007         (JSC::MacroAssemblerARM64::mul64): Added.
2008         (JSC::MacroAssemblerARM64::rshift64): Added.
2009         (JSC::MacroAssemblerARM64::convertInt64ToDouble): Added.
2010         (JSC::MacroAssemblerARM64::branchMul64): Added.
2011         (JSC::MacroAssemblerARM64::branchNeg64): Added.
2012         (JSC::MacroAssemblerARM64::scratchRegisterForBlinding): Added.
2013         * dfg/DFGSpeculativeJIT.cpp:
2014         (JSC::DFG::SpeculativeJIT::compileArithDiv): Changed
2015         SpeculateIntegerOperand to SpeculateInt32Operand,
2016         nodeCanIgnoreNegativeZero() to bytecodeCanIgnoreNegativeZero(), and
2017         nodeUsedAsNumber() to bytecodeUsesAsNumber().
2018         (JSC::DFG::SpeculativeJIT::compileArithMod): Changed
2019         nodeCanIgnoreNegativeZero() to bytecodeCanIgnoreNegativeZero().
2020
2021 2013-11-13  Oliver Hunt  <oliver@apple.com>
2022
2023         Fix debug build.
2024
2025         * parser/Parser.cpp:
2026
2027 2013-11-13  Tim Horton  <timothy_horton@apple.com>
2028
2029         r159210 added a period where there previously wasn't one, breaking >100 tests
2030
2031         Rubber-stamped by Oliver Hunt.
2032
2033         * parser/Parser.cpp:
2034         (JSC::::logError):
2035         Remove the extra period.
2036
2037 2013-11-13  Oliver Hunt  <oliver@apple.com>
2038
2039         REGRESSION (r158014): Many webpages throw stack overflow exceptions on iOS (because Parser::parseMemberExpression uses ~130K more stack)
2040         https://bugs.webkit.org/show_bug.cgi?id=124177
2041
2042         Reviewed by Michael Saboff.
2043
2044         This patch pushes error handling into NEVER_INLINE functions to perform
2045         the actual error message construction.  This dramatically reduces the
2046         stack usage of the Parser.  For the large functions (such as parseMemberExpression)
2047         the improvement is on the order of 2.5x reduction in stack usage.  For
2048         smaller functions the reduction is in the order of 5-6x.
2049
2050         * parser/Parser.cpp:
2051         (JSC::::logError):
2052         * parser/Parser.h:
2053
2054 2013-11-13  Julien Brianceau  <jbriance@cisco.com>
2055
2056         [sh4] Protect repatchCompact from flushConstantPool.
2057         https://bugs.webkit.org/show_bug.cgi?id=124278
2058
2059         Reviewed by Michael Saboff.
2060
2061         Random crashes may occur with sh4 architecture, when a flushConstantPool occurs in
2062         movlMemRegCompact. As in this case a branch opcode and the constant pool are put
2063         before the movlMemRegCompact, the branch itself is patched when calling repatchCompact
2064         instead of the mov instruction, which is really bad.
2065
2066         * assembler/SH4Assembler.h:
2067         (JSC::SH4Assembler::repatchCompact): Handle this specific case and add an ASSERT.
2068
2069 2013-11-12  Alexey Proskuryakov  <ap@apple.com>
2070
2071         Disable WebCrypto on Mountain Lion
2072         https://bugs.webkit.org/show_bug.cgi?id=124261
2073
2074         Rubber-stamped by Sam Weinig.
2075
2076         * Configurations/FeatureDefines.xcconfig:
2077
2078 2013-11-12  Julien Brianceau  <jbriance@cisco.com>
2079
2080         [sh4] Fix load32WithUnalignedHalfWords function in baseline JIT.
2081         https://bugs.webkit.org/show_bug.cgi?id=124233
2082
2083         Reviewed by Michael Saboff.
2084
2085         * assembler/MacroAssemblerSH4.h:
2086         (JSC::MacroAssemblerSH4::load32WithUnalignedHalfWords): Do not claim scratch register too early.
2087         Test already covered by fast/regex/pcre-test-1.
2088
2089 2013-11-12  Filip Pizlo  <fpizlo@apple.com>
2090
2091         Liveness analysis should take less memory in CodeBlock when it is unused
2092         https://bugs.webkit.org/show_bug.cgi?id=124225
2093
2094         Reviewed by Mark Hahnenberg.
2095         
2096         Basically, I turned CodeBlock::m_livenessAnalysis into a pointer that is null by
2097         default.
2098
2099         * bytecode/BytecodeLivenessAnalysis.cpp:
2100         (JSC::BytecodeLivenessAnalysis::BytecodeLivenessAnalysis):
2101         (JSC::BytecodeLivenessAnalysis::runLivenessFixpoint):
2102         (JSC::BytecodeLivenessAnalysis::operandIsLiveAtBytecodeOffset):
2103         (JSC::BytecodeLivenessAnalysis::dumpResults):
2104         (JSC::BytecodeLivenessAnalysis::compute):
2105         * bytecode/BytecodeLivenessAnalysis.h:
2106         * bytecode/CodeBlock.cpp:
2107         (JSC::CodeBlock::CodeBlock):
2108         * bytecode/CodeBlock.h:
2109         (JSC::CodeBlock::livenessAnalysis):
2110
2111 2013-11-11  Oliver Hunt  <oliver@apple.com>
2112
2113         Support unprefixed deconstructing assignment
2114         https://bugs.webkit.org/show_bug.cgi?id=124172
2115
2116         Reviewed by Mark Lam.
2117
2118         Add support for unprefixed descontructive assignment.
2119
2120         Happily non-reference types on the left hand side of an assignment
2121         are a runtime error, so we're able to defer validation of the binding
2122         pattern to codegen time when we're already doing a lot more work.
2123
2124         We're also able to predicate our attempt to parse on the existence of
2125         '[' or '{' as they are not as common as other constructs. 
2126
2127         * bytecompiler/NodesCodegen.cpp:
2128         (JSC::ArrayPatternNode::emitDirectBinding):
2129         * parser/ASTBuilder.h:
2130         * parser/Parser.cpp:
2131         (JSC::::createBindingPattern):
2132         (JSC::::tryParseDeconstructionPatternExpression):
2133         (JSC::::parseDeconstructionPattern):
2134         (JSC::::parseForStatement):
2135         (JSC::::parseAssignmentExpression):
2136         * parser/Parser.h:
2137         (JSC::Parser::createSavePoint):
2138         (JSC::Parser::restoreSavePoint):
2139         * parser/SyntaxChecker.h:
2140
2141 2013-11-12  Andy Estes  <aestes@apple.com>
2142
2143         Run JavaScriptCore Objective-C API tests on all supported platforms
2144         https://bugs.webkit.org/show_bug.cgi?id=124214
2145
2146         Reviewed by Mark Hahnenberg.
2147
2148         Now that we support the API on iOS and on OS X 10.8, there's no reason
2149         to limit the tests to OS X 10.9 (or greater).
2150
2151         * API/tests/CurrentThisInsideBlockGetterTest.h:
2152         * API/tests/CurrentThisInsideBlockGetterTest.mm:
2153         * API/tests/testapi.mm:
2154
2155 2013-08-02  Mark Hahnenberg  <mhahnenberg@apple.com>
2156
2157         CodeBlocks should be able to determine bytecode liveness
2158         https://bugs.webkit.org/show_bug.cgi?id=118546
2159
2160         Reviewed by Filip Pizlo.
2161
2162         This will simplify some things in the DFG related to OSR exits and determining 
2163         which bytecode variables are live at which points during execution. It will
2164         also be useful for making our conservative GC scan more precise. Currently it 
2165         doesn't properly account for liveness while the DFG is running, so it will be 
2166         off by default behing a runtime Options flag.
2167
2168         * JavaScriptCore.xcodeproj/project.pbxproj:
2169         * bytecode/BytecodeBasicBlock.cpp: Added.
2170         (JSC::isBranch): Used to determine the end of basic blocks.
2171         (JSC::isUnconditionalBranch): Used to determine when a branch at the end of a 
2172         basic block can't possibly fall through to the next basic block in program order.
2173         (JSC::isTerminal): Also used to detect the end of a block.
2174         (JSC::isThrow):
2175         (JSC::isJumpTarget): Used to correctly separate basic blocks. Any jump destination 
2176         must be the head of its own basic block.
2177         (JSC::linkBlocks): Links two blocks together in a bi-direcitonal fashion.
2178         (JSC::computeBytecodeBasicBlocks): Creates a set of basic blocks given a particular 
2179         CodeBlock and links them together.
2180         * bytecode/BytecodeBasicBlock.h: Added.
2181         (JSC::BytecodeBasicBlock::isEntryBlock): Entry blocks are a special basic blocks 
2182         that indicate the beginning of the function.
2183         (JSC::BytecodeBasicBlock::isExitBlock): Exit blocks are a special basic block that 
2184         all blocks that exit the function have as a successor. Entry and exit blocks allows 
2185         the various code paths to be more regular.
2186         (JSC::BytecodeBasicBlock::leaderBytecodeOffset): The leader bytecode offset is the 
2187         bytecode offset of the first instruction in the block.
2188         (JSC::BytecodeBasicBlock::totalBytecodeLength): The total length of all the bytecodes 
2189         in this block.
2190         (JSC::BytecodeBasicBlock::bytecodeOffsets): The bytecode offsets in this particular 
2191         basic block. This Vector allows us to iterate over the bytecodes in reverse order 
2192         which wouldn't be possible normally since they are of variable size.
2193         (JSC::BytecodeBasicBlock::addPredecessor): Links a block to a specified predecessor. 
2194         Only creates one direction of the link.
2195         (JSC::BytecodeBasicBlock::addSuccessor): Same as addPredecessor, but for successors.
2196         (JSC::BytecodeBasicBlock::predecessors): Getter for predecessors.
2197         (JSC::BytecodeBasicBlock::successors): Getter for successors.
2198         (JSC::BytecodeBasicBlock::in): Getter for the liveness info at the head of the block.
2199         (JSC::BytecodeBasicBlock::out): Getter for the liveness info at  the tail of the block.
2200         (JSC::BytecodeBasicBlock::BytecodeBasicBlock):
2201         (JSC::BytecodeBasicBlock::addBytecodeLength): When creating basic blocks we call 
2202         this function when we want to add the next bytecode in program order to this block.
2203         * bytecode/BytecodeLivenessAnalysis.cpp: Added.
2204         (JSC::BytecodeLivenessAnalysis::BytecodeLivenessAnalysis):
2205         (JSC::numberOfCapturedVariables): Convenience wrapper. Returns the
2206         number of captured variables for a particular CodeBlock, or 0 if 
2207         the CodeBlock has no SymbolTable.
2208         (JSC::captureStart): Ditto, but for captureStart().
2209         (JSC::captureEnd): Ditto, but for captureEnd().
2210         (JSC::isValidRegisterForLiveness): Returns true if the liveness analysis should 
2211         track the liveness of a particular operand. We ignore constants, arguments, and 
2212         captured variables. We ignore arguments because they're live for the duration of 
2213         a function call. We ignore captured variables because we also treat them as live 
2214         for the duration of the function. This could probably be improved to be more precise, 
2215         but it didn't seem worth it for now.
2216         (JSC::setForOperand): Convenience wrapper that sets the bit in the provided bit 
2217         vector for the provided operand. It handles skipping over captured variables.
2218         (JSC::computeUsesForBytecodeOffset): Computes which operands are used by a particular bytecode.
2219         (JSC::computeDefsForBytecodeOffset): Computes which operands are defined by a particular 
2220         bytecode. Typically this is just the left-most operand.
2221         (JSC::findBasicBlockWithLeaderOffset): 
2222         (JSC::findBasicBlockForBytecodeOffset): Scans over basic blocks to find the block 
2223         which contains a particular bytecode offset.
2224         (JSC::computeLocalLivenessForBytecodeOffset): Computes block-local liveness from the 
2225         bottom of the block until a specified bytecode offset is reached. 
2226         (JSC::computeLocalLivenessForBlock): Computes liveness for the entire block and 
2227         stores the resulting liveness at the head.
2228         (JSC::BytecodeLivenessAnalysis::runLivenessFixpoint): Runs backward flow liveness 
2229         analysis to fixpoint.
2230         (JSC::BytecodeLivenessAnalysis::getLivenessInfoForNonCapturedVarsAtBytecodeOffset): 
2231         Slow path to get liveness info for non-captured, non-argument variable.
2232         (JSC::BytecodeLivenessAnalysis::operandIsLiveAtBytecodeOffset): 
2233         (JSC::BytecodeLivenessAnalysis::getLivenessInfoAtBytecodeOffset): Returns the liveness 
2234         info for both captured and non-captured vars at a particular bytecode offset.
2235         (JSC::BytecodeLivenessAnalysis::dumpResults): Dumps the output of the liveness analysis. 
2236         Controlled by new flag in Options.h/.cpp.
2237         (JSC::BytecodeLivenessAnalysis::compute): Creates bytecode basic blocks and runs 
2238         full liveness analysis.
2239         * bytecode/BytecodeLivenessAnalysis.h: Added.
2240         (JSC::BytecodeLivenessAnalysis::hasBeenComputed):
2241         (JSC::BytecodeLivenessAnalysis::computeIfNecessary):
2242         * bytecode/CodeBlock.cpp:
2243         (JSC::CodeBlock::CodeBlock):
2244         * bytecode/CodeBlock.h:
2245         (JSC::CodeBlock::livenessAnalysis):
2246         * bytecode/PreciseJumpTargets.cpp: Refactored to be able to get the jump targets for 
2247         a particular bytecode offset for use during bytecode basic block construction.
2248         (JSC::getJumpTargetsForBytecodeOffset):
2249         (JSC::computePreciseJumpTargets):
2250         (JSC::findJumpTargetsForBytecodeOffset):
2251         * bytecode/PreciseJumpTargets.h:
2252         * runtime/Options.cpp:
2253         (JSC::Options::initialize):
2254         * runtime/Options.h:
2255
2256 2013-11-11  Andy Estes  <aestes@apple.com>
2257
2258         [iOS] Define JSC_OBJC_API_ENABLED
2259         https://bugs.webkit.org/show_bug.cgi?id=124192
2260
2261         Reviewed by Geoffrey Garen.
2262
2263         * API/JSBase.h: JSC_OBJC_API_ENABLED should evaluate to true if
2264         TARGET_OS_IPHONE is true.
2265         * API/JSValue.h: Ensure CG types referenced later in the file are defined.
2266
2267 2013-11-12  Balazs Kilvady  <kilvadyb@homejinni.com>
2268
2269         Fix undefined reference issues in JavaScriptCore build.
2270         https://bugs.webkit.org/show_bug.cgi?id=124152
2271
2272         Reviewed by Michael Saboff.
2273
2274         Missing includes added.
2275
2276         * runtime/SymbolTable.cpp:
2277
2278 2013-11-12  Alexandru Chiculita  <achicu@adobe.com>
2279
2280         Web Inspector: Crash when closing the Inspector while debugging an exception inside a breakpoint condition.
2281         https://bugs.webkit.org/show_bug.cgi?id=124078
2282
2283         Reviewed by Joseph Pecoraro.
2284
2285         The crash would happen because the Debugger is not designed to support nested
2286         breaks. For example, when the debugger handles a breakpoint and the Inspector
2287         executes a console command that would hit the breakpoint again, the Debugger
2288         will just ignore the breakpoint.
2289
2290         There were no checks for conditions and actions. Because of that conditions and actions
2291         could trigger exceptions and breakpoints. This patch disables that functionality as it
2292         cannot be supported without a bigger rewrite of the code.
2293
2294         * debugger/Debugger.cpp:
2295         (JSC::TemporaryPausedState::TemporaryPausedState):
2296         (JSC::TemporaryPausedState::~TemporaryPausedState):
2297         (JSC::Debugger::hasBreakpoint):
2298         (JSC::Debugger::pauseIfNeeded):
2299         * debugger/Debugger.h:
2300
2301 2013-11-12  Julien Brianceau  <jbriance@cisco.com>
2302
2303         InvalidIndex shouldn't be private in GPRInfo and FPRInfo for sh4, mips and arm64 architectures.
2304         https://bugs.webkit.org/show_bug.cgi?id=124156
2305
2306         Reviewed by Michael Saboff.
2307
2308         * jit/FPRInfo.h:
2309         (JSC::FPRInfo::debugName):
2310         * jit/GPRInfo.h:
2311         (JSC::GPRInfo::debugName):
2312
2313 2013-11-11  Andreas Kling  <akling@apple.com>
2314
2315         CodeBlock: Un-segment some Vectors.
2316         <https://webkit.org/b/124188>
2317
2318         Turn some SegmentedVectors into Vectors where the final item count
2319         is known at CodeBlock construction time. This removes unnecessary
2320         allocation and indirection.
2321
2322         I've got ~4.5 MB below SegmentedVector<ValueProfile>::ensureSegment
2323         on Membuster3 (peak, before pressure signal) so this should help
2324         take a bit of the edge off there.
2325
2326         Reviewed by Geoffrey Garen.
2327
2328 2013-11-11  Filip Pizlo  <fpizlo@apple.com>
2329
2330         Get rid of the lastResultRegister optimization in the baseline JIT
2331         https://bugs.webkit.org/show_bug.cgi?id=124171
2332
2333         Rubber stamped by Mark Hahnenberg.
2334         
2335         The baseline JIT no longer needs amazing throughput. And this optimization has caused
2336         way too many OSR exit bugs. And it constrains how much we can do in the DFG/FTL. So,
2337         I'm getting rid of it.
2338
2339         * dfg/DFGOSRExit.cpp:
2340         (JSC::DFG::OSRExit::OSRExit):
2341         (JSC::DFG::OSRExit::convertToForward):
2342         * dfg/DFGOSRExit.h:
2343         * dfg/DFGOSRExitCompiler32_64.cpp:
2344         (JSC::DFG::OSRExitCompiler::compileExit):
2345         * dfg/DFGOSRExitCompiler64.cpp:
2346         (JSC::DFG::OSRExitCompiler::compileExit):
2347         * dfg/DFGSpeculativeJIT.cpp:
2348         (JSC::DFG::SpeculativeJIT::SpeculativeJIT):
2349         (JSC::DFG::SpeculativeJIT::compileMovHint):
2350         (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
2351         * dfg/DFGSpeculativeJIT.h:
2352         * ftl/FTLLowerDFGToLLVM.cpp:
2353         (JSC::FTL::LowerDFGToLLVM::LowerDFGToLLVM):
2354         (JSC::FTL::LowerDFGToLLVM::compileZombieHint):
2355         (JSC::FTL::LowerDFGToLLVM::compileInvalidationPoint):
2356         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
2357         (JSC::FTL::LowerDFGToLLVM::observeMovHint):
2358         * ftl/FTLOSRExit.cpp:
2359         (JSC::FTL::OSRExit::OSRExit):
2360         (JSC::FTL::OSRExit::convertToForward):
2361         * ftl/FTLOSRExit.h:
2362         * ftl/FTLOSRExitCompiler.cpp:
2363         (JSC::FTL::compileStub):
2364         * jit/JIT.cpp:
2365         (JSC::JIT::JIT):
2366         (JSC::JIT::privateCompileMainPass):
2367         (JSC::JIT::privateCompileSlowCases):
2368         * jit/JIT.h:
2369         (JSC::JIT::appendCall):
2370         * jit/JITArithmetic32_64.cpp:
2371         (JSC::JIT::emit_op_lshift):
2372         (JSC::JIT::emitRightShift):
2373         (JSC::JIT::emit_op_bitand):
2374         (JSC::JIT::emit_op_bitor):
2375         (JSC::JIT::emit_op_bitxor):
2376         (JSC::JIT::emit_op_inc):
2377         (JSC::JIT::emit_op_dec):
2378         * jit/JITCall.cpp:
2379         (JSC::JIT::emitPutCallResult):
2380         (JSC::JIT::compileLoadVarargs):
2381         * jit/JITInlines.h:
2382         (JSC::JIT::emitGetFromCallFrameHeaderPtr):
2383         (JSC::JIT::emitGetFromCallFrameHeader32):
2384         (JSC::JIT::emitGetFromCallFrameHeader64):
2385         (JSC::JIT::emitLoadTag):
2386         (JSC::JIT::emitLoadPayload):
2387         (JSC::JIT::emitLoad2):
2388         (JSC::JIT::emitGetVirtualRegister):
2389         (JSC::JIT::emitGetVirtualRegisters):
2390         (JSC::JIT::emitPutVirtualRegister):
2391         * jit/JITOpcodes.cpp:
2392         (JSC::JIT::emit_op_mov):
2393         (JSC::JIT::emit_op_catch):
2394         (JSC::JIT::emit_op_new_func):
2395         * jit/JITOpcodes32_64.cpp:
2396         (JSC::JIT::emit_op_mov):
2397         (JSC::JIT::emit_op_to_primitive):
2398         (JSC::JIT::emit_op_to_number):
2399         (JSC::JIT::emit_op_catch):
2400         * jit/JITPropertyAccess.cpp:
2401         (JSC::JIT::emit_op_resolve_scope):
2402         (JSC::JIT::emit_op_get_from_scope):
2403         (JSC::JIT::emit_op_put_to_scope):
2404         * jit/JITPropertyAccess32_64.cpp:
2405         (JSC::JIT::emit_op_get_by_val):
2406         (JSC::JIT::emit_op_get_by_id):
2407         (JSC::JIT::emit_op_get_by_pname):
2408         (JSC::JIT::emitResolveClosure):
2409         (JSC::JIT::emit_op_resolve_scope):
2410         (JSC::JIT::emit_op_get_from_scope):
2411         (JSC::JIT::emit_op_init_global_const):
2412         * jit/SlowPathCall.h:
2413         (JSC::JITSlowPathCall::call):
2414
2415 2013-11-11  Filip Pizlo  <fpizlo@apple.com>
2416
2417         Remove ConstantFoldingPhase's weirdo compile-time optimization
2418         https://bugs.webkit.org/show_bug.cgi?id=124169
2419
2420         Reviewed by Mark Hahnenberg.
2421         
2422         It turns out that this compile-time optimization doesn't optimize compile times
2423         anymore. Kill it with fire.
2424
2425         * dfg/DFGConstantFoldingPhase.cpp:
2426         (JSC::DFG::ConstantFoldingPhase::foldConstants):
2427
2428 2013-11-11  Filip Pizlo  <fpizlo@apple.com>
2429
2430         Make bytecode dumping use the right opcode names for inc/dec.
2431
2432         Rubber stamped by Mark Hahnenberg.
2433
2434         * bytecode/CodeBlock.cpp:
2435         (JSC::CodeBlock::dumpBytecode):
2436
2437 2013-11-10  Filip Pizlo  <fpizlo@apple.com>
2438
2439         DFG Int52 boxing code may clobber the source without telling anyone
2440         https://bugs.webkit.org/show_bug.cgi?id=124137
2441
2442         Reviewed by Mark Hahnenberg.
2443
2444         * dfg/DFGSpeculativeJIT64.cpp:
2445         (JSC::DFG::SpeculativeJIT::boxInt52): This is called in places where source is expected to be unchanged. We never call this expecting super-amazing codegen. So, preserve the source's value the dumb way (by recovering it mathematically).
2446         * jit/AssemblyHelpers.h: Document the invariant for boxInt52.
2447         * jsc.cpp:
2448         (GlobalObject::finishCreation): It's been super annoying that sometimes we say noInline() and sometimes we say neverInlineFunction(). The LayoutTests harnesses ensure that we have something called noInline(), but it's great to also ensure that the shell has it.
2449
2450 2013-11-11  Oliver Hunt  <oliver@apple.com>
2451
2452         ExtJS breaks with modern Array.prototype.values API due to use of with()
2453         https://bugs.webkit.org/show_bug.cgi?id=123440
2454
2455         Reviewed by Beth Dakin.
2456
2457         As with our attempt to make Arguments use the Array prototype, ExtJS has
2458         a weird dependency on not adding new APIs to core types.  In this case
2459         Array.prototype.values.  The fix is to remove it, and push for ES6 to drop
2460         the API.
2461
2462         * runtime/ArrayPrototype.cpp:
2463
2464 2013-11-11  Gabor Rapcsanyi  <rgabor@webkit.org>
2465
2466         Fix CPU(ARM_TRADITIONAL) build after r159039.
2467         https://bugs.webkit.org/show_bug.cgi?id=124149
2468
2469         Reviewed by Geoffrey Garen.
2470
2471         * assembler/ARMAssembler.h:
2472         (JSC::ARMAssembler::firstRegister):
2473         (JSC::ARMAssembler::lastRegister):
2474         (JSC::ARMAssembler::firstFPRegister):
2475         (JSC::ARMAssembler::lastFPRegister):
2476         * assembler/MacroAssemblerARM.h:
2477         * jit/FPRInfo.h:
2478
2479 2013-11-09  Filip Pizlo  <fpizlo@apple.com>
2480
2481         Switch FTL GetById/PutById IC's over to using AnyRegCC
2482         https://bugs.webkit.org/show_bug.cgi?id=124094
2483
2484         Reviewed by Sam Weinig.
2485         
2486         This closes the loop on inline caches (IC's) in the FTL. The goal is to have IC's
2487         in LLVM-generated code that are just as efficient (if not more so) than what a
2488         custom JIT could do. As in zero sources of overhead. Not a single extra instruction
2489         or even register allocation pathology. We accomplish this by having two thingies in
2490         LLVM. First is the llvm.experimental.patchpoint intrinsic, which is sort of an
2491         inline machine code snippet that we can fill in with whatever we want and then
2492         modify subsequently. But you have only two choices of how to pass values to a
2493         patchpoint: (1) via the calling convention or (2) via the stackmap. Neither are good
2494         for operands to an IC (like the base pointer for a GetById, for example). (1) is bad
2495         because it results in things being pinned to certain registers a priori; a custom
2496         JIT (like the DFG) will not pin IC operands to any registers a priori but will allow
2497         the register allocator to do whatever it wants. (2) is bad because the operands may
2498         be spilled or may be represented in other crazy ways. You generally want an IC to
2499         have its operands in registers. Also, patchpoints only return values using the
2500         calling convention, which is unfortunate since it pins the return value to a
2501         register a priori. This is where the second thingy comes in: the AnyRegCC. This is
2502         a special calling convention only for use with patchpoints. It means that arguments
2503         passed "by CC" in the patchpoint can be placed in any register, and the register
2504         that gets used is reported as part of the stackmap. It also means that the return
2505         value (if there is one) can be placed in any register, and the stackmap will tell
2506         you which one it was. Thus, patchpoints combined with AnyRegCC mean that you not
2507         only get the kind of self-modifying code that you want for IC's, but you also get
2508         all of the register allocation goodness that a custom JIT would have given you.
2509         Except that you're getting it from LLVM and not a custom JIT. Awesome.
2510         
2511         Even though all of the fun stuff is on the LLVM side, this patch was harder than
2512         you'd expect.
2513         
2514         First the obvious bits:
2515         
2516         - IC patchpoints now use AnyRegCC instead of the C CC. (CC = calling convention.)
2517         
2518         - FTL::fixFunctionBasedOnStackMaps() now correctly figures out which registers the
2519           IC is supposed to use instead of assuming C CC argument registers.
2520         
2521         And then all of the stuff that broke and that this patch fixes:
2522         
2523         - IC sizing based on generating a dummy IC (what FTLInlineCacheSize did) is totally
2524           bad on x86-64, where various register permutations lead to bizarre header bytes
2525           and eclectic SIB encodings. I changed that to have magic constants, for now.
2526         
2527         - Slow path calls didn't preserve the CC return register.
2528         
2529         - Repatch's scratch register allocation would get totally confused if the operand
2530           registers weren't one of the DFG-style "temp" registers. And by "totally confused"
2531           I mean that it would crash.
2532         
2533         - We assumed that r10 is callee-saved. It's not. That one dude's PPT about x86-64
2534           cdecl that I found on the intertubes was not a trustworthy source of information,
2535           apparently.
2536         
2537         - Call repatching didn't know that the FTL does its IC slow calls via specially
2538           generated thunks. This was particularly fun to fix: basically, now when we relink
2539           an IC call in the FTL, we use the old call target to find the SlowPathCallKey,
2540           which tells us everything we need to know to generate (or look up) a new thunk for
2541           the new function we want to call.
2542         
2543         * assembler/MacroAssemblerCodeRef.h:
2544         (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr):
2545         (JSC::MacroAssemblerCodePtr::isEmptyValue):
2546         (JSC::MacroAssemblerCodePtr::isDeletedValue):
2547         (JSC::MacroAssemblerCodePtr::hash):
2548         (JSC::MacroAssemblerCodePtr::emptyValue):
2549         (JSC::MacroAssemblerCodePtr::deletedValue):
2550         (JSC::MacroAssemblerCodePtrHash::hash):
2551         (JSC::MacroAssemblerCodePtrHash::equal):
2552         * assembler/MacroAssemblerX86Common.h:
2553         * assembler/RepatchBuffer.h:
2554         (JSC::RepatchBuffer::RepatchBuffer):
2555         (JSC::RepatchBuffer::codeBlock):
2556         * ftl/FTLAbbreviations.h:
2557         (JSC::FTL::setInstructionCallingConvention):
2558         * ftl/FTLCompile.cpp:
2559         (JSC::FTL::fixFunctionBasedOnStackMaps):
2560         * ftl/FTLInlineCacheSize.cpp:
2561         (JSC::FTL::sizeOfGetById):
2562         (JSC::FTL::sizeOfPutById):
2563         * ftl/FTLJITFinalizer.cpp:
2564         (JSC::FTL::JITFinalizer::finalizeFunction):
2565         * ftl/FTLLocation.cpp:
2566         (JSC::FTL::Location::forStackmaps):
2567         * ftl/FTLLocation.h:
2568         * ftl/FTLLowerDFGToLLVM.cpp:
2569         (JSC::FTL::LowerDFGToLLVM::compileGetById):
2570         (JSC::FTL::LowerDFGToLLVM::compilePutById):
2571         * ftl/FTLOSRExitCompiler.cpp:
2572         (JSC::FTL::compileStub):
2573         * ftl/FTLSlowPathCall.cpp:
2574         * ftl/FTLSlowPathCallKey.h:
2575         (JSC::FTL::SlowPathCallKey::withCallTarget):
2576         * ftl/FTLStackMaps.cpp:
2577         (JSC::FTL::StackMaps::Location::directGPR):
2578         (JSC::FTL::StackMaps::Location::restoreInto):
2579         * ftl/FTLStackMaps.h:
2580         * ftl/FTLThunks.h:
2581         (JSC::FTL::generateIfNecessary):
2582         (JSC::FTL::keyForThunk):
2583         (JSC::FTL::Thunks::keyForSlowPathCallThunk):
2584         * jit/FPRInfo.h:
2585         (JSC::FPRInfo::toIndex):
2586         * jit/GPRInfo.h:
2587         (JSC::GPRInfo::toIndex):
2588         (JSC::GPRInfo::debugName):
2589         * jit/RegisterSet.cpp:
2590         (JSC::RegisterSet::calleeSaveRegisters):
2591         * jit/RegisterSet.h:
2592         (JSC::RegisterSet::filter):
2593         * jit/Repatch.cpp:
2594         (JSC::readCallTarget):
2595         (JSC::repatchCall):
2596         (JSC::repatchByIdSelfAccess):
2597         (JSC::tryCacheGetByID):
2598         (JSC::tryCachePutByID):
2599         (JSC::tryBuildPutByIdList):
2600         (JSC::resetGetByID):
2601         (JSC::resetPutByID):
2602         * jit/ScratchRegisterAllocator.h:
2603         (JSC::ScratchRegisterAllocator::lock):
2604
2605 2013-11-10  Oliver Hunt  <oliver@apple.com>
2606
2607         Implement Set iterators
2608         https://bugs.webkit.org/show_bug.cgi?id=124129
2609
2610         Reviewed by Antti Koivisto.
2611
2612         Add Set iterator classes and implementations
2613
2614         * JavaScriptCore.xcodeproj/project.pbxproj:
2615         * runtime/CommonIdentifiers.h:
2616         * runtime/JSGlobalObject.cpp:
2617         * runtime/JSGlobalObject.h:
2618         * runtime/JSSetIterator.cpp: Added.
2619         (JSC::JSSetIterator::finishCreation):
2620         (JSC::JSSetIterator::visitChildren):
2621         (JSC::JSSetIterator::createPair):
2622         * runtime/JSSetIterator.h: Added.
2623         (JSC::JSSetIterator::createStructure):
2624         (JSC::JSSetIterator::create):
2625         (JSC::JSSetIterator::next):
2626         (JSC::JSSetIterator::JSSetIterator):
2627         * runtime/SetIteratorConstructor.cpp: Added.
2628         (JSC::SetIteratorConstructor::finishCreation):
2629         * runtime/SetIteratorConstructor.h: Added.
2630         (JSC::SetIteratorConstructor::create):
2631         (JSC::SetIteratorConstructor::createStructure):
2632         (JSC::SetIteratorConstructor::SetIteratorConstructor):
2633         * runtime/SetIteratorPrototype.cpp: Added.
2634         (JSC::SetIteratorPrototype::finishCreation):
2635         (JSC::SetIteratorPrototypeFuncIterator):
2636         (JSC::SetIteratorPrototypeFuncNext):
2637         * runtime/SetIteratorPrototype.h: Added.
2638         (JSC::SetIteratorPrototype::create):
2639         (JSC::SetIteratorPrototype::createStructure):
2640         (JSC::SetIteratorPrototype::SetIteratorPrototype):
2641         * runtime/SetPrototype.cpp:
2642         (JSC::SetPrototype::finishCreation):
2643         (JSC::setProtoFuncValues):
2644         (JSC::setProtoFuncEntries):
2645         (JSC::setProtoFuncKeys):
2646
2647 2013-11-09  Oliver Hunt  <oliver@apple.com>
2648
2649         Add Map Iterators
2650         https://bugs.webkit.org/show_bug.cgi?id=124109
2651
2652         Reviewed by Andreas Kling.
2653
2654         Added new Map iterator implementation.  This is a mostly boilerplate patch
2655         however there's a a little bit of additional logic added to the MapData iterator
2656         to deal with the possibility of map mutation between creation of the iterator
2657         and use of it.  We'll be able to improve the performance of this substantially
2658         by using intrinsics, however I'm pondering coming up with a better way to define
2659         these thunks without requiring so much duplicated logic.
2660
2661         * CMakeLists.txt:
2662         * GNUmakefile.list.am:
2663         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
2664         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
2665         * JavaScriptCore.xcodeproj/project.pbxproj:
2666         * runtime/CommonIdentifiers.h:
2667         * runtime/JSGlobalObject.cpp:
2668         * runtime/JSGlobalObject.h:
2669         * runtime/JSMapIterator.cpp: Added.
2670         (JSC::JSMapIterator::finishCreation):
2671         (JSC::JSMapIterator::visitChildren):
2672         (JSC::JSMapIterator::createPair):
2673         * runtime/JSMapIterator.h: Added.
2674         (JSC::JSMapIterator::createStructure):
2675         (JSC::JSMapIterator::create):
2676         (JSC::JSMapIterator::next):
2677         (JSC::JSMapIterator::JSMapIterator):
2678         * runtime/MapData.h:
2679         (JSC::MapData::const_iterator::ensureSlot):
2680         * runtime/MapIteratorConstructor.cpp: Added.
2681         (JSC::MapIteratorConstructor::finishCreation):
2682         * runtime/MapIteratorConstructor.h: Added.
2683         (JSC::MapIteratorConstructor::create):
2684         (JSC::MapIteratorConstructor::createStructure):
2685         (JSC::MapIteratorConstructor::MapIteratorConstructor):
2686         * runtime/MapIteratorPrototype.cpp: Added.
2687         (JSC::MapIteratorPrototype::finishCreation):
2688         (JSC::MapIteratorPrototypeFuncIterator):
2689         (JSC::MapIteratorPrototypeFuncNext):
2690         * runtime/MapIteratorPrototype.h: Added.
2691         (JSC::MapIteratorPrototype::create):
2692         (JSC::MapIteratorPrototype::createStructure):
2693         (JSC::MapIteratorPrototype::MapIteratorPrototype):
2694         * runtime/MapPrototype.cpp:
2695         (JSC::MapPrototype::finishCreation):
2696         (JSC::mapProtoFuncValues):
2697         (JSC::mapProtoFuncEntries):
2698         (JSC::mapProtoFuncKeys):
2699
2700 2013-11-08  Zan Dobersek  <zdobersek@igalia.com>
2701
2702         Unreviewed GTK build fix.
2703
2704         * GNUmakefile.list.am: Remove redundant build targets.
2705
2706 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
2707
2708         Remove dead FTL C ABI support
2709         https://bugs.webkit.org/show_bug.cgi?id=124100
2710
2711         Reviewed by Jer Noble.
2712
2713         * JavaScriptCore.xcodeproj/project.pbxproj:
2714         * ftl/FTLCArgumentGetter.cpp: Removed.
2715         * ftl/FTLCArgumentGetter.h: Removed.
2716         * ftl/FTLOSRExitCompiler.cpp:
2717         * jit/FPRInfo.h:
2718
2719 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
2720
2721         FTL should support Phantom(FinalObject:)
2722         https://bugs.webkit.org/show_bug.cgi?id=124092
2723
2724         Reviewed by Oliver Hunt.
2725
2726         * ftl/FTLAbstractHeapRepository.h:
2727         * ftl/FTLCapabilities.cpp:
2728         (JSC::FTL::canCompile):
2729         * ftl/FTLLowerDFGToLLVM.cpp:
2730         (JSC::FTL::LowerDFGToLLVM::speculate):
2731         (JSC::FTL::LowerDFGToLLVM::isType):
2732         (JSC::FTL::LowerDFGToLLVM::isNotType):
2733         (JSC::FTL::LowerDFGToLLVM::speculateFinalObject):
2734
2735 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
2736
2737         Get rid of the FTL tail call APIs since they are unused
2738         https://bugs.webkit.org/show_bug.cgi?id=124093
2739
2740         Reviewed by Oliver Hunt.
2741
2742         * ftl/FTLAbbreviations.h:
2743         (JSC::FTL::buildCall):
2744         * ftl/FTLOutput.h:
2745
2746 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
2747
2748         FTL should support AllocatePropertyStorage
2749         https://bugs.webkit.org/show_bug.cgi?id=124086
2750
2751         Reviewed by Oliver Hunt.
2752         
2753         Also rationalized some offsets in the DFG.
2754
2755         * dfg/DFGSpeculativeJIT.cpp:
2756         (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage):
2757         (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage):
2758         * ftl/FTLCapabilities.cpp:
2759         (JSC::FTL::canCompile):
2760         * ftl/FTLIntrinsicRepository.h:
2761         * ftl/FTLLowerDFGToLLVM.cpp:
2762         (JSC::FTL::LowerDFGToLLVM::compileNode):
2763         (JSC::FTL::LowerDFGToLLVM::compileAllocatePropertyStorage):
2764
2765 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
2766
2767         Get rid of the bizarre Darwin/x86-only MacroAssembler::shouldBlindForSpecificArch(uintptr_t) overload
2768         https://bugs.webkit.org/show_bug.cgi?id=124087
2769
2770         Reviewed by Michael Saboff.
2771
2772         * assembler/MacroAssembler.h:
2773         (JSC::MacroAssembler::shouldBlindPointerForSpecificArch):
2774         (JSC::MacroAssembler::shouldBlind):
2775         * assembler/MacroAssemblerX86Common.h:
2776         (JSC::MacroAssemblerX86Common::shouldBlindForSpecificArch):
2777
2778 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
2779
2780         FTL should support NewArrayBuffer
2781         https://bugs.webkit.org/show_bug.cgi?id=124067
2782
2783         Reviewed by Michael Saboff.
2784         
2785         This expanded coverage and revealed some bugs.
2786         
2787         This revealed a bug in FTL::OSRExitCompiler where it was assuming that it could save
2788         the framePointer in regT3 even though DFG::reifyInlinedCallFrames() would clobber it.
2789         It turns out that this can be fixed by just completely restoring the stack prior to
2790         doing reifyInlineCallFrames().
2791         
2792         I used this as an opportunity to simplify NewArray. That revealed a bug; whenever we say
2793         lowJSValue() in there we need to use ManualOperandSpeculation since we're using it to
2794         rebox values even when we also have to do some speculations. The speculations are done
2795         at the top of compileNewArray().
2796         
2797         This also revealed a bug in StringCharAt() for the OOB case.
2798
2799         * ftl/FTLAbstractHeapRepository.h:
2800         (JSC::FTL::AbstractHeapRepository::forIndexingType):
2801         * ftl/FTLCapabilities.cpp:
2802         (JSC::FTL::canCompile):
2803         * ftl/FTLIntrinsicRepository.h:
2804         * ftl/FTLLowerDFGToLLVM.cpp:
2805         (JSC::FTL::LowerDFGToLLVM::compileNode):
2806         (JSC::FTL::LowerDFGToLLVM::compileNewArray):
2807         (JSC::FTL::LowerDFGToLLVM::compileNewArrayBuffer):
2808         (JSC::FTL::LowerDFGToLLVM::compileStringCharAt):
2809         * ftl/FTLOSRExitCompiler.cpp:
2810         (JSC::FTL::compileStub):
2811
2812 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
2813
2814         It should be easy to disable blinding on a per-architecture basis
2815         https://bugs.webkit.org/show_bug.cgi?id=124083
2816
2817         Reviewed by Michael Saboff.
2818
2819         * assembler/AbstractMacroAssembler.h:
2820         (JSC::AbstractMacroAssembler::haveScratchRegisterForBlinding):
2821         (JSC::AbstractMacroAssembler::scratchRegisterForBlinding):
2822         (JSC::AbstractMacroAssembler::canBlind):
2823         (JSC::AbstractMacroAssembler::shouldBlindForSpecificArch):
2824         * assembler/MacroAssembler.h:
2825         (JSC::MacroAssembler::shouldBlind):
2826         (JSC::MacroAssembler::store32):
2827         (JSC::MacroAssembler::branch32):
2828         (JSC::MacroAssembler::branchAdd32):
2829         (JSC::MacroAssembler::branchMul32):
2830         * assembler/MacroAssemblerX86Common.h:
2831         (JSC::MacroAssemblerX86Common::canBlind):
2832         * assembler/MacroAssemblerX86_64.h:
2833         (JSC::MacroAssemblerX86_64::haveScratchRegisterForBlinding):
2834
2835 2013-11-08  Oliver Hunt  <oliver@apple.com>
2836
2837         Remove more accidentally added files.
2838
2839         * runtime/SetIteratorConstructor.cpp: Removed.
2840         * runtime/SetIteratorConstructor.h: Removed.
2841         * runtime/SetIteratorPrototype.cpp: Removed.
2842         * runtime/SetIteratorPrototype.h: Removed.
2843
2844 2013-11-08  Oliver Hunt  <oliver@apple.com>
2845
2846         Remove accidentally added files.
2847
2848         * runtime/JSSetIterator.cpp: Removed.
2849         * runtime/JSSetIterator.h: Removed.
2850
2851 2013-11-08  Oliver Hunt  <oliver@apple.com>
2852
2853         Fix minor (unobservable) bug in ArrayIterator::next()
2854         https://bugs.webkit.org/show_bug.cgi?id=124061
2855
2856         Reviewed by Beth Dakin.
2857
2858         I noticed this while reading the array iterator code.  Due to how
2859         ArrayIterator::next() and our enumeration behaviour is implemented
2860         this is not actually a code path that can be hit.  But in order to
2861         future proof this it should be correct.
2862         
2863         * runtime/JSArrayIterator.cpp:
2864         (JSC::arrayIteratorNext):
2865
2866 2013-11-08  Mark Lam  <mark.lam@apple.com>
2867
2868         Move breakpoint (and exception break) functionality into JSC::Debugger.
2869         https://bugs.webkit.org/show_bug.cgi?id=121796.
2870
2871         Reviewed by Geoffrey Garen.
2872
2873         - In ScriptDebugServer and JSC::Debugger, SourceID and BreakpointID are
2874           now numeric tokens.
2875
2876         - JSC::Debugger now tracks user defined breakpoints in a JSC::Breakpoint
2877           record. Previously, this info is tracked in the ScriptBreakpoint record
2878           in ScriptDebugServer. The only element of ScriptBreakpoint that is not
2879           being tracked by JSC::Breakpoint is the ScriptBreakpointAction.
2880              The ScriptBreakpointAction is still tracked by the ScriptDebugServer
2881           in a list keyed on the corresponding BreakpointID.
2882              The ScriptBreakpoint record is now only used as a means of passing
2883           breakpoint paramaters to the ScriptDebugServer.
2884
2885         - ScriptDebugServer now no longer accesses the JSC::CallFrame* directly.
2886           It always goes through the DebuggerCallFrame.
2887
2888         * GNUmakefile.list.am:
2889         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
2890         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
2891         * JavaScriptCore.xcodeproj/project.pbxproj:
2892         * debugger/Breakpoint.h: Added.
2893         (JSC::Breakpoint::Breakpoint):
2894         - Breakpoint class to track info for each breakpoint in JSC::Debugger.
2895         * debugger/Debugger.cpp:
2896         (JSC::DebuggerCallFrameScope::DebuggerCallFrameScope):
2897         (JSC::DebuggerCallFrameScope::~DebuggerCallFrameScope):
2898         (JSC::Debugger::Debugger):
2899         (JSC::Debugger::detach):
2900         (JSC::Debugger::updateNeedForOpDebugCallbacks):
2901         (JSC::Debugger::setBreakpoint):
2902         (JSC::Debugger::removeBreakpoint):
2903         (JSC::Debugger::hasBreakpoint):
2904         (JSC::Debugger::clearBreakpoints):
2905         (JSC::Debugger::setBreakpointsActivated):
2906         (JSC::Debugger::setPauseOnExceptionsState):
2907         (JSC::Debugger::setPauseOnNextStatement):
2908         (JSC::Debugger::breakProgram):
2909         (JSC::Debugger::continueProgram):
2910         (JSC::Debugger::stepIntoStatement):
2911         (JSC::Debugger::stepOverStatement):
2912         (JSC::Debugger::stepOutOfFunction):
2913         (JSC::Debugger::updateCallFrame):
2914         (JSC::Debugger::updateCallFrameAndPauseIfNeeded):
2915         (JSC::Debugger::pauseIfNeeded):
2916         (JSC::Debugger::exception):
2917         (JSC::Debugger::atStatement):
2918         (JSC::Debugger::callEvent):
2919         (JSC::Debugger::returnEvent):
2920         (JSC::Debugger::willExecuteProgram):
2921         (JSC::Debugger::didExecuteProgram):
2922         (JSC::Debugger::didReachBreakpoint):
2923         (JSC::Debugger::currentDebuggerCallFrame):
2924         * debugger/Debugger.h:
2925         * debugger/DebuggerCallFrame.cpp:
2926         (JSC::DebuggerCallFrame::sourceID):
2927         (JSC::DebuggerCallFrame::sourceIDForCallFrame):
2928         * debugger/DebuggerCallFrame.h:
2929         * debugger/DebuggerPrimitives.h: Added.
2930         - define SourceID, noSourceID, BreakpointID, and noBreakpointID.
2931
2932 2013-11-08  Oliver Hunt  <oliver@apple.com>
2933
2934         Map.forEach crashes on deleted values
2935         https://bugs.webkit.org/show_bug.cgi?id=124017
2936
2937         Reviewed by Ryosuke Niwa.
2938
2939         MapData iterator did not consider the case of the first entries
2940         being holes.  To fix this I've refactored iteration so that we
2941         can perform an initialisation increment on construction, whle
2942         retaining the useful assertion in MapData::const_iterator::operator++
2943
2944         * runtime/MapData.h:
2945         (JSC::MapData::const_iterator::operator++):
2946         (JSC::MapData::const_iterator::internalIncrement):
2947         (JSC::MapData::const_iterator::const_iterator):
2948
2949 2013-11-08  Julien Brianceau  <jbriance@cisco.com>
2950
2951         REGRESSION(r158883): Fix crashes for ARM architecture.
2952         https://bugs.webkit.org/show_bug.cgi?id=124038
2953
2954         Reviewed by Michael Saboff.
2955
2956         * jit/GPRInfo.h: Remove r11 from the temporary register set, use a free register for
2957         nonPreservedNonReturnGPR and remove obsolete declaration of bucketCounterRegister.
2958         (JSC::GPRInfo::toRegister):
2959         (JSC::GPRInfo::toIndex):
2960         * jit/JITOperations.cpp: Frame pointer register is r11 for ARM_TRADITIONAL and
2961         r7 for ARM_THUMB2 instead of r5 since r158883.
2962
2963 2013-11-08  Julien Brianceau  <jbriance@cisco.com>
2964
2965         REGRESSION(r158883): Fix crashes for MIPS architecture.
2966         https://bugs.webkit.org/show_bug.cgi?id=124044
2967
2968         Reviewed by Michael Saboff.
2969
2970         * jit/JITOperations.cpp: Frame pointer register is fp instead of s0 since r158883 for MIPS.
2971         * jit/ThunkGenerators.cpp: Save and restore the new frame pointer register.
2972         (JSC::returnFromJavaScript):
2973         (JSC::callToJavaScript):
2974
2975 2013-11-08  peavo@outlook.com  <peavo@outlook.com>
2976
2977         [Win] JavaScript crash in getHostCallReturnValue.
2978         https://bugs.webkit.org/show_bug.cgi?id=124040
2979
2980         Reviewed by Geoffrey Garen.
2981
2982         * jit/JITOperations.cpp: Update MSVC assembler code in getHostCallReturnValue according to gcc x86 version.
2983
2984 2013-11-08  Julien Brianceau  <jbriance@cisco.com>
2985
2986         [mips] Fix typo (introduced in r158751).
2987         https://bugs.webkit.org/show_bug.cgi?id=124033.
2988
2989         Reviewed by Csaba Osztrogonác.
2990
2991         * jit/ThunkGenerators.cpp:
2992         (JSC::callToJavaScript):
2993
2994 2013-11-08  Julien Brianceau  <jbriance@cisco.com>
2995
2996         [arm] Use specific PatchableJump implementation for CPU(ARM_TRADITIONAL).
2997         https://bugs.webkit.org/show_bug.cgi?id=123891
2998
2999         Reviewed by Michael Saboff.
3000
3001         Although patchableBranch32 is implemented in MacroAssemblerARM.h, the used implementation
3002         is the generic one in MacroAssembler.h. This patch fixes it and also implements the
3003         patchableJump() function for CPU(ARM_TRADITIONAL). These specific implementations are
3004         needed for this architecture backend to ensure that these jumps can be relinked.
3005
3006         * assembler/MacroAssembler.h:
3007         * assembler/MacroAssemblerARM.h:
3008         (JSC::MacroAssemblerARM::patchableJump):
3009         * jit/GPRInfo.h: Remove static_cast that are generating warnings in debug builds.
3010         (JSC::GPRInfo::toIndex):
3011         (JSC::GPRInfo::debugName):
3012
3013 2013-11-07  Mark Lam  <mark.lam@apple.com>
3014
3015         Get rid of the regT* definitions in JSInterfaceJIT.h.
3016         https://bugs.webkit.org/show_bug.cgi?id=123806.
3017
3018         Reviewed by Geoffrey Garen.
3019
3020         JSInterfaceJIT now inherits from GPRInfo and FPRInfo, and relies on them
3021         to provide all the register definitions.
3022
3023         * jit/GPRInfo.h:
3024         (JSC::GPRInfo::toArgumentRegister):
3025         * jit/JIT.cpp:
3026         (JSC::JIT::emitEnterOptimizationCheck):
3027         (JSC::JIT::privateCompile):
3028         * jit/JITArithmetic.cpp:
3029         (JSC::JIT::emit_compareAndJumpSlow):
3030         * jit/JITArithmetic32_64.cpp:
3031         (JSC::JIT::emit_compareAndJumpSlow):
3032         * jit/JITCall.cpp:
3033         (JSC::JIT::compileLoadVarargs):
3034         * jit/JITCall32_64.cpp:
3035         (JSC::JIT::compileLoadVarargs):
3036         * jit/JITInlines.h:
3037         (JSC::JIT::appendCallWithExceptionCheckSetJSValueResult):
3038         (JSC::JIT::appendCallWithExceptionCheckSetJSValueResultWithProfile):
3039         * jit/JITOpcodes.cpp:
3040         (JSC::JIT::emit_op_end):
3041         (JSC::JIT::emitSlow_op_new_object):
3042         (JSC::JIT::emit_op_ret):
3043         (JSC::JIT::emit_op_ret_object_or_this):
3044         (JSC::JIT::emit_op_throw):
3045         (JSC::JIT::emit_op_get_pnames):
3046         (JSC::JIT::emit_op_switch_imm):
3047         (JSC::JIT::emit_op_switch_char):
3048         (JSC::JIT::emit_op_switch_string):
3049         (JSC::JIT::emit_op_create_activation):
3050         (JSC::JIT::emit_op_create_arguments):
3051         (JSC::JIT::emitSlow_op_jfalse):
3052         (JSC::JIT::emitSlow_op_jtrue):
3053         (JSC::JIT::emitSlow_op_eq):
3054         (JSC::JIT::emitSlow_op_neq):
3055         (JSC::JIT::emitSlow_op_get_argument_by_val):
3056         (JSC::JIT::emitSlow_op_loop_hint):
3057         * jit/JITOpcodes32_64.cpp:
3058         (JSC::JIT::privateCompileCTINativeCall):
3059         (JSC::JIT::emit_op_end):
3060         (JSC::JIT::emitSlow_op_new_object):
3061         (JSC::JIT::emitSlow_op_jfalse):
3062         (JSC::JIT::emitSlow_op_jtrue):
3063         (JSC::JIT::emitSlow_op_eq):
3064         (JSC::JIT::emitSlow_op_neq):
3065         (JSC::JIT::emit_op_throw):
3066         (JSC::JIT::emit_op_get_pnames):
3067         (JSC::JIT::emit_op_switch_imm):
3068         (JSC::JIT::emit_op_switch_char):
3069         (JSC::JIT::emit_op_switch_string):
3070         (JSC::JIT::emit_op_create_activation):
3071         (JSC::JIT::emit_op_create_arguments):
3072         (JSC::JIT::emitSlow_op_get_argument_by_val):
3073         * jit/JSInterfaceJIT.h:
3074         (JSC::JSInterfaceJIT::JSInterfaceJIT):
3075         * jit/SlowPathCall.h:
3076         (JSC::JITSlowPathCall::call):
3077         * jit/ThunkGenerators.cpp:
3078
3079 2013-11-07  Filip Pizlo  <fpizlo@apple.com>
3080
3081         FTL should support NewArray
3082         https://bugs.webkit.org/show_bug.cgi?id=124010
3083
3084         Reviewed by Oliver Hunt.
3085
3086         * ftl/FTLCapabilities.cpp:
3087         (JSC::FTL::canCompile):
3088         * ftl/FTLIntrinsicRepository.h:
3089         * ftl/FTLLowerDFGToLLVM.cpp:
3090         (JSC::FTL::LowerDFGToLLVM::compileNode):
3091         (JSC::FTL::LowerDFGToLLVM::compileNewObject):
3092         (JSC::FTL::LowerDFGToLLVM::compileNewArray):
3093         (JSC::FTL::LowerDFGToLLVM::allocateCell):
3094         (JSC::FTL::LowerDFGToLLVM::allocateObject):
3095         (JSC::FTL::LowerDFGToLLVM::allocateBasicStorageAndGetEnd):
3096         (JSC::FTL::LowerDFGToLLVM::ArrayValues::ArrayValues):
3097         (JSC::FTL::LowerDFGToLLVM::allocateJSArray):
3098         * ftl/FTLOutput.h:
3099         (JSC::FTL::Output::loadDouble):
3100         (JSC::FTL::Output::storeDouble):
3101
3102 2013-11-07  Michael Saboff  <msaboff@apple.com>
3103
3104         Change CallFrameRegister to architected frame pointer register
3105         https://bugs.webkit.org/show_bug.cgi?id=123956
3106
3107         Reviewed by Geoffrey Garen.
3108
3109         Changed X86 and ARM variants as well as MIPS to use their respective architected
3110         frame pointer registers.  The freed up callFrameRegisteris are made available to 
3111         the DFG register allocator.  Modified the FTL OSR exit compiler to use a temporary
3112         register as a stand in for the destination callFrameRegister since the FTL frame
3113         pointer register is needed to extract values from the FTL stack.
3114
3115         Reviewed by Geoffrey Garen.
3116
3117         * assembler/ARMAssembler.h:
3118         * assembler/ARMv7Assembler.h:
3119         * assembler/MacroAssemblerMIPS.h:
3120         * ftl/FTLOSRExitCompiler.cpp:
3121         (JSC::FTL::compileStub):
3122         * jit/AssemblyHelpers.h:
3123         (JSC::AssemblyHelpers::addressFor):
3124         * jit/GPRInfo.h:
3125         (JSC::GPRInfo::toRegister):
3126         (JSC::GPRInfo::toIndex):
3127         * jit/JITOperations.cpp:
3128         * jit/JSInterfaceJIT.h:
3129         * jit/ThunkGenerators.cpp:
3130         (JSC::callToJavaScript):
3131         * offlineasm/arm.rb:
3132         * offlineasm/arm64.rb:
3133         * offlineasm/mips.rb:
3134         * offlineasm/x86.rb:
3135
3136 2013-11-07  Oliver Hunt  <oliver@apple.com>
3137
3138         Reproducible crash when using Map (affects Web Inspector)
3139         https://bugs.webkit.org/show_bug.cgi?id=123940
3140
3141         Reviewed by Geoffrey Garen.
3142
3143         Trivial fix.  Once again we get bitten by attempting to be clever when
3144         growing while adding entries to indexing maps.
3145
3146         Now we simply do a find(), and then add() _after_ we've ensured there is
3147         sufficient space in the MapData list.
3148
3149         * runtime/MapData.cpp:
3150         (JSC::MapData::add):
3151
3152 2013-11-07  Mark Lam  <mark.lam@apple.com>
3153
3154         Cosmetic: rename xxxId to xxxID for ScriptId, SourceId, and BreakpointId.
3155         https://bugs.webkit.org/show_bug.cgi?id=123945.
3156
3157         Reviewed by Geoffrey Garen.
3158
3159         * debugger/DebuggerCallFrame.cpp:
3160         (JSC::DebuggerCallFrame::sourceID):
3161         (JSC::DebuggerCallFrame::sourceIDForCallFrame):
3162         * debugger/DebuggerCallFrame.h:
3163
3164 2013-11-07  Michael Saboff  <msaboff@apple.com>
3165
3166         returnFromJavaScript() for ARM_THUMB2 uses push()s which should be pop()s
3167         https://bugs.webkit.org/show_bug.cgi?id=124006
3168
3169         Rubber stamped by Mark Hahnenberg.
3170
3171         Changed the push() calls to pop().
3172
3173         * jit/ThunkGenerators.cpp:
3174         (JSC::returnFromJavaScript):
3175
3176 2013-11-07  Michael Saboff  <msaboff@apple.com>
3177
3178         Remove unneeded moving of ESP to ECX in callToJavaScript for COMPILER(MSVC)
3179         https://bugs.webkit.org/show_bug.cgi?id=123998
3180
3181         Reviewed by Mark Lam.
3182
3183         Dead code removal.  Passing esp as the first "C" argument to a JavaScript
3184         function is no longer needed.
3185
3186         * jit/ThunkGenerators.cpp:
3187         (JSC::callToJavaScript):
3188
3189 2013-11-07  Julien Brianceau  <jbriance@cisco.com>
3190
3191         Fix build for architectures with 4 argument registers (broken since r158820).
3192         https://bugs.webkit.org/show_bug.cgi?id=123969
3193
3194         Reviewed by Andreas Kling.
3195
3196         * jit/CCallHelpers.h:
3197         (JSC::CCallHelpers::setupArguments):
3198
3199 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
3200
3201         FTL should support CheckFunction
3202         https://bugs.webkit.org/show_bug.cgi?id=123862
3203
3204         Reviewed by Sam Weinig.
3205
3206         * ftl/FTLCapabilities.cpp:
3207         (JSC::FTL::canCompile):
3208         * ftl/FTLLowerDFGToLLVM.cpp:
3209         (JSC::FTL::LowerDFGToLLVM::compileNode):
3210         (JSC::FTL::LowerDFGToLLVM::compileCheckFunction):
3211
3212 2013-11-06  Filip Pizlo  <fpizlo@apple.com>
3213
3214         IC code should handle the call frame register not being the callFrameRegister
3215         https://bugs.webkit.org/show_bug.cgi?id=123865
3216
3217         Reviewed by Geoffrey Garen.
3218         
3219         For now, in the FTL, the call frame may be something other than our frame pointer,
3220         since it's an argument passed in according to whatever convention LLVM picks.
3221         
3222         This is temporary in two ways - pretty soon the callFrameRegister will be the actual
3223         frame pointer and not some other register, and LLVM will not pass the frame pointer
3224         as an argument to IC's.
3225
3226         * bytecode/StructureStubInfo.h:
3227         * dfg/DFGSpeculativeJIT32_64.cpp:
3228         (JSC::DFG::SpeculativeJIT::cachedGetById):
3229         (JSC::DFG::SpeculativeJIT::cachedPutById):
3230         * dfg/DFGSpeculativeJIT64.cpp:
3231         (JSC::DFG::SpeculativeJIT::cachedGetById):
3232         (JSC::DFG::SpeculativeJIT::cachedPutById):
3233         * ftl/FTLCompile.cpp:
3234         (JSC::FTL::fixFunctionBasedOnStackMaps):
3235         * ftl/FTLInlineCacheSize.cpp:
3236         (JSC::FTL::sizeOfGetById):
3237         (JSC::FTL::sizeOfPutById):
3238         * jit/CCallHelpers.h:
3239         (JSC::CCallHelpers::setupArguments):
3240         * jit/JITInlineCacheGenerator.cpp:
3241         (JSC::JITByIdGenerator::JITByIdGenerator):
3242         (JSC::JITPutByIdGenerator::JITPutByIdGenerator):
3243         * jit/JITInlineCacheGenerator.h:
3244         (JSC::JITGetByIdGenerator::JITGetByIdGenerator):
3245         * jit/JITPropertyAccess.cpp:
3246         (JSC::JIT::emit_op_get_by_id):
3247         (JSC::JIT::emit_op_put_by_id):
3248         * jit/JITPropertyAccess32_64.cpp:
3249         (JSC::JIT::emit_op_get_by_id):
3250         (JSC::JIT::emit_op_put_by_id):
3251         * jit/Repatch.cpp:
3252         (JSC::tryBuildGetByIDList):
3253         (JSC::emitPutTransitionStub):
3254
3255 2013-11-06  Daniel Bates  <dabates@apple.com>
3256
3257         [iOS] Upstream Letterpress effect
3258         https://bugs.webkit.org/show_bug.cgi?id=123932
3259
3260         Reviewed by Sam Weinig.
3261
3262         Add feature define ENABLE_LETTERPRESS disabled by default. We only enable
3263         letterpress on iOS.
3264
3265         * Configurations/FeatureDefines.xcconfig:
3266
3267 2013-11-05  Oliver Hunt  <oliver@apple.com>
3268
3269         Support iteration of the Arguments object
3270         https://bugs.webkit.org/show_bug.cgi?id=123835
3271
3272         Reviewed by Mark Lam.
3273
3274         Add an ArgumentsIterator object, and associated classes so that we can support
3275         iteration of the arguments object.
3276
3277         This is a largely mechanical patch.  The only gnarliness is in the
3278         logic to avoid reifying the Arguments object in for(... of arguments)
3279         scenarios.
3280
3281         * GNUmakefile.list.am:
3282         * JavaScriptCore.xcodeproj/project.pbxproj:
3283         * bytecompiler/BytecodeGenerator.cpp:
3284         (JSC::BytecodeGenerator::emitEnumeration):
3285         * runtime/Arguments.cpp:
3286         (JSC::Arguments::getOwnPropertySlot):
3287         (JSC::argumentsFuncIterator):
3288         * runtime/Arguments.h:
3289         * runtime/ArgumentsIteratorConstructor.cpp: Added.
3290         (JSC::ArgumentsIteratorConstructor::finishCreation):
3291         * runtime/ArgumentsIteratorConstructor.h: Added.
3292         (JSC::ArgumentsIteratorConstructor::create):
3293         (JSC::ArgumentsIteratorConstructor::createStructure):
3294         (JSC::ArgumentsIteratorConstructor::ArgumentsIteratorConstructor):
3295         * runtime/ArgumentsIteratorPrototype.cpp: Added.
3296         (JSC::ArgumentsIteratorPrototype::finishCreation):
3297         (JSC::argumentsIteratorPrototypeFuncIterator):
3298         (JSC::argumentsIteratorPrototypeFuncNext):
3299         * runtime/ArgumentsIteratorPrototype.h: Added.
3300         (JSC::ArgumentsIteratorPrototype::create):
3301         (JSC::ArgumentsIteratorPrototype::createStructure):
3302         (JSC::ArgumentsIteratorPrototype::ArgumentsIteratorPrototype):
3303         * runtime/CommonIdentifiers.h:
3304         * runtime/JSArgumentsIterator.cpp: Added.
3305         (JSC::JSArgumentsIterator::finishCreation):
3306         * runtime/JSArgumentsIterator.h: Added.
3307         (JSC::JSArgumentsIterator::createStructure):
3308         (JSC::JSArgumentsIterator::create):
3309         (JSC::JSArgumentsIterator::next):
3310         (JSC::JSArgumentsIterator::JSArgumentsIterator):
3311         * runtime/JSArrayIterator.cpp:
3312         (JSC::createIteratorResult):
3313         * runtime/JSGlobalObject.cpp:
3314         * runtime/JSGlobalObject.h:
3315
3316 2013-11-06  Filip Pizlo  <fpizlo@apple.com>
3317
3318         DFG CheckArray(NonArray) should prove that the child isn't an array
3319         https://bugs.webkit.org/show_bug.cgi?id=123911
3320         <rdar://problem/15202803>
3321
3322         Reviewed by Mark Hahnenberg.
3323
3324         * dfg/DFGSpeculativeJIT.cpp:
3325         (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode):
3326         * ftl/FTLLowerDFGToLLVM.cpp:
3327         (JSC::FTL::LowerDFGToLLVM::isArrayType):
3328
3329 2013-11-06  Mark Hahnenberg  <mhahnenberg@apple.com>
3330
3331         JSExport doesn't support constructors
3332         https://bugs.webkit.org/show_bug.cgi?id=123380
3333
3334         Reviewed by Geoffrey Garen.
3335
3336         Needed another linked-on-or-after check for when we're deciding whether
3337         we should copy over init family methods.
3338
3339         Factored out the link time checks into a separate function so that they can be cached.
3340
3341         Factored out the check for init-family method selectors into helper function and changed it to
3342         match the description in the clang docs, namely that there can be underscores at the beginning
3343         and the first letter after 'init' part of the selector (if there is one) must be a capital letter.
3344
3345         Updated tests to make sure we don't treat "initialize" as an init-family method and that we do
3346         treat "_init" as an init-family method.
3347
3348         * API/JSWrapperMap.h:
3349         * API/JSWrapperMap.mm:
3350         (isInitFamilyMethod):
3351         (shouldSkipMethodWithName):
3352         (copyMethodsToObject):
3353         (allocateConstructorForCustomClass):
3354         (supportsInitMethodConstructors):
3355         * API/tests/testapi.mm:
3356         (-[ClassA initialize]):
3357         (-[ClassD initialize]):
3358
3359 2013-11-06  Michael Saboff  <msaboff@apple.com>
3360
3361         Change ctiTrampoline into a thunk
3362         https://bugs.webkit.org/show_bug.cgi?id=123844
3363
3364         Reviewed by Filip Pizlo.
3365
3366         Converted ctiTrampoline and ctiOpThrowNotCaught into thunks named callToJavaScript
3367         and returnFromJavaScript.  Cleaned up and in some cases removed JITStubsXXX.h files
3368         after removing ctiTrampoline and ctiOpThrowNotCaught.  Added callJavaScriptJITFunction
3369         to VM that is a function pointer to the callToJavaScript thunk.
3370
3371         * GNUmakefile.list.am:
3372         * JavaScriptCore.xcodeproj/project.pbxproj:
3373         * dfg/DFGDriver.cpp:
3374         (JSC::DFG::compileImpl):
3375         * jit/JITCode.cpp:
3376         (JSC::JITCode::execute):
3377         * jit/JITExceptions.cpp:
3378         (JSC::genericUnwind):
3379         * jit/JITStubs.cpp:
3380         * jit/JITStubs.h:
3381         * jit/JITStubsARM.h:
3382         * jit/JITStubsARM64.h: Removed.
3383         * jit/JITStubsARMv7.h:
3384         * jit/JITStubsMIPS.h: Removed.
3385         * jit/JITStubsMSVC64.asm:
3386         * jit/JITStubsSH4.h: Removed.
3387         * jit/JITStubsX86.h:
3388         * jit/JITStubsX86_64.h:
3389         * jit/JSInterfaceJIT.h:
3390         * jit/ThunkGenerators.cpp:
3391         (JSC::returnFromJavaScript):
3392         (JSC::callToJavaScript):
3393         * jit/ThunkGenerators.h:
3394         * runtime/VM.cpp:
3395         (JSC::VM::VM):
3396         * runtime/VM.h:
3397
3398 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
3399
3400         FTL should support StringCharCodeAt
3401         https://bugs.webkit.org/show_bug.cgi?id=123854
3402
3403         Reviewed by Sam Weinig.
3404
3405         * ftl/FTLCapabilities.cpp:
3406         (JSC::FTL::canCompile):
3407         * ftl/FTLLowerDFGToLLVM.cpp:
3408         (JSC::FTL::LowerDFGToLLVM::compileNode):
3409         (JSC::FTL::LowerDFGToLLVM::compileStringCharCodeAt):
3410
3411 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
3412
3413         FTL should support NewObject
3414         https://bugs.webkit.org/show_bug.cgi?id=123849
3415
3416         Reviewed by Oliver Hunt.
3417
3418         * ftl/FTLAbstractHeapRepository.cpp:
3419         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
3420         * ftl/FTLAbstractHeapRepository.h:
3421         * ftl/FTLCapabilities.cpp:
3422         (JSC::FTL::canCompile):
3423         * ftl/FTLIntrinsicRepository.h:
3424         * ftl/FTLLowerDFGToLLVM.cpp:
3425         (JSC::FTL::LowerDFGToLLVM::compileNode):
3426         (JSC::FTL::LowerDFGToLLVM::compileNewObject):
3427         (JSC::FTL::LowerDFGToLLVM::allocate):
3428
3429 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
3430
3431         FTL should support StringCharAt
3432         https://bugs.webkit.org/show_bug.cgi?id=123855
3433
3434         Reviewed by Oliver Hunt.
3435         
3436         This is just like GetByVal for String, so we reuse that code.
3437
3438         * ftl/FTLCapabilities.cpp:
3439         (JSC::FTL::canCompile):
3440         * ftl/FTLLowerDFGToLLVM.cpp:
3441         (JSC::FTL::LowerDFGToLLVM::compileNode):
3442         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
3443         (JSC::FTL::LowerDFGToLLVM::compileStringCharAt):
3444
3445 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
3446
3447         Remove old unused code for hypothetical LLVM intrinsics
3448         https://bugs.webkit.org/show_bug.cgi?id=123824
3449
3450         Reviewed by Oliver Hunt.
3451
3452         * ftl/FTLIntrinsicRepository.h:
3453
3454 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
3455
3456         FTL should support String character access operations
3457         https://bugs.webkit.org/show_bug.cgi?id=123783
3458
3459         Reviewed by Oliver Hunt.
3460         
3461         Implements:
3462         
3463         - string.length
3464         
3465         - string[index]
3466
3467         * ftl/FTLAbstractHeapRepository.h:
3468         * ftl/FTLCapabilities.cpp:
3469         (JSC::FTL::canCompile):
3470         * ftl/FTLIntrinsicRepository.h:
3471         * ftl/FTLLowerDFGToLLVM.cpp:
3472         (JSC::FTL::LowerDFGToLLVM::compileGetIndexedPropertyStorage):
3473         (JSC::FTL::LowerDFGToLLVM::compileGetArrayLength):
3474         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
3475
3476 2013-11-05  Mark Hahnenberg  <mhahnenberg@apple.com>
3477
3478         ObjCCallbackFunctionImpl's NSInvocation shouldn't retain its target or arguments
3479         https://bugs.webkit.org/show_bug.cgi?id=123822
3480
3481         Reviewed by Geoffrey Garen.
3482
3483         Using -retainArguments on ObjCCallbackFunctionImpl's NSInvocation leads to memory leaks.
3484         We should handle retaining/releasing the target ourselves, and we should never retain the arguments.
3485
3486         * API/ObjCCallbackFunction.mm:
3487         (JSC::ObjCCallbackFunctionImpl::~ObjCCallbackFunctionImpl):
3488         (JSC::ObjCCallbackFunctionImpl::name):
3489         (objCCallbackFunctionForInvocation):
3490         (objCCallbackFunctionForMethod):
3491         (objCCallbackFunctionForBlock):
3492
3493 2013-11-05  Julien Brianceau  <jbriance@cisco.com>
3494
3495         Fix build for architectures with 4 argument registers (broken since r158681).
3496         https://bugs.webkit.org/show_bug.cgi?id=123826
3497
3498         Reviewed by Michael Saboff.
3499
3500         * jit/CCallHelpers.h:
3501         (JSC::CCallHelpers::setupArgumentsWithExecState):
3502         (JSC::CCallHelpers::setupArguments):
3503
3504 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
3505
3506         Fix register allocation inside control flow in GetByVal String
3507         https://bugs.webkit.org/show_bug.cgi?id=123816
3508
3509         Reviewed by Geoffrey Garen.
3510
3511         * dfg/DFGSpeculativeJIT.cpp:
3512         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
3513
3514 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
3515
3516         Remove FTL::LowerDFGToLLVM::compileJSConstant()
3517         https://bugs.webkit.org/show_bug.cgi?id=123817
3518
3519         Reviewed by Geoffrey Garen.
3520
3521         * ftl/FTLLowerDFGToLLVM.cpp:
3522
3523 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
3524
3525         FTL should support PutById
3526         https://bugs.webkit.org/show_bug.cgi?id=123784
3527
3528         Reviewed by Geoffrey Garen.
3529
3530         * ftl/FTLAbbreviations.h:
3531         (JSC::FTL::buildCall):
3532         * ftl/FTLCapabilities.cpp:
3533         (JSC::FTL::canCompile):
3534         * ftl/FTLCompile.cpp:
3535         (JSC::FTL::generateICFastPath):
3536         (JSC::FTL::fixFunctionBasedOnStackMaps):
3537         * ftl/FTLInlineCacheDescriptor.h:
3538         (JSC::FTL::InlineCacheDescriptor::InlineCacheDescriptor):
3539         (JSC::FTL::GetByIdDescriptor::GetByIdDescriptor):
3540         (JSC::FTL::PutByIdDescriptor::PutByIdDescriptor):
3541         (JSC::FTL::PutByIdDescriptor::ecmaMode):
3542         (JSC::FTL::PutByIdDescriptor::putKind):
3543         * ftl/FTLIntrinsicRepository.h:
3544         * ftl/FTLLowerDFGToLLVM.cpp:
3545         (JSC::FTL::LowerDFGToLLVM::compileNode):
3546         (JSC::FTL::LowerDFGToLLVM::compilePutById):
3547         * ftl/FTLOutput.h:
3548         (JSC::FTL::Output::call):
3549         * ftl/FTLSlowPathCall.cpp:
3550         (JSC::FTL::callOperation):
3551         * ftl/FTLSlowPathCall.h:
3552         * ftl/FTLState.h:
3553         * jit/CCallHelpers.h:
3554         (JSC::CCallHelpers::setupArguments):
3555         * runtime/Executable.h:
3556         (JSC::ScriptExecutable::ecmaMode):
3557
3558 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
3559
3560         GetById->GetByOffset and PutById->PutByOffset folding should mark haveStructures since it may result in structure transition watchpoints
3561         https://bugs.webkit.org/show_bug.cgi?id=123788
3562
3563         Reviewed by Geoffrey Garen.
3564         
3565         haveStructures is true if there are any currentlyKnownStructures that have
3566         interesting values, since that's the only time when clobbering needs to do things.
3567         It's a really important compile-time optimization. But that also means that anytime
3568         we might cause currentlyKnownStructures to get set - like when we might insert some
3569         structure transition watchpoints - we need to set haveStructures. We were forgetting
3570         to do that for GetById->GetByOffset and PutById->PutByOffset because, I guess, we
3571         forgot that those might insert structure transition watchpoints.
3572
3573         * dfg/DFGAbstractInterpreterInlines.h:
3574         (JSC::DFG::::executeEffects):
3575
3576 2013-11-05  Julien Brianceau  <jbriance@cisco.com>
3577
3578         [mips] Make regTx registers match between JSInterfaceJIT and GPRInfo.
3579         https://bugs.webkit.org/show_bug.cgi?id=123807
3580
3581         Reviewed by Mark Lam.
3582
3583         * jit/GPRInfo.h:
3584         (JSC::GPRInfo::toIndex):
3585         * jit/JSInterfaceJIT.h:
3586
3587 2013-11-05  Julien Brianceau  <jbriance@cisco.com>
3588
3589         REGRESSION(r158315): Fix register mixup in JIT::compileOpCall.
3590         https://bugs.webkit.org/show_bug.cgi?id=123799
3591
3592         Reviewed by Mark Lam.
3593
3594         Changeset r158315 is crashing architectures where JSInterfaceJIT::regT3 is
3595         different from GPRInfo::regT3. This is the case for MIPS architecture.
3596
3597         * jit/JITCall32_64.cpp:
3598         (JSC::JIT::compileOpCall):
3599
3600 2013-11-05  Julien Brianceau  <jbriance@cisco.com>
3601
3602         [mips] Fix build for MIPS platforms.
3603         https://bugs.webkit.org/show_bug.cgi?id=123796
3604
3605         Reviewed by Michael Saboff.
3606
3607         * assembler/LinkBuffer.cpp:
3608         (JSC::LinkBuffer::linkCode): Add specific MIPS call to relocateJumps.
3609         * assembler/MIPSAssembler.h: Remove executableCopy (because of r157690) and set relocateJumps function public.
3610         (JSC::MIPSAssembler::firstRegister):
3611         (JSC::MIPSAssembler::lastRegister):
3612         (JSC::MIPSAssembler::firstFPRegister):
3613         (JSC::MIPSAssembler::lastFPRegister):
3614         (JSC::MIPSAssembler::buffer): Needed since r157690.
3615         * assembler/MacroAssemblerMIPS.h: Add framePointerRegister.
3616         (JSC::MacroAssemblerMIPS::revertJumpReplacementToPatchableBranchPtrWithPatch): Remove unused parameter warning.
3617
3618 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
3619
3620         internal-js-tests.yaml/Octane/stress-tests/pdfjs.js.default: ASSERTION FAILED: m_state.forNode(child).m_futurePossibleStructure.isSubsetOf(StructureSet(structure)) at DFGConstantFoldingPhase.cpp:249
3621         https://bugs.webkit.org/show_bug.cgi?id=123778
3622
3623         Unreviewed, remove the other such assertion.
3624
3625         * dfg/DFGConstantFoldingPhase.cpp:
3626         (JSC::DFG::ConstantFoldingPhase::foldConstants):
3627
3628 2013-11-04  Michael Saboff  <msaboff@apple.com>
3629
3630         REGRESSION(r158586): plugins/refcount-leaks.html fails
3631         https://bugs.webkit.org/show_bug.cgi?id=123765
3632
3633         We were leaving a hole of one slot above a new frame when pushing the new frame on
3634         the stack with pushFrame().  This unused slot can contain residual values that will
3635         be marked during GC.
3636
3637         Reviewed by Filip Pizlo.
3638
3639         * interpreter/JSStackInlines.h:
3640         (JSC::JSStack::pushFrame):
3641
3642 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
3643
3644         internal-js-tests.yaml/Octane/stress-tests/pdfjs.js.default: ASSERTION FAILED: m_state.forNode(child).m_futurePossibleStructure.isSubsetOf(StructureSet(structure)) at DFGConstantFoldingPhase.cpp:249
3645         https://bugs.webkit.org/show_bug.cgi?id=123778
3646
3647         Reviewed by Geoffrey Garen.
3648         
3649         This assertion was just wrong: ee do an execute() above the assertion. The assertion
3650         is asserting that if we need a watchpoint (i.e. the best proven structure was not the
3651         current structure) then it must be the future possible structure.  But while that may
3652         have been true before execute(), it won't be true after if the PutById was a
3653         transition. Of course, this can only happen in the concurrent JIT in which case the
3654         code would be invalidated anyway since we would only transform the code in a way that
3655         leveraged the lack of a transition if we inserted a watchpoint, in which case we
3656         would realize that the watchpoint had been fired during compilation.
3657         
3658         Since this requires concurrent JIT awesomeness, I don't know how to test it.
3659
3660         * dfg/DFGConstantFoldingPhase.cpp:
3661         (JSC::DFG::ConstantFoldingPhase::foldConstants):
3662
3663 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
3664
3665         DFG CheckArray(String) should just be a Phantom(String:)
3666         https://bugs.webkit.org/show_bug.cgi?id=123779
3667
3668         Reviewed by Geoffrey Garen.
3669         
3670         This should be a speed-up since Phantom(String:) is smart enough to use the string
3671         structure. It should also be a simplification since CheckArray(String) was totally
3672         redundant.
3673         
3674         Also FixupPhase was assuming that it may see CheckArray's. That's wrong. It can
3675         create CheckArray's but it won't see them as input since no previous phase can
3676         create them.
3677
3678         * dfg/DFGFixupPhase.cpp:
3679         (JSC::DFG::FixupPhase::fixupNode):
3680         (JSC::DFG::FixupPhase::checkArray):
3681         * dfg/DFGSpeculativeJIT.cpp:
3682         (JSC::DFG::SpeculativeJIT::checkArray):
3683
3684 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
3685
3686         DFG NewArray/NewArrayBuffer shouldn't be constructing with negative indexing
3687         https://bugs.webkit.org/show_bug.cgi?id=123760
3688         <rdar://problem/15356705>
3689
3690         Reviewed by Mark Hahnenberg and Oliver Hunt.
3691
3692         * dfg/DFGOperations.cpp:
3693
3694 2013-11-04  Michael Saboff  <msaboff@apple.com>
3695
3696         Eliminate HostCall bit from JSC Stack CallerFrame
3697         https://bugs.webkit.org/show_bug.cgi?id=123642
3698
3699         Reviewed by Geoffrey Garen.
3700
3701         Replace the HostCallFrame bit or'ed to the CallerFrame value in a CallFrame with
3702         a VM entry sentinel CallFrame.  Logically, the VM entry sentinel call frame is
3703         pushed on the stack before the callee frame when calling from native to JavaScript
3704         code.  The callee frame's CallerFrame points at the VM entry sentinel call frame
3705         and the VM entry sentinel call frame's CallerFrame points to the real caller.
3706         The VM entry sentinel call frame has a sentinel (1) in the CodeBlock to indicate
3707         its a VM entry sentinel call frame.  It's ScopeChain has vm.topCallFrame at the
3708         time of the call.  This allows for a complete stack walk as well as walking just
3709         the contiguous JS frames.
3710
3711         The VM entry sentinel call frame and callee frame are currently allocated and
3712         initialized in ExecState::init(), but this initialization will be moved to
3713         ctiTrampoline when we actually move onto the native stack.
3714
3715         * bytecode/CodeBlock.cpp:
3716         (JSC::CodeBlock::noticeIncomingCall):
3717         * debugger/DebuggerCallFrame.cpp:
3718         (JSC::DebuggerCallFrame::callerFrame):
3719         * dfg/DFGJITCompiler.cpp:
3720         (JSC::DFG::JITCompiler::compileExceptionHandlers):
3721         * interpreter/CallFrame.h:
3722         (JSC::ExecState::frameExtent):
3723         (JSC::ExecState::currentVPC):
3724         (JSC::ExecState::setCurrentVPC):
3725         (JSC::ExecState::init):
3726         (JSC::ExecState::noCaller):
3727         (JSC::ExecState::isVMEntrySentinel):
3728         (JSC::ExecState::vmEntrySentinelCallerFrame):
3729         (JSC::ExecState::initializeVMEntrySentinelFrame):
3730         (JSC::ExecState::callerFrameSkippingVMEntrySentinel):
3731         (JSC::ExecState::vmEntrySentinelCodeBlock):
3732         * interpreter/Interpreter.cpp:
3733         (JSC::unwindCallFrame):
3734         (JSC::Interpreter::getStackTrace):
3735         * interpreter/Interpreter.h:
3736         (JSC::TopCallFrameSetter::TopCallFrameSetter):
3737         (JSC::TopCallFrameSetter::~TopCallFrameSetter):
3738         (JSC::NativeCallFrameTracer::NativeCallFrameTracer):
3739         * interpreter/JSStack.cpp:
3740         (JSC::JSStack::~JSStack):
3741         * interpreter/JSStackInlines.h:
3742         (JSC::JSStack::getStartOfFrame):
3743         (JSC::JSStack::pushFrame):
3744         (JSC::JSStack::popFrame):
3745         * interpreter/Register.h:
3746         (JSC::Register::operator=):
3747         (JSC::Register::callFrame):
3748         * interpreter/StackVisitor.cpp:
3749         (JSC::StackVisitor::readFrame):
3750         (JSC::StackVisitor::readNonInlinedFrame):
3751         (JSC::StackVisitor::readInlinedFrame):
3752         (JSC::StackVisitor::Frame::print):
3753         * interpreter/VMInspector.cpp:
3754         (JSC::VMInspector::countFrames):
3755         * jit/JIT.cpp:
3756         (JSC::JIT::privateCompileExceptionHandlers):
3757         * jit/JITOperations.cpp:
3758         * jit/JITStubsARM.h:
3759         (JSC::ctiTrampoline):
3760         * jit/JITStubsARM64.h:
3761         * jit/JITStubsARMv7.h:
3762         (JSC::ctiTrampoline):
3763         * jit/JITStubsMIPS.h:
3764         * jit/JITStubsMSVC64.asm:
3765         * jit/JITStubsSH4.h:
3766         * jit/JITStubsX86.h:
3767         * jit/JITStubsX86_64.h:
3768         * jsc.cpp:
3769         (functionDumpCallFrame):
3770         * llint/LowLevelInterpreter.cpp:
3771         (JSC::CLoop::execute):
3772         * runtime/VM.cpp:
3773         (JSC::VM::VM):
3774         (JSC::VM::throwException):
3775
3776 2013-11-04  Mark Hahnenberg  <mhahnenberg@apple.com>
3777
3778         JSArrayBufferViews of length 0 allocate 0 CopiedSpace bytes, which is invalid
3779         https://bugs.webkit.org/show_bug.cgi?id=123746
3780
3781         Reviewed by Geoffrey Garen.
3782
3783         This patch disallows clients from allocating 0 bytes in CopiedSpace. We enforce this invariant 
3784         with an ASSERT in C++ code and a breakpoint in JIT code. Clients who care about 0-byte 
3785         allocations (like JSArrayBufferViews) must handle that case themselves, but we don't punish 
3786         anybody else for the rare case that somebody decides to allocate a 0-length typed array. 
3787         It also makes the allocation and copying cases consistent for CopiedSpace: no 0-byte allocations, 
3788         no 0-byte copying.
3789  
3790         Also added a check so that JSArrayBufferViews don't try to copy their m_vector backing store when 
3791         their length is 0. Also sprinkled several ASSERTs throughout the JSArrayBufferView code to make sure that 
3792         when length is 0 m_vector is null.
3793
3794         * dfg/DFGSpeculativeJIT.cpp:
3795         (JSC::DFG::SpeculativeJIT::compileNewTypedArray):
3796         * dfg/DFGSpeculativeJIT.h:
3797         (JSC::DFG::SpeculativeJIT::emitAllocateBasicStorage):
3798         * heap/CopiedSpaceInlines.h:
3799         (JSC::CopiedSpace::tryAllocate):
3800         * runtime/ArrayBuffer.h:
3801         (JSC::ArrayBuffer::create):
3802         * runtime/JSArrayBufferView.cpp:
3803         (JSC::JSArrayBufferView::ConstructionContext::ConstructionContext):
3804         * runtime/JSGenericTypedArrayViewInlines.h:
3805         (JSC::::visitChildren):
3806         (JSC::::copyBackingStore):
3807         (JSC::::slowDownAndWasteMemory):
3808
3809 2013-11-04  Julien Brianceau  <jbriance@cisco.com>
3810
3811         [sh4] Refactor jumps in baseline JIT to return label after the jump.
3812         https://bugs.webkit.org/show_bug.cgi?id=123734
3813
3814         Reviewed by Michael Saboff.
3815
3816         Current implementation of jumps in sh4 baseline JIT returns a label on the jump itself
3817         and not after it. This is not correct and leads to issues like infinite loop the DFG
3818         (https://bugs.webkit.org/show_bug.cgi?id=122597 for instance). This refactor fixes this
3819         and also simplifies the link and relink procedures for sh4 jumps.
3820
3821         * assembler/MacroAssemblerSH4.h:
3822         (JSC::MacroAssemblerSH4::branchDouble):
3823         (JSC::MacroAssemblerSH4::branchTrue):
3824         (JSC::MacroAssemblerSH4::branchFalse):
3825         * assembler/SH4Assembler.h:
3826         (JSC::SH4Assembler::jmp):
3827         (JSC::SH4Assembler::extraInstrForBranch):
3828         (JSC::SH4Assembler::jne):
3829         (JSC::SH4Assembler::je):
3830         (JSC::SH4Assembler::bra):
3831         (JSC::SH4Assembler::linkJump):
3832         (JSC::SH4Assembler::relinkJump):
3833
3834 2013-11-03  Filip Pizlo  <fpizlo@apple.com>
3835
3836         Generated color wheel displays incorrectly (regressed in r155567)
3837         https://bugs.webkit.org/show_bug.cgi?id=123664
3838
3839         Reviewed by Andreas Kling.
3840
3841         Interestingly, r155567 just "un-broke" the attempt to constant-fold ArithMod, but
3842         that constant folding was just wrong to begin with. There is no evidence that this
3843         constant folding rule is profitable. I'm removing it instead of trying to think
3844         about what it means for it to be correct.
3845
3846         * dfg/DFGAbstractInterpreterInlines.h:
3847         (JSC::DFG::::executeEffects):
3848
3849 2013-11-03  Filip Pizlo  <fpizlo@apple.com>
3850
3851         Unreviewed, it is no longer necessary to call DisablePrettyStackTrace.
3852
3853         * llvm/library/LLVMExports.cpp:
3854         (initializeAndGetJSCLLVMAPI):
3855
3856 2013-11-02  Mark Lam  <mark.lam@apple.com>
3857
3858         Assertion failure in non-JIT'ed LLInt on ARM Thumb.
3859         https://bugs.webkit.org/show_bug.cgi?id=97569.
3860
3861         Reviewed by Geoffrey Garen.
3862
3863         * assembler/MacroAssemblerCodeRef.h:
3864         - Thumb2 alignment assertions do not apply to the C Loop LLINT because
3865           the arguments passed to those assertions are actually OpcodeIDs
3866           masquerading as addresses.
3867         * llint/LLIntOfflineAsmConfig.h:
3868         - Some of the #defines belong in the !ENABLE(LLINT_C_LOOP) section.
3869           Moving them there.
3870         * llint/LowLevelInterpreter.cpp:
3871         - Keep the compiler happy from some unreferenced C Loop labels.
3872
3873 2013-11-02  Filip Pizlo  <fpizlo@apple.com>
3874
3875         FTL should use LLVM intrinsics for OSR exit, watchpoints, inline caches, and stack layout
3876         https://bugs.webkit.org/show_bug.cgi?id=122318
3877
3878         Reviewed by Geoffrey Garen.
3879         
3880         This all now works. This patch just updates our implementation to work with LLVM trunk,
3881         and removes all of the old code that tried to do OSR exits and heap accesses without
3882         the benefit of those intrinsics.
3883         
3884         In particular:
3885         
3886         - StackMaps parsing now uses the new, less compact, but more future-proof, format.
3887         
3888         - Remove the ftlUsesStackmaps() option and hard-code ftlUsesStackmaps = true. Remove
3889           all code for ftlUsesStackmaps = false, since that was only there for back when we
3890           didn't have the intrinsics.
3891         
3892         - Remove the other experimental OSR options (useLLVMOSRExitIntrinsic,
3893           ftlTrapsOnOSRExit, and FTLOSRExitOmitsMarshalling).
3894         
3895         - Remove LowerDFGToLLVM's use of the ExitThunkGenerator since we don't need to generate
3896           the exit thunks until after we parse the stackmaps.
3897         
3898         - Remove all of the exit thunk and compiler code for the no-stackmaps case.
3899
3900         * dfg/DFGDriver.cpp:
3901         (JSC::DFG::compileImpl):
3902         * ftl/FTLCompile.cpp:
3903         (JSC::FTL::mmAllocateDataSection):
3904         * ftl/FTLExitThunkGenerator.cpp:
3905         (JSC::FTL::ExitThunkGenerator::emitThunk):
3906         * ftl/FTLIntrinsicRepository.h:
3907         * ftl/FTLLocation.cpp:
3908         (JSC::FTL::Location::forStackmaps):
3909         * ftl/FTLLowerDFGToLLVM.cpp:
3910         (JSC::FTL::LowerDFGToLLVM::LowerDFGToLLVM):
3911         (JSC::FTL::LowerDFGToLLVM::lower):
3912         (JSC::FTL::LowerDFGToLLVM::compileGetById):
3913         (JSC::FTL::LowerDFGToLLVM::compileInvalidationPoint):
3914         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
3915         (JSC::FTL::LowerDFGToLLVM::emitOSRExitCall):
3916         (JSC::FTL::LowerDFGToLLVM::callStackmap):
3917         (JSC::FTL::LowerDFGToLLVM::addExitArgumentForNode):
3918         * ftl/FTLOSRExitCompilationInfo.h:
3919         (JSC::FTL::OSRExitCompilationInfo::OSRExitCompilationInfo):
3920         * ftl/FTLOSRExitCompiler.cpp:
3921         (JSC::FTL::compileStub):
3922         (JSC::FTL::compileFTLOSRExit):
3923         * ftl/FTLStackMaps.cpp:
3924         (JSC::FTL::StackMaps::Location::parse):
3925         (JSC::FTL::StackMaps::parse):
3926         (WTF::printInternal):
3927         * ftl/FTLStackMaps.h:
3928         * ftl/FTLThunks.cpp:
3929         (JSC::FTL::osrExitGenerationThunkGenerator):
3930         * ftl/FTLThunks.h:
3931         (JSC::FTL::Thunks::getOSRExitGenerationThunk):
3932         * runtime/Options.h:
3933
3934 2013-11-02  Patrick Gansterer  <paroga@webkit.org>
3935
3936         Add missing getHostCallReturnValue() for MSVC ARM
3937         https://bugs.webkit.org/show_bug.cgi?id=123685
3938
3939         Reviewed by Darin Adler.
3940
3941         * jit/JITStubsARM.h:
3942
3943 2013-11-02  Patrick Gansterer  <paroga@webkit.org>
3944
3945         Fix MSVC warning about unary minus operator
3946         https://bugs.webkit.org/show_bug.cgi?id=123674
3947
3948         Reviewed by Darin Adler.
3949
3950         Change some static_cast<> to silence the following warning of Microsoft compiler:
3951         warning C4146: unary minus operator applied to unsigned type, result still unsigned
395