APIEntryShims need some love
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2013-11-18  Mark Hahnenberg  <mhahnenberg@apple.com>
2
3         APIEntryShims need some love
4         https://bugs.webkit.org/show_bug.cgi?id=124540
5
6         Reviewed by Filip Pizlo.
7
8         We were missing them in key places which some other hacking revealed. These could have manifested as
9         race conditions for VMs being used in multithreaded environments.
10
11         * API/JSContext.mm:
12         (-[JSContext setException:]):
13         (-[JSContext wrapperForObjCObject:]):
14         (-[JSContext wrapperForJSObject:]):
15         * API/JSContextRef.cpp:
16         (JSContextGroupRelease):
17         (JSGlobalContextRelease):
18         * API/JSManagedValue.mm:
19         (-[JSManagedValue initWithValue:]):
20         (-[JSManagedValue value]):
21         * API/JSObjectRef.cpp:
22         (JSObjectIsFunction):
23         (JSObjectCopyPropertyNames):
24         * API/JSValue.mm:
25         (containerValueToObject):
26         * API/JSWrapperMap.mm:
27         (tryUnwrapObjcObject):
28
29 2013-11-18  Filip Pizlo  <fpizlo@apple.com>
30
31         Allow the FTL debug dumps to include the new size field
32         https://bugs.webkit.org/show_bug.cgi?id=124479
33
34         Reviewed by Mark Hahnenberg.
35
36         * ftl/FTLStackMaps.cpp:
37         (JSC::FTL::StackMaps::Location::parse):
38         (JSC::FTL::StackMaps::Location::dump):
39         * ftl/FTLStackMaps.h:
40
41 2013-11-18  peavo@outlook.com  <peavo@outlook.com>
42
43         [Win] Link fails when DFG JIT is enabled.
44         https://bugs.webkit.org/show_bug.cgi?id=123614
45
46         Reviewed by Brent Fulgham.
47
48         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Added new files.
49         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
50
51 2013-11-18  Julien Brianceau  <jbriance@cisco.com>
52
53         [sh4] Add missing implementation in MacroAssembler to fix build (broken since r159395).
54         https://bugs.webkit.org/show_bug.cgi?id=124484
55
56         Reviewed by Michael Saboff.
57
58         * assembler/MacroAssemblerSH4.h:
59         (JSC::MacroAssemblerSH4::load8):
60         (JSC::MacroAssemblerSH4::branch8):
61
62 2013-11-18  Michael Saboff  <msaboff@apple.com>
63
64         ARM64 CRASH: Improper offset in getHostCallReturnValue() to access callerFrame in CallFrame
65         https://bugs.webkit.org/show_bug.cgi?id=124481
66
67         Reviewed by Mark Lam.
68
69         Fixed the offset to access CallerFrame in the ARM64 version of getHostCallReturnValue() to be 0
70         to correspond with the change in CallFrame layout done in r158315.
71
72         * jit/JITOperations.cpp:
73
74 2013-11-18  Michael Saboff  <msaboff@apple.com>
75
76         Crash in virtualForThunkGenerator generated code on ARM64
77         https://bugs.webkit.org/show_bug.cgi?id=124447
78
79         Reviewed by Geoffrey Garen.
80
81         The baseline JIT generates slow path call code with the caller in regT0.  The DFG
82         generates call code with the caller in nonArgGPR0.  The virtualForThunkGenerator
83         generates code with the caller in nonArgGPR0.  For X86 and X86_64, regT0 and nonArgGPR0
84         are the same CPU register, eax.  For other platforms this isn't the case.  The same
85         issue exists for JSVALUE32_64 ports as well, where there also is an issue with the callee
86         tag registers being regT1 and nonArgGPR1 in the various locations.
87
88         Changed nonArgGPR0, nonArgGPR1 and nonArgGPR2 for X86 and X86_64 to not match up with
89         regT0-2.  Changing these registers will cause a crash on all ports should we have a
90         similar problem in the future.  Changed the DFG call generating code to use regT0 and
91         regT1.  Now all slow path call code is generated using regT0 and for JSVALUE32_64 regT1.
92         Added r12 to X86_64 as a new temp register (regT9) and moved r13 down to regT10.
93         The new temp register decreases the likelihood of inadvertant register overlap.
94
95         * dfg/DFGSpeculativeJIT32_64.cpp:
96         (JSC::DFG::SpeculativeJIT::emitCall):
97         * dfg/DFGSpeculativeJIT64.cpp:
98         (JSC::DFG::SpeculativeJIT::emitCall):
99         * jit/GPRInfo.h:
100         (JSC::GPRInfo::toRegister):
101         (JSC::GPRInfo::toIndex):
102         * jit/ThunkGenerators.cpp:
103         (JSC::virtualForThunkGenerator):
104
105 2013-11-18  Balazs Kilvady  <kilvadyb@homejinni.com>
106
107         Add missing load8/branch8 with AbsoluteAddress parameter to MIPS port.
108
109         [MIPS] Build fails since r159395.
110         https://bugs.webkit.org/show_bug.cgi?id=124491
111
112         Reviewed by Michael Saboff.
113
114         * assembler/MacroAssemblerMIPS.h:
115         (JSC::MacroAssemblerMIPS::load8):
116         (JSC::MacroAssemblerMIPS::branch8):
117
118 2013-11-18  Csaba Osztrogonác  <ossy@webkit.org>
119
120         REGRESSION(r159351): It made zillion tests assert on !CF platforms
121         https://bugs.webkit.org/show_bug.cgi?id=124490
122
123         Reviewed by Mark Hahnenberg.
124
125         * heap/MarkedSpace.cpp:
126         (JSC::MarkedSpace::sweep):
127
128 2013-11-18  Julien Brianceau  <jbriance@cisco.com>
129
130         Remove architecture specific code in LowLevelInterpreter.
131         https://bugs.webkit.org/show_bug.cgi?id=124501
132
133         Reviewed by Michael Saboff.
134
135         * llint/LowLevelInterpreter.asm: Use generic path instead of sh4 specific code.
136         * llint/LowLevelInterpreter32_64.asm: Merge sh4/mips path with arm path. The
137         "move t0, a0" is not needed for arm because t0 == a0 with this architecture.
138         * offlineasm/sh4.rb: Handle move opcode with pr register.
139
140 2013-11-18  Julien Brianceau  <jbriance@cisco.com>
141
142         [arm] Add missing implementation in MacroAssembler to fix build (broken since r159395).
143         https://bugs.webkit.org/show_bug.cgi?id=124488
144
145         Reviewed by Zoltan Herczeg.
146
147         * assembler/MacroAssemblerARM.h:
148         (JSC::MacroAssemblerARM::branch8):
149
150 2013-11-17  Julien Brianceau  <jbriance@cisco.com>
151
152         [sh4] Fix revertJumpReplacementToBranchPtrWithPatch in MacroAssembler.
153         https://bugs.webkit.org/show_bug.cgi?id=124468
154
155         Reviewed by Michael Saboff.
156
157         Current implementation of revertJumpReplacementToBranchPtrWithPatch is wrong in
158         the sh4 MacroAssembler part, leading to random instabilities. This patch fixes it
159         and also renames the bad-named revertJumpToMove to revertJumpReplacementToBranchPtrWithPatch
160         in the SH4Assembler.
161
162         * assembler/MacroAssemblerSH4.h:
163         (JSC::MacroAssemblerSH4::revertJumpReplacementToBranchPtrWithPatch):
164         * assembler/SH4Assembler.h:
165         (JSC::SH4Assembler::replaceWithJump):
166         (JSC::SH4Assembler::revertJumpReplacementToBranchPtrWithPatch):
167
168 2013-11-16  Filip Pizlo  <fpizlo@apple.com>
169
170         Simplify WatchpointSet state tracking
171         https://bugs.webkit.org/show_bug.cgi?id=124465
172
173         Reviewed by Sam Weinig.
174         
175         We previously represented the state of watchpoint sets using two booleans. But that
176         makes it awkward to case over the state.
177         
178         We also previously supported a watchpoint set being both watched and invalidated. We
179         never used that capability, and its presence was just purely confusing.
180         
181         This turns the whole thing into an enum.
182
183         * assembler/MacroAssemblerARM64.h:
184         (JSC::MacroAssemblerARM64::branch8):
185         * assembler/MacroAssemblerARMv7.h:
186         (JSC::MacroAssemblerARMv7::branch8):
187         * assembler/MacroAssemblerX86.h:
188         (JSC::MacroAssemblerX86::branch8):
189         * assembler/MacroAssemblerX86_64.h:
190         (JSC::MacroAssemblerX86_64::branch8):
191         * bytecode/Watchpoint.cpp:
192         (JSC::WatchpointSet::WatchpointSet):
193         (JSC::WatchpointSet::add):
194         (JSC::WatchpointSet::notifyWriteSlow):
195         (JSC::InlineWatchpointSet::inflateSlow):
196         * bytecode/Watchpoint.h:
197         (JSC::WatchpointSet::state):
198         (JSC::WatchpointSet::isStillValid):
199         (JSC::WatchpointSet::startWatching):
200         (JSC::WatchpointSet::notifyWrite):
201         (JSC::WatchpointSet::addressOfState):
202         (JSC::InlineWatchpointSet::InlineWatchpointSet):
203         (JSC::InlineWatchpointSet::hasBeenInvalidated):
204         (JSC::InlineWatchpointSet::startWatching):
205         (JSC::InlineWatchpointSet::notifyWrite):
206         (JSC::InlineWatchpointSet::decodeState):
207         (JSC::InlineWatchpointSet::encodeState):
208         * jit/JITPropertyAccess.cpp:
209         (JSC::JIT::emitVarInjectionCheck):
210         * jit/JITPropertyAccess32_64.cpp:
211         (JSC::JIT::emitVarInjectionCheck):
212         * llint/LowLevelInterpreter.asm:
213         * llint/LowLevelInterpreter32_64.asm:
214         * llint/LowLevelInterpreter64.asm:
215         * runtime/JSFunction.cpp:
216         (JSC::JSFunction::JSFunction):
217         * runtime/JSFunctionInlines.h:
218         (JSC::JSFunction::JSFunction):
219         * runtime/JSGlobalObject.cpp:
220         (JSC::JSGlobalObject::JSGlobalObject):
221         * runtime/Structure.cpp:
222         (JSC::Structure::Structure):
223         * runtime/SymbolTable.cpp:
224         (JSC::SymbolTableEntry::attemptToWatch):
225         * runtime/SymbolTable.h:
226
227 2013-11-16  Filip Pizlo  <fpizlo@apple.com>
228
229         FTL should have an explicit notion of bytecode liveness
230         https://bugs.webkit.org/show_bug.cgi?id=124181
231
232         Reviewed by Sam Weinig.
233         
234         This makes FTL OSR exit use bytecode liveness analysis to determine which variables
235         to include values for. The decision of how to get the values of variables is based on
236         forward propagation of MovHints and SetLocals.
237         
238         This fixes a bunch of bugs (like https://bugs.webkit.org/show_bug.cgi?id=124138 but
239         also others that I noticed when I started writing more targetted tests) and allows us
240         to remove some sketchy code.
241
242         * CMakeLists.txt:
243         * GNUmakefile.list.am:
244         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
245         * JavaScriptCore.xcodeproj/project.pbxproj:
246         * bytecode/BytecodeBasicBlock.h:
247         * bytecode/BytecodeLivenessAnalysis.cpp:
248         (JSC::isValidRegisterForLiveness):
249         (JSC::setForOperand):
250         (JSC::computeUsesForBytecodeOffset):
251         (JSC::computeDefsForBytecodeOffset):
252         (JSC::stepOverInstruction):
253         (JSC::computeLocalLivenessForBytecodeOffset):
254         (JSC::BytecodeLivenessAnalysis::runLivenessFixpoint):
255         (JSC::BytecodeLivenessAnalysis::operandIsLiveAtBytecodeOffset):
256         (JSC::getLivenessInfo):
257         (JSC::BytecodeLivenessAnalysis::getLivenessInfoAtBytecodeOffset):
258         (JSC::BytecodeLivenessAnalysis::computeFullLiveness):
259         * bytecode/BytecodeLivenessAnalysis.h:
260         * bytecode/BytecodeLivenessAnalysisInlines.h: Added.
261         (JSC::operandIsAlwaysLive):
262         (JSC::operandThatIsNotAlwaysLiveIsLive):
263         (JSC::operandIsLive):
264         * bytecode/CodeBlock.h:
265         (JSC::CodeBlock::captureCount):
266         (JSC::CodeBlock::captureStart):
267         (JSC::CodeBlock::captureEnd):
268         * bytecode/CodeOrigin.cpp:
269         (JSC::InlineCallFrame::dumpInContext):
270         * bytecode/FullBytecodeLiveness.h: Added.
271         (JSC::FullBytecodeLiveness::FullBytecodeLiveness):
272         (JSC::FullBytecodeLiveness::getOut):
273         (JSC::FullBytecodeLiveness::operandIsLive):
274         (JSC::FullBytecodeLiveness::getLiveness):
275         * dfg/DFGAvailability.cpp: Added.
276         (JSC::DFG::Availability::dump):
277         (JSC::DFG::Availability::dumpInContext):
278         * dfg/DFGAvailability.h: Added.
279         (JSC::DFG::Availability::Availability):
280         (JSC::DFG::Availability::unavailable):
281         (JSC::DFG::Availability::withFlush):
282         (JSC::DFG::Availability::withNode):
283         (JSC::DFG::Availability::withUnavailableNode):
284         (JSC::DFG::Availability::nodeIsUndecided):
285         (JSC::DFG::Availability::nodeIsUnavailable):
286         (JSC::DFG::Availability::hasNode):
287         (JSC::DFG::Availability::node):
288         (JSC::DFG::Availability::flushedAt):
289         (JSC::DFG::Availability::operator!):
290         (JSC::DFG::Availability::operator==):
291         (JSC::DFG::Availability::merge):
292         (JSC::DFG::Availability::mergeNodes):
293         (JSC::DFG::Availability::unavailableMarker):
294         * dfg/DFGBasicBlock.h:
295         * dfg/DFGByteCodeParser.cpp:
296         (JSC::DFG::ByteCodeParser::parseBlock):
297         * dfg/DFGDisassembler.cpp:
298         (JSC::DFG::Disassembler::Disassembler):
299         * dfg/DFGFlushFormat.cpp:
300         (WTF::printInternal):
301         * dfg/DFGFlushFormat.h:
302         (JSC::DFG::resultFor):
303         (JSC::DFG::useKindFor):
304         (JSC::DFG::dataFormatFor):
305         * dfg/DFGFlushedAt.cpp:
306         (JSC::DFG::FlushedAt::dump):
307         * dfg/DFGFlushedAt.h:
308         (JSC::DFG::FlushedAt::FlushedAt):
309         (JSC::DFG::FlushedAt::merge):
310         * dfg/DFGGraph.cpp:
311         (JSC::DFG::Graph::dump):
312         (JSC::DFG::Graph::livenessFor):
313         (JSC::DFG::Graph::isLiveInBytecode):
314         * dfg/DFGGraph.h:
315         (JSC::DFG::Graph::baselineCodeBlockFor):
316         * dfg/DFGOSRAvailabilityAnalysisPhase.cpp:
317         (JSC::DFG::OSRAvailabilityAnalysisPhase::run):
318         * dfg/DFGOSRAvailabilityAnalysisPhase.h:
319         * dfg/DFGPlan.cpp:
320         (JSC::DFG::Plan::compileInThreadImpl):
321         * dfg/DFGResurrectionForValidationPhase.cpp: Added.
322         (JSC::DFG::ResurrectionForValidationPhase::ResurrectionForValidationPhase):
323         (JSC::DFG::ResurrectionForValidationPhase::run):
324         (JSC::DFG::performResurrectionForValidation):
325         * dfg/DFGResurrectionForValidationPhase.h: Added.
326         * dfg/DFGSSAConversionPhase.cpp:
327         (JSC::DFG::SSAConversionPhase::run):
328         * dfg/DFGValueSource.h:
329         (JSC::DFG::ValueSource::forFlushFormat):
330         * dfg/DFGVariableAccessData.h:
331         * ftl/FTLExitValue.cpp:
332         (JSC::FTL::ExitValue::dumpInContext):
333         * ftl/FTLInlineCacheSize.cpp:
334         (JSC::FTL::sizeOfGetById):
335         * ftl/FTLLocation.cpp:
336         (JSC::FTL::Location::gpr):
337         (JSC::FTL::Location::fpr):
338         (JSC::FTL::Location::directGPR):
339         * ftl/FTLLowerDFGToLLVM.cpp:
340         (JSC::FTL::LowerDFGToLLVM::LowerDFGToLLVM):
341         (JSC::FTL::LowerDFGToLLVM::compileBlock):
342         (JSC::FTL::LowerDFGToLLVM::compileNode):
343         (JSC::FTL::LowerDFGToLLVM::compileSetLocal):
344         (JSC::FTL::LowerDFGToLLVM::compileZombieHint):
345         (JSC::FTL::LowerDFGToLLVM::compilePutById):
346         (JSC::FTL::LowerDFGToLLVM::compileInvalidationPoint):
347         (JSC::FTL::LowerDFGToLLVM::initializeOSRExitStateForBlock):
348         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
349         (JSC::FTL::LowerDFGToLLVM::emitOSRExitCall):
350         (JSC::FTL::LowerDFGToLLVM::buildExitArguments):
351         (JSC::FTL::LowerDFGToLLVM::addExitArgumentForNode):
352         (JSC::FTL::LowerDFGToLLVM::observeMovHint):
353         * ftl/FTLOutput.h:
354         (JSC::FTL::Output::alloca):
355         * ftl/FTLValueSource.cpp: Removed.
356         * ftl/FTLValueSource.h: Removed.
357         * llvm/LLVMAPIFunctions.h:
358         * runtime/DumpContext.cpp:
359         (JSC::DumpContext::DumpContext):
360         * runtime/DumpContext.h:
361         * runtime/Options.h:
362         * runtime/SymbolTable.h:
363         (JSC::SharedSymbolTable::captureStart):
364         (JSC::SharedSymbolTable::captureEnd):
365         (JSC::SharedSymbolTable::captureCount):
366
367 2013-11-16  Filip Pizlo  <fpizlo@apple.com>
368
369         Fix indentation of JSActivation.h.
370
371         Rubber stamped by Mark Hahnenberg.
372
373         * runtime/JSActivation.h:
374
375 2013-11-16  Filip Pizlo  <fpizlo@apple.com>
376
377         Fix indentation of JSVariableObject.h.
378
379         Rubber stamped by Mark Hahnenberg.
380         
381         I'm about to do some damage to this file. I wanted to give it some sanity first.
382
383         * runtime/JSVariableObject.h:
384
385 2013-11-16  Julien Brianceau  <jbriance@cisco.com>
386
387         [sh4] Fix build (broken since r159346).
388         https://bugs.webkit.org/show_bug.cgi?id=124455
389
390         Reviewed by Oliver Hunt.
391
392         Fix LLINT implementation for sh4 architecture to handle properly load and store operations with pr register.
393
394         * offlineasm/sh4.rb:
395
396 2013-11-15  Alexey Proskuryakov  <ap@apple.com>
397
398         Support exporting symmetric keys as JWK
399         https://bugs.webkit.org/show_bug.cgi?id=124442
400
401         Reviewed by Sam Weinig.
402
403         * runtime/JSONObject.h: Export JSONStringify.
404
405 2013-11-15  peavo@outlook.com  <peavo@outlook.com>
406
407         [Win] JavaScript crashes on 64-bit with JIT enabled.
408         https://bugs.webkit.org/show_bug.cgi?id=124409
409
410         Reviewed by Michael Saboff.
411
412         These are issues found with JIT on 64-bit:
413         - The registers rsi and rdi in callToJavaScript needs to be saved and restored. This is required by the Windows 64-bit ABI.
414         - The getHostCallReturnValue function needs to be updated according to it's GCC counterpart.
415         - The poke argument offset needs to be 20h, because Windows 64-bit ABI requires stack space allocated for the 4 argument registers.
416
417         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Re-added JITStubsMSVC64.asm to project.
418         * jit/CCallHelpers.h: Set poke argument offset.
419         (JSC::CCallHelpers::setupArguments): Compile fix, added needed method.
420         * jit/JITStubsMSVC64.asm: Save and restore registers rsi and rdi.
421                                   Update getHostCallReturnValue according to the GCC version.
422
423 2013-11-14  David Farler  <dfarler@apple.com>
424
425         Copy ASAN flag settings to WebCore and JavaScriptCore intermediate build tools
426         https://bugs.webkit.org/show_bug.cgi?id=124362
427
428         Reviewed by David Kilzer.
429
430         * Configurations/ToolExecutable.xcconfig:
431         Use ASAN_C*FLAGS.
432
433 2013-11-15  Mark Hahnenberg  <mhahnenberg@apple.com>
434
435         Remove JSChunk
436         https://bugs.webkit.org/show_bug.cgi?id=124435
437
438         Reviewed by Geoffrey Garen.
439
440         It's empty and has been since it was added 3 years ago.
441
442         * CMakeLists.txt:
443         * runtime/JSChunk.cpp: Removed.
444         * runtime/JSChunk.h: Removed.
445
446 2013-11-15  Mark Hahnenberg  <mhahnenberg@apple.com>
447
448         Remove VTableSpectrum
449         https://bugs.webkit.org/show_bug.cgi?id=124427
450
451         Reviewed by Filip Pizlo.
452
453         * CMakeLists.txt:
454         * GNUmakefile.list.am:
455         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
456         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
457         * JavaScriptCore.xcodeproj/project.pbxproj:
458         * heap/Heap.cpp:
459         (JSC::Heap::lastChanceToFinalize):
460         * heap/Heap.h:
461         * heap/MarkedBlock.cpp:
462         (JSC::MarkedBlock::callDestructor):
463         * heap/SlotVisitor.cpp:
464         (JSC::visitChildren):
465         * heap/SlotVisitor.h:
466         * heap/VTableSpectrum.cpp: Removed.
467         * heap/VTableSpectrum.h: Removed.
468
469 2013-11-14  Mark Hahnenberg  <mhahnenberg@apple.com>
470
471         -dealloc callbacks from wrapped Objective-C objects can happen at bad times
472         https://bugs.webkit.org/show_bug.cgi?id=123821
473
474         Reviewed by Darin Adler.
475
476         Currently with the JSC Obj-C API, JS wrappers for client Obj-C objects retain their associated Obj-C 
477         object. When they are swept, they release their Obj-C objects which can trigger a call to that 
478         object's -dealloc method. These -dealloc methods can then call back into the same VM, which is not 
479         allowed during sweeping or VM shutdown.
480
481         We can handle this case by creating our own pool of Obj-C objects to be released when it is safe to do so.
482         This is accomplished by using DelayedReleaseScope, an RAII-style object that will retain all objects
483         that are unsafe to release until the end of the DelayedReleaseScope.
484
485         * API/APIShims.h:
486         (JSC::APICallbackShim::APICallbackShim):
487         (JSC::APICallbackShim::vmForDropAllLocks):
488         (JSC::APICallbackShim::execForDropAllLocks):
489         * API/JSAPIWrapperObject.mm:
490         (JSAPIWrapperObjectHandleOwner::finalize):
491         * API/ObjCCallbackFunction.mm:
492         (JSC::ObjCCallbackFunctionImpl::destroy):
493         (JSC::ObjCCallbackFunction::destroy):
494         * API/tests/testapi.mm:
495         (-[TinyDOMNode initWithVirtualMachine:]):
496         (-[TinyDOMNode dealloc]):
497         (-[TinyDOMNode appendChild:]):
498         (-[TinyDOMNode removeChildAtIndex:]):
499         (-[EvilAllocationObject initWithContext:]):
500         (-[EvilAllocationObject dealloc]):
501         (-[EvilAllocationObject doEvilThingsWithContext:]):
502         * JavaScriptCore.xcodeproj/project.pbxproj:
503         * heap/DelayedReleaseScope.h: Added.
504         (JSC::DelayedReleaseScope::DelayedReleaseScope):
505         (JSC::DelayedReleaseScope::~DelayedReleaseScope):
506         (JSC::DelayedReleaseScope::releaseSoon):
507         (JSC::MarkedSpace::releaseSoon):
508         * heap/Heap.cpp:
509         (JSC::Heap::collectAllGarbage):
510         * heap/Heap.h:
511         (JSC::Heap::releaseSoon):
512         * heap/MarkedAllocator.cpp:
513         (JSC::MarkedAllocator::allocateSlowCase):
514         * heap/MarkedSpace.cpp:
515         (JSC::MarkedSpace::MarkedSpace):
516         (JSC::MarkedSpace::lastChanceToFinalize):
517         (JSC::MarkedSpace::sweep):
518         * heap/MarkedSpace.h:
519
520 2013-11-15  Michael Saboff  <msaboff@apple.com>
521
522         REGRESSION (r158586): callToJavaScript needs to save return PC to Sentinel frame
523         https://bugs.webkit.org/show_bug.cgi?id=124420
524
525         Reviewed by Filip Pizlo.
526
527         Save the return PC into the sentinel frame.
528
529         * jit/JITStubsMSVC64.asm:
530         * jit/JITStubsX86.h:
531         * llint/LowLevelInterpreter32_64.asm:
532         * llint/LowLevelInterpreter64.asm:
533
534 2013-11-14  Oliver Hunt  <oliver@apple.com>
535
536         Make CLoop easier to build, and make it work
537         https://bugs.webkit.org/show_bug.cgi?id=124359
538
539         Reviewed by Geoffrey Garen.
540
541         Add --cloop to build-jsc, build-webkit and friends.
542
543         Also make CLoop build and work again - This meant adding a
544         couple of missing ENABLE(DFG_JIT) blocks, and fixing a few 
545         other references.
546
547         * Configurations/FeatureDefines.xcconfig:
548         * bytecode/BytecodeLivenessAnalysis.cpp:
549         (JSC::computeUsesForBytecodeOffset):
550         (JSC::computeDefsForBytecodeOffset):
551         * bytecode/DFGExitProfile.cpp:
552         * dfg/DFGCapabilities.cpp:
553         * dfg/DFGCompilationKey.cpp:
554         * dfg/DFGCompilationMode.cpp:
555         * jit/JITExceptions.cpp:
556         (JSC::genericUnwind):
557
558 2013-11-14  Michael Saboff  <msaboff@apple.com>
559
560         REGRESSION (r159276): Fix lots of crashes for arm_traditional architecture.
561         https://bugs.webkit.org/show_bug.cgi?id=124365
562
563         Reviewed by Oliver Hunt.
564
565         Crashes were caused by a mixup between regular registers and temporary registers in ARM_EXTRA_GPRS.
566
567         * llint/LowLevelInterpreter32_64.asm: Warning, t3 != a3. It's safer to use an implementation using aX
568         registers like the MIPS one for cCallX macros.
569         * offlineasm/arm.rb: Rearrange ARM_EXTRA_GPRS according to the new register distribution in LLINT.
570
571 2013-11-14  Michael Saboff  <msaboff@apple.com>
572
573         REGRESSION (r159276): rbp register overwritten in Win 64 version of callToJavascript stub
574         https://bugs.webkit.org/show_bug.cgi?id=124361
575
576         Reviewed by Oliver Hunt.
577
578         Swapped operand ordering to: mov rax, rbp
579
580         * jit/JITStubsMSVC64.asm:
581
582 2013-11-14  Julien Brianceau  <jbriance@cisco.com>
583
584         REGRESSION (r159276): Fix lots of crashes for sh4 architecture.
585         https://bugs.webkit.org/show_bug.cgi?id=124347
586
587         Reviewed by Michael Saboff.
588
589         Since r159276, we have (t4 == a0 == r4) and (t5 == a1 == r5) in LLINT for sh4.
590         This leads to argument register trampling in cCallX macros, especially with cCall2
591         macro when arg1 == t4.
592
593         * llint/LowLevelInterpreter32_64.asm: Use a new "setargs" pseudo-op to setup arguments for sh4.
594         * offlineasm/instructions.rb:
595         * offlineasm/sh4.rb: Lower "setargs" pseudo-op to setup argument registers and prevent register trampling issues.
596
597 2013-11-14  Julien Brianceau  <jbriance@cisco.com>
598
599         Fix build for sh4 architectures (broken since r159276).
600         https://bugs.webkit.org/show_bug.cgi?id=124344
601
602         Reviewed by Csaba Osztrogonác.
603
604         * offlineasm/sh4.rb: There is no fp alias for r14 register for sh4.
605
606 2013-11-13  Michael Saboff  <msaboff@apple.com>
607
608         Change callToJavaScript thunk into an offline assembled stub
609         https://bugs.webkit.org/show_bug.cgi?id=124251
610
611         Reviewed by Geoffrey Garen.
612
613         Changed callToJavaScript and throwNotCaught into stubs generated by the offline assembler.
614         Added popCalleeSaves and pushCalleeSaves pseudo ops to the offline assembler to handle
615         the saving and restoring of callee save registers.  Fixed callFrameRegister differences
616         between arm traditional (r11) and arm Thumb2 (r7) in GPRInfo.h.  Also fixed implementation
617         of pop & push in arm.rb.
618
619         Since the offline assembler and therefore the LLInt don't work on Windows, the Windows stubs
620         are handled as inline assembly in JITStubsX86.h and JITStubsMSVC64.asm.
621
622         * dfg/DFGDriver.cpp:
623         (JSC::DFG::compileImpl):
624         * jit/GPRInfo.h:
625         (JSC::GPRInfo::toIndex):
626         (JSC::GPRInfo::debugName):
627         * jit/JITCode.cpp:
628         (JSC::JITCode::execute):
629         * jit/JITExceptions.cpp:
630         (JSC::genericUnwind):
631         * jit/JITStubs.h:
632         * jit/JITStubsMSVC64.asm:
633         * jit/JITStubsX86.h:
634         * jit/ThunkGenerators.cpp:
635         * jit/ThunkGenerators.h:
636         * llint/LLIntThunks.h:
637         * llint/LowLevelInterpreter.asm:
638         * llint/LowLevelInterpreter32_64.asm:
639         * llint/LowLevelInterpreter64.asm:
640         * offlineasm/arm.rb:
641         * offlineasm/arm64.rb:
642         * offlineasm/instructions.rb:
643         * offlineasm/mips.rb:
644         * offlineasm/registers.rb:
645         * offlineasm/sh4.rb:
646         * offlineasm/x86.rb:
647         * runtime/VM.cpp:
648         (JSC::VM::VM):
649         * runtime/VM.h:
650
651 2013-11-13  Andy Estes  <aestes@apple.com>
652
653         Fix the ARM64 build after recent JavaScriptCore changes
654         https://bugs.webkit.org/show_bug.cgi?id=124315
655
656         Reviewed by Michael Saboff.
657
658         Based on patches by myself, Filip Pizlo, Benjamin Poulain, and Michael Saboff.
659
660         * Configurations/JavaScriptCore.xcconfig: Hid the symbol for
661         std::bad_function_call.
662         * JavaScriptCore.xcodeproj/project.pbxproj: Marked
663         MacroAssemblerARM64.h and ARM64Assembler.h as Private headers.
664         * assembler/ARM64Assembler.h:
665         (JSC::ARM64Assembler::executableOffsetFor):
666         * assembler/MacroAssemblerARM64.h: Removed ARM64's executableCopy(),
667         which was removed from other assembler backends in r157690.
668         (JSC::MacroAssemblerARM64::shouldBlindForSpecificArch): Added.
669         (JSC::MacroAssemblerARM64::lshift64): Added.
670         (JSC::MacroAssemblerARM64::mul64): Added.
671         (JSC::MacroAssemblerARM64::rshift64): Added.
672         (JSC::MacroAssemblerARM64::convertInt64ToDouble): Added.
673         (JSC::MacroAssemblerARM64::branchMul64): Added.
674         (JSC::MacroAssemblerARM64::branchNeg64): Added.
675         (JSC::MacroAssemblerARM64::scratchRegisterForBlinding): Added.
676         * dfg/DFGSpeculativeJIT.cpp:
677         (JSC::DFG::SpeculativeJIT::compileArithDiv): Changed
678         SpeculateIntegerOperand to SpeculateInt32Operand,
679         nodeCanIgnoreNegativeZero() to bytecodeCanIgnoreNegativeZero(), and
680         nodeUsedAsNumber() to bytecodeUsesAsNumber().
681         (JSC::DFG::SpeculativeJIT::compileArithMod): Changed
682         nodeCanIgnoreNegativeZero() to bytecodeCanIgnoreNegativeZero().
683
684 2013-11-13  Oliver Hunt  <oliver@apple.com>
685
686         Fix debug build.
687
688         * parser/Parser.cpp:
689
690 2013-11-13  Tim Horton  <timothy_horton@apple.com>
691
692         r159210 added a period where there previously wasn't one, breaking >100 tests
693
694         Rubber-stamped by Oliver Hunt.
695
696         * parser/Parser.cpp:
697         (JSC::::logError):
698         Remove the extra period.
699
700 2013-11-13  Oliver Hunt  <oliver@apple.com>
701
702         REGRESSION (r158014): Many webpages throw stack overflow exceptions on iOS (because Parser::parseMemberExpression uses ~130K more stack)
703         https://bugs.webkit.org/show_bug.cgi?id=124177
704
705         Reviewed by Michael Saboff.
706
707         This patch pushes error handling into NEVER_INLINE functions to perform
708         the actual error message construction.  This dramatically reduces the
709         stack usage of the Parser.  For the large functions (such as parseMemberExpression)
710         the improvement is on the order of 2.5x reduction in stack usage.  For
711         smaller functions the reduction is in the order of 5-6x.
712
713         * parser/Parser.cpp:
714         (JSC::::logError):
715         * parser/Parser.h:
716
717 2013-11-13  Julien Brianceau  <jbriance@cisco.com>
718
719         [sh4] Protect repatchCompact from flushConstantPool.
720         https://bugs.webkit.org/show_bug.cgi?id=124278
721
722         Reviewed by Michael Saboff.
723
724         Random crashes may occur with sh4 architecture, when a flushConstantPool occurs in
725         movlMemRegCompact. As in this case a branch opcode and the constant pool are put
726         before the movlMemRegCompact, the branch itself is patched when calling repatchCompact
727         instead of the mov instruction, which is really bad.
728
729         * assembler/SH4Assembler.h:
730         (JSC::SH4Assembler::repatchCompact): Handle this specific case and add an ASSERT.
731
732 2013-11-12  Alexey Proskuryakov  <ap@apple.com>
733
734         Disable WebCrypto on Mountain Lion
735         https://bugs.webkit.org/show_bug.cgi?id=124261
736
737         Rubber-stamped by Sam Weinig.
738
739         * Configurations/FeatureDefines.xcconfig:
740
741 2013-11-12  Julien Brianceau  <jbriance@cisco.com>
742
743         [sh4] Fix load32WithUnalignedHalfWords function in baseline JIT.
744         https://bugs.webkit.org/show_bug.cgi?id=124233
745
746         Reviewed by Michael Saboff.
747
748         * assembler/MacroAssemblerSH4.h:
749         (JSC::MacroAssemblerSH4::load32WithUnalignedHalfWords): Do not claim scratch register too early.
750         Test already covered by fast/regex/pcre-test-1.
751
752 2013-11-12  Filip Pizlo  <fpizlo@apple.com>
753
754         Liveness analysis should take less memory in CodeBlock when it is unused
755         https://bugs.webkit.org/show_bug.cgi?id=124225
756
757         Reviewed by Mark Hahnenberg.
758         
759         Basically, I turned CodeBlock::m_livenessAnalysis into a pointer that is null by
760         default.
761
762         * bytecode/BytecodeLivenessAnalysis.cpp:
763         (JSC::BytecodeLivenessAnalysis::BytecodeLivenessAnalysis):
764         (JSC::BytecodeLivenessAnalysis::runLivenessFixpoint):
765         (JSC::BytecodeLivenessAnalysis::operandIsLiveAtBytecodeOffset):
766         (JSC::BytecodeLivenessAnalysis::dumpResults):
767         (JSC::BytecodeLivenessAnalysis::compute):
768         * bytecode/BytecodeLivenessAnalysis.h:
769         * bytecode/CodeBlock.cpp:
770         (JSC::CodeBlock::CodeBlock):
771         * bytecode/CodeBlock.h:
772         (JSC::CodeBlock::livenessAnalysis):
773
774 2013-11-11  Oliver Hunt  <oliver@apple.com>
775
776         Support unprefixed deconstructing assignment
777         https://bugs.webkit.org/show_bug.cgi?id=124172
778
779         Reviewed by Mark Lam.
780
781         Add support for unprefixed descontructive assignment.
782
783         Happily non-reference types on the left hand side of an assignment
784         are a runtime error, so we're able to defer validation of the binding
785         pattern to codegen time when we're already doing a lot more work.
786
787         We're also able to predicate our attempt to parse on the existence of
788         '[' or '{' as they are not as common as other constructs. 
789
790         * bytecompiler/NodesCodegen.cpp:
791         (JSC::ArrayPatternNode::emitDirectBinding):
792         * parser/ASTBuilder.h:
793         * parser/Parser.cpp:
794         (JSC::::createBindingPattern):
795         (JSC::::tryParseDeconstructionPatternExpression):
796         (JSC::::parseDeconstructionPattern):
797         (JSC::::parseForStatement):
798         (JSC::::parseAssignmentExpression):
799         * parser/Parser.h:
800         (JSC::Parser::createSavePoint):
801         (JSC::Parser::restoreSavePoint):
802         * parser/SyntaxChecker.h:
803
804 2013-11-12  Andy Estes  <aestes@apple.com>
805
806         Run JavaScriptCore Objective-C API tests on all supported platforms
807         https://bugs.webkit.org/show_bug.cgi?id=124214
808
809         Reviewed by Mark Hahnenberg.
810
811         Now that we support the API on iOS and on OS X 10.8, there's no reason
812         to limit the tests to OS X 10.9 (or greater).
813
814         * API/tests/CurrentThisInsideBlockGetterTest.h:
815         * API/tests/CurrentThisInsideBlockGetterTest.mm:
816         * API/tests/testapi.mm:
817
818 2013-08-02  Mark Hahnenberg  <mhahnenberg@apple.com>
819
820         CodeBlocks should be able to determine bytecode liveness
821         https://bugs.webkit.org/show_bug.cgi?id=118546
822
823         Reviewed by Filip Pizlo.
824
825         This will simplify some things in the DFG related to OSR exits and determining 
826         which bytecode variables are live at which points during execution. It will
827         also be useful for making our conservative GC scan more precise. Currently it 
828         doesn't properly account for liveness while the DFG is running, so it will be 
829         off by default behing a runtime Options flag.
830
831         * JavaScriptCore.xcodeproj/project.pbxproj:
832         * bytecode/BytecodeBasicBlock.cpp: Added.
833         (JSC::isBranch): Used to determine the end of basic blocks.
834         (JSC::isUnconditionalBranch): Used to determine when a branch at the end of a 
835         basic block can't possibly fall through to the next basic block in program order.
836         (JSC::isTerminal): Also used to detect the end of a block.
837         (JSC::isThrow):
838         (JSC::isJumpTarget): Used to correctly separate basic blocks. Any jump destination 
839         must be the head of its own basic block.
840         (JSC::linkBlocks): Links two blocks together in a bi-direcitonal fashion.
841         (JSC::computeBytecodeBasicBlocks): Creates a set of basic blocks given a particular 
842         CodeBlock and links them together.
843         * bytecode/BytecodeBasicBlock.h: Added.
844         (JSC::BytecodeBasicBlock::isEntryBlock): Entry blocks are a special basic blocks 
845         that indicate the beginning of the function.
846         (JSC::BytecodeBasicBlock::isExitBlock): Exit blocks are a special basic block that 
847         all blocks that exit the function have as a successor. Entry and exit blocks allows 
848         the various code paths to be more regular.
849         (JSC::BytecodeBasicBlock::leaderBytecodeOffset): The leader bytecode offset is the 
850         bytecode offset of the first instruction in the block.
851         (JSC::BytecodeBasicBlock::totalBytecodeLength): The total length of all the bytecodes 
852         in this block.
853         (JSC::BytecodeBasicBlock::bytecodeOffsets): The bytecode offsets in this particular 
854         basic block. This Vector allows us to iterate over the bytecodes in reverse order 
855         which wouldn't be possible normally since they are of variable size.
856         (JSC::BytecodeBasicBlock::addPredecessor): Links a block to a specified predecessor. 
857         Only creates one direction of the link.
858         (JSC::BytecodeBasicBlock::addSuccessor): Same as addPredecessor, but for successors.
859         (JSC::BytecodeBasicBlock::predecessors): Getter for predecessors.
860         (JSC::BytecodeBasicBlock::successors): Getter for successors.
861         (JSC::BytecodeBasicBlock::in): Getter for the liveness info at the head of the block.
862         (JSC::BytecodeBasicBlock::out): Getter for the liveness info at  the tail of the block.
863         (JSC::BytecodeBasicBlock::BytecodeBasicBlock):
864         (JSC::BytecodeBasicBlock::addBytecodeLength): When creating basic blocks we call 
865         this function when we want to add the next bytecode in program order to this block.
866         * bytecode/BytecodeLivenessAnalysis.cpp: Added.
867         (JSC::BytecodeLivenessAnalysis::BytecodeLivenessAnalysis):
868         (JSC::numberOfCapturedVariables): Convenience wrapper. Returns the
869         number of captured variables for a particular CodeBlock, or 0 if 
870         the CodeBlock has no SymbolTable.
871         (JSC::captureStart): Ditto, but for captureStart().
872         (JSC::captureEnd): Ditto, but for captureEnd().
873         (JSC::isValidRegisterForLiveness): Returns true if the liveness analysis should 
874         track the liveness of a particular operand. We ignore constants, arguments, and 
875         captured variables. We ignore arguments because they're live for the duration of 
876         a function call. We ignore captured variables because we also treat them as live 
877         for the duration of the function. This could probably be improved to be more precise, 
878         but it didn't seem worth it for now.
879         (JSC::setForOperand): Convenience wrapper that sets the bit in the provided bit 
880         vector for the provided operand. It handles skipping over captured variables.
881         (JSC::computeUsesForBytecodeOffset): Computes which operands are used by a particular bytecode.
882         (JSC::computeDefsForBytecodeOffset): Computes which operands are defined by a particular 
883         bytecode. Typically this is just the left-most operand.
884         (JSC::findBasicBlockWithLeaderOffset): 
885         (JSC::findBasicBlockForBytecodeOffset): Scans over basic blocks to find the block 
886         which contains a particular bytecode offset.
887         (JSC::computeLocalLivenessForBytecodeOffset): Computes block-local liveness from the 
888         bottom of the block until a specified bytecode offset is reached. 
889         (JSC::computeLocalLivenessForBlock): Computes liveness for the entire block and 
890         stores the resulting liveness at the head.
891         (JSC::BytecodeLivenessAnalysis::runLivenessFixpoint): Runs backward flow liveness 
892         analysis to fixpoint.
893         (JSC::BytecodeLivenessAnalysis::getLivenessInfoForNonCapturedVarsAtBytecodeOffset): 
894         Slow path to get liveness info for non-captured, non-argument variable.
895         (JSC::BytecodeLivenessAnalysis::operandIsLiveAtBytecodeOffset): 
896         (JSC::BytecodeLivenessAnalysis::getLivenessInfoAtBytecodeOffset): Returns the liveness 
897         info for both captured and non-captured vars at a particular bytecode offset.
898         (JSC::BytecodeLivenessAnalysis::dumpResults): Dumps the output of the liveness analysis. 
899         Controlled by new flag in Options.h/.cpp.
900         (JSC::BytecodeLivenessAnalysis::compute): Creates bytecode basic blocks and runs 
901         full liveness analysis.
902         * bytecode/BytecodeLivenessAnalysis.h: Added.
903         (JSC::BytecodeLivenessAnalysis::hasBeenComputed):
904         (JSC::BytecodeLivenessAnalysis::computeIfNecessary):
905         * bytecode/CodeBlock.cpp:
906         (JSC::CodeBlock::CodeBlock):
907         * bytecode/CodeBlock.h:
908         (JSC::CodeBlock::livenessAnalysis):
909         * bytecode/PreciseJumpTargets.cpp: Refactored to be able to get the jump targets for 
910         a particular bytecode offset for use during bytecode basic block construction.
911         (JSC::getJumpTargetsForBytecodeOffset):
912         (JSC::computePreciseJumpTargets):
913         (JSC::findJumpTargetsForBytecodeOffset):
914         * bytecode/PreciseJumpTargets.h:
915         * runtime/Options.cpp:
916         (JSC::Options::initialize):
917         * runtime/Options.h:
918
919 2013-11-11  Andy Estes  <aestes@apple.com>
920
921         [iOS] Define JSC_OBJC_API_ENABLED
922         https://bugs.webkit.org/show_bug.cgi?id=124192
923
924         Reviewed by Geoffrey Garen.
925
926         * API/JSBase.h: JSC_OBJC_API_ENABLED should evaluate to true if
927         TARGET_OS_IPHONE is true.
928         * API/JSValue.h: Ensure CG types referenced later in the file are defined.
929
930 2013-11-12  Balazs Kilvady  <kilvadyb@homejinni.com>
931
932         Fix undefined reference issues in JavaScriptCore build.
933         https://bugs.webkit.org/show_bug.cgi?id=124152
934
935         Reviewed by Michael Saboff.
936
937         Missing includes added.
938
939         * runtime/SymbolTable.cpp:
940
941 2013-11-12  Alexandru Chiculita  <achicu@adobe.com>
942
943         Web Inspector: Crash when closing the Inspector while debugging an exception inside a breakpoint condition.
944         https://bugs.webkit.org/show_bug.cgi?id=124078
945
946         Reviewed by Joseph Pecoraro.
947
948         The crash would happen because the Debugger is not designed to support nested
949         breaks. For example, when the debugger handles a breakpoint and the Inspector
950         executes a console command that would hit the breakpoint again, the Debugger
951         will just ignore the breakpoint.
952
953         There were no checks for conditions and actions. Because of that conditions and actions
954         could trigger exceptions and breakpoints. This patch disables that functionality as it
955         cannot be supported without a bigger rewrite of the code.
956
957         * debugger/Debugger.cpp:
958         (JSC::TemporaryPausedState::TemporaryPausedState):
959         (JSC::TemporaryPausedState::~TemporaryPausedState):
960         (JSC::Debugger::hasBreakpoint):
961         (JSC::Debugger::pauseIfNeeded):
962         * debugger/Debugger.h:
963
964 2013-11-12  Julien Brianceau  <jbriance@cisco.com>
965
966         InvalidIndex shouldn't be private in GPRInfo and FPRInfo for sh4, mips and arm64 architectures.
967         https://bugs.webkit.org/show_bug.cgi?id=124156
968
969         Reviewed by Michael Saboff.
970
971         * jit/FPRInfo.h:
972         (JSC::FPRInfo::debugName):
973         * jit/GPRInfo.h:
974         (JSC::GPRInfo::debugName):
975
976 2013-11-11  Andreas Kling  <akling@apple.com>
977
978         CodeBlock: Un-segment some Vectors.
979         <https://webkit.org/b/124188>
980
981         Turn some SegmentedVectors into Vectors where the final item count
982         is known at CodeBlock construction time. This removes unnecessary
983         allocation and indirection.
984
985         I've got ~4.5 MB below SegmentedVector<ValueProfile>::ensureSegment
986         on Membuster3 (peak, before pressure signal) so this should help
987         take a bit of the edge off there.
988
989         Reviewed by Geoffrey Garen.
990
991 2013-11-11  Filip Pizlo  <fpizlo@apple.com>
992
993         Get rid of the lastResultRegister optimization in the baseline JIT
994         https://bugs.webkit.org/show_bug.cgi?id=124171
995
996         Rubber stamped by Mark Hahnenberg.
997         
998         The baseline JIT no longer needs amazing throughput. And this optimization has caused
999         way too many OSR exit bugs. And it constrains how much we can do in the DFG/FTL. So,
1000         I'm getting rid of it.
1001
1002         * dfg/DFGOSRExit.cpp:
1003         (JSC::DFG::OSRExit::OSRExit):
1004         (JSC::DFG::OSRExit::convertToForward):
1005         * dfg/DFGOSRExit.h:
1006         * dfg/DFGOSRExitCompiler32_64.cpp:
1007         (JSC::DFG::OSRExitCompiler::compileExit):
1008         * dfg/DFGOSRExitCompiler64.cpp:
1009         (JSC::DFG::OSRExitCompiler::compileExit):
1010         * dfg/DFGSpeculativeJIT.cpp:
1011         (JSC::DFG::SpeculativeJIT::SpeculativeJIT):
1012         (JSC::DFG::SpeculativeJIT::compileMovHint):
1013         (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
1014         * dfg/DFGSpeculativeJIT.h:
1015         * ftl/FTLLowerDFGToLLVM.cpp:
1016         (JSC::FTL::LowerDFGToLLVM::LowerDFGToLLVM):
1017         (JSC::FTL::LowerDFGToLLVM::compileZombieHint):
1018         (JSC::FTL::LowerDFGToLLVM::compileInvalidationPoint):
1019         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
1020         (JSC::FTL::LowerDFGToLLVM::observeMovHint):
1021         * ftl/FTLOSRExit.cpp:
1022         (JSC::FTL::OSRExit::OSRExit):
1023         (JSC::FTL::OSRExit::convertToForward):
1024         * ftl/FTLOSRExit.h:
1025         * ftl/FTLOSRExitCompiler.cpp:
1026         (JSC::FTL::compileStub):
1027         * jit/JIT.cpp:
1028         (JSC::JIT::JIT):
1029         (JSC::JIT::privateCompileMainPass):
1030         (JSC::JIT::privateCompileSlowCases):
1031         * jit/JIT.h:
1032         (JSC::JIT::appendCall):
1033         * jit/JITArithmetic32_64.cpp:
1034         (JSC::JIT::emit_op_lshift):
1035         (JSC::JIT::emitRightShift):
1036         (JSC::JIT::emit_op_bitand):
1037         (JSC::JIT::emit_op_bitor):
1038         (JSC::JIT::emit_op_bitxor):
1039         (JSC::JIT::emit_op_inc):
1040         (JSC::JIT::emit_op_dec):
1041         * jit/JITCall.cpp:
1042         (JSC::JIT::emitPutCallResult):
1043         (JSC::JIT::compileLoadVarargs):
1044         * jit/JITInlines.h:
1045         (JSC::JIT::emitGetFromCallFrameHeaderPtr):
1046         (JSC::JIT::emitGetFromCallFrameHeader32):
1047         (JSC::JIT::emitGetFromCallFrameHeader64):
1048         (JSC::JIT::emitLoadTag):
1049         (JSC::JIT::emitLoadPayload):
1050         (JSC::JIT::emitLoad2):
1051         (JSC::JIT::emitGetVirtualRegister):
1052         (JSC::JIT::emitGetVirtualRegisters):
1053         (JSC::JIT::emitPutVirtualRegister):
1054         * jit/JITOpcodes.cpp:
1055         (JSC::JIT::emit_op_mov):
1056         (JSC::JIT::emit_op_catch):
1057         (JSC::JIT::emit_op_new_func):
1058         * jit/JITOpcodes32_64.cpp:
1059         (JSC::JIT::emit_op_mov):
1060         (JSC::JIT::emit_op_to_primitive):
1061         (JSC::JIT::emit_op_to_number):
1062         (JSC::JIT::emit_op_catch):
1063         * jit/JITPropertyAccess.cpp:
1064         (JSC::JIT::emit_op_resolve_scope):
1065         (JSC::JIT::emit_op_get_from_scope):
1066         (JSC::JIT::emit_op_put_to_scope):
1067         * jit/JITPropertyAccess32_64.cpp:
1068         (JSC::JIT::emit_op_get_by_val):
1069         (JSC::JIT::emit_op_get_by_id):
1070         (JSC::JIT::emit_op_get_by_pname):
1071         (JSC::JIT::emitResolveClosure):
1072         (JSC::JIT::emit_op_resolve_scope):
1073         (JSC::JIT::emit_op_get_from_scope):
1074         (JSC::JIT::emit_op_init_global_const):
1075         * jit/SlowPathCall.h:
1076         (JSC::JITSlowPathCall::call):
1077
1078 2013-11-11  Filip Pizlo  <fpizlo@apple.com>
1079
1080         Remove ConstantFoldingPhase's weirdo compile-time optimization
1081         https://bugs.webkit.org/show_bug.cgi?id=124169
1082
1083         Reviewed by Mark Hahnenberg.
1084         
1085         It turns out that this compile-time optimization doesn't optimize compile times
1086         anymore. Kill it with fire.
1087
1088         * dfg/DFGConstantFoldingPhase.cpp:
1089         (JSC::DFG::ConstantFoldingPhase::foldConstants):
1090
1091 2013-11-11  Filip Pizlo  <fpizlo@apple.com>
1092
1093         Make bytecode dumping use the right opcode names for inc/dec.
1094
1095         Rubber stamped by Mark Hahnenberg.
1096
1097         * bytecode/CodeBlock.cpp:
1098         (JSC::CodeBlock::dumpBytecode):
1099
1100 2013-11-10  Filip Pizlo  <fpizlo@apple.com>
1101
1102         DFG Int52 boxing code may clobber the source without telling anyone
1103         https://bugs.webkit.org/show_bug.cgi?id=124137
1104
1105         Reviewed by Mark Hahnenberg.
1106
1107         * dfg/DFGSpeculativeJIT64.cpp:
1108         (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).
1109         * jit/AssemblyHelpers.h: Document the invariant for boxInt52.
1110         * jsc.cpp:
1111         (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.
1112
1113 2013-11-11  Oliver Hunt  <oliver@apple.com>
1114
1115         ExtJS breaks with modern Array.prototype.values API due to use of with()
1116         https://bugs.webkit.org/show_bug.cgi?id=123440
1117
1118         Reviewed by Beth Dakin.
1119
1120         As with our attempt to make Arguments use the Array prototype, ExtJS has
1121         a weird dependency on not adding new APIs to core types.  In this case
1122         Array.prototype.values.  The fix is to remove it, and push for ES6 to drop
1123         the API.
1124
1125         * runtime/ArrayPrototype.cpp:
1126
1127 2013-11-11  Gabor Rapcsanyi  <rgabor@webkit.org>
1128
1129         Fix CPU(ARM_TRADITIONAL) build after r159039.
1130         https://bugs.webkit.org/show_bug.cgi?id=124149
1131
1132         Reviewed by Geoffrey Garen.
1133
1134         * assembler/ARMAssembler.h:
1135         (JSC::ARMAssembler::firstRegister):
1136         (JSC::ARMAssembler::lastRegister):
1137         (JSC::ARMAssembler::firstFPRegister):
1138         (JSC::ARMAssembler::lastFPRegister):
1139         * assembler/MacroAssemblerARM.h:
1140         * jit/FPRInfo.h:
1141
1142 2013-11-09  Filip Pizlo  <fpizlo@apple.com>
1143
1144         Switch FTL GetById/PutById IC's over to using AnyRegCC
1145         https://bugs.webkit.org/show_bug.cgi?id=124094
1146
1147         Reviewed by Sam Weinig.
1148         
1149         This closes the loop on inline caches (IC's) in the FTL. The goal is to have IC's
1150         in LLVM-generated code that are just as efficient (if not more so) than what a
1151         custom JIT could do. As in zero sources of overhead. Not a single extra instruction
1152         or even register allocation pathology. We accomplish this by having two thingies in
1153         LLVM. First is the llvm.experimental.patchpoint intrinsic, which is sort of an
1154         inline machine code snippet that we can fill in with whatever we want and then
1155         modify subsequently. But you have only two choices of how to pass values to a
1156         patchpoint: (1) via the calling convention or (2) via the stackmap. Neither are good
1157         for operands to an IC (like the base pointer for a GetById, for example). (1) is bad
1158         because it results in things being pinned to certain registers a priori; a custom
1159         JIT (like the DFG) will not pin IC operands to any registers a priori but will allow
1160         the register allocator to do whatever it wants. (2) is bad because the operands may
1161         be spilled or may be represented in other crazy ways. You generally want an IC to
1162         have its operands in registers. Also, patchpoints only return values using the
1163         calling convention, which is unfortunate since it pins the return value to a
1164         register a priori. This is where the second thingy comes in: the AnyRegCC. This is
1165         a special calling convention only for use with patchpoints. It means that arguments
1166         passed "by CC" in the patchpoint can be placed in any register, and the register
1167         that gets used is reported as part of the stackmap. It also means that the return
1168         value (if there is one) can be placed in any register, and the stackmap will tell
1169         you which one it was. Thus, patchpoints combined with AnyRegCC mean that you not
1170         only get the kind of self-modifying code that you want for IC's, but you also get
1171         all of the register allocation goodness that a custom JIT would have given you.
1172         Except that you're getting it from LLVM and not a custom JIT. Awesome.
1173         
1174         Even though all of the fun stuff is on the LLVM side, this patch was harder than
1175         you'd expect.
1176         
1177         First the obvious bits:
1178         
1179         - IC patchpoints now use AnyRegCC instead of the C CC. (CC = calling convention.)
1180         
1181         - FTL::fixFunctionBasedOnStackMaps() now correctly figures out which registers the
1182           IC is supposed to use instead of assuming C CC argument registers.
1183         
1184         And then all of the stuff that broke and that this patch fixes:
1185         
1186         - IC sizing based on generating a dummy IC (what FTLInlineCacheSize did) is totally
1187           bad on x86-64, where various register permutations lead to bizarre header bytes
1188           and eclectic SIB encodings. I changed that to have magic constants, for now.
1189         
1190         - Slow path calls didn't preserve the CC return register.
1191         
1192         - Repatch's scratch register allocation would get totally confused if the operand
1193           registers weren't one of the DFG-style "temp" registers. And by "totally confused"
1194           I mean that it would crash.
1195         
1196         - We assumed that r10 is callee-saved. It's not. That one dude's PPT about x86-64
1197           cdecl that I found on the intertubes was not a trustworthy source of information,
1198           apparently.
1199         
1200         - Call repatching didn't know that the FTL does its IC slow calls via specially
1201           generated thunks. This was particularly fun to fix: basically, now when we relink
1202           an IC call in the FTL, we use the old call target to find the SlowPathCallKey,
1203           which tells us everything we need to know to generate (or look up) a new thunk for
1204           the new function we want to call.
1205         
1206         * assembler/MacroAssemblerCodeRef.h:
1207         (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr):
1208         (JSC::MacroAssemblerCodePtr::isEmptyValue):
1209         (JSC::MacroAssemblerCodePtr::isDeletedValue):
1210         (JSC::MacroAssemblerCodePtr::hash):
1211         (JSC::MacroAssemblerCodePtr::emptyValue):
1212         (JSC::MacroAssemblerCodePtr::deletedValue):
1213         (JSC::MacroAssemblerCodePtrHash::hash):
1214         (JSC::MacroAssemblerCodePtrHash::equal):
1215         * assembler/MacroAssemblerX86Common.h:
1216         * assembler/RepatchBuffer.h:
1217         (JSC::RepatchBuffer::RepatchBuffer):
1218         (JSC::RepatchBuffer::codeBlock):
1219         * ftl/FTLAbbreviations.h:
1220         (JSC::FTL::setInstructionCallingConvention):
1221         * ftl/FTLCompile.cpp:
1222         (JSC::FTL::fixFunctionBasedOnStackMaps):
1223         * ftl/FTLInlineCacheSize.cpp:
1224         (JSC::FTL::sizeOfGetById):
1225         (JSC::FTL::sizeOfPutById):
1226         * ftl/FTLJITFinalizer.cpp:
1227         (JSC::FTL::JITFinalizer::finalizeFunction):
1228         * ftl/FTLLocation.cpp:
1229         (JSC::FTL::Location::forStackmaps):
1230         * ftl/FTLLocation.h:
1231         * ftl/FTLLowerDFGToLLVM.cpp:
1232         (JSC::FTL::LowerDFGToLLVM::compileGetById):
1233         (JSC::FTL::LowerDFGToLLVM::compilePutById):
1234         * ftl/FTLOSRExitCompiler.cpp:
1235         (JSC::FTL::compileStub):
1236         * ftl/FTLSlowPathCall.cpp:
1237         * ftl/FTLSlowPathCallKey.h:
1238         (JSC::FTL::SlowPathCallKey::withCallTarget):
1239         * ftl/FTLStackMaps.cpp:
1240         (JSC::FTL::StackMaps::Location::directGPR):
1241         (JSC::FTL::StackMaps::Location::restoreInto):
1242         * ftl/FTLStackMaps.h:
1243         * ftl/FTLThunks.h:
1244         (JSC::FTL::generateIfNecessary):
1245         (JSC::FTL::keyForThunk):
1246         (JSC::FTL::Thunks::keyForSlowPathCallThunk):
1247         * jit/FPRInfo.h:
1248         (JSC::FPRInfo::toIndex):
1249         * jit/GPRInfo.h:
1250         (JSC::GPRInfo::toIndex):
1251         (JSC::GPRInfo::debugName):
1252         * jit/RegisterSet.cpp:
1253         (JSC::RegisterSet::calleeSaveRegisters):
1254         * jit/RegisterSet.h:
1255         (JSC::RegisterSet::filter):
1256         * jit/Repatch.cpp:
1257         (JSC::readCallTarget):
1258         (JSC::repatchCall):
1259         (JSC::repatchByIdSelfAccess):
1260         (JSC::tryCacheGetByID):
1261         (JSC::tryCachePutByID):
1262         (JSC::tryBuildPutByIdList):
1263         (JSC::resetGetByID):
1264         (JSC::resetPutByID):
1265         * jit/ScratchRegisterAllocator.h:
1266         (JSC::ScratchRegisterAllocator::lock):
1267
1268 2013-11-10  Oliver Hunt  <oliver@apple.com>
1269
1270         Implement Set iterators
1271         https://bugs.webkit.org/show_bug.cgi?id=124129
1272
1273         Reviewed by Antti Koivisto.
1274
1275         Add Set iterator classes and implementations
1276
1277         * JavaScriptCore.xcodeproj/project.pbxproj:
1278         * runtime/CommonIdentifiers.h:
1279         * runtime/JSGlobalObject.cpp:
1280         * runtime/JSGlobalObject.h:
1281         * runtime/JSSetIterator.cpp: Added.
1282         (JSC::JSSetIterator::finishCreation):
1283         (JSC::JSSetIterator::visitChildren):
1284         (JSC::JSSetIterator::createPair):
1285         * runtime/JSSetIterator.h: Added.
1286         (JSC::JSSetIterator::createStructure):
1287         (JSC::JSSetIterator::create):
1288         (JSC::JSSetIterator::next):
1289         (JSC::JSSetIterator::JSSetIterator):
1290         * runtime/SetIteratorConstructor.cpp: Added.
1291         (JSC::SetIteratorConstructor::finishCreation):
1292         * runtime/SetIteratorConstructor.h: Added.
1293         (JSC::SetIteratorConstructor::create):
1294         (JSC::SetIteratorConstructor::createStructure):
1295         (JSC::SetIteratorConstructor::SetIteratorConstructor):
1296         * runtime/SetIteratorPrototype.cpp: Added.
1297         (JSC::SetIteratorPrototype::finishCreation):
1298         (JSC::SetIteratorPrototypeFuncIterator):
1299         (JSC::SetIteratorPrototypeFuncNext):
1300         * runtime/SetIteratorPrototype.h: Added.
1301         (JSC::SetIteratorPrototype::create):
1302         (JSC::SetIteratorPrototype::createStructure):
1303         (JSC::SetIteratorPrototype::SetIteratorPrototype):
1304         * runtime/SetPrototype.cpp:
1305         (JSC::SetPrototype::finishCreation):
1306         (JSC::setProtoFuncValues):
1307         (JSC::setProtoFuncEntries):
1308         (JSC::setProtoFuncKeys):
1309
1310 2013-11-09  Oliver Hunt  <oliver@apple.com>
1311
1312         Add Map Iterators
1313         https://bugs.webkit.org/show_bug.cgi?id=124109
1314
1315         Reviewed by Andreas Kling.
1316
1317         Added new Map iterator implementation.  This is a mostly boilerplate patch
1318         however there's a a little bit of additional logic added to the MapData iterator
1319         to deal with the possibility of map mutation between creation of the iterator
1320         and use of it.  We'll be able to improve the performance of this substantially
1321         by using intrinsics, however I'm pondering coming up with a better way to define
1322         these thunks without requiring so much duplicated logic.
1323
1324         * CMakeLists.txt:
1325         * GNUmakefile.list.am:
1326         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
1327         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
1328         * JavaScriptCore.xcodeproj/project.pbxproj:
1329         * runtime/CommonIdentifiers.h:
1330         * runtime/JSGlobalObject.cpp:
1331         * runtime/JSGlobalObject.h:
1332         * runtime/JSMapIterator.cpp: Added.
1333         (JSC::JSMapIterator::finishCreation):
1334         (JSC::JSMapIterator::visitChildren):
1335         (JSC::JSMapIterator::createPair):
1336         * runtime/JSMapIterator.h: Added.
1337         (JSC::JSMapIterator::createStructure):
1338         (JSC::JSMapIterator::create):
1339         (JSC::JSMapIterator::next):
1340         (JSC::JSMapIterator::JSMapIterator):
1341         * runtime/MapData.h:
1342         (JSC::MapData::const_iterator::ensureSlot):
1343         * runtime/MapIteratorConstructor.cpp: Added.
1344         (JSC::MapIteratorConstructor::finishCreation):
1345         * runtime/MapIteratorConstructor.h: Added.
1346         (JSC::MapIteratorConstructor::create):
1347         (JSC::MapIteratorConstructor::createStructure):
1348         (JSC::MapIteratorConstructor::MapIteratorConstructor):
1349         * runtime/MapIteratorPrototype.cpp: Added.
1350         (JSC::MapIteratorPrototype::finishCreation):
1351         (JSC::MapIteratorPrototypeFuncIterator):
1352         (JSC::MapIteratorPrototypeFuncNext):
1353         * runtime/MapIteratorPrototype.h: Added.
1354         (JSC::MapIteratorPrototype::create):
1355         (JSC::MapIteratorPrototype::createStructure):
1356         (JSC::MapIteratorPrototype::MapIteratorPrototype):
1357         * runtime/MapPrototype.cpp:
1358         (JSC::MapPrototype::finishCreation):
1359         (JSC::mapProtoFuncValues):
1360         (JSC::mapProtoFuncEntries):
1361         (JSC::mapProtoFuncKeys):
1362
1363 2013-11-08  Zan Dobersek  <zdobersek@igalia.com>
1364
1365         Unreviewed GTK build fix.
1366
1367         * GNUmakefile.list.am: Remove redundant build targets.
1368
1369 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
1370
1371         Remove dead FTL C ABI support
1372         https://bugs.webkit.org/show_bug.cgi?id=124100
1373
1374         Reviewed by Jer Noble.
1375
1376         * JavaScriptCore.xcodeproj/project.pbxproj:
1377         * ftl/FTLCArgumentGetter.cpp: Removed.
1378         * ftl/FTLCArgumentGetter.h: Removed.
1379         * ftl/FTLOSRExitCompiler.cpp:
1380         * jit/FPRInfo.h:
1381
1382 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
1383
1384         FTL should support Phantom(FinalObject:)
1385         https://bugs.webkit.org/show_bug.cgi?id=124092
1386
1387         Reviewed by Oliver Hunt.
1388
1389         * ftl/FTLAbstractHeapRepository.h:
1390         * ftl/FTLCapabilities.cpp:
1391         (JSC::FTL::canCompile):
1392         * ftl/FTLLowerDFGToLLVM.cpp:
1393         (JSC::FTL::LowerDFGToLLVM::speculate):
1394         (JSC::FTL::LowerDFGToLLVM::isType):
1395         (JSC::FTL::LowerDFGToLLVM::isNotType):
1396         (JSC::FTL::LowerDFGToLLVM::speculateFinalObject):
1397
1398 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
1399
1400         Get rid of the FTL tail call APIs since they are unused
1401         https://bugs.webkit.org/show_bug.cgi?id=124093
1402
1403         Reviewed by Oliver Hunt.
1404
1405         * ftl/FTLAbbreviations.h:
1406         (JSC::FTL::buildCall):
1407         * ftl/FTLOutput.h:
1408
1409 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
1410
1411         FTL should support AllocatePropertyStorage
1412         https://bugs.webkit.org/show_bug.cgi?id=124086
1413
1414         Reviewed by Oliver Hunt.
1415         
1416         Also rationalized some offsets in the DFG.
1417
1418         * dfg/DFGSpeculativeJIT.cpp:
1419         (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage):
1420         (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage):
1421         * ftl/FTLCapabilities.cpp:
1422         (JSC::FTL::canCompile):
1423         * ftl/FTLIntrinsicRepository.h:
1424         * ftl/FTLLowerDFGToLLVM.cpp:
1425         (JSC::FTL::LowerDFGToLLVM::compileNode):
1426         (JSC::FTL::LowerDFGToLLVM::compileAllocatePropertyStorage):
1427
1428 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
1429
1430         Get rid of the bizarre Darwin/x86-only MacroAssembler::shouldBlindForSpecificArch(uintptr_t) overload
1431         https://bugs.webkit.org/show_bug.cgi?id=124087
1432
1433         Reviewed by Michael Saboff.
1434
1435         * assembler/MacroAssembler.h:
1436         (JSC::MacroAssembler::shouldBlindPointerForSpecificArch):
1437         (JSC::MacroAssembler::shouldBlind):
1438         * assembler/MacroAssemblerX86Common.h:
1439         (JSC::MacroAssemblerX86Common::shouldBlindForSpecificArch):
1440
1441 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
1442
1443         FTL should support NewArrayBuffer
1444         https://bugs.webkit.org/show_bug.cgi?id=124067
1445
1446         Reviewed by Michael Saboff.
1447         
1448         This expanded coverage and revealed some bugs.
1449         
1450         This revealed a bug in FTL::OSRExitCompiler where it was assuming that it could save
1451         the framePointer in regT3 even though DFG::reifyInlinedCallFrames() would clobber it.
1452         It turns out that this can be fixed by just completely restoring the stack prior to
1453         doing reifyInlineCallFrames().
1454         
1455         I used this as an opportunity to simplify NewArray. That revealed a bug; whenever we say
1456         lowJSValue() in there we need to use ManualOperandSpeculation since we're using it to
1457         rebox values even when we also have to do some speculations. The speculations are done
1458         at the top of compileNewArray().
1459         
1460         This also revealed a bug in StringCharAt() for the OOB case.
1461
1462         * ftl/FTLAbstractHeapRepository.h:
1463         (JSC::FTL::AbstractHeapRepository::forIndexingType):
1464         * ftl/FTLCapabilities.cpp:
1465         (JSC::FTL::canCompile):
1466         * ftl/FTLIntrinsicRepository.h:
1467         * ftl/FTLLowerDFGToLLVM.cpp:
1468         (JSC::FTL::LowerDFGToLLVM::compileNode):
1469         (JSC::FTL::LowerDFGToLLVM::compileNewArray):
1470         (JSC::FTL::LowerDFGToLLVM::compileNewArrayBuffer):
1471         (JSC::FTL::LowerDFGToLLVM::compileStringCharAt):
1472         * ftl/FTLOSRExitCompiler.cpp:
1473         (JSC::FTL::compileStub):
1474
1475 2013-11-08  Filip Pizlo  <fpizlo@apple.com>
1476
1477         It should be easy to disable blinding on a per-architecture basis
1478         https://bugs.webkit.org/show_bug.cgi?id=124083
1479
1480         Reviewed by Michael Saboff.
1481
1482         * assembler/AbstractMacroAssembler.h:
1483         (JSC::AbstractMacroAssembler::haveScratchRegisterForBlinding):
1484         (JSC::AbstractMacroAssembler::scratchRegisterForBlinding):
1485         (JSC::AbstractMacroAssembler::canBlind):
1486         (JSC::AbstractMacroAssembler::shouldBlindForSpecificArch):
1487         * assembler/MacroAssembler.h:
1488         (JSC::MacroAssembler::shouldBlind):
1489         (JSC::MacroAssembler::store32):
1490         (JSC::MacroAssembler::branch32):
1491         (JSC::MacroAssembler::branchAdd32):
1492         (JSC::MacroAssembler::branchMul32):
1493         * assembler/MacroAssemblerX86Common.h:
1494         (JSC::MacroAssemblerX86Common::canBlind):
1495         * assembler/MacroAssemblerX86_64.h:
1496         (JSC::MacroAssemblerX86_64::haveScratchRegisterForBlinding):
1497
1498 2013-11-08  Oliver Hunt  <oliver@apple.com>
1499
1500         Remove more accidentally added files.
1501
1502         * runtime/SetIteratorConstructor.cpp: Removed.
1503         * runtime/SetIteratorConstructor.h: Removed.
1504         * runtime/SetIteratorPrototype.cpp: Removed.
1505         * runtime/SetIteratorPrototype.h: Removed.
1506
1507 2013-11-08  Oliver Hunt  <oliver@apple.com>
1508
1509         Remove accidentally added files.
1510
1511         * runtime/JSSetIterator.cpp: Removed.
1512         * runtime/JSSetIterator.h: Removed.
1513
1514 2013-11-08  Oliver Hunt  <oliver@apple.com>
1515
1516         Fix minor (unobservable) bug in ArrayIterator::next()
1517         https://bugs.webkit.org/show_bug.cgi?id=124061
1518
1519         Reviewed by Beth Dakin.
1520
1521         I noticed this while reading the array iterator code.  Due to how
1522         ArrayIterator::next() and our enumeration behaviour is implemented
1523         this is not actually a code path that can be hit.  But in order to
1524         future proof this it should be correct.
1525         
1526         * runtime/JSArrayIterator.cpp:
1527         (JSC::arrayIteratorNext):
1528
1529 2013-11-08  Mark Lam  <mark.lam@apple.com>
1530
1531         Move breakpoint (and exception break) functionality into JSC::Debugger.
1532         https://bugs.webkit.org/show_bug.cgi?id=121796.
1533
1534         Reviewed by Geoffrey Garen.
1535
1536         - In ScriptDebugServer and JSC::Debugger, SourceID and BreakpointID are
1537           now numeric tokens.
1538
1539         - JSC::Debugger now tracks user defined breakpoints in a JSC::Breakpoint
1540           record. Previously, this info is tracked in the ScriptBreakpoint record
1541           in ScriptDebugServer. The only element of ScriptBreakpoint that is not
1542           being tracked by JSC::Breakpoint is the ScriptBreakpointAction.
1543              The ScriptBreakpointAction is still tracked by the ScriptDebugServer
1544           in a list keyed on the corresponding BreakpointID.
1545              The ScriptBreakpoint record is now only used as a means of passing
1546           breakpoint paramaters to the ScriptDebugServer.
1547
1548         - ScriptDebugServer now no longer accesses the JSC::CallFrame* directly.
1549           It always goes through the DebuggerCallFrame.
1550
1551         * GNUmakefile.list.am:
1552         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
1553         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
1554         * JavaScriptCore.xcodeproj/project.pbxproj:
1555         * debugger/Breakpoint.h: Added.
1556         (JSC::Breakpoint::Breakpoint):
1557         - Breakpoint class to track info for each breakpoint in JSC::Debugger.
1558         * debugger/Debugger.cpp:
1559         (JSC::DebuggerCallFrameScope::DebuggerCallFrameScope):
1560         (JSC::DebuggerCallFrameScope::~DebuggerCallFrameScope):
1561         (JSC::Debugger::Debugger):
1562         (JSC::Debugger::detach):
1563         (JSC::Debugger::updateNeedForOpDebugCallbacks):
1564         (JSC::Debugger::setBreakpoint):
1565         (JSC::Debugger::removeBreakpoint):
1566         (JSC::Debugger::hasBreakpoint):
1567         (JSC::Debugger::clearBreakpoints):
1568         (JSC::Debugger::setBreakpointsActivated):
1569         (JSC::Debugger::setPauseOnExceptionsState):
1570         (JSC::Debugger::setPauseOnNextStatement):
1571         (JSC::Debugger::breakProgram):
1572         (JSC::Debugger::continueProgram):
1573         (JSC::Debugger::stepIntoStatement):
1574         (JSC::Debugger::stepOverStatement):
1575         (JSC::Debugger::stepOutOfFunction):
1576         (JSC::Debugger::updateCallFrame):
1577         (JSC::Debugger::updateCallFrameAndPauseIfNeeded):
1578         (JSC::Debugger::pauseIfNeeded):
1579         (JSC::Debugger::exception):
1580         (JSC::Debugger::atStatement):
1581         (JSC::Debugger::callEvent):
1582         (JSC::Debugger::returnEvent):
1583         (JSC::Debugger::willExecuteProgram):
1584         (JSC::Debugger::didExecuteProgram):
1585         (JSC::Debugger::didReachBreakpoint):
1586         (JSC::Debugger::currentDebuggerCallFrame):
1587         * debugger/Debugger.h:
1588         * debugger/DebuggerCallFrame.cpp:
1589         (JSC::DebuggerCallFrame::sourceID):
1590         (JSC::DebuggerCallFrame::sourceIDForCallFrame):
1591         * debugger/DebuggerCallFrame.h:
1592         * debugger/DebuggerPrimitives.h: Added.
1593         - define SourceID, noSourceID, BreakpointID, and noBreakpointID.
1594
1595 2013-11-08  Oliver Hunt  <oliver@apple.com>
1596
1597         Map.forEach crashes on deleted values
1598         https://bugs.webkit.org/show_bug.cgi?id=124017
1599
1600         Reviewed by Ryosuke Niwa.
1601
1602         MapData iterator did not consider the case of the first entries
1603         being holes.  To fix this I've refactored iteration so that we
1604         can perform an initialisation increment on construction, whle
1605         retaining the useful assertion in MapData::const_iterator::operator++
1606
1607         * runtime/MapData.h:
1608         (JSC::MapData::const_iterator::operator++):
1609         (JSC::MapData::const_iterator::internalIncrement):
1610         (JSC::MapData::const_iterator::const_iterator):
1611
1612 2013-11-08  Julien Brianceau  <jbriance@cisco.com>
1613
1614         REGRESSION(r158883): Fix crashes for ARM architecture.
1615         https://bugs.webkit.org/show_bug.cgi?id=124038
1616
1617         Reviewed by Michael Saboff.
1618
1619         * jit/GPRInfo.h: Remove r11 from the temporary register set, use a free register for
1620         nonPreservedNonReturnGPR and remove obsolete declaration of bucketCounterRegister.
1621         (JSC::GPRInfo::toRegister):
1622         (JSC::GPRInfo::toIndex):
1623         * jit/JITOperations.cpp: Frame pointer register is r11 for ARM_TRADITIONAL and
1624         r7 for ARM_THUMB2 instead of r5 since r158883.
1625
1626 2013-11-08  Julien Brianceau  <jbriance@cisco.com>
1627
1628         REGRESSION(r158883): Fix crashes for MIPS architecture.
1629         https://bugs.webkit.org/show_bug.cgi?id=124044
1630
1631         Reviewed by Michael Saboff.
1632
1633         * jit/JITOperations.cpp: Frame pointer register is fp instead of s0 since r158883 for MIPS.
1634         * jit/ThunkGenerators.cpp: Save and restore the new frame pointer register.
1635         (JSC::returnFromJavaScript):
1636         (JSC::callToJavaScript):
1637
1638 2013-11-08  peavo@outlook.com  <peavo@outlook.com>
1639
1640         [Win] JavaScript crash in getHostCallReturnValue.
1641         https://bugs.webkit.org/show_bug.cgi?id=124040
1642
1643         Reviewed by Geoffrey Garen.
1644
1645         * jit/JITOperations.cpp: Update MSVC assembler code in getHostCallReturnValue according to gcc x86 version.
1646
1647 2013-11-08  Julien Brianceau  <jbriance@cisco.com>
1648
1649         [mips] Fix typo (introduced in r158751).
1650         https://bugs.webkit.org/show_bug.cgi?id=124033.
1651
1652         Reviewed by Csaba Osztrogonác.
1653
1654         * jit/ThunkGenerators.cpp:
1655         (JSC::callToJavaScript):
1656
1657 2013-11-08  Julien Brianceau  <jbriance@cisco.com>
1658
1659         [arm] Use specific PatchableJump implementation for CPU(ARM_TRADITIONAL).
1660         https://bugs.webkit.org/show_bug.cgi?id=123891
1661
1662         Reviewed by Michael Saboff.
1663
1664         Although patchableBranch32 is implemented in MacroAssemblerARM.h, the used implementation
1665         is the generic one in MacroAssembler.h. This patch fixes it and also implements the
1666         patchableJump() function for CPU(ARM_TRADITIONAL). These specific implementations are
1667         needed for this architecture backend to ensure that these jumps can be relinked.
1668
1669         * assembler/MacroAssembler.h:
1670         * assembler/MacroAssemblerARM.h:
1671         (JSC::MacroAssemblerARM::patchableJump):
1672         * jit/GPRInfo.h: Remove static_cast that are generating warnings in debug builds.
1673         (JSC::GPRInfo::toIndex):
1674         (JSC::GPRInfo::debugName):
1675
1676 2013-11-07  Mark Lam  <mark.lam@apple.com>
1677
1678         Get rid of the regT* definitions in JSInterfaceJIT.h.
1679         https://bugs.webkit.org/show_bug.cgi?id=123806.
1680
1681         Reviewed by Geoffrey Garen.
1682
1683         JSInterfaceJIT now inherits from GPRInfo and FPRInfo, and relies on them
1684         to provide all the register definitions.
1685
1686         * jit/GPRInfo.h:
1687         (JSC::GPRInfo::toArgumentRegister):
1688         * jit/JIT.cpp:
1689         (JSC::JIT::emitEnterOptimizationCheck):
1690         (JSC::JIT::privateCompile):
1691         * jit/JITArithmetic.cpp:
1692         (JSC::JIT::emit_compareAndJumpSlow):
1693         * jit/JITArithmetic32_64.cpp:
1694         (JSC::JIT::emit_compareAndJumpSlow):
1695         * jit/JITCall.cpp:
1696         (JSC::JIT::compileLoadVarargs):
1697         * jit/JITCall32_64.cpp:
1698         (JSC::JIT::compileLoadVarargs):
1699         * jit/JITInlines.h:
1700         (JSC::JIT::appendCallWithExceptionCheckSetJSValueResult):
1701         (JSC::JIT::appendCallWithExceptionCheckSetJSValueResultWithProfile):
1702         * jit/JITOpcodes.cpp:
1703         (JSC::JIT::emit_op_end):
1704         (JSC::JIT::emitSlow_op_new_object):
1705         (JSC::JIT::emit_op_ret):
1706         (JSC::JIT::emit_op_ret_object_or_this):
1707         (JSC::JIT::emit_op_throw):
1708         (JSC::JIT::emit_op_get_pnames):
1709         (JSC::JIT::emit_op_switch_imm):
1710         (JSC::JIT::emit_op_switch_char):
1711         (JSC::JIT::emit_op_switch_string):
1712         (JSC::JIT::emit_op_create_activation):
1713         (JSC::JIT::emit_op_create_arguments):
1714         (JSC::JIT::emitSlow_op_jfalse):
1715         (JSC::JIT::emitSlow_op_jtrue):
1716         (JSC::JIT::emitSlow_op_eq):
1717         (JSC::JIT::emitSlow_op_neq):
1718         (JSC::JIT::emitSlow_op_get_argument_by_val):
1719         (JSC::JIT::emitSlow_op_loop_hint):
1720         * jit/JITOpcodes32_64.cpp:
1721         (JSC::JIT::privateCompileCTINativeCall):
1722         (JSC::JIT::emit_op_end):
1723         (JSC::JIT::emitSlow_op_new_object):
1724         (JSC::JIT::emitSlow_op_jfalse):
1725         (JSC::JIT::emitSlow_op_jtrue):
1726         (JSC::JIT::emitSlow_op_eq):
1727         (JSC::JIT::emitSlow_op_neq):
1728         (JSC::JIT::emit_op_throw):
1729         (JSC::JIT::emit_op_get_pnames):
1730         (JSC::JIT::emit_op_switch_imm):
1731         (JSC::JIT::emit_op_switch_char):
1732         (JSC::JIT::emit_op_switch_string):
1733         (JSC::JIT::emit_op_create_activation):
1734         (JSC::JIT::emit_op_create_arguments):
1735         (JSC::JIT::emitSlow_op_get_argument_by_val):
1736         * jit/JSInterfaceJIT.h:
1737         (JSC::JSInterfaceJIT::JSInterfaceJIT):
1738         * jit/SlowPathCall.h:
1739         (JSC::JITSlowPathCall::call):
1740         * jit/ThunkGenerators.cpp:
1741
1742 2013-11-07  Filip Pizlo  <fpizlo@apple.com>
1743
1744         FTL should support NewArray
1745         https://bugs.webkit.org/show_bug.cgi?id=124010
1746
1747         Reviewed by Oliver Hunt.
1748
1749         * ftl/FTLCapabilities.cpp:
1750         (JSC::FTL::canCompile):
1751         * ftl/FTLIntrinsicRepository.h:
1752         * ftl/FTLLowerDFGToLLVM.cpp:
1753         (JSC::FTL::LowerDFGToLLVM::compileNode):
1754         (JSC::FTL::LowerDFGToLLVM::compileNewObject):
1755         (JSC::FTL::LowerDFGToLLVM::compileNewArray):
1756         (JSC::FTL::LowerDFGToLLVM::allocateCell):
1757         (JSC::FTL::LowerDFGToLLVM::allocateObject):
1758         (JSC::FTL::LowerDFGToLLVM::allocateBasicStorageAndGetEnd):
1759         (JSC::FTL::LowerDFGToLLVM::ArrayValues::ArrayValues):
1760         (JSC::FTL::LowerDFGToLLVM::allocateJSArray):
1761         * ftl/FTLOutput.h:
1762         (JSC::FTL::Output::loadDouble):
1763         (JSC::FTL::Output::storeDouble):
1764
1765 2013-11-07  Michael Saboff  <msaboff@apple.com>
1766
1767         Change CallFrameRegister to architected frame pointer register
1768         https://bugs.webkit.org/show_bug.cgi?id=123956
1769
1770         Reviewed by Geoffrey Garen.
1771
1772         Changed X86 and ARM variants as well as MIPS to use their respective architected
1773         frame pointer registers.  The freed up callFrameRegisteris are made available to 
1774         the DFG register allocator.  Modified the FTL OSR exit compiler to use a temporary
1775         register as a stand in for the destination callFrameRegister since the FTL frame
1776         pointer register is needed to extract values from the FTL stack.
1777
1778         Reviewed by Geoffrey Garen.
1779
1780         * assembler/ARMAssembler.h:
1781         * assembler/ARMv7Assembler.h:
1782         * assembler/MacroAssemblerMIPS.h:
1783         * ftl/FTLOSRExitCompiler.cpp:
1784         (JSC::FTL::compileStub):
1785         * jit/AssemblyHelpers.h:
1786         (JSC::AssemblyHelpers::addressFor):
1787         * jit/GPRInfo.h:
1788         (JSC::GPRInfo::toRegister):
1789         (JSC::GPRInfo::toIndex):
1790         * jit/JITOperations.cpp:
1791         * jit/JSInterfaceJIT.h:
1792         * jit/ThunkGenerators.cpp:
1793         (JSC::callToJavaScript):
1794         * offlineasm/arm.rb:
1795         * offlineasm/arm64.rb:
1796         * offlineasm/mips.rb:
1797         * offlineasm/x86.rb:
1798
1799 2013-11-07  Oliver Hunt  <oliver@apple.com>
1800
1801         Reproducible crash when using Map (affects Web Inspector)
1802         https://bugs.webkit.org/show_bug.cgi?id=123940
1803
1804         Reviewed by Geoffrey Garen.
1805
1806         Trivial fix.  Once again we get bitten by attempting to be clever when
1807         growing while adding entries to indexing maps.
1808
1809         Now we simply do a find(), and then add() _after_ we've ensured there is
1810         sufficient space in the MapData list.
1811
1812         * runtime/MapData.cpp:
1813         (JSC::MapData::add):
1814
1815 2013-11-07  Mark Lam  <mark.lam@apple.com>
1816
1817         Cosmetic: rename xxxId to xxxID for ScriptId, SourceId, and BreakpointId.
1818         https://bugs.webkit.org/show_bug.cgi?id=123945.
1819
1820         Reviewed by Geoffrey Garen.
1821
1822         * debugger/DebuggerCallFrame.cpp:
1823         (JSC::DebuggerCallFrame::sourceID):
1824         (JSC::DebuggerCallFrame::sourceIDForCallFrame):
1825         * debugger/DebuggerCallFrame.h:
1826
1827 2013-11-07  Michael Saboff  <msaboff@apple.com>
1828
1829         returnFromJavaScript() for ARM_THUMB2 uses push()s which should be pop()s
1830         https://bugs.webkit.org/show_bug.cgi?id=124006
1831
1832         Rubber stamped by Mark Hahnenberg.
1833
1834         Changed the push() calls to pop().
1835
1836         * jit/ThunkGenerators.cpp:
1837         (JSC::returnFromJavaScript):
1838
1839 2013-11-07  Michael Saboff  <msaboff@apple.com>
1840
1841         Remove unneeded moving of ESP to ECX in callToJavaScript for COMPILER(MSVC)
1842         https://bugs.webkit.org/show_bug.cgi?id=123998
1843
1844         Reviewed by Mark Lam.
1845
1846         Dead code removal.  Passing esp as the first "C" argument to a JavaScript
1847         function is no longer needed.
1848
1849         * jit/ThunkGenerators.cpp:
1850         (JSC::callToJavaScript):
1851
1852 2013-11-07  Julien Brianceau  <jbriance@cisco.com>
1853
1854         Fix build for architectures with 4 argument registers (broken since r158820).
1855         https://bugs.webkit.org/show_bug.cgi?id=123969
1856
1857         Reviewed by Andreas Kling.
1858
1859         * jit/CCallHelpers.h:
1860         (JSC::CCallHelpers::setupArguments):
1861
1862 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
1863
1864         FTL should support CheckFunction
1865         https://bugs.webkit.org/show_bug.cgi?id=123862
1866
1867         Reviewed by Sam Weinig.
1868
1869         * ftl/FTLCapabilities.cpp:
1870         (JSC::FTL::canCompile):
1871         * ftl/FTLLowerDFGToLLVM.cpp:
1872         (JSC::FTL::LowerDFGToLLVM::compileNode):
1873         (JSC::FTL::LowerDFGToLLVM::compileCheckFunction):
1874
1875 2013-11-06  Filip Pizlo  <fpizlo@apple.com>
1876
1877         IC code should handle the call frame register not being the callFrameRegister
1878         https://bugs.webkit.org/show_bug.cgi?id=123865
1879
1880         Reviewed by Geoffrey Garen.
1881         
1882         For now, in the FTL, the call frame may be something other than our frame pointer,
1883         since it's an argument passed in according to whatever convention LLVM picks.
1884         
1885         This is temporary in two ways - pretty soon the callFrameRegister will be the actual
1886         frame pointer and not some other register, and LLVM will not pass the frame pointer
1887         as an argument to IC's.
1888
1889         * bytecode/StructureStubInfo.h:
1890         * dfg/DFGSpeculativeJIT32_64.cpp:
1891         (JSC::DFG::SpeculativeJIT::cachedGetById):
1892         (JSC::DFG::SpeculativeJIT::cachedPutById):
1893         * dfg/DFGSpeculativeJIT64.cpp:
1894         (JSC::DFG::SpeculativeJIT::cachedGetById):
1895         (JSC::DFG::SpeculativeJIT::cachedPutById):
1896         * ftl/FTLCompile.cpp:
1897         (JSC::FTL::fixFunctionBasedOnStackMaps):
1898         * ftl/FTLInlineCacheSize.cpp:
1899         (JSC::FTL::sizeOfGetById):
1900         (JSC::FTL::sizeOfPutById):
1901         * jit/CCallHelpers.h:
1902         (JSC::CCallHelpers::setupArguments):
1903         * jit/JITInlineCacheGenerator.cpp:
1904         (JSC::JITByIdGenerator::JITByIdGenerator):
1905         (JSC::JITPutByIdGenerator::JITPutByIdGenerator):
1906         * jit/JITInlineCacheGenerator.h:
1907         (JSC::JITGetByIdGenerator::JITGetByIdGenerator):
1908         * jit/JITPropertyAccess.cpp:
1909         (JSC::JIT::emit_op_get_by_id):
1910         (JSC::JIT::emit_op_put_by_id):
1911         * jit/JITPropertyAccess32_64.cpp:
1912         (JSC::JIT::emit_op_get_by_id):
1913         (JSC::JIT::emit_op_put_by_id):
1914         * jit/Repatch.cpp:
1915         (JSC::tryBuildGetByIDList):
1916         (JSC::emitPutTransitionStub):
1917
1918 2013-11-06  Daniel Bates  <dabates@apple.com>
1919
1920         [iOS] Upstream Letterpress effect
1921         https://bugs.webkit.org/show_bug.cgi?id=123932
1922
1923         Reviewed by Sam Weinig.
1924
1925         Add feature define ENABLE_LETTERPRESS disabled by default. We only enable
1926         letterpress on iOS.
1927
1928         * Configurations/FeatureDefines.xcconfig:
1929
1930 2013-11-05  Oliver Hunt  <oliver@apple.com>
1931
1932         Support iteration of the Arguments object
1933         https://bugs.webkit.org/show_bug.cgi?id=123835
1934
1935         Reviewed by Mark Lam.
1936
1937         Add an ArgumentsIterator object, and associated classes so that we can support
1938         iteration of the arguments object.
1939
1940         This is a largely mechanical patch.  The only gnarliness is in the
1941         logic to avoid reifying the Arguments object in for(... of arguments)
1942         scenarios.
1943
1944         * GNUmakefile.list.am:
1945         * JavaScriptCore.xcodeproj/project.pbxproj:
1946         * bytecompiler/BytecodeGenerator.cpp:
1947         (JSC::BytecodeGenerator::emitEnumeration):
1948         * runtime/Arguments.cpp:
1949         (JSC::Arguments::getOwnPropertySlot):
1950         (JSC::argumentsFuncIterator):
1951         * runtime/Arguments.h:
1952         * runtime/ArgumentsIteratorConstructor.cpp: Added.
1953         (JSC::ArgumentsIteratorConstructor::finishCreation):
1954         * runtime/ArgumentsIteratorConstructor.h: Added.
1955         (JSC::ArgumentsIteratorConstructor::create):
1956         (JSC::ArgumentsIteratorConstructor::createStructure):
1957         (JSC::ArgumentsIteratorConstructor::ArgumentsIteratorConstructor):
1958         * runtime/ArgumentsIteratorPrototype.cpp: Added.
1959         (JSC::ArgumentsIteratorPrototype::finishCreation):
1960         (JSC::argumentsIteratorPrototypeFuncIterator):
1961         (JSC::argumentsIteratorPrototypeFuncNext):
1962         * runtime/ArgumentsIteratorPrototype.h: Added.
1963         (JSC::ArgumentsIteratorPrototype::create):
1964         (JSC::ArgumentsIteratorPrototype::createStructure):
1965         (JSC::ArgumentsIteratorPrototype::ArgumentsIteratorPrototype):
1966         * runtime/CommonIdentifiers.h:
1967         * runtime/JSArgumentsIterator.cpp: Added.
1968         (JSC::JSArgumentsIterator::finishCreation):
1969         * runtime/JSArgumentsIterator.h: Added.
1970         (JSC::JSArgumentsIterator::createStructure):
1971         (JSC::JSArgumentsIterator::create):
1972         (JSC::JSArgumentsIterator::next):
1973         (JSC::JSArgumentsIterator::JSArgumentsIterator):
1974         * runtime/JSArrayIterator.cpp:
1975         (JSC::createIteratorResult):
1976         * runtime/JSGlobalObject.cpp:
1977         * runtime/JSGlobalObject.h:
1978
1979 2013-11-06  Filip Pizlo  <fpizlo@apple.com>
1980
1981         DFG CheckArray(NonArray) should prove that the child isn't an array
1982         https://bugs.webkit.org/show_bug.cgi?id=123911
1983         <rdar://problem/15202803>
1984
1985         Reviewed by Mark Hahnenberg.
1986
1987         * dfg/DFGSpeculativeJIT.cpp:
1988         (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode):
1989         * ftl/FTLLowerDFGToLLVM.cpp:
1990         (JSC::FTL::LowerDFGToLLVM::isArrayType):
1991
1992 2013-11-06  Mark Hahnenberg  <mhahnenberg@apple.com>
1993
1994         JSExport doesn't support constructors
1995         https://bugs.webkit.org/show_bug.cgi?id=123380
1996
1997         Reviewed by Geoffrey Garen.
1998
1999         Needed another linked-on-or-after check for when we're deciding whether
2000         we should copy over init family methods.
2001
2002         Factored out the link time checks into a separate function so that they can be cached.
2003
2004         Factored out the check for init-family method selectors into helper function and changed it to
2005         match the description in the clang docs, namely that there can be underscores at the beginning
2006         and the first letter after 'init' part of the selector (if there is one) must be a capital letter.
2007
2008         Updated tests to make sure we don't treat "initialize" as an init-family method and that we do
2009         treat "_init" as an init-family method.
2010
2011         * API/JSWrapperMap.h:
2012         * API/JSWrapperMap.mm:
2013         (isInitFamilyMethod):
2014         (shouldSkipMethodWithName):
2015         (copyMethodsToObject):
2016         (allocateConstructorForCustomClass):
2017         (supportsInitMethodConstructors):
2018         * API/tests/testapi.mm:
2019         (-[ClassA initialize]):
2020         (-[ClassD initialize]):
2021
2022 2013-11-06  Michael Saboff  <msaboff@apple.com>
2023
2024         Change ctiTrampoline into a thunk
2025         https://bugs.webkit.org/show_bug.cgi?id=123844
2026
2027         Reviewed by Filip Pizlo.
2028
2029         Converted ctiTrampoline and ctiOpThrowNotCaught into thunks named callToJavaScript
2030         and returnFromJavaScript.  Cleaned up and in some cases removed JITStubsXXX.h files
2031         after removing ctiTrampoline and ctiOpThrowNotCaught.  Added callJavaScriptJITFunction
2032         to VM that is a function pointer to the callToJavaScript thunk.
2033
2034         * GNUmakefile.list.am:
2035         * JavaScriptCore.xcodeproj/project.pbxproj:
2036         * dfg/DFGDriver.cpp:
2037         (JSC::DFG::compileImpl):
2038         * jit/JITCode.cpp:
2039         (JSC::JITCode::execute):
2040         * jit/JITExceptions.cpp:
2041         (JSC::genericUnwind):
2042         * jit/JITStubs.cpp:
2043         * jit/JITStubs.h:
2044         * jit/JITStubsARM.h:
2045         * jit/JITStubsARM64.h: Removed.
2046         * jit/JITStubsARMv7.h:
2047         * jit/JITStubsMIPS.h: Removed.
2048         * jit/JITStubsMSVC64.asm:
2049         * jit/JITStubsSH4.h: Removed.
2050         * jit/JITStubsX86.h:
2051         * jit/JITStubsX86_64.h:
2052         * jit/JSInterfaceJIT.h:
2053         * jit/ThunkGenerators.cpp:
2054         (JSC::returnFromJavaScript):
2055         (JSC::callToJavaScript):
2056         * jit/ThunkGenerators.h:
2057         * runtime/VM.cpp:
2058         (JSC::VM::VM):
2059         * runtime/VM.h:
2060
2061 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
2062
2063         FTL should support StringCharCodeAt
2064         https://bugs.webkit.org/show_bug.cgi?id=123854
2065
2066         Reviewed by Sam Weinig.
2067
2068         * ftl/FTLCapabilities.cpp:
2069         (JSC::FTL::canCompile):
2070         * ftl/FTLLowerDFGToLLVM.cpp:
2071         (JSC::FTL::LowerDFGToLLVM::compileNode):
2072         (JSC::FTL::LowerDFGToLLVM::compileStringCharCodeAt):
2073
2074 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
2075
2076         FTL should support NewObject
2077         https://bugs.webkit.org/show_bug.cgi?id=123849
2078
2079         Reviewed by Oliver Hunt.
2080
2081         * ftl/FTLAbstractHeapRepository.cpp:
2082         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
2083         * ftl/FTLAbstractHeapRepository.h:
2084         * ftl/FTLCapabilities.cpp:
2085         (JSC::FTL::canCompile):
2086         * ftl/FTLIntrinsicRepository.h:
2087         * ftl/FTLLowerDFGToLLVM.cpp:
2088         (JSC::FTL::LowerDFGToLLVM::compileNode):
2089         (JSC::FTL::LowerDFGToLLVM::compileNewObject):
2090         (JSC::FTL::LowerDFGToLLVM::allocate):
2091
2092 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
2093
2094         FTL should support StringCharAt
2095         https://bugs.webkit.org/show_bug.cgi?id=123855
2096
2097         Reviewed by Oliver Hunt.
2098         
2099         This is just like GetByVal for String, so we reuse that code.
2100
2101         * ftl/FTLCapabilities.cpp:
2102         (JSC::FTL::canCompile):
2103         * ftl/FTLLowerDFGToLLVM.cpp:
2104         (JSC::FTL::LowerDFGToLLVM::compileNode):
2105         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
2106         (JSC::FTL::LowerDFGToLLVM::compileStringCharAt):
2107
2108 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
2109
2110         Remove old unused code for hypothetical LLVM intrinsics
2111         https://bugs.webkit.org/show_bug.cgi?id=123824
2112
2113         Reviewed by Oliver Hunt.
2114
2115         * ftl/FTLIntrinsicRepository.h:
2116
2117 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
2118
2119         FTL should support String character access operations
2120         https://bugs.webkit.org/show_bug.cgi?id=123783
2121
2122         Reviewed by Oliver Hunt.
2123         
2124         Implements:
2125         
2126         - string.length
2127         
2128         - string[index]
2129
2130         * ftl/FTLAbstractHeapRepository.h:
2131         * ftl/FTLCapabilities.cpp:
2132         (JSC::FTL::canCompile):
2133         * ftl/FTLIntrinsicRepository.h:
2134         * ftl/FTLLowerDFGToLLVM.cpp:
2135         (JSC::FTL::LowerDFGToLLVM::compileGetIndexedPropertyStorage):
2136         (JSC::FTL::LowerDFGToLLVM::compileGetArrayLength):
2137         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
2138
2139 2013-11-05  Mark Hahnenberg  <mhahnenberg@apple.com>
2140
2141         ObjCCallbackFunctionImpl's NSInvocation shouldn't retain its target or arguments
2142         https://bugs.webkit.org/show_bug.cgi?id=123822
2143
2144         Reviewed by Geoffrey Garen.
2145
2146         Using -retainArguments on ObjCCallbackFunctionImpl's NSInvocation leads to memory leaks.
2147         We should handle retaining/releasing the target ourselves, and we should never retain the arguments.
2148
2149         * API/ObjCCallbackFunction.mm:
2150         (JSC::ObjCCallbackFunctionImpl::~ObjCCallbackFunctionImpl):
2151         (JSC::ObjCCallbackFunctionImpl::name):
2152         (objCCallbackFunctionForInvocation):
2153         (objCCallbackFunctionForMethod):
2154         (objCCallbackFunctionForBlock):
2155
2156 2013-11-05  Julien Brianceau  <jbriance@cisco.com>
2157
2158         Fix build for architectures with 4 argument registers (broken since r158681).
2159         https://bugs.webkit.org/show_bug.cgi?id=123826
2160
2161         Reviewed by Michael Saboff.
2162
2163         * jit/CCallHelpers.h:
2164         (JSC::CCallHelpers::setupArgumentsWithExecState):
2165         (JSC::CCallHelpers::setupArguments):
2166
2167 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
2168
2169         Fix register allocation inside control flow in GetByVal String
2170         https://bugs.webkit.org/show_bug.cgi?id=123816
2171
2172         Reviewed by Geoffrey Garen.
2173
2174         * dfg/DFGSpeculativeJIT.cpp:
2175         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
2176
2177 2013-11-05  Filip Pizlo  <fpizlo@apple.com>
2178
2179         Remove FTL::LowerDFGToLLVM::compileJSConstant()
2180         https://bugs.webkit.org/show_bug.cgi?id=123817
2181
2182         Reviewed by Geoffrey Garen.
2183
2184         * ftl/FTLLowerDFGToLLVM.cpp:
2185
2186 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
2187
2188         FTL should support PutById
2189         https://bugs.webkit.org/show_bug.cgi?id=123784
2190
2191         Reviewed by Geoffrey Garen.
2192
2193         * ftl/FTLAbbreviations.h:
2194         (JSC::FTL::buildCall):
2195         * ftl/FTLCapabilities.cpp:
2196         (JSC::FTL::canCompile):
2197         * ftl/FTLCompile.cpp:
2198         (JSC::FTL::generateICFastPath):
2199         (JSC::FTL::fixFunctionBasedOnStackMaps):
2200         * ftl/FTLInlineCacheDescriptor.h:
2201         (JSC::FTL::InlineCacheDescriptor::InlineCacheDescriptor):
2202         (JSC::FTL::GetByIdDescriptor::GetByIdDescriptor):
2203         (JSC::FTL::PutByIdDescriptor::PutByIdDescriptor):
2204         (JSC::FTL::PutByIdDescriptor::ecmaMode):
2205         (JSC::FTL::PutByIdDescriptor::putKind):
2206         * ftl/FTLIntrinsicRepository.h:
2207         * ftl/FTLLowerDFGToLLVM.cpp:
2208         (JSC::FTL::LowerDFGToLLVM::compileNode):
2209         (JSC::FTL::LowerDFGToLLVM::compilePutById):
2210         * ftl/FTLOutput.h:
2211         (JSC::FTL::Output::call):
2212         * ftl/FTLSlowPathCall.cpp:
2213         (JSC::FTL::callOperation):
2214         * ftl/FTLSlowPathCall.h:
2215         * ftl/FTLState.h:
2216         * jit/CCallHelpers.h:
2217         (JSC::CCallHelpers::setupArguments):
2218         * runtime/Executable.h:
2219         (JSC::ScriptExecutable::ecmaMode):
2220
2221 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
2222
2223         GetById->GetByOffset and PutById->PutByOffset folding should mark haveStructures since it may result in structure transition watchpoints
2224         https://bugs.webkit.org/show_bug.cgi?id=123788
2225
2226         Reviewed by Geoffrey Garen.
2227         
2228         haveStructures is true if there are any currentlyKnownStructures that have
2229         interesting values, since that's the only time when clobbering needs to do things.
2230         It's a really important compile-time optimization. But that also means that anytime
2231         we might cause currentlyKnownStructures to get set - like when we might insert some
2232         structure transition watchpoints - we need to set haveStructures. We were forgetting
2233         to do that for GetById->GetByOffset and PutById->PutByOffset because, I guess, we
2234         forgot that those might insert structure transition watchpoints.
2235
2236         * dfg/DFGAbstractInterpreterInlines.h:
2237         (JSC::DFG::::executeEffects):
2238
2239 2013-11-05  Julien Brianceau  <jbriance@cisco.com>
2240
2241         [mips] Make regTx registers match between JSInterfaceJIT and GPRInfo.
2242         https://bugs.webkit.org/show_bug.cgi?id=123807
2243
2244         Reviewed by Mark Lam.
2245
2246         * jit/GPRInfo.h:
2247         (JSC::GPRInfo::toIndex):
2248         * jit/JSInterfaceJIT.h:
2249
2250 2013-11-05  Julien Brianceau  <jbriance@cisco.com>
2251
2252         REGRESSION(r158315): Fix register mixup in JIT::compileOpCall.
2253         https://bugs.webkit.org/show_bug.cgi?id=123799
2254
2255         Reviewed by Mark Lam.
2256
2257         Changeset r158315 is crashing architectures where JSInterfaceJIT::regT3 is
2258         different from GPRInfo::regT3. This is the case for MIPS architecture.
2259
2260         * jit/JITCall32_64.cpp:
2261         (JSC::JIT::compileOpCall):
2262
2263 2013-11-05  Julien Brianceau  <jbriance@cisco.com>
2264
2265         [mips] Fix build for MIPS platforms.
2266         https://bugs.webkit.org/show_bug.cgi?id=123796
2267
2268         Reviewed by Michael Saboff.
2269
2270         * assembler/LinkBuffer.cpp:
2271         (JSC::LinkBuffer::linkCode): Add specific MIPS call to relocateJumps.
2272         * assembler/MIPSAssembler.h: Remove executableCopy (because of r157690) and set relocateJumps function public.
2273         (JSC::MIPSAssembler::firstRegister):
2274         (JSC::MIPSAssembler::lastRegister):
2275         (JSC::MIPSAssembler::firstFPRegister):
2276         (JSC::MIPSAssembler::lastFPRegister):
2277         (JSC::MIPSAssembler::buffer): Needed since r157690.
2278         * assembler/MacroAssemblerMIPS.h: Add framePointerRegister.
2279         (JSC::MacroAssemblerMIPS::revertJumpReplacementToPatchableBranchPtrWithPatch): Remove unused parameter warning.
2280
2281 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
2282
2283         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
2284         https://bugs.webkit.org/show_bug.cgi?id=123778
2285
2286         Unreviewed, remove the other such assertion.
2287
2288         * dfg/DFGConstantFoldingPhase.cpp:
2289         (JSC::DFG::ConstantFoldingPhase::foldConstants):
2290
2291 2013-11-04  Michael Saboff  <msaboff@apple.com>
2292
2293         REGRESSION(r158586): plugins/refcount-leaks.html fails
2294         https://bugs.webkit.org/show_bug.cgi?id=123765
2295
2296         We were leaving a hole of one slot above a new frame when pushing the new frame on
2297         the stack with pushFrame().  This unused slot can contain residual values that will
2298         be marked during GC.
2299
2300         Reviewed by Filip Pizlo.
2301
2302         * interpreter/JSStackInlines.h:
2303         (JSC::JSStack::pushFrame):
2304
2305 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
2306
2307         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
2308         https://bugs.webkit.org/show_bug.cgi?id=123778
2309
2310         Reviewed by Geoffrey Garen.
2311         
2312         This assertion was just wrong: ee do an execute() above the assertion. The assertion
2313         is asserting that if we need a watchpoint (i.e. the best proven structure was not the
2314         current structure) then it must be the future possible structure.  But while that may
2315         have been true before execute(), it won't be true after if the PutById was a
2316         transition. Of course, this can only happen in the concurrent JIT in which case the
2317         code would be invalidated anyway since we would only transform the code in a way that
2318         leveraged the lack of a transition if we inserted a watchpoint, in which case we
2319         would realize that the watchpoint had been fired during compilation.
2320         
2321         Since this requires concurrent JIT awesomeness, I don't know how to test it.
2322
2323         * dfg/DFGConstantFoldingPhase.cpp:
2324         (JSC::DFG::ConstantFoldingPhase::foldConstants):
2325
2326 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
2327
2328         DFG CheckArray(String) should just be a Phantom(String:)
2329         https://bugs.webkit.org/show_bug.cgi?id=123779
2330
2331         Reviewed by Geoffrey Garen.
2332         
2333         This should be a speed-up since Phantom(String:) is smart enough to use the string
2334         structure. It should also be a simplification since CheckArray(String) was totally
2335         redundant.
2336         
2337         Also FixupPhase was assuming that it may see CheckArray's. That's wrong. It can
2338         create CheckArray's but it won't see them as input since no previous phase can
2339         create them.
2340
2341         * dfg/DFGFixupPhase.cpp:
2342         (JSC::DFG::FixupPhase::fixupNode):
2343         (JSC::DFG::FixupPhase::checkArray):
2344         * dfg/DFGSpeculativeJIT.cpp:
2345         (JSC::DFG::SpeculativeJIT::checkArray):
2346
2347 2013-11-04  Filip Pizlo  <fpizlo@apple.com>
2348
2349         DFG NewArray/NewArrayBuffer shouldn't be constructing with negative indexing
2350         https://bugs.webkit.org/show_bug.cgi?id=123760
2351         <rdar://problem/15356705>
2352
2353         Reviewed by Mark Hahnenberg and Oliver Hunt.
2354
2355         * dfg/DFGOperations.cpp:
2356
2357 2013-11-04  Michael Saboff  <msaboff@apple.com>
2358
2359         Eliminate HostCall bit from JSC Stack CallerFrame
2360         https://bugs.webkit.org/show_bug.cgi?id=123642
2361
2362         Reviewed by Geoffrey Garen.
2363
2364         Replace the HostCallFrame bit or'ed to the CallerFrame value in a CallFrame with
2365         a VM entry sentinel CallFrame.  Logically, the VM entry sentinel call frame is
2366         pushed on the stack before the callee frame when calling from native to JavaScript
2367         code.  The callee frame's CallerFrame points at the VM entry sentinel call frame
2368         and the VM entry sentinel call frame's CallerFrame points to the real caller.
2369         The VM entry sentinel call frame has a sentinel (1) in the CodeBlock to indicate
2370         its a VM entry sentinel call frame.  It's ScopeChain has vm.topCallFrame at the
2371         time of the call.  This allows for a complete stack walk as well as walking just
2372         the contiguous JS frames.
2373
2374         The VM entry sentinel call frame and callee frame are currently allocated and
2375         initialized in ExecState::init(), but this initialization will be moved to
2376         ctiTrampoline when we actually move onto the native stack.
2377
2378         * bytecode/CodeBlock.cpp:
2379         (JSC::CodeBlock::noticeIncomingCall):
2380         * debugger/DebuggerCallFrame.cpp:
2381         (JSC::DebuggerCallFrame::callerFrame):
2382         * dfg/DFGJITCompiler.cpp:
2383         (JSC::DFG::JITCompiler::compileExceptionHandlers):
2384         * interpreter/CallFrame.h:
2385         (JSC::ExecState::frameExtent):
2386         (JSC::ExecState::currentVPC):
2387         (JSC::ExecState::setCurrentVPC):
2388         (JSC::ExecState::init):
2389         (JSC::ExecState::noCaller):
2390         (JSC::ExecState::isVMEntrySentinel):
2391         (JSC::ExecState::vmEntrySentinelCallerFrame):
2392         (JSC::ExecState::initializeVMEntrySentinelFrame):
2393         (JSC::ExecState::callerFrameSkippingVMEntrySentinel):
2394         (JSC::ExecState::vmEntrySentinelCodeBlock):
2395         * interpreter/Interpreter.cpp:
2396         (JSC::unwindCallFrame):
2397         (JSC::Interpreter::getStackTrace):
2398         * interpreter/Interpreter.h:
2399         (JSC::TopCallFrameSetter::TopCallFrameSetter):
2400         (JSC::TopCallFrameSetter::~TopCallFrameSetter):
2401         (JSC::NativeCallFrameTracer::NativeCallFrameTracer):
2402         * interpreter/JSStack.cpp:
2403         (JSC::JSStack::~JSStack):
2404         * interpreter/JSStackInlines.h:
2405         (JSC::JSStack::getStartOfFrame):
2406         (JSC::JSStack::pushFrame):
2407         (JSC::JSStack::popFrame):
2408         * interpreter/Register.h:
2409         (JSC::Register::operator=):
2410         (JSC::Register::callFrame):
2411         * interpreter/StackVisitor.cpp:
2412         (JSC::StackVisitor::readFrame):
2413         (JSC::StackVisitor::readNonInlinedFrame):
2414         (JSC::StackVisitor::readInlinedFrame):
2415         (JSC::StackVisitor::Frame::print):
2416         * interpreter/VMInspector.cpp:
2417         (JSC::VMInspector::countFrames):
2418         * jit/JIT.cpp:
2419         (JSC::JIT::privateCompileExceptionHandlers):
2420         * jit/JITOperations.cpp:
2421         * jit/JITStubsARM.h:
2422         (JSC::ctiTrampoline):
2423         * jit/JITStubsARM64.h:
2424         * jit/JITStubsARMv7.h:
2425         (JSC::ctiTrampoline):
2426         * jit/JITStubsMIPS.h:
2427         * jit/JITStubsMSVC64.asm:
2428         * jit/JITStubsSH4.h:
2429         * jit/JITStubsX86.h:
2430         * jit/JITStubsX86_64.h:
2431         * jsc.cpp:
2432         (functionDumpCallFrame):
2433         * llint/LowLevelInterpreter.cpp:
2434         (JSC::CLoop::execute):
2435         * runtime/VM.cpp:
2436         (JSC::VM::VM):
2437         (JSC::VM::throwException):
2438
2439 2013-11-04  Mark Hahnenberg  <mhahnenberg@apple.com>
2440
2441         JSArrayBufferViews of length 0 allocate 0 CopiedSpace bytes, which is invalid
2442         https://bugs.webkit.org/show_bug.cgi?id=123746
2443
2444         Reviewed by Geoffrey Garen.
2445
2446         This patch disallows clients from allocating 0 bytes in CopiedSpace. We enforce this invariant 
2447         with an ASSERT in C++ code and a breakpoint in JIT code. Clients who care about 0-byte 
2448         allocations (like JSArrayBufferViews) must handle that case themselves, but we don't punish 
2449         anybody else for the rare case that somebody decides to allocate a 0-length typed array. 
2450         It also makes the allocation and copying cases consistent for CopiedSpace: no 0-byte allocations, 
2451         no 0-byte copying.
2452  
2453         Also added a check so that JSArrayBufferViews don't try to copy their m_vector backing store when 
2454         their length is 0. Also sprinkled several ASSERTs throughout the JSArrayBufferView code to make sure that 
2455         when length is 0 m_vector is null.
2456
2457         * dfg/DFGSpeculativeJIT.cpp:
2458         (JSC::DFG::SpeculativeJIT::compileNewTypedArray):
2459         * dfg/DFGSpeculativeJIT.h:
2460         (JSC::DFG::SpeculativeJIT::emitAllocateBasicStorage):
2461         * heap/CopiedSpaceInlines.h:
2462         (JSC::CopiedSpace::tryAllocate):
2463         * runtime/ArrayBuffer.h:
2464         (JSC::ArrayBuffer::create):
2465         * runtime/JSArrayBufferView.cpp:
2466         (JSC::JSArrayBufferView::ConstructionContext::ConstructionContext):
2467         * runtime/JSGenericTypedArrayViewInlines.h:
2468         (JSC::::visitChildren):
2469         (JSC::::copyBackingStore):
2470         (JSC::::slowDownAndWasteMemory):
2471
2472 2013-11-04  Julien Brianceau  <jbriance@cisco.com>
2473
2474         [sh4] Refactor jumps in baseline JIT to return label after the jump.
2475         https://bugs.webkit.org/show_bug.cgi?id=123734
2476
2477         Reviewed by Michael Saboff.
2478
2479         Current implementation of jumps in sh4 baseline JIT returns a label on the jump itself
2480         and not after it. This is not correct and leads to issues like infinite loop the DFG
2481         (https://bugs.webkit.org/show_bug.cgi?id=122597 for instance). This refactor fixes this
2482         and also simplifies the link and relink procedures for sh4 jumps.
2483
2484         * assembler/MacroAssemblerSH4.h:
2485         (JSC::MacroAssemblerSH4::branchDouble):
2486         (JSC::MacroAssemblerSH4::branchTrue):
2487         (JSC::MacroAssemblerSH4::branchFalse):
2488         * assembler/SH4Assembler.h:
2489         (JSC::SH4Assembler::jmp):
2490         (JSC::SH4Assembler::extraInstrForBranch):
2491         (JSC::SH4Assembler::jne):
2492         (JSC::SH4Assembler::je):
2493         (JSC::SH4Assembler::bra):
2494         (JSC::SH4Assembler::linkJump):
2495         (JSC::SH4Assembler::relinkJump):
2496
2497 2013-11-03  Filip Pizlo  <fpizlo@apple.com>
2498
2499         Generated color wheel displays incorrectly (regressed in r155567)
2500         https://bugs.webkit.org/show_bug.cgi?id=123664
2501
2502         Reviewed by Andreas Kling.
2503
2504         Interestingly, r155567 just "un-broke" the attempt to constant-fold ArithMod, but
2505         that constant folding was just wrong to begin with. There is no evidence that this
2506         constant folding rule is profitable. I'm removing it instead of trying to think
2507         about what it means for it to be correct.
2508
2509         * dfg/DFGAbstractInterpreterInlines.h:
2510         (JSC::DFG::::executeEffects):
2511
2512 2013-11-03  Filip Pizlo  <fpizlo@apple.com>
2513
2514         Unreviewed, it is no longer necessary to call DisablePrettyStackTrace.
2515
2516         * llvm/library/LLVMExports.cpp:
2517         (initializeAndGetJSCLLVMAPI):
2518
2519 2013-11-02  Mark Lam  <mark.lam@apple.com>
2520
2521         Assertion failure in non-JIT'ed LLInt on ARM Thumb.
2522         https://bugs.webkit.org/show_bug.cgi?id=97569.
2523
2524         Reviewed by Geoffrey Garen.
2525
2526         * assembler/MacroAssemblerCodeRef.h:
2527         - Thumb2 alignment assertions do not apply to the C Loop LLINT because
2528           the arguments passed to those assertions are actually OpcodeIDs
2529           masquerading as addresses.
2530         * llint/LLIntOfflineAsmConfig.h:
2531         - Some of the #defines belong in the !ENABLE(LLINT_C_LOOP) section.
2532           Moving them there.
2533         * llint/LowLevelInterpreter.cpp:
2534         - Keep the compiler happy from some unreferenced C Loop labels.
2535
2536 2013-11-02  Filip Pizlo  <fpizlo@apple.com>
2537
2538         FTL should use LLVM intrinsics for OSR exit, watchpoints, inline caches, and stack layout
2539         https://bugs.webkit.org/show_bug.cgi?id=122318
2540
2541         Reviewed by Geoffrey Garen.
2542         
2543         This all now works. This patch just updates our implementation to work with LLVM trunk,
2544         and removes all of the old code that tried to do OSR exits and heap accesses without
2545         the benefit of those intrinsics.
2546         
2547         In particular:
2548         
2549         - StackMaps parsing now uses the new, less compact, but more future-proof, format.
2550         
2551         - Remove the ftlUsesStackmaps() option and hard-code ftlUsesStackmaps = true. Remove
2552           all code for ftlUsesStackmaps = false, since that was only there for back when we
2553           didn't have the intrinsics.
2554         
2555         - Remove the other experimental OSR options (useLLVMOSRExitIntrinsic,
2556           ftlTrapsOnOSRExit, and FTLOSRExitOmitsMarshalling).
2557         
2558         - Remove LowerDFGToLLVM's use of the ExitThunkGenerator since we don't need to generate
2559           the exit thunks until after we parse the stackmaps.
2560         
2561         - Remove all of the exit thunk and compiler code for the no-stackmaps case.
2562
2563         * dfg/DFGDriver.cpp:
2564         (JSC::DFG::compileImpl):
2565         * ftl/FTLCompile.cpp:
2566         (JSC::FTL::mmAllocateDataSection):
2567         * ftl/FTLExitThunkGenerator.cpp:
2568         (JSC::FTL::ExitThunkGenerator::emitThunk):
2569         * ftl/FTLIntrinsicRepository.h:
2570         * ftl/FTLLocation.cpp:
2571         (JSC::FTL::Location::forStackmaps):
2572         * ftl/FTLLowerDFGToLLVM.cpp:
2573         (JSC::FTL::LowerDFGToLLVM::LowerDFGToLLVM):
2574         (JSC::FTL::LowerDFGToLLVM::lower):
2575         (JSC::FTL::LowerDFGToLLVM::compileGetById):
2576         (JSC::FTL::LowerDFGToLLVM::compileInvalidationPoint):
2577         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
2578         (JSC::FTL::LowerDFGToLLVM::emitOSRExitCall):
2579         (JSC::FTL::LowerDFGToLLVM::callStackmap):
2580         (JSC::FTL::LowerDFGToLLVM::addExitArgumentForNode):
2581         * ftl/FTLOSRExitCompilationInfo.h:
2582         (JSC::FTL::OSRExitCompilationInfo::OSRExitCompilationInfo):
2583         * ftl/FTLOSRExitCompiler.cpp:
2584         (JSC::FTL::compileStub):
2585         (JSC::FTL::compileFTLOSRExit):
2586         * ftl/FTLStackMaps.cpp:
2587         (JSC::FTL::StackMaps::Location::parse):
2588         (JSC::FTL::StackMaps::parse):
2589         (WTF::printInternal):
2590         * ftl/FTLStackMaps.h:
2591         * ftl/FTLThunks.cpp:
2592         (JSC::FTL::osrExitGenerationThunkGenerator):
2593         * ftl/FTLThunks.h:
2594         (JSC::FTL::Thunks::getOSRExitGenerationThunk):
2595         * runtime/Options.h:
2596
2597 2013-11-02  Patrick Gansterer  <paroga@webkit.org>
2598
2599         Add missing getHostCallReturnValue() for MSVC ARM
2600         https://bugs.webkit.org/show_bug.cgi?id=123685
2601
2602         Reviewed by Darin Adler.
2603
2604         * jit/JITStubsARM.h:
2605
2606 2013-11-02  Patrick Gansterer  <paroga@webkit.org>
2607
2608         Fix MSVC warning about unary minus operator
2609         https://bugs.webkit.org/show_bug.cgi?id=123674
2610
2611         Reviewed by Darin Adler.
2612
2613         Change some static_cast<> to silence the following warning of Microsoft compiler:
2614         warning C4146: unary minus operator applied to unsigned type, result still unsigned
2615
2616         * jit/Repatch.cpp:
2617         (JSC::emitPutTransitionStub):
2618
2619 2013-11-02  Filip Pizlo  <fpizlo@apple.com>
2620
2621         Disable LLVM's pretty stack traces, which involve intercepting fatal signals
2622         https://bugs.webkit.org/show_bug.cgi?id=123681
2623
2624         Reviewed by Geoffrey Garen.
2625
2626         * llvm/library/LLVMExports.cpp:
2627         (initializeAndGetJSCLLVMAPI):
2628
2629 2013-11-02  Filip Pizlo  <fpizlo@apple.com>
2630
2631         LLVM assertion failures should funnel into WTF's crash handling
2632         https://bugs.webkit.org/show_bug.cgi?id=123682
2633
2634         Reviewed by Geoffrey Garen.
2635         
2636         Inside llvmForJSC, we override assertion-related functions and funnel them
2637         into g_llvmTrapCallback(). We also now register a fatal error handler inside
2638         the library and funnel that into g_llvmTrapCallback, and have
2639         initializeAndGetJSCLLVMAPI() take such a callback as an argument.
2640         
2641         Inside JSC, we no longer call LLVMInstallFatalErrorHandler() but instead we
2642         pass WTFLogAlwaysAndCrash() as the trap callback for llvmForJSC.
2643
2644         * llvm/InitializeLLVM.cpp:
2645         (JSC::initializeLLVM):
2646         * llvm/InitializeLLVMPOSIX.cpp:
2647         (JSC::initializeLLVMPOSIX):
2648         * llvm/library/LLVMExports.cpp:
2649         (llvmCrash):
2650         (initializeAndGetJSCLLVMAPI):
2651         * llvm/library/LLVMOverrides.cpp:
2652         (raise):
2653         (__assert_rtn):
2654         (abort):
2655         * llvm/library/LLVMTrapCallback.h: Added.
2656
2657 2013-11-02  Filip Pizlo  <fpizlo@apple.com>
2658
2659         CodeBlock::jettison() shouldn't call baselineVersion()
2660         https://bugs.webkit.org/show_bug.cgi?id=123675
2661
2662         Reviewed by Geoffrey Garen.
2663         
2664         Fix more uses of baselineVersion().
2665
2666         * bytecode/CodeBlock.cpp:
2667         (JSC::CodeBlock::jettison):
2668         * bytecode/CodeBlock.h:
2669         * bytecode/ProfiledCodeBlockJettisoningWatchpoint.cpp:
2670         (JSC::ProfiledCodeBlockJettisoningWatchpoint::fireInternal):
2671
2672 2013-11-02  Filip Pizlo  <fpizlo@apple.com>
2673
2674         LLVM asserts in internal-js-tests.yaml/Octane/stress-tests/mandreel.js
2675         https://bugs.webkit.org/show_bug.cgi?id=123535
2676
2677         Reviewed by Geoffrey Garen.
2678         
2679         Use double comparisons for doubles.
2680
2681         * ftl/FTLLowerDFGToLLVM.cpp:
2682         (JSC::FTL::LowerDFGToLLVM::doubleToInt32):
2683
2684 2013-11-02  Patrick Gansterer  <paroga@webkit.org>
2685
2686         Various small WinCE build fixes
2687
2688         * jsc.cpp:
2689         (main):
2690
2691 2013-11-02  Patrick Gansterer  <paroga@webkit.org>
2692
2693         Fix MSVC ARM build after r157581.
2694
2695         * jit/JITStubsARM.h:
2696
2697 2013-11-01  Filip Pizlo  <fpizlo@apple.com>
2698
2699         FTL should use a simple optimization pipeline by default
2700         https://bugs.webkit.org/show_bug.cgi?id=123638
2701
2702         Reviewed by Geoffrey Garen.
2703         
2704         20% speed-up on imagine-gaussian-blur, when combined with --ftlUsesStackmaps=true.
2705
2706         * ftl/FTLCompile.cpp:
2707         (JSC::FTL::compile):
2708         * runtime/Options.h:
2709
2710 2013-11-01  Andreas Kling  <akling@apple.com>
2711
2712         Neuter WTF_MAKE_FAST_ALLOCATED in GLOBAL_FASTMALLOC_NEW builds.
2713         <https://webkit.org/b/123639>
2714
2715         JSC::ParserArenaRefCounted really needed to have the new/delete
2716         operators overridden, in order for JSC::ScopeNode to be able to
2717         choose that "operator new" out of the two it inherits.
2718
2719         Reviewed by Anders Carlsson.
2720
2721 2013-11-01  Filip Pizlo  <fpizlo@apple.com>
2722
2723         OSR exit profiling should be robust against all code being cleared
2724         https://bugs.webkit.org/show_bug.cgi?id=123629
2725         <rdar://problem/15365476>
2726
2727         Reviewed by Michael Saboff.
2728         
2729         The problem here is two-fold:
2730
2731         1) A watchpoint (i.e. ProfiledCodeBlockJettisoningWatchpoint) may be fired after we
2732         have cleared the CodeBlock for all or some Executables.  This means that doing
2733         codeBlock->baselineVersion() would either crash or return a bogus CodeBlock, since
2734         there wasn't a baseline code block reachable from the Executable anymore.  The
2735         solution is that we shouldn't be asking for the baseline code block reachable from
2736         the owning executable (what baselineVersion did), but instead we should be asking
2737         for the baseline version reachable from the code block being watchpointed (basically
2738         what CodeBlock::alternative() did).
2739
2740         2) If dealing with inlined code, baselienCodeBlockForOriginAndBaselineCodeBlock()
2741         may return null, for the same reason as above - we might have cleared the baseline
2742         codeblock for the executable that was inlined.  The solution is to just not do
2743         profiling if there isn't a baseline code block anymore.
2744
2745         * bytecode/CodeBlock.cpp:
2746         (JSC::CodeBlock::baselineAlternative):
2747         (JSC::CodeBlock::baselineVersion):
2748         (JSC::CodeBlock::jettison):
2749         * bytecode/CodeBlock.h:
2750         * bytecode/CodeBlockJettisoningWatchpoint.cpp:
2751         (JSC::CodeBlockJettisoningWatchpoint::fireInternal):
2752         * bytecode/ProfiledCodeBlockJettisoningWatchpoint.cpp:
2753         (JSC::ProfiledCodeBlockJettisoningWatchpoint::fireInternal):
2754         * dfg/DFGOSRExitBase.cpp:
2755         (JSC::DFG::OSRExitBase::considerAddingAsFrequentExitSiteSlow):
2756         * jit/AssemblyHelpers.h:
2757         (JSC::AssemblyHelpers::AssemblyHelpers):
2758         * runtime/Executable.cpp:
2759         (JSC::FunctionExecutable::baselineCodeBlockFor):
2760
2761 2013-10-31  Oliver Hunt  <oliver@apple.com>
2762
2763         JavaScript parser bug
2764         https://bugs.webkit.org/show_bug.cgi?id=123506
2765
2766         Reviewed by Mark Lam.
2767
2768         Add ParserState as an abstraction and use that to save and restore
2769         the parser state around nested functions (We'll need to use this in
2770         more places in future).  Also fix a minor error typo this testcases
2771         hit.
2772
2773         * parser/Parser.cpp:
2774         (JSC::::parseFunctionInfo):
2775         (JSC::::parseAssignmentExpression):
2776         * parser/Parser.h:
2777         (JSC::Parser::saveState):
2778         (JSC::Parser::restoreState):
2779
2780 2013-10-31  Filip Pizlo  <fpizlo@apple.com>
2781
2782         FTL Int32ToDouble should handle the forward type check case where you need a recovery
2783         https://bugs.webkit.org/show_bug.cgi?id=123605
2784
2785         Reviewed by Mark Hahnenberg.
2786         
2787         If you have a Int32ToDouble that needs to do a type check and it's required to do a
2788         forward exit, then it needs to manually pass in a value recovery for itself in the
2789         OSR exit - since this is one of those forward-exiting nodes that doesn't have a
2790         preceding MovHint.
2791
2792         * ftl/FTLLowerDFGToLLVM.cpp:
2793         (JSC::FTL::LowerDFGToLLVM::compileInt32ToDouble):
2794         (JSC::FTL::LowerDFGToLLVM::forwardTypeCheck):
2795
2796 2013-10-31  Filip Pizlo  <fpizlo@apple.com>
2797
2798         FTL should implement InvalidationPoint in terms of llvm.stackmap
2799         https://bugs.webkit.org/show_bug.cgi?id=113647
2800
2801         Reviewed by Mark Hahnenberg.
2802         
2803         This is pretty straightforward now that InvalidationPoint has exactly the semantics
2804         that agree with llvm.stackmap.
2805
2806         * ftl/FTLCompile.cpp:
2807         (JSC::FTL::fixFunctionBasedOnStackMaps):
2808         * ftl/FTLLowerDFGToLLVM.cpp:
2809         (JSC::FTL::LowerDFGToLLVM::compileInvalidationPoint):
2810         (JSC::FTL::LowerDFGToLLVM::emitOSRExitCall):
2811         (JSC::FTL::LowerDFGToLLVM::buildExitArguments):
2812         (JSC::FTL::LowerDFGToLLVM::callStackmap):
2813         * ftl/FTLOSRExitCompilationInfo.h:
2814         (JSC::FTL::OSRExitCompilationInfo::OSRExitCompilationInfo):
2815
2816 2013-10-30  Oliver Hunt  <oliver@apple.com>
2817
2818         Implement basic ES6 Math functions
2819         https://bugs.webkit.org/show_bug.cgi?id=123536
2820
2821         Reviewed by Michael Saboff.
2822
2823         Fairly trivial patch to implement the core ES6 Math functions.
2824
2825         This doesn't implement Math.hypot as it is not a trivial function.
2826         I've also skipped Math.sign as I am yet to be convinced the spec
2827         behaviour is good.  Everything else is trivial.
2828
2829         * runtime/MathObject.cpp:
2830         (JSC::MathObject::finishCreation):
2831         (JSC::mathProtoFuncACosh):
2832         (JSC::mathProtoFuncASinh):
2833         (JSC::mathProtoFuncATanh):
2834         (JSC::mathProtoFuncCbrt):
2835         (JSC::mathProtoFuncCosh):
2836         (JSC::mathProtoFuncExpm1):
2837         (JSC::mathProtoFuncFround):
2838         (JSC::mathProtoFuncLog1p):
2839         (JSC::mathProtoFuncLog10):
2840         (JSC::mathProtoFuncLog2):
2841         (JSC::mathProtoFuncSinh):
2842         (JSC::mathProtoFuncTanh):
2843         (JSC::mathProtoFuncTrunc):
2844
2845 2013-10-31  Filip Pizlo  <fpizlo@apple.com>
2846
2847         FTL::Location::restoreInto() doesn't handle stack-related registers correctly if you're using it after pushing a new stack frame
2848         https://bugs.webkit.org/show_bug.cgi?id=123591
2849
2850         Reviewed by Mark Hahnenberg.
2851         
2852         This gets us to pass more tests with ftlUsesStackmaps.
2853
2854         * ftl/FTLLocation.cpp:
2855         (JSC::FTL::Location::restoreInto):
2856         * ftl/FTLLocation.h:
2857         * ftl/FTLThunks.cpp:
2858         (JSC::FTL::osrExitGenerationWithStackMapThunkGenerator):
2859
2860 2013-10-31  Alexey Proskuryakov  <ap@apple.com>
2861
2862         Enable WebCrypto on Mac
2863         https://bugs.webkit.org/show_bug.cgi?id=123587
2864
2865         Reviewed by Anders Carlsson.
2866
2867         * Configurations/FeatureDefines.xcconfig: Do it.
2868
2869 2013-10-31  Filip Pizlo  <fpizlo@apple.com>
2870
2871         Unreviewed, really remove CachedTranscendentalFunction.h.
2872
2873         * GNUmakefile.list.am:
2874         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
2875
2876 2013-10-31  Filip Pizlo  <fpizlo@apple.com>
2877
2878         Remove CachedTranscendentalFunction because caching math functions is an ugly idea
2879         https://bugs.webkit.org/show_bug.cgi?id=123574
2880
2881         Reviewed by Mark Hahnenberg.
2882         
2883         This is performance-neutral because I also make Math.cos/sin intrinsic. This means that
2884         we gain the "overhead" of actually computing sin and cos but we lose the overhead of
2885         going through the native call thunks.
2886         
2887         Caching transcendental functions is a really ugly idea. It works for SunSpider because
2888         that benchmark makes very predictable calls into Math.sin. But I don't believe that this
2889         is representative of any kind of reality, and so for sensible uses of Math.sin/cos all
2890         that this was doing was adding more call overhead and some hashing overhead.
2891
2892         * JavaScriptCore.xcodeproj/project.pbxproj:
2893         * dfg/DFGAbstractInterpreterInlines.h:
2894         (JSC::DFG::::executeEffects):
2895         * dfg/DFGBackwardsPropagationPhase.cpp:
2896         (JSC::DFG::BackwardsPropagationPhase::propagate):
2897         * dfg/DFGByteCodeParser.cpp:
2898         (JSC::DFG::ByteCodeParser::handleIntrinsic):
2899         * dfg/DFGCSEPhase.cpp:
2900         (JSC::DFG::CSEPhase::performNodeCSE):
2901         * dfg/DFGClobberize.h:
2902         (JSC::DFG::clobberize):
2903         * dfg/DFGFixupPhase.cpp:
2904         (JSC::DFG::FixupPhase::fixupNode):
2905         * dfg/DFGNodeType.h:
2906         * dfg/DFGPredictionPropagationPhase.cpp:
2907         (JSC::DFG::PredictionPropagationPhase::propagate):
2908         (JSC::DFG::PredictionPropagationPhase::doDoubleVoting):
2909         * dfg/DFGSafeToExecute.h:
2910         (JSC::DFG::safeToExecute):
2911         * dfg/DFGSpeculativeJIT.h:
2912         (JSC::DFG::SpeculativeJIT::callOperation):
2913         * dfg/DFGSpeculativeJIT32_64.cpp:
2914         (JSC::DFG::SpeculativeJIT::compile):
2915         * dfg/DFGSpeculativeJIT64.cpp:
2916         (JSC::DFG::SpeculativeJIT::compile):
2917         * jit/JITOperations.h:
2918         * runtime/CachedTranscendentalFunction.h: Removed.
2919         * runtime/DateInstanceCache.h:
2920         * runtime/Intrinsic.h:
2921         * runtime/MathObject.cpp:
2922         (JSC::MathObject::finishCreation):
2923         (JSC::mathProtoFuncCos):
2924         (JSC::mathProtoFuncSin):
2925         * runtime/VM.h:
2926
2927 2013-10-30  Filip Pizlo  <fpizlo@apple.com>
2928
2929         Assertion failure in js/dom/global-constructors-attributes-dedicated-worker.html
2930         https://bugs.webkit.org/show_bug.cgi?id=123551
2931         <rdar://problem/15356238>
2932
2933         Reviewed by Mark Hahnenberg.
2934         
2935         WatchpointSets have always had this "fire everything on deletion" policy because it
2936         seemed like a good fail-safe at the time I first implemented WatchpointSets. But
2937         it's actually causing bugs rather than providing safety:
2938         
2939         - Everyone who registers Watchpoints with WatchpointSets have separate mechanisms
2940           for either keeping the WatchpointSets alive or noticing when they are collected.
2941           So this wasn't actually providing any safety.
2942           
2943           One example of this is Structures, where:
2944           
2945           - CodeBlocks that register Watchpoints on Structure's WatchpointSet will also
2946             register weak references to the Structure, and the GC will jettison a CodeBlock
2947             if the Structure(s) it cares about dies.
2948           
2949           - StructureStubInfos that register Watchpoints on Structure's WatchpointSet will
2950             also be cleared by GC if the Structures die.
2951         
2952         - The WatchpointSet destructor would get invoked from finalization/destruction.
2953           This would then cause CodeBlock::jettison() to be called on a CodeBlock, but that
2954           method requires doing things that access heap objects. This would usually cause
2955           problems on VM destruction, since then the CodeBlocks would still be alive but the
2956           whole heap would be destroyed.
2957         
2958         This also ensures that CodeBlock::jettison() cannot cause a GC. This is safe since
2959         that method doesn't really allocate objects, and it is likely necessary because
2960         jettison() may be called from deep in the stack.
2961
2962         * bytecode/CodeBlock.cpp:
2963         (JSC::CodeBlock::jettison):
2964         * bytecode/Watchpoint.cpp:
2965         (JSC::WatchpointSet::~WatchpointSet):
2966         * bytecode/Watchpoint.h:
2967
2968 2013-10-30  Mark Lam  <mark.lam@apple.com>
2969
2970         Unreviewed, fix C Loop LLINT build.
2971
2972         * bytecode/CodeBlockJettisoningWatchpoint.cpp:
2973         (JSC::CodeBlockJettisoningWatchpoint::fireInternal):
2974         * bytecode/ProfiledCodeBlockJettisoningWatchpoint.cpp:
2975         (JSC::ProfiledCodeBlockJettisoningWatchpoint::fireInternal):
2976
2977 2013-10-30  Filip Pizlo  <fpizlo@apple.com>
2978
2979         Unreviewed, fix FTL build.
2980
2981         * ftl/FTLAbstractHeapRepository.h:
2982         * ftl/FTLLowerDFGToLLVM.cpp:
2983         (JSC::FTL::LowerDFGToLLVM::compileCallOrConstruct):
2984
2985 2013-10-30  Alexey Proskuryakov  <ap@apple.com>
2986
2987         Add a way to fulfill promises from DOM code
2988         https://bugs.webkit.org/show_bug.cgi?id=123466
2989
2990         Reviewed by Sam Weinig.
2991
2992         * JavaScriptCore.xcodeproj/project.pbxproj: Make JSPromise.h and JSPromiseResolver.h
2993         private headers for WebCore to use.
2994
2995         * runtime/JSPromise.h:
2996         * runtime/JSPromiseResolver.h:
2997         Export functions that JSDOMPromise will use.
2998
2999 2013-10-30  Mark Lam  <mark.lam@apple.com>
3000
3001         Adjust CallFrameHeader's ReturnPC and CallFrame locations to match the native ABI .
3002         https://bugs.webkit.org/show_bug.cgi?id=123444.
3003
3004         Reviewed by Geoffrey Garen.
3005
3006         - Introduced an explicit CallerFrameAndPC struct.
3007         - A CallFrame is expected to start with a CallerFrameAndPC struct. 
3008         - The Register class no longer supports CallFrame* and Instruction*.
3009
3010           These hides the differences between JSVALUE32_64 and JSVALUE64 in
3011           terms of managing the callerFrame() and returnPC() values.
3012
3013         - Convert all uses of JSStack::CallerFrame and JSStack::ReturnPC to
3014           go through CallFrame to access the appropriate values and offsets.
3015           CallFrame, in turn, will access the callerFrame and returnPC via
3016           the CallerFrameAndPC struct.
3017
3018         - InlineCallFrame will provide offsets for its callerFrame and
3019           returnPC. It will make use of CallFrame::callerFrameOffset() and
3020           CallerFrame::returnPCOffset() to compute these.
3021
3022         * bytecode/CodeOrigin.h:
3023         (JSC::InlineCallFrame::callerFrameOffset):
3024         (JSC::InlineCallFrame::returnPCOffset):
3025         * dfg/DFGJITCompiler.cpp:
3026         (JSC::DFG::JITCompiler::compileEntry):
3027         (JSC::DFG::JITCompiler::compileExceptionHandlers):
3028         * dfg/DFGOSRExitCompilerCommon.cpp:
3029         (JSC::DFG::reifyInlinedCallFrames):
3030         * dfg/DFGSpeculativeJIT.h:
3031         (JSC::DFG::SpeculativeJIT::calleeFrameSlot):
3032         (JSC::DFG::SpeculativeJIT::calleeArgumentSlot):
3033         (JSC::DFG::SpeculativeJIT::calleeFrameTagSlot):
3034         (JSC::DFG::SpeculativeJIT::calleeFramePayloadSlot):
3035         (JSC::DFG::SpeculativeJIT::calleeArgumentTagSlot):
3036         (JSC::DFG::SpeculativeJIT::calleeArgumentPayloadSlot):
3037         - Prefixed all the above with callee since they apply to the callee frame.
3038         (JSC::DFG::SpeculativeJIT::calleeFrameCallerFrame):
3039         - Added to set the callerFrame pointer in the callee frame.
3040
3041         * dfg/DFGSpeculativeJIT32_64.cpp:
3042         (JSC::DFG::SpeculativeJIT::emitCall):
3043         (JSC::DFG::SpeculativeJIT::compile):
3044         * dfg/DFGSpeculativeJIT64.cpp:
3045         (JSC::DFG::SpeculativeJIT::emitCall):
3046         (JSC::DFG::SpeculativeJIT::compile):
3047         * ftl/FTLLink.cpp:
3048         (JSC::FTL::compileEntry):
3049         (JSC::FTL::link):
3050         * interpreter/CallFrame.h:
3051         (JSC::ExecState::callerFrame):
3052         (JSC::ExecState::callerFrameOffset):
3053         (JSC::ExecState::returnPC):
3054         (JSC::ExecState::hasReturnPC):
3055         (JSC::ExecState::clearReturnPC):
3056         (JSC::ExecState::returnPCOffset):
3057         (JSC::ExecState::setCallerFrame):
3058         (JSC::ExecState::setReturnPC):
3059         (JSC::ExecState::callerFrameAndPC):
3060         * interpreter/JSStack.h:
3061         * interpreter/Register.h:
3062         * jit/AssemblyHelpers.h:
3063         (JSC::AssemblyHelpers::emitPutToCallFrameHeader):
3064         - Convert to using storePtr() here and simplify the code.
3065         (JSC::AssemblyHelpers::emitGetCallerFrameFromCallFrameHeaderPtr):
3066         (JSC::AssemblyHelpers::emitPutCallerFrameToCallFrameHeader):
3067         (JSC::AssemblyHelpers::emitGetReturnPCFromCallFrameHeaderPtr):
3068         (JSC::AssemblyHelpers::emitPutReturnPCToCallFrameHeader):
3069         - Helpers to emit gets/puts of the callerFrame and returnPC.
3070         (JSC::AssemblyHelpers::addressForByteOffset):
3071         * jit/JIT.cpp:
3072         (JSC::JIT::JIT):
3073         (JSC::JIT::privateCompile):
3074         (JSC::JIT::privateCompileExceptionHandlers):
3075         * jit/JITCall.cpp:
3076         (JSC::JIT::compileCallEval):
3077         (JSC::JIT::compileOpCall):
3078         * jit/JITCall32_64.cpp:
3079         (JSC::JIT::emit_op_ret):
3080         (JSC::JIT::emit_op_ret_object_or_this):
3081         (JSC::JIT::compileCallEval):
3082         (JSC::JIT::compileOpCall):
3083         * jit/JITInlines.h:
3084         (JSC::JIT::unmap):
3085         * jit/JITOpcodes.cpp:
3086         (JSC::JIT::emit_op_end):
3087         (JSC::JIT::emit_op_ret):
3088         (JSC::JIT::emit_op_ret_object_or_this):
3089         * jit/JITOpcodes32_64.cpp:
3090         (JSC::JIT::privateCompileCTINativeCall):
3091         (JSC::JIT::emit_op_end):
3092         * jit/JITOperations.cpp:
3093         * jit/SpecializedThunkJIT.h:
3094         (JSC::SpecializedThunkJIT::returnJSValue):
3095         (JSC::SpecializedThunkJIT::returnDouble):
3096         (JSC::SpecializedThunkJIT::returnInt32):
3097         (JSC::SpecializedThunkJIT::returnJSCell):
3098         * jit/ThunkGenerators.cpp:
3099         (JSC::throwExceptionFromCallSlowPathGenerator):
3100         (JSC::slowPathFor):
3101         (JSC::nativeForGenerator):
3102
3103         * llint/LLIntData.cpp:
3104         (JSC::LLInt::Data::performAssertions):
3105         * llint/LowLevelInterpreter.asm:
3106         - Updated offsets and asserts to match the new CallFrame layout.
3107
3108 2013-10-30  Filip Pizlo  <fpizlo@apple.com>
3109
3110         Unreviewed, fix Mac.
3111
3112         * assembler/AbstractMacroAssembler.h:
3113         (JSC::AbstractMacroAssembler::RegisterAllocationOffset::checkOffsets):
3114         (JSC::AbstractMacroAssembler::checkRegisterAllocationAgainstBranchRange):
3115
3116 2013-10-30  Filip Pizlo  <fpizlo@apple.com>
3117
3118         Unreviewed, fix Windows.
3119
3120         * bytecode/CodeBlock.cpp:
3121         (JSC::CodeBlock::jettison):
3122
3123 2013-10-30  Filip Pizlo  <fpizlo@apple.com>
3124
3125         Unreviewed, fix Windows.
3126
3127         * bytecode/CodeBlock.h:
3128         (JSC::CodeBlock::addFrequentExitSite):
3129
3130 2013-10-29  Filip Pizlo  <fpizlo@apple.com>
3131
3132         Add InvalidationPoints to the DFG and use them for all watchpoints
3133         https://bugs.webkit.org/show_bug.cgi?id=123472
3134
3135         Reviewed by Mark Hahnenberg.
3136         
3137         This makes a fundamental change to how watchpoints work in the DFG.
3138         
3139         Previously, a watchpoint was an instruction whose execution semantics were something
3140         like:
3141         
3142             if (watchpoint->invalidated)
3143                 exit
3144         
3145         We would implement this without any branch by using jump replacement.
3146         
3147         This is a very good optimization. But it's a bit awkward once you get a lot of
3148         watchpoints: semantically we will have lots of these branches in the code, which the
3149         compiler needs to reason about even though they don't actually result in any emitted
3150         code.
3151         
3152         Separately, we also had a mechanism for jettisoning a CodeBlock. This mechanism would
3153         be invoked if a CodeBlock exited a lot. It would ensure that a CodeBlock wouldn't be
3154         called into again, but it would do nothing for CodeBlocks that were already on the
3155         stack.
3156         
3157         This change flips jettisoning and watchpoint invalidation on their heads. Now, the jump
3158         replacement has nothing to do with watchpoints; instead it's something that happens if
3159         you ever jettison a CodeBlock. Jump replacement is now an all-or-nothing operation over
3160         all of the potential call-return safe-exit-points in a CodeBlock. We call these
3161         "InvalidationPoint"s. A watchpoint instruction is now "lowered" by having the DFG
3162         collect all of the watchpoint sets that the CodeBlock cares about, and then registering
3163         a CodeBlockJettisoningWatchpoint with all of them. That is, if the watchpoint fires, it
3164         jettisons the CodeBlock, which in turn ensures that the CodeBlock can't be called into
3165         (because the entrypoint now points to baseline code) and can't be returned into
3166         (because returning exits to baseline before the next bytecode instruction).
3167         
3168         This will allow for a sensible lowering of watchpoints to LLVM IR. It will also allow
3169         for jettison() to be used effectively for things like breakpointing and single-stepping
3170         in the debugger.
3171         
3172         Well, basically, this mechanism just takes us into the HotSpot-style world where anyone
3173         can, at any time and for any reason, request that an optimized CodeBlock is rendered
3174         immediately invalid. You can use this for many cool things, I'm sure.
3175
3176         * CMakeLists.txt:
3177         * GNUmakefile.list.am:
3178         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
3179         * JavaScriptCore.xcodeproj/project.pbxproj:
3180         * assembler/AbstractMacroAssembler.h:
3181         * bytecode/CodeBlock.cpp:
3182         (JSC::CodeBlock::jettison):
3183         * bytecode/CodeBlock.h:
3184         * bytecode/CodeBlockJettisoningWatchpoint.cpp: Added.
3185         (JSC::CodeBlockJettisoningWatchpoint::fireInternal):
3186         * bytecode/CodeBlockJettisoningWatchpoint.h: Added.
3187         (JSC::CodeBlockJettisoningWatchpoint::CodeBlockJettisoningWatchpoint):
3188         * bytecode/ExitKind.cpp:
3189         (JSC::exitKindToString):
3190         * bytecode/ExitKind.h:
3191         * bytecode/ProfiledCodeBlockJettisoningWatchpoint.cpp: Added.
3192         (JSC::ProfiledCodeBlockJettisoningWatchpoint::fireInternal):
3193         * bytecode/ProfiledCodeBlockJettisoningWatchpoint.h: Added.
3194         (JSC::ProfiledCodeBlockJettisoningWatchpoint::ProfiledCodeBlockJettisoningWatchpoint):
3195         * dfg/DFGAbstractHeap.h:
3196         * dfg/DFGAbstractInterpreterInlines.h:
3197         (JSC::DFG::::executeEffects):
3198         * dfg/DFGClobberize.cpp:
3199         (JSC::DFG::writesOverlap):
3200         * dfg/DFGClobberize.h:
3201         (JSC::DFG::clobberize):
3202         (JSC::DFG::AbstractHeapOverlaps::AbstractHeapOverlaps):
3203         (JSC::DFG::AbstractHeapOverlaps::operator()):
3204         (JSC::DFG::AbstractHeapOverlaps::result):
3205         * dfg/DFGCommonData.cpp:
3206         (JSC::DFG::CommonData::invalidate):
3207         * dfg/DFGCommonData.h:
3208         (JSC::DFG::CommonData::CommonData):
3209         * dfg/DFGDesiredWatchpoints.cpp:
3210         (JSC::DFG::DesiredWatchpoints::addLazily):
3211         (JSC::DFG::DesiredWatchpoints::reallyAdd):
3212         * dfg/DFGDesiredWatchpoints.h:
3213         (JSC::DFG::WatchpointForGenericWatchpointSet::WatchpointForGenericWatchpointSet):
3214         (JSC::DFG::GenericDesiredWatchpoints::addLazily):
3215         (JSC::DFG::GenericDesiredWatchpoints::reallyAdd):
3216         (JSC::DFG::GenericDesiredWatchpoints::areStillValid):
3217         * dfg/DFGFixupPhase.cpp:
3218         (JSC::DFG::FixupPhase::fixupNode):
3219         * dfg/DFGInvalidationPointInjectionPhase.cpp: Added.
3220         (JSC::DFG::InvalidationPointInjectionPhase::InvalidationPointInjectionPhase):
3221         (JSC::DFG::InvalidationPointInjectionPhase::run):
3222         (JSC::DFG::InvalidationPointInjectionPhase::handle):
3223         (JSC::DFG::InvalidationPointInjectionPhase::insertInvalidationCheck):
3224         (JSC::DFG::performInvalidationPointInjection):
3225         * dfg/DFGInvalidationPointInjectionPhase.h: Added.
3226         * dfg/DFGJITCode.h:
3227         * dfg/DFGJITCompiler.cpp:
3228         (JSC::DFG::JITCompiler::linkOSRExits):
3229         (JSC::DFG::JITCompiler::link):
3230         * dfg/DFGJITCompiler.h:
3231         * dfg/DFGJumpReplacement.cpp: Added.
3232         (JSC::DFG::JumpReplacement::fire):
3233         * dfg/DFGJumpReplacement.h: Added.
3234         (JSC::DFG::JumpReplacement::JumpReplacement):
3235         * dfg/DFGNodeType.h:
3236         * dfg/DFGOSRExitCompilationInfo.h:
3237         * dfg/DFGOperations.cpp:
3238         * dfg/DFGPlan.cpp:
3239         (JSC::DFG::Plan::compileInThreadImpl):
3240         (JSC::DFG::Plan::reallyAdd):
3241         * dfg/DFGPredictionPropagationPhase.cpp:
3242         (JSC::DFG::PredictionPropagationPhase::propagate):
3243         * dfg/DFGSafeToExecute.h:
3244         (JSC::DFG::safeToExecute):
3245         * dfg/DFGSpeculativeJIT.cpp:
3246         (JSC::DFG::SpeculativeJIT::emitInvalidationPoint):
3247         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectEquality):
3248         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
3249         * dfg/DFGSpeculativeJIT.h:
3250         (JSC::DFG::SpeculativeJIT::masqueradesAsUndefinedWatchpointIsStillValid):
3251         (JSC::DFG::SpeculativeJIT::speculateStringObjectForStructure):
3252         * dfg/DFGSpeculativeJIT32_64.cpp:
3253         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull):
3254         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull):
3255         (JSC::DFG::SpeculativeJIT::compileObjectEquality):
3256         (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality):
3257         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality):
3258         (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot):
3259         (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch):
3260         (JSC::DFG::SpeculativeJIT::compile):
3261         * dfg/DFGSpeculativeJIT64.cpp:
3262         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull):
3263         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull):
3264         (JSC::DFG::SpeculativeJIT::compileObjectEquality):
3265         (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality):
3266         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality):
3267         (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot):
3268         (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch):
3269         (JSC::DFG::SpeculativeJIT::compile):
3270         * dfg/DFGWatchpointCollectionPhase.cpp: Added.
3271         (JSC::DFG::WatchpointCollectionPhase::WatchpointCollectionPhase):
3272         (JSC::DFG::WatchpointCollectionPhase::run):
3273         (JSC::DFG::WatchpointCollectionPhase::handle):
3274         (JSC::DFG::WatchpointCollectionPhase::handleEdge):
3275         (JSC::DFG::WatchpointCollectionPhase::handleMasqueradesAsUndefined):
3276         (JSC::DFG::WatchpointCollectionPhase::handleStringGetByVal):
3277         (JSC::DFG::WatchpointCollectionPhase::addLazily):
3278         (JSC::DFG::WatchpointCollectionPhase::globalObject):
3279         (JSC::DFG::performWatchpointCollection):
3280         * dfg/DFGWatchpointCollectionPhase.h: Added.
3281         * ftl/FTLCapabilities.cpp:
3282         (JSC::FTL::canCompile):
3283         * ftl/FTLLowerDFGToLLVM.cpp:
3284         (JSC::FTL::LowerDFGToLLVM::compileNode):
3285         (JSC::FTL::LowerDFGToLLVM::compileStructureTransitionWatchpoint):
3286         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
3287         (JSC::FTL::LowerDFGToLLVM::compileGlobalVarWatchpoint):
3288         (JSC::FTL::LowerDFGToLLVM::compileCompareEqConstant):
3289         (JSC::FTL::LowerDFGToLLVM::compileCompareStrictEq):
3290         (JSC::FTL::LowerDFGToLLVM::compileCompareStrictEqConstant):
3291         (JSC::FTL::LowerDFGToLLVM::compileInvalidationPoint):
3292         (JSC::FTL::LowerDFGToLLVM::equalNullOrUndefined):
3293         (JSC::FTL::LowerDFGToLLVM::speculateNonNullObject):
3294         * jit/JITOperations.cpp:
3295         * jit/JumpReplacementWatchpoint.cpp: Removed.
3296         * jit/JumpReplacementWatchpoint.h: Removed.
3297
3298 2013-10-25  Mark Hahnenberg  <mhahnenberg@apple.com>
3299
3300         JSExport doesn't support constructors
3301         https://bugs.webkit.org/show_bug.cgi?id=123380
3302
3303         Reviewed by Geoffrey Garen.
3304
3305         Support for constructor-style callbacks for the Objective-C API to JSC is currently limited to 
3306         Objective-C blocks. Any clients who try to call the constructor of a JSExport-ed Objective-C class 
3307         are met with a type error stating that it cannot be called as a constructor.
3308
3309         It would be nice to expand JSExport's functionality to support this idiom. It is a natural 
3310         extension to JSExport and would increase the expressiveness and simplicity in both Objective-C and 
3311         JavaScript client code.
3312
3313         The way we'll do this is to expand the capabilities of ObjCCallbackFunction and associated classes. 
3314         Instead of constructing a normal C API object for the constructor, we'll instead allocate a full-blown 
3315         ObjCCallbackFunction object which can already properly handle being invoked as a constructor.
3316
3317         * API/JSWrapperMap.mm:
3318         (copyMethodsToObject):
3319         (allocateConstructorForCustomClass):
3320         (-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]):
3321         (tryUnwrapObjcObject):
3322         * API/ObjCCallbackFunction.h:
3323         (JSC::ObjCCallbackFunction::impl):
3324         * API/ObjCCallbackFunction.mm:
3325         (JSC::ObjCCallbackFunctionImpl::ObjCCallbackFunctionImpl):
3326         (JSC::ObjCCallbackFunctionImpl::wrappedConstructor):
3327         (JSC::ObjCCallbackFunctionImpl::isConstructible):
3328         (JSC::ObjCCallbackFunction::getConstructData):
3329         (JSC::ObjCCallbackFunctionImpl::name):
3330         (JSC::ObjCCallbackFunctionImpl::call):
3331         (objCCallbackFunctionForInvocation):
3332         (objCCallbackFunctionForInit):
3333         (tryUnwrapConstructor):
3334         * API/tests/testapi.mm:
3335         (-[TextXYZ initWithString:]):
3336         (-[ClassA initWithA:]):
3337         (-[ClassB initWithA:b:]):
3338         (-[ClassC initWithA:]):
3339         (-[ClassC initWithA:b:]):
3340
3341 2013-10-30  peavo@outlook.com  <peavo@outlook.com>
3342
3343         [Win] Compile errors when enabling DFG JIT.
3344         https://bugs.webkit.org/show_bug.cgi?id=120998
3345
3346         Reviewed by Brent Fulgham.
3347
3348         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Added files.
3349         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
3350         * dfg/DFGAllocator.h: Removed scope.
3351         * dfg/DFGWorklist.cpp: Use new ThreadingOnce class instead of pthread_once.
3352         (JSC::DFG::globalWorklist):
3353         * heap/DeferGC.h: Link fix, member needs to be public.
3354         * jit/JITOperationWrappers.h: Added required assembler macros.
3355
3356 2013-10-30  Iago Toral Quiroga  <itoral@igalia.com>
3357
3358         Add result caching for Math.cos
3359         https://bugs.webkit.org/show_bug.cgi?id=123255
3360
3361         Reviewed by Brent Fulgham.
3362
3363         * runtime/MathObject.cpp:
3364         (JSC::mathProtoFuncCos):
3365         * runtime/VM.h:
3366
3367 2013-10-30  Alex Christensen  <achristensen@webkit.org>
3368
3369         Disabled JIT on Win64.
3370         https://bugs.webkit.org/show_bug.cgi?id=122472
3371
3372         Reviewed by Geoffrey Garen.
3373
3374         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
3375         Disabled building JITStubsMSVC64.
3376
3377 2013-10-29  Michael Saboff  <msaboff@apple.com>
3378
3379         Change local variable register allocation to start at offset -1
3380         https://bugs.webkit.org/show_bug.cgi?id=123182
3381
3382         Reviewed by Geoffrey Garen.
3383
3384         Adjusted the virtual register mapping down by one slot.  Reduced
3385         the CallFrame header slots offsets by one.  They now start at 0.
3386         Changed arity fixup to no longer skip passed register slot 0 as this
3387         is now part of the CallFrame header.
3388
3389         * bytecode/VirtualRegister.h:
3390         (JSC::operandIsLocal):
3391         (JSC::operandIsArgument):
3392         (JSC::VirtualRegister::localToOperand):
3393         (JSC::VirtualRegister::operandToLocal):
3394           Adjusted functions for shift in mapping from local to register offset.
3395
3396         * dfg/DFGByteCodeParser.cpp:
3397         (JSC::DFG::ByteCodeParser::findArgumentPositionForLocal):
3398         (JSC::DFG::ByteCodeParser::addCall):
3399         (JSC::DFG::ByteCodeParser::handleInlining):
3400         (JSC::DFG::ByteCodeParser::parseBlock):