BUILD FIX (r146558): Call [super dealloc] from -[TinyDOMNode dealloc]
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2013-03-22  David Kilzer  <ddkilzer@apple.com>
2
3         BUILD FIX (r146558): Call [super dealloc] from -[TinyDOMNode dealloc]
4         <http://webkit.org/b/112608>
5
6         Fixes the following build failure:
7
8             Source/JavaScriptCore/API/tests/testapi.mm:205:1: error: method possibly missing a [super dealloc] call [-Werror,-Wobjc-missing-super-calls]
9             }
10             ^
11             1 error generated.
12
13         * API/tests/testapi.mm:
14         (-[TinyDOMNode dealloc]): Call [super dealloc].
15
16 2013-03-22  Ryosuke Niwa  <rniwa@webkit.org>
17
18         Leak bots erroneously report JSC::WatchpointSet as leaking
19         https://bugs.webkit.org/show_bug.cgi?id=107781
20
21         Reviewed by Filip Pizlo.
22
23         Since leaks doesn't support tagged pointers, avoid using it by flipping the bit flag to indicate
24         the entry is "fat". We set the flag when the entry is NOT fat; i.e. slim.
25
26         Replaced FatFlag by SlimFlag and initialized m_bits with this flag to indicate that the entry is
27         initially "slim".
28
29         * runtime/SymbolTable.cpp:
30         (JSC::SymbolTableEntry::copySlow): Don't set FatFlag since it has been replaced by SlimFlag.
31         (JSC::SymbolTableEntry::inflateSlow): Ditto.
32
33         * runtime/SymbolTable.h:
34         (JSC::SymbolTableEntry::Fast::Fast): Set SlimFlag by default.
35         (JSC::SymbolTableEntry::Fast::isNull): Ignore SlimFlag.
36         (JSC::SymbolTableEntry::Fast::isFat): An entry is fat when m_bits is not entirely zero and SlimFlag
37         is not set.
38
39         (JSC::SymbolTableEntry::SymbolTableEntry): Set SlimFlag by default.
40         (JSC::SymbolTableEntry::SymbolTableEntry::getFast): Set SlimFlag when creating Fast from a fat entry.
41         (JSC::SymbolTableEntry::isNull): Ignore SlimFlag.
42         (JSC::SymbolTableEntry::FatEntry::FatEntry): Strip SlimFlag.
43         (JSC::SymbolTableEntry::isFat): An entry is fat when m_bits is not entirely zero and SlimFlag is unset.
44         (JSC::SymbolTableEntry::fatEntry): Don't strip FatFlag as this flag doesn't exist anymore.
45         (JSC::SymbolTableEntry::pack): Preserve SlimFlag.
46
47         (JSC::SymbolTableIndexHashTraits): empty value is no longer zero so don't set emptyValueIsZero true.
48
49 2013-03-21  Mark Hahnenberg  <mhahnenberg@apple.com>
50
51         Objective-C API: Need a good way to preserve custom properties on JS wrappers
52         https://bugs.webkit.org/show_bug.cgi?id=112608
53
54         Reviewed by Geoffrey Garen.
55
56         Currently, we just use a weak map, which means that garbage collection can cause a wrapper to 
57         disappear if it isn't directly exported to JavaScript.
58
59         The most straightforward and safe way (with respect to garbage collection and concurrency) is to have 
60         clients add and remove their external references along with their owners. Effectively, the client is 
61         recording the structure of the external object graph so that the garbage collector can make sure to 
62         mark any wrappers that are reachable through either the JS object graph of the external Obj-C object 
63         graph. By keeping these wrappers alive, this has the effect that custom properties on these wrappers 
64         will also remain alive.
65
66         The rule for if an object needs to be tracked by the runtime (and therefore whether the client should report it) is as follows:
67         For a particular object, its references to its children should be added if:
68         1. The child is referenced from JavaScript.
69         2. The child contains references to other objects for which (1) or (2) are true.
70
71         * API/JSAPIWrapperObject.mm:
72         (JSAPIWrapperObjectHandleOwner::finalize):
73         (JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots): A wrapper object is kept alive only if its JSGlobalObject
74         is marked and its corresponding Objective-C object was added to the set of opaque roots.
75         (JSC::JSAPIWrapperObject::visitChildren): We now call out to scanExternalObjectGraph, which handles adding all Objective-C
76         objects to the set of opaque roots.
77         * API/JSAPIWrapperObject.h:
78         (JSAPIWrapperObject):
79         * API/JSContext.mm: Moved dealloc to its proper place in the main implementation.
80         (-[JSContext dealloc]):
81         * API/JSVirtualMachine.h:
82         * API/JSVirtualMachine.mm:
83         (-[JSVirtualMachine initWithContextGroupRef:]):
84         (-[JSVirtualMachine dealloc]):
85         (getInternalObjcObject): Helper funciton to get the Objective-C object out of JSManagedValues or JSValues if there is one.
86         (-[JSVirtualMachine addManagedReference:withOwner:]): Adds the Objective-C object to the set of objects 
87         owned by the owner object in that particular virtual machine.
88         (-[JSVirtualMachine removeManagedReference:withOwner:]): Removes the relationship between the two objects.
89         (-[JSVirtualMachine externalObjectGraph]):
90         (scanExternalObjectGraph): Does a depth-first search of the external object graph in a particular virtual machine starting at
91         the specified root. Each new object it encounters it adds to the set of opaque roots. These opaque roots will keep their 
92         corresponding wrapper objects alive if they have them. 
93         * API/JSManagedReferenceInternal.h: Added.
94         * API/JSVirtualMachine.mm: Added the per-JSVirtualMachine map between objects and the objects they own, which is more formally
95         known as that virtual machine's external object graph.
96         * API/JSWrapperMap.mm:
97         (-[JSWrapperMap dealloc]): We were leaking this before :-(
98         (-[JSVirtualMachine initWithContextGroupRef:]):
99         (-[JSVirtualMachine dealloc]):
100         (-[JSVirtualMachine externalObjectGraph]):
101         * API/JSVirtualMachineInternal.h:
102         * API/tests/testapi.mm: Added two new tests using the TinyDOMNode class. The first tests that a custom property added to a wrapper 
103         doesn't vanish after GC, even though that wrapper isn't directly accessible to the JS garbage collector but is accessible through 
104         the external Objective-C object graph. The second test makes sure that adding an object to the external object graph with the same 
105         owner doesn't cause any sort of problems.
106         (+[TinyDOMNode sharedVirtualMachine]):
107         (-[TinyDOMNode init]):
108         (-[TinyDOMNode dealloc]):
109         (-[TinyDOMNode appendChild:]):
110         (-[TinyDOMNode numberOfChildren]):
111         (-[TinyDOMNode childAtIndex:]):
112         (-[TinyDOMNode removeChildAtIndex:]):
113         * JavaScriptCore.xcodeproj/project.pbxproj:
114         * heap/SlotVisitor.h:
115         (SlotVisitor):
116         * heap/SlotVisitorInlines.h:
117         (JSC::SlotVisitor::containsOpaqueRootTriState): Added a new method to SlotVisitor to allow scanExternalObjectGraph to have a 
118         thread-safe view of opaque roots during parallel marking. The set of opaque roots available to any one SlotVisitor isn't guaranteed
119         to be 100% correct, but that just results in a small duplication of work in scanExternalObjectGraph. To indicate this change for
120         false negatives we return a TriState that's either true or mixed, but never false.
121
122 2013-03-21  Mark Lam  <mark.lam@apple.com>
123
124         Fix O(n^2) op_debug bytecode charPosition to column computation.
125         https://bugs.webkit.org/show_bug.cgi?id=112957.
126
127         Reviewed by Geoffrey Garen.
128
129         The previous algorithm does a linear reverse scan of the source string
130         to find the line start for any given char position. This results in a
131         O(n^2) algortithm when the source string has no line breaks.
132
133         The new algorithm computes a line start column table for a
134         SourceProvider on first use. This line start table is used to fix up
135         op_debug's charPosition operand into a column operand when an
136         UnlinkedCodeBlock is linked into a CodeBlock. The initialization of
137         the line start table is O(n), and the CodeBlock column fix up is
138         O(log(n)).
139
140         * bytecode/CodeBlock.cpp:
141         (JSC::CodeBlock::dumpBytecode): 
142         (JSC::CodeBlock::CodeBlock): - do column fix up.
143         * interpreter/Interpreter.cpp:
144         (JSC::Interpreter::debug): - no need to do column fixup anymore.
145         * interpreter/Interpreter.h:
146         * jit/JITStubs.cpp:
147         (JSC::DEFINE_STUB_FUNCTION):
148         * llint/LLIntSlowPaths.cpp:
149         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
150         * parser/SourceProvider.cpp:
151         (JSC::SourceProvider::lineStarts):
152         (JSC::charPositionExtractor):
153         (JSC::SourceProvider::charPositionToColumnNumber):
154         - initialize line start column table if needed.
155         - look up line start for the given char position.
156         * parser/SourceProvider.h:
157
158 2013-03-21  Filip Pizlo  <fpizlo@apple.com>
159
160         JSC profiler should have an at-a-glance report of the success of DFG optimization
161         https://bugs.webkit.org/show_bug.cgi?id=112988
162
163         Reviewed by Geoffrey Garen.
164
165         * dfg/DFGByteCodeParser.cpp:
166         (JSC::DFG::ByteCodeParser::handleCall):
167         (JSC::DFG::ByteCodeParser::handleGetById):
168         (JSC::DFG::ByteCodeParser::parseBlock):
169         * profiler/ProfilerCompilation.cpp:
170         (JSC::Profiler::Compilation::Compilation):
171         (JSC::Profiler::Compilation::toJS):
172         * profiler/ProfilerCompilation.h:
173         (JSC::Profiler::Compilation::noticeInlinedGetById):
174         (JSC::Profiler::Compilation::noticeInlinedPutById):
175         (JSC::Profiler::Compilation::noticeInlinedCall):
176         (Compilation):
177         * runtime/CommonIdentifiers.h:
178
179 2013-03-21  Mark Lam  <mark.lam@apple.com>
180
181         Fix lexer charPosition computation when "rewind"ing the lexer.
182         https://bugs.webkit.org/show_bug.cgi?id=112952.
183
184         Reviewed by Michael Saboff.
185
186         Changed the Lexer to no longer keep a m_charPosition. Instead, we compute
187         currentCharPosition() from m_code and m_codeStartPlusOffset, where
188         m_codeStartPlusOffset is the SourceProvider m_codeStart + the SourceCode
189         start offset. This ensures that the charPosition is always in sync with
190         m_code.
191
192         * parser/Lexer.cpp:
193         (JSC::::setCode):
194         (JSC::::internalShift):
195         (JSC::::shift):
196         (JSC::::lex):
197         * parser/Lexer.h:
198         (JSC::Lexer::currentCharPosition):
199         (JSC::::lexExpectIdentifier):
200
201 2013-03-21  Alberto Garcia  <agarcia@igalia.com>
202
203         [BlackBerry] GCActivityCallback: replace JSLock with JSLockHolder
204         https://bugs.webkit.org/show_bug.cgi?id=112448
205
206         Reviewed by Xan Lopez.
207
208         This changed in r121381.
209
210         * runtime/GCActivityCallbackBlackBerry.cpp:
211         (JSC::DefaultGCActivityCallback::doWork):
212
213 2013-03-21  Mark Hahnenberg  <mhahnenberg@apple.com>
214
215         Objective-C API: wrapperClass holds a static JSClassRef, which causes JSGlobalObjects to leak
216         https://bugs.webkit.org/show_bug.cgi?id=112856
217
218         Reviewed by Geoffrey Garen.
219
220         Through a very convoluted path that involves the caching of prototypes on the JSClassRef, we can leak 
221         JSGlobalObjects when inserting an Objective-C object into multiple independent JSContexts.
222
223         * API/JSAPIWrapperObject.cpp: Removed.
224         * API/JSAPIWrapperObject.h:
225         (JSAPIWrapperObject):
226         * API/JSAPIWrapperObject.mm: Copied from Source/JavaScriptCore/API/JSAPIWrapperObject.cpp. Made this an
227         Objective-C++ file so that we can call release on the wrappedObject. Also added a WeakHandleOwner for 
228         JSAPIWrapperObjects. This will also be used in a future patch for https://bugs.webkit.org/show_bug.cgi?id=112608.
229         (JSAPIWrapperObjectHandleOwner):
230         (jsAPIWrapperObjectHandleOwner):
231         (JSAPIWrapperObjectHandleOwner::finalize): This finalize replaces the old finalize that was done through
232         the C API.
233         (JSC::JSAPIWrapperObject::finishCreation): Allocate the WeakImpl. Balanced in finalize.
234         (JSC::JSAPIWrapperObject::setWrappedObject): We now do the retain of the wrappedObject here rather than in random
235         places scattered around JSWrapperMap.mm
236         * API/JSObjectRef.cpp: Added some ifdefs for platforms that don't support the Obj-C API.
237         (JSObjectGetPrivate): Ditto.
238         (JSObjectSetPrivate): Ditto.
239         (JSObjectGetPrivateProperty): Ditto.
240         (JSObjectSetPrivateProperty): Ditto.
241         (JSObjectDeletePrivateProperty): Ditto.
242         * API/JSValueRef.cpp: Ditto.
243         (JSValueIsObjectOfClass): Ditto.
244         * API/JSWrapperMap.mm: Remove wrapperClass().
245         (objectWithCustomBrand): Change to no longer use a parent class, which was only used to give the ability to 
246         finalize wrapper objects.
247         (-[JSObjCClassInfo initWithContext:forClass:superClassInfo:]): Change to no longer use wrapperClass(). 
248         (-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]): Ditto.
249         (tryUnwrapObjcObject): We now check if the object inherits from JSAPIWrapperObject.
250         * API/tests/testapi.mm: Added a test that exports an Objective-C object to two different JSContexts and makes 
251         sure that the first one is collected properly by using a weak JSManagedValue for the wrapper in the first JSContext.
252         * CMakeLists.txt: Build file modifications.
253         * GNUmakefile.list.am: Ditto.
254         * JavaScriptCore.gypi: Ditto.
255         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto.
256         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Ditto.
257         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
258         * JavaScriptCore.xcodeproj/project.pbxproj: Ditto.
259         * runtime/JSGlobalObject.cpp: More ifdefs for unsupported platforms.
260         (JSC::JSGlobalObject::reset): Ditto.
261         (JSC::JSGlobalObject::visitChildren): Ditto.
262         * runtime/JSGlobalObject.h: Ditto.
263         (JSGlobalObject): Ditto.
264         (JSC::JSGlobalObject::objcCallbackFunctionStructure): Ditto.
265
266 2013-03-21  Anton Muhin  <antonm@chromium.org>
267
268         Unreviewed, rolling out r146483.
269         http://trac.webkit.org/changeset/146483
270         https://bugs.webkit.org/show_bug.cgi?id=111695
271
272         Breaks debug builds.
273
274         * bytecode/GlobalResolveInfo.h: Removed property svn:mergeinfo.
275
276 2013-03-21  Gabor Rapcsanyi  <rgabor@webkit.org>
277
278         Implement LLInt for CPU(ARM_TRADITIONAL)
279         https://bugs.webkit.org/show_bug.cgi?id=97589
280
281         Reviewed by Zoltan Herczeg.
282
283         Enable LLInt for ARMv5 and ARMv7 traditional as well.
284
285         * llint/LLIntOfflineAsmConfig.h:
286         * llint/LowLevelInterpreter.asm:
287         * llint/LowLevelInterpreter32_64.asm:
288         * offlineasm/arm.rb:
289         * offlineasm/backends.rb:
290         * offlineasm/instructions.rb:
291
292 2013-03-20  Cosmin Truta  <ctruta@blackberry.com>
293
294         [QNX][ARM] REGRESSION(r135330): Various failures in Octane
295         https://bugs.webkit.org/show_bug.cgi?id=112863
296
297         Reviewed by Yong Li.
298
299         This was fixed in http://trac.webkit.org/changeset/146396 on Linux only.
300         Enable this fix on QNX.
301
302         * assembler/ARMv7Assembler.h:
303         (ARMv7Assembler):
304         (JSC::ARMv7Assembler::replaceWithJump):
305         (JSC::ARMv7Assembler::maxJumpReplacementSize):
306         * assembler/MacroAssemblerARMv7.h:
307         (JSC::MacroAssemblerARMv7::revertJumpReplacementToBranchPtrWithPatch):
308
309 2013-03-20  Filip Pizlo  <fpizlo@apple.com>
310
311         Fix indentation of JSString.h
312
313         Rubber stamped by Mark Hahnenberg.
314
315         * runtime/JSString.h:
316
317 2013-03-20  Filip Pizlo  <fpizlo@apple.com>
318
319         "" + x where x is not a string should be optimized by the DFG to some manner of ToString conversion
320         https://bugs.webkit.org/show_bug.cgi?id=112845
321
322         Reviewed by Mark Hahnenberg.
323         
324         I like to do "" + x. So I decided to make DFG recognize it, and related idioms.
325
326         * dfg/DFGFixupPhase.cpp:
327         (JSC::DFG::FixupPhase::fixupNode):
328         (JSC::DFG::FixupPhase::fixupToPrimitive):
329         (FixupPhase):
330         (JSC::DFG::FixupPhase::fixupToString):
331         (JSC::DFG::FixupPhase::attemptToMakeFastStringAdd):
332         * dfg/DFGPredictionPropagationPhase.cpp:
333         (JSC::DFG::resultOfToPrimitive):
334         (DFG):
335         (JSC::DFG::PredictionPropagationPhase::propagate):
336         * dfg/DFGPredictionPropagationPhase.h:
337         (DFG):
338
339 2013-03-20  Zoltan Herczeg  <zherczeg@webkit.org>
340
341         ARMv7 replaceWithJump ASSERT failure after r135330.
342         https://bugs.webkit.org/show_bug.cgi?id=103146
343
344         Reviewed by Filip Pizlo.
345
346         On Linux, the 24 bit distance range of jumps sometimes does not
347         enough to cover all targets addresses. This patch supports jumps
348         outside of this range using a mov/movt/bx 10 byte long sequence.
349
350         * assembler/ARMv7Assembler.h:
351         (ARMv7Assembler):
352         (JSC::ARMv7Assembler::revertJumpTo_movT3movtcmpT2):
353         (JSC::ARMv7Assembler::nopw):
354         (JSC::ARMv7Assembler::label):
355         (JSC::ARMv7Assembler::replaceWithJump):
356         (JSC::ARMv7Assembler::maxJumpReplacementSize):
357         * assembler/MacroAssemblerARMv7.h:
358         (JSC::MacroAssemblerARMv7::revertJumpReplacementToBranchPtrWithPatch):
359
360 2013-03-20  Mark Hahnenberg  <mhahnenberg@apple.com>
361
362         Objective-C API: Fix over-releasing in allocateConstructorAndPrototypeWithSuperClassInfo:
363         https://bugs.webkit.org/show_bug.cgi?id=112832
364
365         Reviewed by Geoffrey Garen.
366
367         If either the m_constructor or m_prototype (but not both) is collected, we will call 
368         allocateConstructorAndPrototypeWithSuperClassInfo, which will create a new object to replace the one 
369         that was collected, but at the end of the method we call release on both of them. 
370         This is incorrect since we autorelease the JSValue in the case that the object doesn't need to be 
371         reallocated. Thus we'll end up overreleasing later during the drain of the autorelease pool.
372
373         * API/JSWrapperMap.mm:
374         (objectWithCustomBrand): We no longer alloc here. We instead call the JSValue valueWithValue class method,
375         which autoreleases for us.
376         (-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]): We no longer call release on the 
377         constructor or prototype JSValues.
378         * API/tests/testapi.mm: Added a new test that crashes on ToT due to over-releasing.
379
380 2013-03-19  Filip Pizlo  <fpizlo@apple.com>
381
382         It's called "Hash Consing" not "Hash Consting"
383         https://bugs.webkit.org/show_bug.cgi?id=112768
384
385         Rubber stamped by Mark Hahnenberg.
386         
387         See http://en.wikipedia.org/wiki/Hash_consing
388
389         * heap/GCThreadSharedData.cpp:
390         (JSC::GCThreadSharedData::GCThreadSharedData):
391         (JSC::GCThreadSharedData::reset):
392         * heap/GCThreadSharedData.h:
393         (GCThreadSharedData):
394         * heap/SlotVisitor.cpp:
395         (JSC::SlotVisitor::SlotVisitor):
396         (JSC::SlotVisitor::setup):
397         (JSC::SlotVisitor::reset):
398         (JSC::JSString::tryHashConsLock):
399         (JSC::JSString::releaseHashConsLock):
400         (JSC::JSString::shouldTryHashCons):
401         (JSC::SlotVisitor::internalAppend):
402         * heap/SlotVisitor.h:
403         (SlotVisitor):
404         * runtime/JSGlobalData.cpp:
405         (JSC::JSGlobalData::JSGlobalData):
406         * runtime/JSGlobalData.h:
407         (JSGlobalData):
408         (JSC::JSGlobalData::haveEnoughNewStringsToHashCons):
409         (JSC::JSGlobalData::resetNewStringsSinceLastHashCons):
410         * runtime/JSString.h:
411         (JSC::JSString::finishCreation):
412         (JSString):
413         (JSC::JSString::isHashConsSingleton):
414         (JSC::JSString::clearHashConsSingleton):
415         (JSC::JSString::setHashConsSingleton):
416
417 2013-03-20  Filip Pizlo  <fpizlo@apple.com>
418
419         DFG implementation of op_strcat should inline rope allocations
420         https://bugs.webkit.org/show_bug.cgi?id=112780
421
422         Reviewed by Oliver Hunt.
423         
424         This gets rid of the StrCat node and adds a MakeRope node. The MakeRope node can
425         take either two or three operands, and allocates a rope string with either two or
426         three fibers. (The magic choice of three children for non-VarArg nodes happens to
427         match exactly with the magic choice of three fibers for rope strings.)
428         
429         ValueAdd on KnownString is replaced with MakeRope with two children.
430         
431         StrCat gets replaced by an appropriate sequence of MakeRope's.
432         
433         MakeRope does not do the dynamic check to see if its children are empty strings.
434         This is replaced by a static check, instead. The downside is that we may use more
435         memory if the strings passed to MakeRope turn out to dynamically be empty. The
436         upside is that we do fewer checks in the cases where either the strings are not
437         empty, or where the strings are statically known to be empty. I suspect both of
438         those cases are more common, than the case where the string is dynamically empty.
439         
440         This also results in some badness for X86. MakeRope needs six registers if it is
441         allocating a three-rope. We don't have six registers to spare on X86. Currently,
442         the code side-steps this problem by just never usign three-ropes in optimized
443         code on X86. All other architectures, including X86_64, don't have this problem.
444         
445         This is a shocking speed-up. 9% progressions on both V8/splay and
446         SunSpider/date-format-xparb. 1% progression on V8v7 overall, and ~0.5% progression
447         on SunSpider. 2x speed-up on microbenchmarks that test op_strcat.
448
449         * dfg/DFGAbstractState.cpp:
450         (JSC::DFG::AbstractState::executeEffects):
451         * dfg/DFGAdjacencyList.h:
452         (AdjacencyList):
453         (JSC::DFG::AdjacencyList::removeEdge):
454         * dfg/DFGArgumentsSimplificationPhase.cpp:
455         (JSC::DFG::ArgumentsSimplificationPhase::removeArgumentsReferencingPhantomChild):
456         * dfg/DFGBackwardsPropagationPhase.cpp:
457         (JSC::DFG::BackwardsPropagationPhase::propagate):
458         * dfg/DFGByteCodeParser.cpp:
459         (JSC::DFG::ByteCodeParser::parseBlock):
460         * dfg/DFGCSEPhase.cpp:
461         (JSC::DFG::CSEPhase::putStructureStoreElimination):
462         (JSC::DFG::CSEPhase::eliminateIrrelevantPhantomChildren):
463         (JSC::DFG::CSEPhase::performNodeCSE):
464         * dfg/DFGDCEPhase.cpp:
465         (JSC::DFG::DCEPhase::eliminateIrrelevantPhantomChildren):
466         * dfg/DFGFixupPhase.cpp:
467         (JSC::DFG::FixupPhase::fixupNode):
468         (JSC::DFG::FixupPhase::createToString):
469         (JSC::DFG::FixupPhase::attemptToForceStringArrayModeByToStringConversion):
470         (JSC::DFG::FixupPhase::convertStringAddUse):
471         (FixupPhase):
472         (JSC::DFG::FixupPhase::convertToMakeRope):
473         (JSC::DFG::FixupPhase::fixupMakeRope):
474         (JSC::DFG::FixupPhase::attemptToMakeFastStringAdd):
475         * dfg/DFGNodeType.h:
476         (DFG):
477         * dfg/DFGOperations.cpp:
478         * dfg/DFGOperations.h:
479         * dfg/DFGPredictionPropagationPhase.cpp:
480         (JSC::DFG::PredictionPropagationPhase::propagate):
481         * dfg/DFGSpeculativeJIT.cpp:
482         (JSC::DFG::SpeculativeJIT::compileAdd):
483         (JSC::DFG::SpeculativeJIT::compileMakeRope):
484         (DFG):
485         * dfg/DFGSpeculativeJIT.h:
486         (JSC::DFG::SpeculativeJIT::callOperation):
487         (SpeculativeJIT):
488         (JSC::DFG::SpeculateCellOperand::SpeculateCellOperand):
489         (JSC::DFG::SpeculateCellOperand::~SpeculateCellOperand):
490         (JSC::DFG::SpeculateCellOperand::gpr):
491         (JSC::DFG::SpeculateCellOperand::use):
492         * dfg/DFGSpeculativeJIT32_64.cpp:
493         (JSC::DFG::SpeculativeJIT::compile):
494         * dfg/DFGSpeculativeJIT64.cpp:
495         (JSC::DFG::SpeculativeJIT::compile):
496         * runtime/JSString.h:
497         (JSRopeString):
498
499 2013-03-20  Peter Gal  <galpeter@inf.u-szeged.hu>
500
501         Implement and32 on MIPS platform
502         https://bugs.webkit.org/show_bug.cgi?id=112665
503
504         Reviewed by Zoltan Herczeg.
505
506         * assembler/MacroAssemblerMIPS.h:
507         (JSC::MacroAssemblerMIPS::and32): Added missing method.
508         (MacroAssemblerMIPS):
509
510 2013-03-20  Mark Lam  <mark.lam@apple.com>
511
512         Fix incorrect debugger column number value.
513         https://bugs.webkit.org/show_bug.cgi?id=112741.
514
515         Reviewed by Oliver Hunt.
516
517         1. In lexer, parser, and debugger code, renamed column to charPosition.
518         2. Convert the charPosition to the equivalent column number before
519            passing it to the debugger.
520         3. Changed ScopeNodes to take both a startLocation and an endLocation.
521            This allows FunctionBodyNodes, ProgramNodes, and EvalNodess to emit
522            correct debug hooks with correct starting line and column numbers.
523         4. Fixed the Lexer to not reset the charPosition (previously
524            columnNumber) in Lexer::lex().
525
526         * JavaScriptCore.order:
527         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def:
528         * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in:
529         * bytecode/CodeBlock.cpp:
530         (JSC::CodeBlock::dumpBytecode):
531         * bytecompiler/BytecodeGenerator.cpp:
532         (JSC::BytecodeGenerator::emitDebugHook):
533         * bytecompiler/BytecodeGenerator.h:
534         (JSC::BytecodeGenerator::emitExpressionInfo):
535         * bytecompiler/NodesCodegen.cpp:
536         (JSC::ArrayNode::toArgumentList):
537         (JSC::ConstStatementNode::emitBytecode):
538         (JSC::EmptyStatementNode::emitBytecode):
539         (JSC::DebuggerStatementNode::emitBytecode):
540         (JSC::ExprStatementNode::emitBytecode):
541         (JSC::VarStatementNode::emitBytecode):
542         (JSC::IfNode::emitBytecode):
543         (JSC::IfElseNode::emitBytecode):
544         (JSC::DoWhileNode::emitBytecode):
545         (JSC::WhileNode::emitBytecode):
546         (JSC::ForNode::emitBytecode):
547         (JSC::ForInNode::emitBytecode):
548         (JSC::ContinueNode::emitBytecode):
549         (JSC::BreakNode::emitBytecode):
550         (JSC::ReturnNode::emitBytecode):
551         (JSC::WithNode::emitBytecode):
552         (JSC::SwitchNode::emitBytecode):
553         (JSC::LabelNode::emitBytecode):
554         (JSC::ThrowNode::emitBytecode):
555         (JSC::TryNode::emitBytecode):
556         (JSC::ProgramNode::emitBytecode):
557         (JSC::EvalNode::emitBytecode):
558         (JSC::FunctionBodyNode::emitBytecode):
559         * interpreter/Interpreter.cpp:
560         (JSC::Interpreter::debug):
561         - convert charPosition to column for the debugger.
562         * interpreter/Interpreter.h:
563         * jit/JITStubs.cpp:
564         (DEFINE_STUB_FUNCTION(void, op_debug)):
565         * llint/LLIntSlowPaths.cpp:
566         (LLINT_SLOW_PATH_DECL(slow_op_debug)):
567         * parser/ASTBuilder.h:
568         (JSC::ASTBuilder::createFunctionExpr):
569         (JSC::ASTBuilder::createFunctionBody):
570         (JSC::ASTBuilder::createGetterOrSetterProperty):
571         (JSC::ASTBuilder::createFuncDeclStatement):
572         (JSC::ASTBuilder::createBlockStatement):
573         (JSC::ASTBuilder::createExprStatement):
574         (JSC::ASTBuilder::createIfStatement):
575         (JSC::ASTBuilder::createForLoop):
576         (JSC::ASTBuilder::createForInLoop):
577         (JSC::ASTBuilder::createVarStatement):
578         (JSC::ASTBuilder::createReturnStatement):
579         (JSC::ASTBuilder::createBreakStatement):
580         (JSC::ASTBuilder::createContinueStatement):
581         (JSC::ASTBuilder::createTryStatement):
582         (JSC::ASTBuilder::createSwitchStatement):
583         (JSC::ASTBuilder::createWhileStatement):
584         (JSC::ASTBuilder::createDoWhileStatement):
585         (JSC::ASTBuilder::createWithStatement):
586         (JSC::ASTBuilder::createThrowStatement):
587         (JSC::ASTBuilder::createDebugger):
588         (JSC::ASTBuilder::createConstStatement):
589         * parser/Lexer.cpp:
590         (JSC::::setCode):
591         (JSC::::internalShift):
592         (JSC::::shift):
593         (JSC::::lex):
594         * parser/Lexer.h:
595         (JSC::Lexer::currentCharPosition):
596         (Lexer):
597         (JSC::::lexExpectIdentifier):
598         * parser/NodeConstructors.h:
599         (JSC::Node::Node):
600         * parser/Nodes.cpp:
601         (JSC::StatementNode::setLoc):
602         (JSC::ScopeNode::ScopeNode):
603         (JSC::ProgramNode::ProgramNode):
604         (JSC::ProgramNode::create):
605         (JSC::EvalNode::EvalNode):
606         (JSC::EvalNode::create):
607         (JSC::FunctionBodyNode::FunctionBodyNode):
608         (JSC::FunctionBodyNode::create):
609         * parser/Nodes.h:
610         (JSC::Node::charPosition):
611         (Node):
612         (StatementNode):
613         (JSC::StatementNode::lastLine):
614         (ScopeNode):
615         (JSC::ScopeNode::startLine):
616         (JSC::ScopeNode::startCharPosition):
617         (ProgramNode):
618         (EvalNode):
619         (FunctionBodyNode):
620         * parser/Parser.cpp:
621         (JSC::::Parser):
622         (JSC::::parseFunctionBody):
623         (JSC::::parseFunctionInfo):
624         * parser/Parser.h:
625         (JSC::::parse):
626         * parser/ParserTokens.h:
627         (JSC::JSTokenLocation::JSTokenLocation):
628         (JSTokenLocation):
629         * parser/SyntaxChecker.h:
630         (JSC::SyntaxChecker::createFunctionBody):
631
632 2013-03-20  Csaba Osztrogonác  <ossy@webkit.org>
633
634         REGRESSION(r146089): It broke 20 sputnik tests on ARM traditional and Thumb2
635         https://bugs.webkit.org/show_bug.cgi?id=112676
636
637         Rubber-stamped by Filip Pizlo.
638
639         Add one more EABI_32BIT_DUMMY_ARG to make DFG JIT ARM EABI compatible
640         again after r146089 similar to https://bugs.webkit.org/show_bug.cgi?id=84449
641
642         * dfg/DFGSpeculativeJIT.h:
643         (JSC::DFG::SpeculativeJIT::callOperation):
644
645 2013-03-19  Michael Saboff  <msaboff@apple.com>
646
647         Crash when loading http://www.jqchart.com/jquery/gauges/RadialGauge/LiveData
648         https://bugs.webkit.org/show_bug.cgi?id=112694
649
650         Reviewed by Filip Pizlo.
651
652         We were trying to convert an NewArray to a Phantom, but convertToPhantom doesn't handle
653         nodes with variable arguments.  Added code to insert a Phantom node in front of all the
654         live children of a var args node.  Added ASSERT not var args for convertToPhantom to
655         catch any other similar cases.  Added a new convertToPhantomUnchecked() for converting 
656         var arg nodes.
657
658         * dfg/DFGDCEPhase.cpp:
659         (JSC::DFG::DCEPhase::run):
660         * dfg/DFGNode.h:
661         (Node):
662         (JSC::DFG::Node::setOpAndDefaultNonExitFlags): Added ASSERT(!(m_flags & NodeHasVarArgs))
663         (JSC::DFG::Node::setOpAndDefaultNonExitFlagsUnchecked):
664         (JSC::DFG::Node::convertToPhantomUnchecked):
665
666 2013-03-19  Mark Hahnenberg  <mhahnenberg@apple.com>
667
668         Crash in SpeculativeJIT::fillSpeculateIntInternal<false> on http://bellard.org/jslinux
669         https://bugs.webkit.org/show_bug.cgi?id=112738
670
671         Reviewed by Filip Pizlo.
672
673         * dfg/DFGFixupPhase.cpp:
674         (JSC::DFG::FixupPhase::fixIntEdge): We shouldn't be killing this node because it could be
675         referenced by other people.
676
677 2013-03-19  Oliver Hunt  <oliver@apple.com>
678
679         RELEASE_ASSERT fires in exception handler lookup
680
681         RS=Geoff Garen.
682
683         Temporarily switch this RELEASE_ASSERT into a regular ASSERT 
684         as currently this is producing fairly bad crashiness.
685
686         * bytecode/CodeBlock.cpp:
687         (JSC::CodeBlock::handlerForBytecodeOffset):
688
689 2013-03-18  Filip Pizlo  <fpizlo@apple.com>
690
691         DFG should optimize StringObject.length and StringOrStringObject.length
692         https://bugs.webkit.org/show_bug.cgi?id=112658
693
694         Reviewed by Mark Hahnenberg.
695         
696         Implemented by injecting a ToString(StringObject:@a) or ToString(StringOrStringObject:@a) prior
697         to GetArrayLength with ArrayMode(Array::String) if @a is predicted StringObject or
698         StringOrStringObject.
699
700         * dfg/DFGFixupPhase.cpp:
701         (JSC::DFG::FixupPhase::fixupNode):
702         (JSC::DFG::FixupPhase::createToString):
703         (FixupPhase):
704         (JSC::DFG::FixupPhase::attemptToForceStringArrayModeByToStringConversion):
705         (JSC::DFG::FixupPhase::convertStringAddUse):
706
707 2013-03-19  Gabor Rapcsanyi  <rgabor@webkit.org>
708
709         Implement and32 on ARMv7 and ARM traditional platforms
710         https://bugs.webkit.org/show_bug.cgi?id=112663
711
712         Reviewed by Zoltan Herczeg.
713
714         * assembler/MacroAssemblerARM.h:
715         (JSC::MacroAssemblerARM::and32): Add missing method.
716         (MacroAssemblerARM):
717         * assembler/MacroAssemblerARMv7.h:
718         (JSC::MacroAssemblerARMv7::and32): Add missing method.
719         (MacroAssemblerARMv7):
720
721 2013-03-18  Filip Pizlo  <fpizlo@apple.com>
722
723         DFG ToString generic cases should work correctly
724         https://bugs.webkit.org/show_bug.cgi?id=112654
725         <rdar://problem/13447250>
726
727         Reviewed by Geoffrey Garen.
728
729         * dfg/DFGSpeculativeJIT.cpp:
730         (JSC::DFG::SpeculativeJIT::compileToStringOnCell):
731         * dfg/DFGSpeculativeJIT32_64.cpp:
732         (JSC::DFG::SpeculativeJIT::compile):
733         * dfg/DFGSpeculativeJIT64.cpp:
734         (JSC::DFG::SpeculativeJIT::compile):
735
736 2013-03-18  Michael Saboff  <msaboff@apple.com>
737
738         Unreviewed build fix for 32 bit builds.
739
740         * dfg/DFGSpeculativeJIT32_64.cpp:
741         (JSC::DFG::SpeculativeJIT::compile):
742
743 2013-03-18  Michael Saboff  <msaboff@apple.com>
744
745         EFL: Unsafe branch detected in compilePutByValForFloatTypedArray()
746         https://bugs.webkit.org/show_bug.cgi?id=112609
747
748         Reviewed by Geoffrey Garen.
749
750         Created local valueFPR and scratchFPR and filled them with valueOp.fpr() and scratch.fpr()
751         respectively so that if valueOp.fpr() causes a spill during allocation, it occurs before the
752         branch and also to follow convention.  Added register allocation checks to FPRTemporary.
753         Cleaned up a couple of other places to follow the "AllocatVirtualRegType foo, get machine
754         reg from foo" pattern.
755
756         * dfg/DFGSpeculativeJIT.cpp:
757         (JSC::DFG::SpeculativeJIT::compilePutByValForFloatTypedArray):
758         * dfg/DFGSpeculativeJIT.h:
759         (JSC::DFG::SpeculativeJIT::fprAllocate):
760         * dfg/DFGSpeculativeJIT32_64.cpp:
761         (JSC::DFG::SpeculativeJIT::convertToDouble):
762         (JSC::DFG::SpeculativeJIT::compile):
763         * dfg/DFGSpeculativeJIT64.cpp:
764         (JSC::DFG::SpeculativeJIT::compile):
765
766 2013-03-18  Filip Pizlo  <fpizlo@apple.com>
767
768         DFG should inline binary string concatenations (i.e. ValueAdd with string children)
769         https://bugs.webkit.org/show_bug.cgi?id=112599
770
771         Reviewed by Oliver Hunt.
772         
773         This does as advertised: if you do x + y where x and y are strings, you'll get
774         a fast inlined JSRopeString allocation (along with whatever checks are necessary).
775         It also does good things if either x or y (or both) are StringObjects, or some
776         other thing like StringOrStringObject. It also lays the groundwork for making this
777         fast if either x or y are numbers, or some other reasonably-cheap-to-convert
778         value.
779
780         * dfg/DFGAbstractState.cpp:
781         (JSC::DFG::AbstractState::executeEffects):
782         * dfg/DFGFixupPhase.cpp:
783         (JSC::DFG::FixupPhase::fixupNode):
784         (FixupPhase):
785         (JSC::DFG::FixupPhase::isStringObjectUse):
786         (JSC::DFG::FixupPhase::convertStringAddUse):
787         (JSC::DFG::FixupPhase::attemptToMakeFastStringAdd):
788         * dfg/DFGOperations.cpp:
789         * dfg/DFGOperations.h:
790         * dfg/DFGSpeculativeJIT.cpp:
791         (JSC::DFG::SpeculativeJIT::compileAdd):
792         * dfg/DFGSpeculativeJIT.h:
793         (JSC::DFG::SpeculativeJIT::callOperation):
794         (SpeculativeJIT):
795         (JSC::DFG::SpeculativeJIT::emitAllocateJSCell):
796         (JSC::DFG::SpeculativeJIT::emitAllocateJSObject):
797         * runtime/JSString.h:
798         (JSC::JSString::offsetOfFlags):
799         (JSString):
800         (JSRopeString):
801         (JSC::JSRopeString::offsetOfFibers):
802
803 2013-03-18  Filip Pizlo  <fpizlo@apple.com>
804
805         JSC_NATIVE_FUNCTION() takes an identifier for the name and then uses #name, which is unsafe if name was already #define'd to something else
806         https://bugs.webkit.org/show_bug.cgi?id=112639
807
808         Reviewed by Michael Saboff.
809         
810         Change it to take a string instead.
811
812         * runtime/JSObject.h:
813         (JSC):
814         * runtime/ObjectPrototype.cpp:
815         (JSC::ObjectPrototype::finishCreation):
816         * runtime/StringPrototype.cpp:
817         (JSC::StringPrototype::finishCreation):
818
819 2013-03-18  Brent Fulgham  <bfulgham@webkit.org>
820
821         [WinCairo] Get build working under VS2010.
822         https://bugs.webkit.org/show_bug.cgi?id=112604
823
824         Reviewed by Tim Horton.
825
826         * JavaScriptCore.vcxproj/testapi/testapi.vcxproj: Use CFLite-specific
827         build target (standard version links against CoreFoundation.lib
828         instead of CFLite.lib).
829         * JavaScriptCore.vcxproj/testapi/testapiCommonCFLite.props: Added.
830         * JavaScriptCore.vcxproj/testapi/testapiDebugCFLite.props: Added.
831         * JavaScriptCore.vcxproj/testapi/testapiReleaseCFLite.props: Added.
832
833 2013-03-18  Roger Fong  <roger_fong@apple.com>
834
835         AppleWin VS2010 Debug configuration build fix..
836
837         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
838
839 2013-03-18  Brent Fulgham  <bfulgham@webkit.org>
840
841         [WinCairo] Get build working under VS2010.
842         https://bugs.webkit.org/show_bug.cgi?id=112604
843
844         Reviewed by Tim Horton.
845
846         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Add build targets for
847         Debug_WinCairo and Release_WinCairo using CFLite.
848         * JavaScriptCore.vcxproj/JavaScriptCoreCFLite.props: Added.
849         * JavaScriptCore.vcxproj/JavaScriptCoreDebugCFLite.props: Added.
850         * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGenerator.vcxproj:
851         Add Debug_WinCairo and Release_WinCairo build targets to
852         make sure headers are copied to proper build folder.
853         * JavaScriptCore.vcxproj/JavaScriptCoreGenerated.vcxproj: Ditto.
854         * JavaScriptCore.vcxproj/JavaScriptCoreReleaseCFLite.props: Added.
855         * JavaScriptCore.vcxproj/LLInt/LLIntAssembly/LLIntAssembly.vcxproj:
856         Add Debug_WinCairo and Release_WinCairo build targets to
857         make sure headers are copied to proper build folder.
858         * JavaScriptCore.vcxproj/LLInt/LLIntDesiredOffsets/LLIntDesiredOffsets.vcxproj:
859         Ditto.
860         * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcxproj:
861         Ditto.
862         * JavaScriptCore.vcxproj/jsc/jsc.vcxproj: Ditto.
863         * JavaScriptCore.vcxproj/testRegExp/testRegExp.vcxproj: Ditto.
864         * JavaScriptCore.vcxproj/testapi/testapi.vcxproj: Ditto.
865
866 2013-03-18  Michael Saboff  <msaboff@apple.com>
867
868         Potentially unsafe register allocations in DFG code generation
869         https://bugs.webkit.org/show_bug.cgi?id=112477
870
871         Reviewed by Geoffrey Garen.
872
873         Moved allocation of temporary GPRs to be before any generated branches in the functions below.
874
875         * dfg/DFGSpeculativeJIT32_64.cpp:
876         (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality):
877         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality):
878         (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot):
879         * dfg/DFGSpeculativeJIT64.cpp:
880         (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality):
881         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality):
882         (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot):
883
884 2013-03-15  Filip Pizlo  <fpizlo@apple.com>
885
886         DFG string conversions and allocations should be inlined
887         https://bugs.webkit.org/show_bug.cgi?id=112376
888
889         Reviewed by Geoffrey Garen.
890         
891         This turns new String(), String(), String.prototype.valueOf(), and
892         String.prototype.toString() into intrinsics. It gives the DFG the ability to handle
893         conversions from StringObject to JSString and vice-versa, and also gives it the
894         ability to handle cases where a variable may be either a StringObject or a JSString.
895         To do this, I added StringObject to value profiling (and removed the stale
896         distinction between Myarguments and Foreignarguments). I also cleaned up ToPrimitive
897         handling, using some of the new functionality but also taking advantage of the
898         existence of Identity(String:@a).
899         
900         This is a 2% SunSpider speed-up. Also there are some speed-ups on V8v7 and Kraken.
901         On microbenchmarks that stress new String() this is a 14x speed-up.
902
903         * CMakeLists.txt:
904         * DerivedSources.make:
905         * DerivedSources.pri:
906         * GNUmakefile.list.am:
907         * bytecode/CodeBlock.h:
908         (CodeBlock):
909         (JSC::CodeBlock::hasExitSite):
910         (JSC):
911         * bytecode/DFGExitProfile.cpp:
912         (JSC::DFG::ExitProfile::hasExitSite):
913         (DFG):
914         * bytecode/DFGExitProfile.h:
915         (ExitProfile):
916         (JSC::DFG::ExitProfile::hasExitSite):
917         * bytecode/ExitKind.cpp:
918         (JSC::exitKindToString):
919         * bytecode/ExitKind.h:
920         * bytecode/SpeculatedType.cpp:
921         (JSC::dumpSpeculation):
922         (JSC::speculationToAbbreviatedString):
923         (JSC::speculationFromClassInfo):
924         * bytecode/SpeculatedType.h:
925         (JSC):
926         (JSC::isStringObjectSpeculation):
927         (JSC::isStringOrStringObjectSpeculation):
928         * create_hash_table:
929         * dfg/DFGAbstractState.cpp:
930         (JSC::DFG::AbstractState::executeEffects):
931         * dfg/DFGAbstractState.h:
932         (JSC::DFG::AbstractState::filterEdgeByUse):
933         * dfg/DFGByteCodeParser.cpp:
934         (ByteCodeParser):
935         (JSC::DFG::ByteCodeParser::handleCall):
936         (JSC::DFG::ByteCodeParser::emitArgumentPhantoms):
937         (DFG):
938         (JSC::DFG::ByteCodeParser::handleConstantInternalFunction):
939         * dfg/DFGCSEPhase.cpp:
940         (JSC::DFG::CSEPhase::putStructureStoreElimination):
941         * dfg/DFGEdge.h:
942         (JSC::DFG::Edge::shift):
943         * dfg/DFGFixupPhase.cpp:
944         (JSC::DFG::FixupPhase::fixupNode):
945         (JSC::DFG::FixupPhase::isStringPrototypeMethodSane):
946         (FixupPhase):
947         (JSC::DFG::FixupPhase::canOptimizeStringObjectAccess):
948         (JSC::DFG::FixupPhase::observeUseKindOnNode):
949         * dfg/DFGGraph.h:
950         (JSC::DFG::Graph::hasGlobalExitSite):
951         (Graph):
952         (JSC::DFG::Graph::hasExitSite):
953         (JSC::DFG::Graph::clobbersWorld):
954         * dfg/DFGNode.h:
955         (JSC::DFG::Node::convertToToString):
956         (Node):
957         (JSC::DFG::Node::hasStructure):
958         (JSC::DFG::Node::shouldSpeculateStringObject):
959         (JSC::DFG::Node::shouldSpeculateStringOrStringObject):
960         * dfg/DFGNodeType.h:
961         (DFG):
962         * dfg/DFGOperations.cpp:
963         * dfg/DFGOperations.h:
964         * dfg/DFGPredictionPropagationPhase.cpp:
965         (JSC::DFG::PredictionPropagationPhase::propagate):
966         * dfg/DFGSpeculativeJIT.cpp:
967         (JSC::DFG::SpeculativeJIT::compileToStringOnCell):
968         (DFG):
969         (JSC::DFG::SpeculativeJIT::compileNewStringObject):
970         (JSC::DFG::SpeculativeJIT::speculateObject):
971         (JSC::DFG::SpeculativeJIT::speculateObjectOrOther):
972         (JSC::DFG::SpeculativeJIT::speculateString):
973         (JSC::DFG::SpeculativeJIT::speculateStringObject):
974         (JSC::DFG::SpeculativeJIT::speculateStringOrStringObject):
975         (JSC::DFG::SpeculativeJIT::speculate):
976         * dfg/DFGSpeculativeJIT.h:
977         (JSC::DFG::SpeculativeJIT::callOperation):
978         (SpeculativeJIT):
979         (JSC::DFG::SpeculateCellOperand::SpeculateCellOperand):
980         (DFG):
981         (JSC::DFG::SpeculativeJIT::speculateStringObjectForStructure):
982         * dfg/DFGSpeculativeJIT32_64.cpp:
983         (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
984         (JSC::DFG::SpeculativeJIT::compile):
985         * dfg/DFGSpeculativeJIT64.cpp:
986         (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
987         (JSC::DFG::SpeculativeJIT::compile):
988         * dfg/DFGUseKind.cpp:
989         (WTF::printInternal):
990         * dfg/DFGUseKind.h:
991         (JSC::DFG::typeFilterFor):
992         * interpreter/CallFrame.h:
993         (JSC::ExecState::regExpPrototypeTable):
994         * runtime/CommonIdentifiers.h:
995         * runtime/Intrinsic.h:
996         * runtime/JSDestructibleObject.h:
997         (JSDestructibleObject):
998         (JSC::JSDestructibleObject::classInfoOffset):
999         * runtime/JSGlobalData.cpp:
1000         (JSC):
1001         (JSC::JSGlobalData::JSGlobalData):
1002         (JSC::JSGlobalData::~JSGlobalData):
1003         * runtime/JSGlobalData.h:
1004         (JSGlobalData):
1005         * runtime/JSObject.cpp:
1006         * runtime/JSObject.h:
1007         (JSC):
1008         * runtime/JSWrapperObject.h:
1009         (JSC::JSWrapperObject::allocationSize):
1010         (JSWrapperObject):
1011         (JSC::JSWrapperObject::internalValueOffset):
1012         (JSC::JSWrapperObject::internalValueCellOffset):
1013         * runtime/StringPrototype.cpp:
1014         (JSC):
1015         (JSC::StringPrototype::finishCreation):
1016         (JSC::StringPrototype::create):
1017         * runtime/StringPrototype.h:
1018         (StringPrototype):
1019
1020 2013-03-18  Filip Pizlo  <fpizlo@apple.com>
1021
1022         ObjectPrototype properties should be eagerly created rather than lazily via static tables
1023         https://bugs.webkit.org/show_bug.cgi?id=112539
1024
1025         Reviewed by Oliver Hunt.
1026         
1027         This is the first part of https://bugs.webkit.org/show_bug.cgi?id=112233. Rolling this
1028         in first since it's the less-likely-to-be-broken part.
1029
1030         * CMakeLists.txt:
1031         * DerivedSources.make:
1032         * DerivedSources.pri:
1033         * GNUmakefile.list.am:
1034         * interpreter/CallFrame.h:
1035         (JSC::ExecState::objectConstructorTable):
1036         * runtime/CommonIdentifiers.h:
1037         * runtime/JSGlobalData.cpp:
1038         (JSC):
1039         (JSC::JSGlobalData::JSGlobalData):
1040         (JSC::JSGlobalData::~JSGlobalData):
1041         * runtime/JSGlobalData.h:
1042         (JSGlobalData):
1043         * runtime/JSObject.cpp:
1044         (JSC::JSObject::putDirectNativeFunction):
1045         (JSC):
1046         * runtime/JSObject.h:
1047         (JSObject):
1048         (JSC):
1049         * runtime/Lookup.cpp:
1050         (JSC::setUpStaticFunctionSlot):
1051         * runtime/ObjectPrototype.cpp:
1052         (JSC):
1053         (JSC::ObjectPrototype::finishCreation):
1054         (JSC::ObjectPrototype::create):
1055         * runtime/ObjectPrototype.h:
1056         (ObjectPrototype):
1057
1058 2013-03-16  Pratik Solanki  <psolanki@apple.com>
1059
1060         Disable High DPI Canvas on iOS
1061         https://bugs.webkit.org/show_bug.cgi?id=112511
1062
1063         Reviewed by Joseph Pecoraro.
1064
1065         * Configurations/FeatureDefines.xcconfig:
1066
1067 2013-03-15  Andreas Kling  <akling@apple.com>
1068
1069         Don't also clone StructureRareData when cloning Structure.
1070         <http://webkit.org/b/111672>
1071
1072         Reviewed by Mark Hahnenberg.
1073
1074         We were cloning a lot of StructureRareData with only the previousID pointer set since
1075         the enumerationCache is not shared between clones.
1076
1077         Let the Structure copy constructor decide whether it wants to clone the rare data.
1078         The decision is made by StructureRareData::needsCloning() and will currently always
1079         return false, since StructureRareData only holds on to caches at present.
1080         This may change in the future as more members are added to StructureRareData.
1081
1082         * runtime/Structure.cpp:
1083         (JSC::Structure::Structure):
1084         (JSC::Structure::cloneRareDataFrom):
1085         * runtime/StructureInlines.h:
1086         (JSC::Structure::create):
1087
1088 2013-03-15  Mark Hahnenberg  <mhahnenberg@apple.com>
1089
1090         Roll out r145838
1091         https://bugs.webkit.org/show_bug.cgi?id=112458
1092
1093         Unreviewed. Requested by Filip Pizlo.
1094
1095         * CMakeLists.txt:
1096         * DerivedSources.make:
1097         * DerivedSources.pri:
1098         * GNUmakefile.list.am:
1099         * dfg/DFGOperations.cpp:
1100         * interpreter/CallFrame.h:
1101         (JSC::ExecState::objectPrototypeTable):
1102         * jit/JITStubs.cpp:
1103         (JSC::getByVal):
1104         * llint/LLIntSlowPaths.cpp:
1105         (JSC::LLInt::getByVal):
1106         * runtime/CommonIdentifiers.h:
1107         * runtime/JSCell.cpp:
1108         (JSC):
1109         * runtime/JSCell.h:
1110         (JSCell):
1111         * runtime/JSCellInlines.h:
1112         (JSC):
1113         (JSC::JSCell::fastGetOwnProperty):
1114         * runtime/JSGlobalData.cpp:
1115         (JSC):
1116         (JSC::JSGlobalData::JSGlobalData):
1117         (JSC::JSGlobalData::~JSGlobalData):
1118         * runtime/JSGlobalData.h:
1119         (JSGlobalData):
1120         * runtime/JSObject.cpp:
1121         (JSC):
1122         * runtime/JSObject.h:
1123         (JSObject):
1124         (JSC):
1125         * runtime/Lookup.cpp:
1126         (JSC::setUpStaticFunctionSlot):
1127         * runtime/ObjectPrototype.cpp:
1128         (JSC):
1129         (JSC::ObjectPrototype::finishCreation):
1130         (JSC::ObjectPrototype::getOwnPropertySlot):
1131         (JSC::ObjectPrototype::getOwnPropertyDescriptor):
1132         * runtime/ObjectPrototype.h:
1133         (JSC::ObjectPrototype::create):
1134         (ObjectPrototype):
1135         * runtime/PropertyMapHashTable.h:
1136         (JSC::PropertyTable::findWithString):
1137         * runtime/Structure.h:
1138         (Structure):
1139         * runtime/StructureInlines.h:
1140         (JSC::Structure::get):
1141
1142 2013-03-15  Michael Saboff  <msaboff@apple.com>
1143
1144         Cleanup of DFG and Baseline JIT debugging code
1145         https://bugs.webkit.org/show_bug.cgi?id=111871
1146
1147         Reviewed by Geoffrey Garen.
1148
1149         Fixed various debug related issue in baseline and DFG JITs. See below.
1150
1151         * dfg/DFGRepatch.cpp:
1152         (JSC::DFG::dfgLinkClosureCall): Used pointerDump() to handle when calleeCodeBlock is NULL.
1153         * dfg/DFGScratchRegisterAllocator.h: Now use ScratchBuffer::activeLengthPtr() to get
1154         pointer to scratch register length.
1155         (JSC::DFG::ScratchRegisterAllocator::preserveUsedRegistersToScratchBuffer):
1156         (JSC::DFG::ScratchRegisterAllocator::restoreUsedRegistersFromScratchBuffer):
1157         * dfg/DFGSpeculativeJIT.cpp:
1158         (JSC::DFG::SpeculativeJIT::checkConsistency): Added missing case labels for DataFormatOSRMarker,
1159         DataFormatDead, and DataFormatArguments and made them RELEASE_ASSERT_NOT_REACHED();
1160         * jit/JITCall.cpp:
1161         (JSC::JIT::privateCompileClosureCall): Used pointerDump() to handle when calleeCodeBlock is NULL.
1162         * jit/JITCall32_64.cpp:
1163         (JSC::JIT::privateCompileClosureCall): Used pointerDump() to handle when calleeCodeBlock is NULL.
1164         * runtime/JSGlobalData.h:
1165         (JSC::ScratchBuffer::ScratchBuffer): Fixed buffer allocation alignment to
1166         be on a double boundary.
1167         (JSC::ScratchBuffer::setActiveLength):
1168         (JSC::ScratchBuffer::activeLength):
1169         (JSC::ScratchBuffer::activeLengthPtr):
1170
1171 2013-03-15  Michael Saboff  <msaboff@apple.com>
1172
1173         Add runtime check for improper register allocations in DFG
1174         https://bugs.webkit.org/show_bug.cgi?id=112380
1175
1176         Reviewed by Geoffrey Garen.
1177
1178         Added framework to check for register allocation within a branch source - target range.  All register allocations
1179         are saved using the offset in the code stream where the allocation occurred.  Later when a jump is linked, the
1180         currently saved register allocations are checked to make sure that they didn't occur in the range of code that was
1181         jumped over.  This protects against the case where an allocation could have spilled register contents to free up 
1182         a register and that spill only occurs on one path of a many through the code.  A subsequent fill of the spilled
1183         register may load garbage.  See https://bugs.webkit.org/show_bug.cgi?id=111777 for one such bug.
1184         This code is protected by the compile time check of #if ENABLE(DFG_REGISTER_ALLOCATION_VALIDATION).
1185         The check is only done during the processing of SpeculativeJIT::compile(Node* node) and its callees.
1186  
1187         * assembler/AbstractMacroAssembler.h:
1188         (JSC::AbstractMacroAssembler::Jump::link): Invoke register allocation checks using source and target of link.
1189         (JSC::AbstractMacroAssembler::Jump::linkTo): Invoke register allocation checks using source and target of link.
1190         (AbstractMacroAssembler):
1191         (RegisterAllocationOffset): New helper class to store the instruction stream offset and compare against a 
1192         jump range.
1193         (JSC::AbstractMacroAssembler::RegisterAllocationOffset::RegisterAllocationOffset):
1194         (JSC::AbstractMacroAssembler::RegisterAllocationOffset::check):
1195         (JSC::AbstractMacroAssembler::addRegisterAllocationAtOffset):
1196         (JSC::AbstractMacroAssembler::clearRegisterAllocationOffsets): 
1197         (JSC::AbstractMacroAssembler::checkRegisterAllocationAgainstBranchRange):
1198         * dfg/DFGSpeculativeJIT.h:
1199         (JSC::DFG::SpeculativeJIT::allocate):
1200         * dfg/DFGSpeculativeJIT32_64.cpp:
1201         (JSC::DFG::SpeculativeJIT::compile):
1202         * dfg/DFGSpeculativeJIT64.cpp:
1203         (JSC::DFG::SpeculativeJIT::compile):
1204
1205 2013-03-14  Oliver Hunt  <oliver@apple.com>
1206
1207         REGRESSION(r145000): Crash loading arstechnica.com when Safari Web Inspector is open
1208         https://bugs.webkit.org/show_bug.cgi?id=111868
1209
1210         Reviewed by Antti Koivisto.
1211
1212         Don't allow non-local property lookup when the debugger is enabled.
1213
1214         * bytecompiler/BytecodeGenerator.cpp:
1215         (JSC::BytecodeGenerator::resolve):
1216
1217 2013-03-11  Mark Hahnenberg  <mhahnenberg@apple.com>
1218
1219         Objective-C API: Objective-C functions exposed to JavaScript have the wrong type (object instead of function)
1220         https://bugs.webkit.org/show_bug.cgi?id=105892
1221
1222         Reviewed by Geoffrey Garen.
1223
1224         Changed ObjCCallbackFunction to subclass JSCallbackFunction which already has all of the machinery to call
1225         functions using the C API. Since ObjCCallbackFunction is now a JSCell, we changed the old implementation of
1226         ObjCCallbackFunction to be the internal implementation and keep track of all the proper data so that we 
1227         don't have to put all of that in the header, which will now be included from C++ files (e.g. JSGlobalObject.cpp).
1228
1229         * API/JSCallbackFunction.cpp: Change JSCallbackFunction to allow subclassing. Originally it was internally
1230         passing its own Structure up the chain of constructors, but we now want to be able to pass other Structures as well.
1231         (JSC::JSCallbackFunction::JSCallbackFunction):
1232         (JSC::JSCallbackFunction::create):
1233         * API/JSCallbackFunction.h:
1234         (JSCallbackFunction):
1235         * API/JSWrapperMap.mm: Changed interface to tryUnwrapBlock.
1236         (tryUnwrapObjcObject):
1237         * API/ObjCCallbackFunction.h:
1238         (ObjCCallbackFunction): Moved into the JSC namespace, just like JSCallbackFunction.
1239         (JSC::ObjCCallbackFunction::createStructure): Overridden so that the correct ClassInfo gets used since we have 
1240         a destructor.
1241         (JSC::ObjCCallbackFunction::impl): Getter for the internal impl.
1242         * API/ObjCCallbackFunction.mm:
1243         (JSC::ObjCCallbackFunctionImpl::ObjCCallbackFunctionImpl): What used to be ObjCCallbackFunction is now 
1244         ObjCCallbackFunctionImpl. It handles the Objective-C specific parts of managing callback functions.
1245         (JSC::ObjCCallbackFunctionImpl::~ObjCCallbackFunctionImpl):
1246         (JSC::objCCallbackFunctionCallAsFunction): Same as the old one, but now it casts to ObjCCallbackFunction and grabs the impl 
1247         rather than using JSObjectGetPrivate.
1248         (JSC::ObjCCallbackFunction::ObjCCallbackFunction): New bits to allow being part of the JSCell hierarchy.
1249         (JSC::ObjCCallbackFunction::create):
1250         (JSC::ObjCCallbackFunction::destroy):
1251         (JSC::ObjCCallbackFunctionImpl::call): Handles the actual invocation, just like it used to.
1252         (objCCallbackFunctionForInvocation):
1253         (tryUnwrapBlock): Changed to check the ClassInfo for inheritance directly, rather than going through the C API call.
1254         * API/tests/testapi.mm: Added new test to make sure that doing Function.prototype.toString.call(f) won't result in 
1255         an error when f is an Objective-C method or block underneath the covers.
1256         * runtime/JSGlobalObject.cpp: Added new Structure for ObjCCallbackFunction.
1257         (JSC::JSGlobalObject::reset):
1258         (JSC::JSGlobalObject::visitChildren):
1259         * runtime/JSGlobalObject.h:
1260         (JSGlobalObject):
1261         (JSC::JSGlobalObject::objcCallbackFunctionStructure):
1262
1263 2013-03-14  Mark Hahnenberg  <mhahnenberg@apple.com>
1264
1265         Objective-C API: Nested dictionaries are not converted properly in the Objective-C binding
1266         https://bugs.webkit.org/show_bug.cgi?id=112377
1267
1268         Reviewed by Oliver Hunt.
1269
1270         Accidental reassignment of the root task in the container conversion logic was causing the last 
1271         array or dictionary processed to be returned in the case of nested containers.
1272
1273         * API/JSValue.mm:
1274         (containerValueToObject):
1275         * API/tests/testapi.mm:
1276
1277 2013-03-13  Filip Pizlo  <fpizlo@apple.com>
1278
1279         JSObject fast by-string access optimizations should work even on the prototype chain, and even when the result is undefined
1280         https://bugs.webkit.org/show_bug.cgi?id=112233
1281
1282         Reviewed by Oliver Hunt.
1283         
1284         Extended the existing fast access path for String keys to work over the entire prototype chain,
1285         not just the self access case. This will fail as soon as it sees an object that intercepts
1286         getOwnPropertySlot, so this patch also ensures that ObjectPrototype does not fall into that
1287         category. This is accomplished by making ObjectPrototype eagerly reify all of its properties.
1288         This is safe for ObjectPrototype because it's so common and we expect all of its properties to
1289         be reified for any interesting programs anyway. A new idiom for adding native functions to
1290         prototypes is introduced, which ought to work well for any other prototypes that we wish to do
1291         this conversion for.
1292         
1293         This is a >60% speed-up in the case that you frequently do by-string lookups that "miss", i.e.
1294         they don't turn up anything.
1295
1296         * CMakeLists.txt:
1297         * DerivedSources.make:
1298         * DerivedSources.pri:
1299         * GNUmakefile.list.am:
1300         * dfg/DFGOperations.cpp:
1301         * interpreter/CallFrame.h:
1302         (JSC::ExecState::objectConstructorTable):
1303         * jit/JITStubs.cpp:
1304         (JSC::getByVal):
1305         * llint/LLIntSlowPaths.cpp:
1306         (JSC::LLInt::getByVal):
1307         * runtime/CommonIdentifiers.h:
1308         * runtime/JSCell.cpp:
1309         (JSC::JSCell::getByStringSlow):
1310         (JSC):
1311         * runtime/JSCell.h:
1312         (JSCell):
1313         * runtime/JSCellInlines.h:
1314         (JSC):
1315         (JSC::JSCell::getByStringAndKey):
1316         (JSC::JSCell::getByString):
1317         * runtime/JSGlobalData.cpp:
1318         (JSC):
1319         (JSC::JSGlobalData::JSGlobalData):
1320         (JSC::JSGlobalData::~JSGlobalData):
1321         * runtime/JSGlobalData.h:
1322         (JSGlobalData):
1323         * runtime/JSObject.cpp:
1324         (JSC::JSObject::putDirectNativeFunction):
1325         (JSC):
1326         * runtime/JSObject.h:
1327         (JSObject):
1328         (JSC):
1329         * runtime/Lookup.cpp:
1330         (JSC::setUpStaticFunctionSlot):
1331         * runtime/ObjectPrototype.cpp:
1332         (JSC):
1333         (JSC::ObjectPrototype::finishCreation):
1334         (JSC::ObjectPrototype::create):
1335         * runtime/ObjectPrototype.h:
1336         (ObjectPrototype):
1337         * runtime/PropertyMapHashTable.h:
1338         (JSC::PropertyTable::findWithString):
1339         * runtime/Structure.h:
1340         (Structure):
1341         * runtime/StructureInlines.h:
1342         (JSC::Structure::get):
1343         (JSC):
1344
1345 2013-03-13  Filip Pizlo  <fpizlo@apple.com>
1346
1347         DFG bytecode parser is too aggressive about getting rid of GetLocals on captured variables
1348         https://bugs.webkit.org/show_bug.cgi?id=112287
1349         <rdar://problem/13342340>
1350
1351         Reviewed by Oliver Hunt.
1352
1353         * bytecode/CodeBlock.cpp:
1354         (JSC::CodeBlock::dumpBytecode):
1355         (JSC::CodeBlock::finalizeUnconditionally):
1356         * dfg/DFGByteCodeParser.cpp:
1357         (JSC::DFG::ByteCodeParser::getLocal):
1358
1359 2013-03-13  Ryosuke Niwa  <rniwa@webkit.org>
1360
1361         Threaded HTML Parser is missing feature define flags in all but Chromium port's build files
1362         https://bugs.webkit.org/show_bug.cgi?id=112277
1363
1364         Reviewed by Adam Barth.
1365
1366         * Configurations/FeatureDefines.xcconfig:
1367
1368 2013-03-13  Csaba Osztrogonác  <ossy@webkit.org>
1369
1370         LLINT C loop warning fix for GCC
1371         https://bugs.webkit.org/show_bug.cgi?id=112145
1372
1373         Reviewed by Filip Pizlo.
1374
1375         * llint/LowLevelInterpreter.cpp:
1376         (JSC::CLoop::execute):
1377
1378 2013-02-13  Simon Hausmann  <simon.hausmann@digia.com>
1379
1380         Add support for convenient conversion from JSStringRef to QString
1381         https://bugs.webkit.org/show_bug.cgi?id=109694
1382
1383         Reviewed by Allan Sandfeld Jensen.
1384
1385         Add JSStringCopyQString helper function that allows for the convenient
1386         extraction of a QString out of a JSStringRef.
1387
1388         * API/JSStringRefQt.cpp: Added.
1389         (JSStringCopyQString):
1390         * API/JSStringRefQt.h: Added.
1391         * API/OpaqueJSString.h:
1392         (OpaqueJSString):
1393         (OpaqueJSString::qString):
1394         (OpaqueJSString::OpaqueJSString):
1395         * Target.pri:
1396
1397 2013-03-13  Peter Gal  <galpeter@inf.u-szeged.hu>
1398
1399         Token 'not' is ignored in the offlineasm.
1400         https://bugs.webkit.org/show_bug.cgi?id=111568
1401
1402         Reviewed by Filip Pizlo.
1403
1404         * offlineasm/parser.rb: Build the Not AST node if the 'not' token is found.
1405
1406 2013-03-12  Tim Horton  <timothy_horton@apple.com>
1407
1408         WTF uses macros for exports. Try to fix the Windows build. Unreviewed.
1409
1410         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def:
1411         * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in:
1412
1413 2013-03-12  Filip Pizlo  <fpizlo@apple.com>
1414
1415         Array.prototype.sort should at least try to be PTIME even when the array is in some bizarre mode
1416         https://bugs.webkit.org/show_bug.cgi?id=112187
1417         <rdar://problem/13393550>
1418
1419         Reviewed by Michael Saboff and Gavin Barraclough.
1420         
1421         If we have an array-like object in crazy mode passed into Array.prototype.sort, and its length is large,
1422         then first copy all elements into a separate, compact, un-holy array and sort that. Then copy back.
1423         This means that sorting will be at worst O(n^2) in the actual number of things in the array, rather than
1424         O(n^2) in the array's length.
1425
1426         * runtime/ArrayPrototype.cpp:
1427         (JSC::attemptFastSort):
1428         (JSC::performSlowSort):
1429         (JSC):
1430         (JSC::arrayProtoFuncSort):
1431
1432 2013-03-12  Tim Horton  <timothy_horton@apple.com>
1433
1434         Try to fix the Windows build.
1435
1436         Not reviewed.
1437
1438         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def:
1439
1440 2013-03-12  Geoffrey Garen  <ggaren@apple.com>
1441
1442         Try to fix the Windows build.
1443
1444         Not reviewed.
1445
1446         * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in:
1447         Export a thing.
1448
1449 2013-03-11  Oliver Hunt  <oliver@apple.com>
1450
1451         Harden JSStringJoiner
1452         https://bugs.webkit.org/show_bug.cgi?id=112093
1453
1454         Reviewed by Filip Pizlo.
1455
1456         Harden JSStringJoiner, make it use our CheckedArithmetic
1457         class to simplify everything.
1458
1459         * runtime/JSStringJoiner.cpp:
1460         (JSC::JSStringJoiner::build):
1461         * runtime/JSStringJoiner.h:
1462         (JSStringJoiner):
1463         (JSC::JSStringJoiner::JSStringJoiner):
1464         (JSC::JSStringJoiner::append):
1465
1466 2013-03-12  Filip Pizlo  <fpizlo@apple.com>
1467
1468         DFG generic array access cases should not be guarded by CheckStructure even of the profiling tells us that it could be
1469         https://bugs.webkit.org/show_bug.cgi?id=112183
1470
1471         Reviewed by Oliver Hunt.
1472         
1473         Slight speed-up on string-unpack-code.
1474
1475         * dfg/DFGFixupPhase.cpp:
1476         (JSC::DFG::FixupPhase::findAndRemoveUnnecessaryStructureCheck):
1477         (FixupPhase):
1478         (JSC::DFG::FixupPhase::checkArray):
1479         (JSC::DFG::FixupPhase::blessArrayOperation):
1480
1481 2013-03-12  Gabor Rapcsanyi  <rgabor@webkit.org>
1482
1483         https://bugs.webkit.org/show_bug.cgi?id=112141
1484         LLInt CLoop backend misses Double2Ints() on 32bit architectures
1485
1486         Reviewed by Filip Pizlo.
1487
1488         Implement Double2Ints() in CLoop backend of LLInt on 32bit architectures.
1489
1490         * llint/LowLevelInterpreter.cpp:
1491         (LLInt):
1492         (JSC::LLInt::Double2Ints):
1493         * offlineasm/cloop.rb:
1494
1495 2013-03-12  Gabor Rapcsanyi  <rgabor@webkit.org>
1496
1497         Making more sophisticated cache flush on ARM Linux platform
1498         https://bugs.webkit.org/show_bug.cgi?id=111854
1499
1500         Reviewed by Zoltan Herczeg.
1501
1502         The cache flush on ARM Linux invalidates whole pages
1503         instead of just the required area.
1504
1505         * assembler/ARMAssembler.h:
1506         (ARMAssembler):
1507         (JSC::ARMAssembler::linuxPageFlush):
1508         (JSC::ARMAssembler::cacheFlush):
1509         * assembler/ARMv7Assembler.h:
1510         (ARMv7Assembler):
1511         (JSC::ARMv7Assembler::linuxPageFlush):
1512         (JSC::ARMv7Assembler::cacheFlush):
1513
1514 2013-03-12  Gabor Rapcsanyi  <rgabor@webkit.org>
1515
1516         Renaming the armv7.rb LLINT backend to arm.rb
1517         https://bugs.webkit.org/show_bug.cgi?id=110565
1518
1519         Reviewed by Zoltan Herczeg.
1520
1521         This is the first step of a unified ARM backend for
1522         all ARM 32 bit architectures in LLInt.
1523
1524         * CMakeLists.txt:
1525         * GNUmakefile.list.am:
1526         * JavaScriptCore.gypi:
1527         * LLIntOffsetsExtractor.pro:
1528         * offlineasm/arm.rb: Copied from Source/JavaScriptCore/offlineasm/armv7.rb.
1529         * offlineasm/armv7.rb: Removed.
1530         * offlineasm/backends.rb:
1531         * offlineasm/risc.rb:
1532
1533 2013-03-12  Csaba Osztrogonác  <ossy@webkit.org>
1534
1535         REGRESSION(r145482): It broke 33 jsc tests and zillion layout tests on all platform
1536         https://bugs.webkit.org/show_bug.cgi?id=112112
1537
1538         Reviewed by Oliver Hunt.
1539
1540         Rolling out https://trac.webkit.org/changeset/145482 to unbreak the bots.
1541
1542         * runtime/JSStringJoiner.cpp:
1543         (JSC::JSStringJoiner::build):
1544         * runtime/JSStringJoiner.h:
1545         (JSStringJoiner):
1546         (JSC::JSStringJoiner::JSStringJoiner):
1547         (JSC::JSStringJoiner::append):
1548
1549 2013-03-12  Filip Pizlo  <fpizlo@apple.com>
1550
1551         DFG prediction propagation phase should not rerun forward propagation if double voting has already converged
1552         https://bugs.webkit.org/show_bug.cgi?id=111920
1553
1554         Reviewed by Oliver Hunt.
1555         
1556         I don't know why we weren't exiting early after double voting if !m_changed.
1557         
1558         This change also removes backwards propagation from the voting fixpoint, since at that
1559         point short-circuiting loops is probably not particularly profitable. Profiling shows
1560         that this reduces the time spent in prediction propagation even further.
1561         
1562         This change appears to be a 1% SunSpider speed-up.
1563
1564         * dfg/DFGPredictionPropagationPhase.cpp:
1565         (JSC::DFG::PredictionPropagationPhase::run):
1566
1567 2013-03-11  Filip Pizlo  <fpizlo@apple.com>
1568
1569         DFG overflow check elimination is too smart for its own good
1570         https://bugs.webkit.org/show_bug.cgi?id=111832
1571
1572         Reviewed by Oliver Hunt and Gavin Barraclough.
1573         
1574         Rolling this back in after fixing accidental misuse of JSValue. The code was doing value < someInt
1575         rather than value.asInt32() < someInt. This "worked" when isWithinPowerOfTwo wasn't templatized.
1576         It worked by always being false and always disabling the relvant optimization.
1577         
1578         This improves overflow check elimination in three ways:
1579         
1580         1) It reduces the amount of time the compiler will spend doing it.
1581         
1582         2) It fixes bugs where overflow check elimination was overzealous. Precisely, for a binary operation
1583            over @a and @b where both @a and @b will type check that their inputs (@a->children, @b->children)
1584            are int32's and then perform a possibly-overflowing operation, we must be careful not to assume
1585            that @a's non-int32 parts don't matter if at the point that @a runs we have as yet not proved that
1586            @b->children are int32's and that hence @b might produce a large enough result that doubles would
1587            start chopping low bits. The specific implication of this is that for a binary operation to not
1588            propagate that it cares about non-int32 parts (NodeUsedAsNumber), we must prove that at least one
1589            of the inputs is guaranteed to produce a result within 2^32 and that there won't be a tower of such
1590            operations large enough to ultimately produce a double greater than 2^52 (roughly). We achieve the
1591            latter by disabling this optimization for very large basic blocks. It's noteworthy that blocks that
1592            large won't even make it into the DFG currently.
1593         
1594         3) It makes the overflow check elimination more precise for cases where the inputs to an Add or Sub
1595            are the outputs of a bit-op. For example in (@a + (@b | 0)) | 0, we don't need to propagate
1596            NodeUsedAsNumber to either @a or @b.
1597         
1598         This is neutral on V8v7 and a slight speed-up on compile time benchmarks.
1599
1600         * CMakeLists.txt:
1601         * GNUmakefile.list.am:
1602         * JavaScriptCore.xcodeproj/project.pbxproj:
1603         * Target.pri:
1604         * dfg/DFGArrayMode.cpp:
1605         (JSC::DFG::ArrayMode::refine):
1606         * dfg/DFGBackwardsPropagationPhase.cpp: Added.
1607         (DFG):
1608         (BackwardsPropagationPhase):
1609         (JSC::DFG::BackwardsPropagationPhase::BackwardsPropagationPhase):
1610         (JSC::DFG::BackwardsPropagationPhase::run):
1611         (JSC::DFG::BackwardsPropagationPhase::isNotNegZero):
1612         (JSC::DFG::BackwardsPropagationPhase::isNotZero):
1613         (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwoForConstant):
1614         (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwoNonRecursive):
1615         (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwo):
1616         (JSC::DFG::BackwardsPropagationPhase::mergeDefaultFlags):
1617         (JSC::DFG::BackwardsPropagationPhase::propagate):
1618         (JSC::DFG::performBackwardsPropagation):
1619         * dfg/DFGBackwardsPropagationPhase.h: Added.
1620         (DFG):
1621         * dfg/DFGCPSRethreadingPhase.cpp:
1622         (JSC::DFG::CPSRethreadingPhase::run):
1623         (JSC::DFG::CPSRethreadingPhase::clearIsLoadedFrom):
1624         (CPSRethreadingPhase):
1625         (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor):
1626         (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor):
1627         * dfg/DFGDriver.cpp:
1628         (JSC::DFG::compile):
1629         * dfg/DFGGraph.cpp:
1630         (JSC::DFG::Graph::dump):
1631         * dfg/DFGNodeFlags.cpp:
1632         (JSC::DFG::dumpNodeFlags):
1633         (DFG):
1634         * dfg/DFGNodeFlags.h:
1635         (DFG):
1636         * dfg/DFGPredictionPropagationPhase.cpp:
1637         (PredictionPropagationPhase):
1638         (JSC::DFG::PredictionPropagationPhase::propagate):
1639         * dfg/DFGUnificationPhase.cpp:
1640         (JSC::DFG::UnificationPhase::run):
1641         * dfg/DFGVariableAccessData.h:
1642         (JSC::DFG::VariableAccessData::VariableAccessData):
1643         (JSC::DFG::VariableAccessData::mergeIsLoadedFrom):
1644         (VariableAccessData):
1645         (JSC::DFG::VariableAccessData::setIsLoadedFrom):
1646         (JSC::DFG::VariableAccessData::isLoadedFrom):
1647
1648 2013-03-11  Oliver Hunt  <oliver@apple.com>
1649
1650         Harden JSStringJoiner
1651         https://bugs.webkit.org/show_bug.cgi?id=112093
1652
1653         Reviewed by Filip Pizlo.
1654
1655         Harden JSStringJoiner, make it use our CheckedArithmetic
1656         class to simplify everything.
1657
1658         * runtime/JSStringJoiner.cpp:
1659         (JSC::JSStringJoiner::build):
1660         * runtime/JSStringJoiner.h:
1661         (JSStringJoiner):
1662         (JSC::JSStringJoiner::JSStringJoiner):
1663         (JSC::JSStringJoiner::append):
1664
1665 2013-03-11  Michael Saboff  <msaboff@apple.com>
1666
1667         Crash beneath operationCreateInlinedArguments running fast/js/dfg-create-inlined-arguments-in-closure-inline.html (32-bit only)
1668         https://bugs.webkit.org/show_bug.cgi?id=112067
1669
1670         Reviewed by Geoffrey Garen.
1671
1672         We weren't setting the tag in SetCallee.  Therefore set it to CellTag.
1673
1674         * dfg/DFGSpeculativeJIT32_64.cpp:
1675         (JSC::DFG::SpeculativeJIT::compile):
1676
1677 2013-03-11  Oliver Hunt  <oliver@apple.com>
1678
1679         Make SegmentedVector Noncopyable
1680         https://bugs.webkit.org/show_bug.cgi?id=112059
1681
1682         Reviewed by Geoffrey Garen.
1683
1684         Copying a SegmentedVector is very expensive, and really shouldn't
1685         be necessary.  So I've taken the one place where we currently copy
1686         and replaced it with a regular Vector, and replaced the address
1687         dependent logic with a indexing ref instead.
1688
1689         * bytecompiler/BytecodeGenerator.cpp:
1690         (JSC::BytecodeGenerator::newLabelScope):
1691         (JSC::BytecodeGenerator::emitComplexJumpScopes):
1692         * bytecompiler/BytecodeGenerator.h:
1693         (BytecodeGenerator):
1694         * bytecompiler/LabelScope.h:
1695         (JSC):
1696         (JSC::LabelScopePtr::LabelScopePtr):
1697         (LabelScopePtr):
1698         (JSC::LabelScopePtr::operator=):
1699         (JSC::LabelScopePtr::~LabelScopePtr):
1700         (JSC::LabelScopePtr::operator*):
1701         (JSC::LabelScopePtr::operator->):
1702         * bytecompiler/NodesCodegen.cpp:
1703         (JSC::DoWhileNode::emitBytecode):
1704         (JSC::WhileNode::emitBytecode):
1705         (JSC::ForNode::emitBytecode):
1706         (JSC::ForInNode::emitBytecode):
1707         (JSC::SwitchNode::emitBytecode):
1708         (JSC::LabelNode::emitBytecode):
1709
1710 2013-03-10  Andreas Kling  <akling@apple.com>
1711
1712         SpeculativeJIT should use OwnPtr<SlowPathGenerator>.
1713         <http://webkit.org/b/111942>
1714
1715         Reviewed by Anders Carlsson.
1716
1717         There's no need to include DFGSlowPathGenerator.h from the header as long as the destructor is out-of-line,
1718         so let's use OwnPtr instead of raw pointers + deleteAllValues().
1719
1720         * dfg/DFGSpeculativeJIT.cpp:
1721         (JSC::DFG::SpeculativeJIT::~SpeculativeJIT):
1722         (JSC::DFG::SpeculativeJIT::addSlowPathGenerator):
1723         * dfg/DFGSpeculativeJIT.h:
1724         (SpeculativeJIT):
1725
1726 2013-03-09  Sheriff Bot  <webkit.review.bot@gmail.com>
1727
1728         Unreviewed, rolling out r145299.
1729         http://trac.webkit.org/changeset/145299
1730         https://bugs.webkit.org/show_bug.cgi?id=111928
1731
1732         compilation failure with recent clang
1733         (DFGBackwardsPropagationPhase.cpp:132:35: error: comparison of
1734         constant 10 with expression of type 'bool' is always false)
1735         (Requested by thorton on #webkit).
1736
1737         * CMakeLists.txt:
1738         * GNUmakefile.list.am:
1739         * JavaScriptCore.xcodeproj/project.pbxproj:
1740         * Target.pri:
1741         * dfg/DFGArrayMode.cpp:
1742         (JSC::DFG::ArrayMode::refine):
1743         * dfg/DFGBackwardsPropagationPhase.cpp: Removed.
1744         * dfg/DFGBackwardsPropagationPhase.h: Removed.
1745         * dfg/DFGCPSRethreadingPhase.cpp:
1746         (JSC::DFG::CPSRethreadingPhase::run):
1747         (CPSRethreadingPhase):
1748         (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor):
1749         (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor):
1750         * dfg/DFGDriver.cpp:
1751         (JSC::DFG::compile):
1752         * dfg/DFGGraph.cpp:
1753         (JSC::DFG::Graph::dump):
1754         * dfg/DFGNodeFlags.cpp:
1755         (JSC::DFG::nodeFlagsAsString):
1756         (DFG):
1757         * dfg/DFGNodeFlags.h:
1758         (DFG):
1759         * dfg/DFGPredictionPropagationPhase.cpp:
1760         (JSC::DFG::PredictionPropagationPhase::isNotNegZero):
1761         (PredictionPropagationPhase):
1762         (JSC::DFG::PredictionPropagationPhase::isNotZero):
1763         (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwoForConstant):
1764         (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwoNonRecursive):
1765         (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwo):
1766         (JSC::DFG::PredictionPropagationPhase::propagate):
1767         (JSC::DFG::PredictionPropagationPhase::mergeDefaultFlags):
1768         * dfg/DFGUnificationPhase.cpp:
1769         (JSC::DFG::UnificationPhase::run):
1770         * dfg/DFGVariableAccessData.h:
1771         (JSC::DFG::VariableAccessData::VariableAccessData):
1772         (VariableAccessData):
1773
1774 2013-03-08  Filip Pizlo  <fpizlo@apple.com>
1775
1776         DFG overflow check elimination is too smart for its own good
1777         https://bugs.webkit.org/show_bug.cgi?id=111832
1778
1779         Reviewed by Oliver Hunt and Gavin Barraclough.
1780         
1781         This improves overflow check elimination in three ways:
1782         
1783         1) It reduces the amount of time the compiler will spend doing it.
1784         
1785         2) It fixes bugs where overflow check elimination was overzealous. Precisely, for a binary operation
1786            over @a and @b where both @a and @b will type check that their inputs (@a->children, @b->children)
1787            are int32's and then perform a possibly-overflowing operation, we must be careful not to assume
1788            that @a's non-int32 parts don't matter if at the point that @a runs we have as yet not proved that
1789            @b->children are int32's and that hence @b might produce a large enough result that doubles would
1790            start chopping low bits. The specific implication of this is that for a binary operation to not
1791            propagate that it cares about non-int32 parts (NodeUsedAsNumber), we must prove that at least one
1792            of the inputs is guaranteed to produce a result within 2^32 and that there won't be a tower of such
1793            operations large enough to ultimately produce a double greater than 2^52 (roughly). We achieve the
1794            latter by disabling this optimization for very large basic blocks. It's noteworthy that blocks that
1795            large won't even make it into the DFG currently.
1796         
1797         3) It makes the overflow check elimination more precise for cases where the inputs to an Add or Sub
1798            are the outputs of a bit-op. For example in (@a + (@b | 0)) | 0, we don't need to propagate
1799            NodeUsedAsNumber to either @a or @b.
1800         
1801         This is neutral on V8v7 and a slight speed-up on compile time benchmarks.
1802
1803         * CMakeLists.txt:
1804         * GNUmakefile.list.am:
1805         * JavaScriptCore.xcodeproj/project.pbxproj:
1806         * Target.pri:
1807         * dfg/DFGArrayMode.cpp:
1808         (JSC::DFG::ArrayMode::refine):
1809         * dfg/DFGBackwardsPropagationPhase.cpp: Added.
1810         (DFG):
1811         (BackwardsPropagationPhase):
1812         (JSC::DFG::BackwardsPropagationPhase::BackwardsPropagationPhase):
1813         (JSC::DFG::BackwardsPropagationPhase::run):
1814         (JSC::DFG::BackwardsPropagationPhase::isNotNegZero):
1815         (JSC::DFG::BackwardsPropagationPhase::isNotZero):
1816         (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwoForConstant):
1817         (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwoNonRecursive):
1818         (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwo):
1819         (JSC::DFG::BackwardsPropagationPhase::mergeDefaultFlags):
1820         (JSC::DFG::BackwardsPropagationPhase::propagate):
1821         (JSC::DFG::performBackwardsPropagation):
1822         * dfg/DFGBackwardsPropagationPhase.h: Added.
1823         (DFG):
1824         * dfg/DFGCPSRethreadingPhase.cpp:
1825         (JSC::DFG::CPSRethreadingPhase::run):
1826         (JSC::DFG::CPSRethreadingPhase::clearIsLoadedFrom):
1827         (CPSRethreadingPhase):
1828         (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor):
1829         (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor):
1830         * dfg/DFGDriver.cpp:
1831         (JSC::DFG::compile):
1832         * dfg/DFGGraph.cpp:
1833         (JSC::DFG::Graph::dump):
1834         * dfg/DFGNodeFlags.cpp:
1835         (JSC::DFG::dumpNodeFlags):
1836         (DFG):
1837         * dfg/DFGNodeFlags.h:
1838         (DFG):
1839         * dfg/DFGPredictionPropagationPhase.cpp:
1840         (PredictionPropagationPhase):
1841         (JSC::DFG::PredictionPropagationPhase::propagate):
1842         * dfg/DFGUnificationPhase.cpp:
1843         (JSC::DFG::UnificationPhase::run):
1844         * dfg/DFGVariableAccessData.h:
1845         (JSC::DFG::VariableAccessData::VariableAccessData):
1846         (JSC::DFG::VariableAccessData::mergeIsLoadedFrom):
1847         (VariableAccessData):
1848         (JSC::DFG::VariableAccessData::setIsLoadedFrom):
1849         (JSC::DFG::VariableAccessData::isLoadedFrom):
1850
1851 2013-03-08  Roger Fong  <roger_fong@apple.com>
1852
1853         Makefile fixes.
1854
1855         * JavaScriptCore.vcxproj/JavaScriptCore.make:
1856
1857 2013-03-08  Gabor Rapcsanyi  <rgabor@webkit.org>
1858
1859         Cache flush problem on ARMv7 JSC
1860         https://bugs.webkit.org/show_bug.cgi?id=111441
1861
1862         Reviewed by Zoltan Herczeg.
1863
1864         Not proper cache flush causing random crashes on ARMv7 Linux with V8 tests.
1865         The problem is similar to https://bugs.webkit.org/show_bug.cgi?id=77712.
1866         Change the cache fulsh mechanism similar to ARM traditinal and revert the
1867         temporary fix.
1868
1869         * assembler/ARMv7Assembler.h:
1870         (JSC::ARMv7Assembler::cacheFlush):
1871
1872 2013-03-07  Geoffrey Garen  <ggaren@apple.com>
1873
1874         REGRESSION (r143759): 40% JSBench regression, 20% Octane/closure regression, 40% Octane/jquery regression, 2% Octane regression
1875         https://bugs.webkit.org/show_bug.cgi?id=111797
1876
1877         Reviewed by Oliver Hunt.
1878
1879         The bot's testing configuration stresses the cache's starting guess
1880         of 1MB.
1881
1882         This patch removes any starting guess, and just uses wall clock time
1883         to discover the initial working set size of an app, in code size.
1884
1885         * runtime/CodeCache.cpp:
1886         (JSC::CodeCacheMap::pruneSlowCase): Update our timer as we go.
1887
1888         Also fixed a bug where pruning from 0 to 0 would hang -- that case is
1889         a possibility now that we start with a capacity of 0.
1890
1891         * runtime/CodeCache.h:
1892         (CodeCacheMap):
1893         (JSC::CodeCacheMap::CodeCacheMap):
1894         (JSC::CodeCacheMap::add):
1895         (JSC::CodeCacheMap::prune): Don't prune if we're in the middle of
1896         discovering the working set size of an app, in code size.
1897
1898 2013-03-07  Michael Saboff  <msaboff@apple.com>
1899
1900         Crash when updating predictions below JSC::arrayProtoFuncForEach on tuaw.com article
1901         https://bugs.webkit.org/show_bug.cgi?id=111777
1902
1903         Reviewed by Filip Pizlo.
1904
1905         Moved register allocations to be above any generated control flow so that any
1906         resulting spill would be visible to all subsequently generated code.
1907
1908         * dfg/DFGSpeculativeJIT32_64.cpp:
1909         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull):
1910         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull):
1911         (JSC::DFG::SpeculativeJIT::compile):
1912         * dfg/DFGSpeculativeJIT64.cpp:
1913         (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull):
1914         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull):
1915         (JSC::DFG::SpeculativeJIT::compile):
1916
1917 2013-03-07  Filip Pizlo  <fpizlo@apple.com>
1918
1919         DFG should not get corrupted IR in the case of code that is dead, unreachable, and contains a chain of nodes that use each other in an untyped way
1920         https://bugs.webkit.org/show_bug.cgi?id=111783
1921
1922         Reviewed by Mark Hahnenberg.
1923         
1924         Unreachable code is not touched by CFA and so thinks that even untyped uses are checked.
1925         But dead untyped uses don't need checks and hence don't need to be Phantom'd. The DCE knew
1926         this in findTypeCheckRoot() but not in eliminateIrrelevantPhantomChildren(), leading to a
1927         Phantom node that had another Phantom node as one of its kids.
1928
1929         * dfg/DFGDCEPhase.cpp:
1930         (JSC::DFG::DCEPhase::eliminateIrrelevantPhantomChildren):
1931
1932 2013-03-07  Filip Pizlo  <fpizlo@apple.com>
1933
1934         The DFG fixpoint is not strictly profitable, and should be straight-lined
1935         https://bugs.webkit.org/show_bug.cgi?id=111764
1936
1937         Reviewed by Oliver Hunt and Geoffrey Garen.
1938         
1939         The DFG previously ran optimizations to fixpoint because there exists a circular dependency:
1940         
1941         CSE depends on CFG simplification: CFG simplification merges blocks, and CSE is block-local.
1942         
1943         CFG simplification depends on CFA and constant folding: constant folding reveals branches on
1944         constants.
1945         
1946         CFA depends on CSE: CSE reveals must-alias relationships by proving that two operations
1947         always produce identical values.
1948         
1949         Arguments simplification also depends on CSE, but it ought not depend on anything else.
1950         
1951         Hence we get a cycle like: CFA -> folding -> CFG -> CSE -> CFA.
1952         
1953         Note that before we had sparse conditional CFA, we also had CFA depending on CFG. This ought
1954         not be the case anymore: CFG simplification should not by itself lead to better CFA results.
1955         
1956         My guess is that the weakest link in this cycle is CFG -> CSE. CSE cuts both ways: if you
1957         CSE too much then you increase register pressure. Hence it's not clear that you always want
1958         to CSE after simplifying control flow. This leads to an order of optimization as follows:
1959         
1960         CSE -> arguments -> CFA -> folding -> CFG
1961         
1962         This is a 2.5% speed-up on SunSpider, a 4% speed-up on V8Spider, a possible 0.3% slow-down
1963         on V8v7, nothing on Kraken, and 1.2% speed-up in the JSRegress geomean. I'll take a 2.5%
1964         speed-up over a 0.3% V8v7 speed-up.
1965
1966         * dfg/DFGDriver.cpp:
1967         (JSC::DFG::compile):
1968
1969 2013-03-07  Roger Fong  <roger_fong@apple.com>
1970
1971         Build fix for AppleWin VS2010.
1972
1973         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
1974         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
1975
1976 2013-03-05  Mark Hahnenberg  <mhahnenberg@apple.com>
1977
1978         Objective-C API: Need a good way to reference event handlers without causing cycles
1979         https://bugs.webkit.org/show_bug.cgi?id=111088
1980
1981         Reviewed by Geoffrey Garen.
1982
1983         JSManagedValue is like a special kind of weak value. When you create a JSManagedValue, you can
1984         supply an Objective-C object as its "owner". As long as the Objective-C owner object remains
1985         alive and its wrapper remains accessible to the JSC garbage collector (e.g. by being marked by 
1986         the global object), the reference to the JavaScript value is strong. As soon as the Objective-C
1987         owner is deallocated or its wrapper becomes inaccessible to the garbage collector, the reference
1988         becomes weak.
1989
1990         If you do not supply an owner or you use the weakValueWithValue: convenience class method, the
1991         returned JSManagedValue behaves as a normal weak reference.
1992
1993         This new class allows clients to maintain references to JavaScript values in the Objective-C
1994         heap without creating reference cycles/leaking memory.
1995
1996         * API/JSAPIWrapperObject.cpp: Added.
1997         (JSC):
1998         (JSC::::createStructure):
1999         (JSC::JSAPIWrapperObject::JSAPIWrapperObject): This is a special JSObject for the Objective-C API that knows
2000         for the purposes of garbage collection/marking that it wraps an opaque Objective-C object.
2001         (JSC::JSAPIWrapperObject::visitChildren): We add the pointer to the wrapped Objective-C object to the set of
2002         opaque roots so that the weak handle owner for JSManagedValues can find it later.
2003         * API/JSAPIWrapperObject.h: Added.
2004         (JSC):
2005         (JSAPIWrapperObject):
2006         (JSC::JSAPIWrapperObject::wrappedObject):
2007         (JSC::JSAPIWrapperObject::setWrappedObject):
2008         * API/JSBase.cpp:
2009         (JSSynchronousGarbageCollect):
2010         * API/JSBasePrivate.h:
2011         * API/JSCallbackObject.cpp:
2012         (JSC):
2013         * API/JSCallbackObject.h:
2014         (JSC::JSCallbackObject::destroy): Moved this to the header so that we don't get link errors with JSAPIWrapperObject.
2015         * API/JSContext.mm:
2016         (-[JSContext initWithVirtualMachine:]): We weren't adding manually allocated/initialized JSVirtualMachine objects to 
2017         the global cache of virtual machines. The init methods handle this now rather than contextWithGlobalContextRef, since 
2018         not everyone is guaranteed to use the latter.
2019         (-[JSContext initWithGlobalContextRef:]):
2020         (+[JSContext contextWithGlobalContextRef:]):
2021         * API/JSManagedValue.h: Added.
2022         * API/JSManagedValue.mm: Added.
2023         (JSManagedValueHandleOwner):
2024         (managedValueHandleOwner):
2025         (+[JSManagedValue weakValueWithValue:]):
2026         (+[JSManagedValue managedValueWithValue:owner:]):
2027         (-[JSManagedValue init]): We explicitly call the ARC entrypoints to initialize/get the weak owner field since we don't 
2028         use ARC when building our framework.
2029         (-[JSManagedValue initWithValue:]):
2030         (-[JSManagedValue initWithValue:owner:]):
2031         (-[JSManagedValue dealloc]):
2032         (-[JSManagedValue value]):
2033         (-[JSManagedValue weakOwner]):
2034         (JSManagedValueHandleOwner::isReachableFromOpaqueRoots): If the Objective-C owner is still alive (i.e. loading the weak field
2035         returns non-nil) and that value was added to the set of opaque roots by the wrapper for that Objective-C owner, then the the 
2036         JSObject to which the JSManagedObject refers is still alive.
2037         * API/JSObjectRef.cpp: We have to add explicit checks for the JSAPIWrapperObject, just like the other types of JSCallbackObjects.
2038         (JSObjectGetPrivate):
2039         (JSObjectSetPrivate):
2040         (JSObjectGetPrivateProperty):
2041         (JSObjectSetPrivateProperty):
2042         (JSObjectDeletePrivateProperty):
2043         * API/JSValue.mm:
2044         (objectToValueWithoutCopy):
2045         * API/JSValueRef.cpp:
2046         (JSValueIsObjectOfClass):
2047         * API/JSVirtualMachine.mm:
2048         (-[JSVirtualMachine initWithContextGroupRef:]):
2049         (+[JSVirtualMachine virtualMachineWithContextGroupRef:]):
2050         * API/JSWrapperMap.mm:
2051         (wrapperFinalize):
2052         (makeWrapper): This is our own internal version of JSObjectMake which creates JSAPIWrapperObjects, the Obj-C API 
2053         version of JSCallbackObjects.
2054         (createObjectWithCustomBrand):
2055         (-[JSObjCClassInfo wrapperForObject:]):
2056         (tryUnwrapObjcObject):
2057         * API/JavaScriptCore.h:
2058         * API/tests/testapi.mm: Added new tests for the strong and weak uses of JSManagedValue in the context of an 
2059         onclick handler for an Objective-C object inserted into a JSContext.
2060         (-[TextXYZ setWeakOnclick:]):
2061         (-[TextXYZ setOnclick:]):
2062         (-[TextXYZ weakOnclick]):
2063         (-[TextXYZ onclick]):
2064         (-[TextXYZ click]):
2065         * CMakeLists.txt: Various build system additions.
2066         * GNUmakefile.list.am:
2067         * JavaScriptCore.gypi:
2068         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
2069         * JavaScriptCore.xcodeproj/project.pbxproj:
2070         * runtime/JSGlobalObject.cpp: Added the new canonical Structure for the JSAPIWrapperObject class.
2071         (JSC::JSGlobalObject::reset):
2072         (JSC):
2073         (JSC::JSGlobalObject::visitChildren):
2074         * runtime/JSGlobalObject.h:
2075         (JSGlobalObject):
2076         (JSC::JSGlobalObject::objcWrapperObjectStructure):
2077
2078 2013-03-06  Filip Pizlo  <fpizlo@apple.com>
2079
2080         ConvertThis should be turned into Identity based on predictions in Fixup, rather than based on proofs in ConstantFolding
2081         https://bugs.webkit.org/show_bug.cgi?id=111674
2082
2083         Reviewed by Oliver Hunt.
2084         
2085         This gets rid of the speculated forms of ConvertThis in the backend, and has Fixup
2086         convert them to either Identity(Object:@child) if the child is predicted object, or
2087         Phantom(Other:@child) ; WeakJSConstant(global this object) if it's predicted Other.
2088         
2089         The goal of this is to ensure that the optimization fixpoint doesn't create
2090         Identity's, since doing so requires a rerun of CSE. So far this isn't a speed-up
2091         but I'm hoping this will be a step towards reducing the need to rerun the fixpoint
2092         so as to ultimately reduce compile times.
2093
2094         * dfg/DFGAbstractState.cpp:
2095         (JSC::DFG::AbstractState::executeEffects):
2096         * dfg/DFGAssemblyHelpers.h:
2097         (AssemblyHelpers):
2098         * dfg/DFGConstantFoldingPhase.cpp:
2099         (JSC::DFG::ConstantFoldingPhase::foldConstants):
2100         * dfg/DFGFixupPhase.cpp:
2101         (JSC::DFG::FixupPhase::fixupNode):
2102         (FixupPhase):
2103         (JSC::DFG::FixupPhase::observeUseKindOnNode):
2104         (JSC::DFG::FixupPhase::setUseKindAndUnboxIfProfitable):
2105         * dfg/DFGGraph.h:
2106         (JSC::DFG::Graph::globalThisObjectFor):
2107         (Graph):
2108         * dfg/DFGNode.h:
2109         (Node):
2110         (JSC::DFG::Node::convertToIdentity):
2111         (JSC::DFG::Node::convertToWeakConstant):
2112         * dfg/DFGSpeculativeJIT32_64.cpp:
2113         (JSC::DFG::SpeculativeJIT::compile):
2114         * dfg/DFGSpeculativeJIT64.cpp:
2115         (JSC::DFG::SpeculativeJIT::compile):
2116
2117 2013-03-07  Peter Gal  <galpeter@inf.u-szeged.hu>
2118
2119         Children method in LLINT AST Not class should return [@child]
2120         https://bugs.webkit.org/show_bug.cgi?id=90740
2121
2122         Reviewed by Filip Pizlo.
2123
2124         * offlineasm/ast.rb: Fixed the return value of the children method in the Not AST class.
2125
2126 2013-03-05  Oliver Hunt  <oliver@apple.com>
2127
2128         Bring back eager resolution of function scoped variables
2129         https://bugs.webkit.org/show_bug.cgi?id=111497
2130
2131         Reviewed by Geoffrey Garen.
2132
2133         This reverts the get/put_scoped_var part of the great non-local
2134         variable resolution refactoring.  This still leaves all the lazy
2135         variable resolution logic as it's necessary for global property
2136         resolution, and i don't want to make the patch bigger than it
2137         already is.
2138
2139         * bytecode/CodeBlock.cpp:
2140         (JSC::CodeBlock::dumpBytecode):
2141         (JSC::CodeBlock::CodeBlock):
2142         * bytecode/CodeBlock.h:
2143         (CodeBlock):
2144         * bytecode/Opcode.h:
2145         (JSC):
2146         (JSC::padOpcodeName):
2147         * bytecode/UnlinkedCodeBlock.cpp:
2148         (JSC::generateFunctionCodeBlock):
2149         (JSC::UnlinkedFunctionExecutable::codeBlockFor):
2150         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
2151         * bytecode/UnlinkedCodeBlock.h:
2152         (JSC):
2153         (UnlinkedFunctionExecutable):
2154         (UnlinkedCodeBlock):
2155         (JSC::UnlinkedCodeBlock::usesGlobalObject):
2156         (JSC::UnlinkedCodeBlock::setGlobalObjectRegister):
2157         (JSC::UnlinkedCodeBlock::globalObjectRegister):
2158         * bytecompiler/BytecodeGenerator.cpp:
2159         (JSC::ResolveResult::checkValidity):
2160         (JSC::BytecodeGenerator::BytecodeGenerator):
2161         (JSC::BytecodeGenerator::emitLoadGlobalObject):
2162         (JSC):
2163         (JSC::BytecodeGenerator::resolve):
2164         (JSC::BytecodeGenerator::resolveConstDecl):
2165         (JSC::BytecodeGenerator::emitResolve):
2166         (JSC::BytecodeGenerator::emitResolveBase):
2167         (JSC::BytecodeGenerator::emitResolveBaseForPut):
2168         (JSC::BytecodeGenerator::emitResolveWithBaseForPut):
2169         (JSC::BytecodeGenerator::emitResolveWithThis):
2170         (JSC::BytecodeGenerator::emitGetStaticVar):
2171         (JSC::BytecodeGenerator::emitPutStaticVar):
2172         * bytecompiler/BytecodeGenerator.h:
2173         (JSC::ResolveResult::lexicalResolve):
2174         (JSC::ResolveResult::isStatic):
2175         (JSC::ResolveResult::depth):
2176         (JSC::ResolveResult::index):
2177         (ResolveResult):
2178         (JSC::ResolveResult::ResolveResult):
2179         (BytecodeGenerator):
2180         * bytecompiler/NodesCodegen.cpp:
2181         (JSC::ResolveNode::isPure):
2182         (JSC::FunctionCallResolveNode::emitBytecode):
2183         (JSC::PostfixNode::emitResolve):
2184         (JSC::TypeOfResolveNode::emitBytecode):
2185         (JSC::PrefixNode::emitResolve):
2186         (JSC::ReadModifyResolveNode::emitBytecode):
2187         (JSC::AssignResolveNode::emitBytecode):
2188         (JSC::ConstDeclNode::emitCodeSingle):
2189         * dfg/DFGByteCodeParser.cpp:
2190         (JSC::DFG::ByteCodeParser::parseBlock):
2191         * dfg/DFGCapabilities.cpp:
2192         (JSC::DFG::debugFail):
2193         * dfg/DFGCapabilities.h:
2194         (JSC::DFG::canCompileOpcode):
2195         (JSC::DFG::canInlineOpcode):
2196         * jit/JIT.cpp:
2197         (JSC::JIT::privateCompileMainPass):
2198         * jit/JIT.h:
2199         (JIT):
2200         * jit/JITPropertyAccess.cpp:
2201         (JSC::JIT::emit_op_get_scoped_var):
2202         (JSC):
2203         (JSC::JIT::emit_op_put_scoped_var):
2204         * jit/JITPropertyAccess32_64.cpp:
2205         (JSC::JIT::emit_op_get_scoped_var):
2206         (JSC):
2207         (JSC::JIT::emit_op_put_scoped_var):
2208         * llint/LowLevelInterpreter32_64.asm:
2209         * llint/LowLevelInterpreter64.asm:
2210         * runtime/CodeCache.cpp:
2211         (JSC::CodeCache::getCodeBlock):
2212         (JSC::CodeCache::getProgramCodeBlock):
2213         (JSC::CodeCache::getEvalCodeBlock):
2214         * runtime/CodeCache.h:
2215         (JSC):
2216         (CodeCache):
2217         * runtime/Executable.cpp:
2218         (JSC::EvalExecutable::compileInternal):
2219         (JSC::FunctionExecutable::produceCodeBlockFor):
2220         * runtime/JSGlobalObject.cpp:
2221         (JSC::JSGlobalObject::createEvalCodeBlock):
2222         * runtime/JSGlobalObject.h:
2223         (JSGlobalObject):
2224         * runtime/Options.cpp:
2225         (JSC::Options::initialize):
2226
2227 2013-03-06  Filip Pizlo  <fpizlo@apple.com>
2228
2229         Unreviewed, roll out http://trac.webkit.org/changeset/144989
2230         
2231         I think we want the assertion that I removed.
2232
2233         * dfg/DFGAbstractState.cpp:
2234         (JSC::DFG::AbstractState::merge):
2235         (JSC::DFG::AbstractState::mergeVariableBetweenBlocks):
2236         * dfg/DFGAbstractState.h:
2237         (AbstractState):
2238
2239 2013-03-06  Filip Pizlo  <fpizlo@apple.com>
2240
2241         DFG::AbstractState::merge() is still more complicated than it needs to be
2242         https://bugs.webkit.org/show_bug.cgi?id=111619
2243
2244         Reviewed by Mark Hahnenberg.
2245         
2246         This method is the one place where we still do some minimal amount of liveness pruning, but the style with
2247         which it is written is awkward, and it makes an assertion about variablesAtTail that will be invalidated
2248         by https://bugs.webkit.org/show_bug.cgi?id=111539.
2249
2250         * dfg/DFGAbstractState.cpp:
2251         (JSC::DFG::AbstractState::merge):
2252         (JSC::DFG::AbstractState::mergeVariableBetweenBlocks):
2253         * dfg/DFGAbstractState.h:
2254         (AbstractState):
2255
2256 2013-03-06  Filip Pizlo  <fpizlo@apple.com>
2257
2258         DFG should not run full CSE after the optimization fixpoint, since it really just wants store elimination
2259         https://bugs.webkit.org/show_bug.cgi?id=111536
2260
2261         Reviewed by Oliver Hunt and Mark Hahnenberg.
2262         
2263         The fixpoint will do aggressive load elimination and pure CSE. There's no need to do it after the fixpoint.
2264         On the other hand, the fixpoint does not profit from doing store elimination (except for SetLocal/Flush).
2265         Previously we had CSE do both, and had it avoid doing some store elimination during the fixpoint by querying
2266         the fixpoint state. This changes CSE to be templated on mode - either NormalCSE or StoreElimination - so
2267         that we explicitly put it into one of those modes depending on where we call it from. The goal is to reduce
2268         time spent doing load elimination after the fixpoint, since that is just wasted cycles.
2269
2270         * dfg/DFGCSEPhase.cpp:
2271         (JSC::DFG::CSEPhase::CSEPhase):
2272         (JSC::DFG::CSEPhase::run):
2273         (JSC::DFG::CSEPhase::performNodeCSE):
2274         (JSC::DFG::CSEPhase::performBlockCSE):
2275         (JSC::DFG::performCSE):
2276         (DFG):
2277         (JSC::DFG::performStoreElimination):
2278         * dfg/DFGCSEPhase.h:
2279         (DFG):
2280         * dfg/DFGDriver.cpp:
2281         (JSC::DFG::compile):
2282
2283 2013-03-06  Andreas Kling  <akling@apple.com>
2284
2285         Pack Structure members better.
2286         <http://webkit.org/b/111593>
2287         <rdar://problem/13359200>
2288
2289         Reviewed by Mark Hahnenberg.
2290
2291         Shrink Structure by 8 bytes (now at 104 bytes) on 64-bit by packing the members better.
2292
2293         * runtime/Structure.cpp:
2294         (JSC::Structure::Structure):
2295         * runtime/Structure.h:
2296         (Structure):
2297
2298 2013-03-06  Andreas Kling  <akling@apple.com>
2299
2300         Unreviewed, fix Windows build after r144910.
2301
2302         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
2303
2304 2013-03-05  Filip Pizlo  <fpizlo@apple.com>
2305
2306         DFG should not check if nodes are shouldGenerate prior to DCE
2307         https://bugs.webkit.org/show_bug.cgi?id=111520
2308
2309         Reviewed by Geoffrey Garen.
2310         
2311         All nodes are live before DCE. We don't need to check that they aren't, because they
2312         definitely will be.
2313
2314         * dfg/DFGArgumentsSimplificationPhase.cpp:
2315         (JSC::DFG::ArgumentsSimplificationPhase::run):
2316         * dfg/DFGCFAPhase.cpp:
2317         (JSC::DFG::CFAPhase::performBlockCFA):
2318         * dfg/DFGCFGSimplificationPhase.cpp:
2319         (JSC::DFG::CFGSimplificationPhase::keepOperandAlive):
2320         * dfg/DFGCSEPhase.cpp:
2321         (JSC::DFG::CSEPhase::pureCSE):
2322         (JSC::DFG::CSEPhase::int32ToDoubleCSE):
2323         (JSC::DFG::CSEPhase::constantCSE):
2324         (JSC::DFG::CSEPhase::weakConstantCSE):
2325         (JSC::DFG::CSEPhase::getCalleeLoadElimination):
2326         (JSC::DFG::CSEPhase::getArrayLengthElimination):
2327         (JSC::DFG::CSEPhase::globalVarLoadElimination):
2328         (JSC::DFG::CSEPhase::scopedVarLoadElimination):
2329         (JSC::DFG::CSEPhase::globalVarWatchpointElimination):
2330         (JSC::DFG::CSEPhase::globalVarStoreElimination):
2331         (JSC::DFG::CSEPhase::scopedVarStoreElimination):
2332         (JSC::DFG::CSEPhase::getByValLoadElimination):
2333         (JSC::DFG::CSEPhase::checkStructureElimination):
2334         (JSC::DFG::CSEPhase::structureTransitionWatchpointElimination):
2335         (JSC::DFG::CSEPhase::putStructureStoreElimination):
2336         (JSC::DFG::CSEPhase::getByOffsetLoadElimination):
2337         (JSC::DFG::CSEPhase::putByOffsetStoreElimination):
2338         (JSC::DFG::CSEPhase::getPropertyStorageLoadElimination):
2339         (JSC::DFG::CSEPhase::checkArrayElimination):
2340         (JSC::DFG::CSEPhase::getIndexedPropertyStorageLoadElimination):
2341         (JSC::DFG::CSEPhase::getMyScopeLoadElimination):
2342         (JSC::DFG::CSEPhase::getLocalLoadElimination):
2343         (JSC::DFG::CSEPhase::setLocalStoreElimination):
2344         (JSC::DFG::CSEPhase::performNodeCSE):
2345         * dfg/DFGFixupPhase.cpp:
2346         (JSC::DFG::FixupPhase::fixupNode):
2347         (JSC::DFG::FixupPhase::fixupSetLocalsInBlock):
2348         * dfg/DFGPredictionPropagationPhase.cpp:
2349         (JSC::DFG::PredictionPropagationPhase::propagate):
2350         * dfg/DFGStructureCheckHoistingPhase.cpp:
2351         (JSC::DFG::StructureCheckHoistingPhase::run):
2352
2353 2013-03-06  Csaba Osztrogonác  <ossy@webkit.org>
2354
2355         Fix unused parameter warnings in ARM assembler
2356         https://bugs.webkit.org/show_bug.cgi?id=111433
2357
2358         Reviewed by Kentaro Hara.
2359
2360         * assembler/ARMAssembler.h: Remove unreachable revertJump() after r143346.
2361         * assembler/MacroAssemblerARM.h:
2362         (JSC::MacroAssemblerARM::moveIntsToDouble): Remove unused scratch parameter instead of UNUSED_PARAM.
2363         (JSC::MacroAssemblerARM::branchConvertDoubleToInt32): Remove unused fpTemp parameter.
2364         (JSC::MacroAssemblerARM::revertJumpReplacementToPatchableBranchPtrWithPatch): Remove unused parameters.
2365
2366 2013-03-06  Andreas Kling  <akling@apple.com>
2367
2368         Unused Structure property tables waste 14MB on Membuster.
2369         <http://webkit.org/b/110854>
2370         <rdar://problem/13292104>
2371
2372         Reviewed by Geoffrey Garen.
2373
2374         Turn PropertyTable into a GC object and have Structure drop unpinned tables when marking.
2375         14 MB progression on Membuster3.
2376
2377         This time it should stick; I've been through all the tests with COLLECT_ON_EVERY_ALLOCATION.
2378         The issue with the last version was that Structure::m_offset could be used uninitialized
2379         when re-materializing a previously GC'd property table, causing some sanity checks to fail.
2380
2381         * CMakeLists.txt:
2382         * GNUmakefile.list.am:
2383         * JavaScriptCore.gypi:
2384         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
2385         * JavaScriptCore.xcodeproj/project.pbxproj:
2386         * Target.pri:
2387
2388             Added PropertyTable.cpp.
2389
2390         * runtime/PropertyTable.cpp: Added.
2391         (JSC::PropertyTable::create):
2392         (JSC::PropertyTable::clone):
2393         (JSC::PropertyTable::PropertyTable):
2394         (JSC::PropertyTable::destroy):
2395         (JSC::PropertyTable::~PropertyTable):
2396         (JSC::PropertyTable::visitChildren):
2397
2398             Moved marking of property table values here from Structure::visitChildren().
2399
2400         * runtime/WriteBarrier.h:
2401         (JSC::WriteBarrierBase::get):
2402
2403             Move m_cell to a local before using it multiple times. This avoids a multiple-access race when
2404             Structure::checkOffsetConsistency() is used in assertions on the main thread while a marking thread
2405             zaps the property table.
2406
2407         * runtime/Structure.h:
2408         (JSC::Structure::materializePropertyMapIfNecessary):
2409         (JSC::Structure::materializePropertyMapIfNecessaryForPinning):
2410         * runtime/StructureInlines.h:
2411         (JSC::Structure::propertyTable):
2412
2413             Added a getter for the Structure's PropertyTable that ASSERTs GC currently isn't active.
2414             Because GC can zap an unpinned property table at any time, it's not entirely safe to access it.
2415             Renamed the variable itself to m_propertyTableUnsafe to force call sites into explaining themselves.
2416
2417         (JSC::Structure::putWillGrowOutOfLineStorage):
2418         (JSC::Structure::checkOffsetConsistency):
2419
2420             Moved these out of Structure.h to break header dependency cycle between Structure/PropertyTable.
2421
2422         * runtime/Structure.cpp:
2423         (JSC::Structure::visitChildren):
2424
2425             Null out m_propertyTable if the table is unpinned. This'll cause the table to get GC'd.
2426
2427         (JSC::Structure::takePropertyTableOrCloneIfPinned):
2428
2429             Added for setting up the property table in a new transition, this code is now shared between
2430             addPropertyTransition() and nonPropertyTransition().
2431
2432         * runtime/JSGlobalData.h:
2433         * runtime/JSGlobalData.cpp:
2434         (JSC::JSGlobalData::JSGlobalData):
2435
2436             Add a global propertyTableStructure.
2437
2438         * runtime/PropertyMapHashTable.h:
2439         (PropertyTable):
2440         (JSC::PropertyTable::createStructure):
2441         (JSC::PropertyTable::copy):
2442
2443             Make PropertyTable a GC object.
2444
2445         * runtime/Structure.cpp:
2446         (JSC::Structure::dumpStatistics):
2447         (JSC::Structure::materializePropertyMap):
2448         (JSC::Structure::despecifyDictionaryFunction):
2449         (JSC::Structure::addPropertyTransition):
2450         (JSC::Structure::changePrototypeTransition):
2451         (JSC::Structure::despecifyFunctionTransition):
2452         (JSC::Structure::attributeChangeTransition):
2453         (JSC::Structure::toDictionaryTransition):
2454         (JSC::Structure::sealTransition):
2455         (JSC::Structure::freezeTransition):
2456         (JSC::Structure::preventExtensionsTransition):
2457         (JSC::Structure::nonPropertyTransition):
2458         (JSC::Structure::isSealed):
2459         (JSC::Structure::isFrozen):
2460         (JSC::Structure::flattenDictionaryStructure):
2461         (JSC::Structure::pin):
2462         (JSC::Structure::copyPropertyTable):
2463         (JSC::Structure::copyPropertyTableForPinning):
2464         (JSC::Structure::get):
2465         (JSC::Structure::despecifyFunction):
2466         (JSC::Structure::despecifyAllFunctions):
2467         (JSC::Structure::putSpecificValue):
2468         (JSC::Structure::remove):
2469         (JSC::Structure::createPropertyMap):
2470         (JSC::Structure::getPropertyNamesFromStructure):
2471         (JSC::Structure::checkConsistency):
2472
2473 2013-03-05  Filip Pizlo  <fpizlo@apple.com>
2474
2475         Get rid of the invert argument to SpeculativeJIT::jumpSlowForUnwantedArrayMode
2476         https://bugs.webkit.org/show_bug.cgi?id=105624
2477
2478         Reviewed by Oliver Hunt.
2479         
2480         All callers pass invert = false, which is the default value of the argument. So, get
2481         rid of the argument and fold away all code that checks it.
2482
2483         * dfg/DFGSpeculativeJIT.cpp:
2484         (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode):
2485         * dfg/DFGSpeculativeJIT.h:
2486         (SpeculativeJIT):
2487
2488 2013-03-05  Filip Pizlo  <fpizlo@apple.com>
2489
2490         Unreviewed, fix an incorrect comment. The comment was a holdover from a work-in-progress version of this code.
2491
2492         * dfg/DFGDCEPhase.cpp:
2493         (JSC::DFG::DCEPhase::run):
2494
2495 2013-03-04  Filip Pizlo  <fpizlo@apple.com>
2496
2497         DFG DCE might eliminate checks unsoundly
2498         https://bugs.webkit.org/show_bug.cgi?id=109389
2499
2500         Reviewed by Oliver Hunt.
2501         
2502         This gets rid of all eager reference counting, and does all dead code elimination
2503         in one phase - the DCEPhase. This phase also sets up the node reference counts,
2504         which are then used not just for DCE but also register allocation and stack slot
2505         allocation.
2506         
2507         Doing this required a number of surgical changes in places that previously relied
2508         on always having liveness information. For example, the structure check hoisting
2509         phase must now consult whether a VariableAccessData is profitable for unboxing to
2510         make sure that it doesn't try to do hoisting on set SetLocals. The arguments
2511         simplification phase employs its own light-weight liveness analysis. Both phases
2512         previously just used reference counts.
2513         
2514         The largest change is that now, dead nodes get turned into Phantoms. Those
2515         Phantoms will retain those child edges that are not proven. This ensures that any
2516         type checks performed by a dead node remain even after the node is killed. On the
2517         other hand, this Phantom conversion means that we need special handling for
2518         SetLocal. I decided to make the four forms of SetLocal explicit:
2519         
2520         MovHint(@a, rK): Just indicates that node @a contains the value that would have
2521              now been placed into virtual register rK. Does not actually cause @a to be
2522              stored into rK. This would have previously been a dead SetLocal with @a
2523              being live. MovHints are always dead.
2524         
2525         ZombieHint(rK): Indicates that at this point, register rK will contain a dead
2526              value and OSR should put Undefined into it. This would have previously been
2527              a dead SetLocal with @a being dead also. ZombieHints are always dead.
2528         
2529         MovHintAndCheck(@a, rK): Identical to MovHint except @a is also type checked,
2530              according to whatever UseKind the edge to @a has. The type check is always a
2531              forward exit. MovHintAndChecks are always live, since they are
2532              NodeMustGenerate. Previously this would have been a dead SetLocal with a
2533              live @a, and the check would have disappeared. This is one of the bugs that
2534              this patch solves.
2535         
2536         SetLocal(@a, rK): This still does exactly what it does now, if the SetLocal is
2537              live.
2538         
2539         Basically this patch makes it so that dead SetLocals eventually decay to MovHint,
2540         ZombieHint, or MovHintAndCheck depending on the situation. If the child @a is
2541         also dead, then you get a ZombieHint. If the child @a is live but the SetLocal
2542         has a type check and @a's type hasn't been proven to have that type then you get
2543         a MovHintAndCheck. Otherwise you get a MovHint.
2544         
2545         This is performance neutral.
2546
2547         * CMakeLists.txt:
2548         * GNUmakefile.list.am:
2549         * JavaScriptCore.xcodeproj/project.pbxproj:
2550         * Target.pri:
2551         * dfg/DFGAbstractState.cpp:
2552         (JSC::DFG::AbstractState::executeEffects):
2553         (JSC::DFG::AbstractState::mergeStateAtTail):
2554         * dfg/DFGArgumentsSimplificationPhase.cpp:
2555         (JSC::DFG::ArgumentsSimplificationPhase::run):
2556         (ArgumentsSimplificationPhase):
2557         (JSC::DFG::ArgumentsSimplificationPhase::removeArgumentsReferencingPhantomChild):
2558         * dfg/DFGBasicBlock.h:
2559         (BasicBlock):
2560         * dfg/DFGBasicBlockInlines.h:
2561         (DFG):
2562         * dfg/DFGByteCodeParser.cpp:
2563         (JSC::DFG::ByteCodeParser::addToGraph):
2564         (JSC::DFG::ByteCodeParser::insertPhiNode):
2565         (JSC::DFG::ByteCodeParser::emitFunctionChecks):
2566         * dfg/DFGCFAPhase.cpp:
2567         (JSC::DFG::CFAPhase::run):
2568         * dfg/DFGCFGSimplificationPhase.cpp:
2569         (JSC::DFG::CFGSimplificationPhase::run):
2570         (JSC::DFG::CFGSimplificationPhase::keepOperandAlive):
2571         * dfg/DFGCPSRethreadingPhase.cpp:
2572         (JSC::DFG::CPSRethreadingPhase::run):
2573         (JSC::DFG::CPSRethreadingPhase::addPhiSilently):
2574         * dfg/DFGCSEPhase.cpp:
2575         (JSC::DFG::CSEPhase::eliminateIrrelevantPhantomChildren):
2576         (JSC::DFG::CSEPhase::setReplacement):
2577         (JSC::DFG::CSEPhase::performNodeCSE):
2578         * dfg/DFGCommon.cpp:
2579         (WTF::printInternal):
2580         (WTF):
2581         * dfg/DFGCommon.h:
2582         (WTF):
2583         * dfg/DFGConstantFoldingPhase.cpp:
2584         (JSC::DFG::ConstantFoldingPhase::foldConstants):
2585         (JSC::DFG::ConstantFoldingPhase::addStructureTransitionCheck):
2586         (JSC::DFG::ConstantFoldingPhase::paintUnreachableCode):
2587         * dfg/DFGDCEPhase.cpp: Added.
2588         (DFG):
2589         (DCEPhase):
2590         (JSC::DFG::DCEPhase::DCEPhase):
2591         (JSC::DFG::DCEPhase::run):
2592         (JSC::DFG::DCEPhase::findTypeCheckRoot):
2593         (JSC::DFG::DCEPhase::countEdge):
2594         (JSC::DFG::DCEPhase::eliminateIrrelevantPhantomChildren):
2595         (JSC::DFG::performDCE):
2596         * dfg/DFGDCEPhase.h: Added.
2597         (DFG):
2598         * dfg/DFGDriver.cpp:
2599         (JSC::DFG::compile):
2600         * dfg/DFGFixupPhase.cpp:
2601         (JSC::DFG::FixupPhase::fixupNode):
2602         (JSC::DFG::FixupPhase::checkArray):
2603         (JSC::DFG::FixupPhase::blessArrayOperation):
2604         (JSC::DFG::FixupPhase::fixIntEdge):
2605         (JSC::DFG::FixupPhase::injectInt32ToDoubleNode):
2606         (JSC::DFG::FixupPhase::truncateConstantToInt32):
2607         * dfg/DFGGraph.cpp:
2608         (JSC::DFG::Graph::Graph):
2609         (JSC::DFG::Graph::dump):
2610         (DFG):
2611         * dfg/DFGGraph.h:
2612         (JSC::DFG::Graph::changeChild):
2613         (JSC::DFG::Graph::changeEdge):
2614         (JSC::DFG::Graph::compareAndSwap):
2615         (JSC::DFG::Graph::clearAndDerefChild):
2616         (JSC::DFG::Graph::performSubstitution):
2617         (JSC::DFG::Graph::performSubstitutionForEdge):
2618         (Graph):
2619         (JSC::DFG::Graph::substitute):
2620         * dfg/DFGInsertionSet.h:
2621         (InsertionSet):
2622         * dfg/DFGNode.h:
2623         (JSC::DFG::Node::Node):
2624         (JSC::DFG::Node::convertToConstant):
2625         (JSC::DFG::Node::convertToGetLocalUnlinked):
2626         (JSC::DFG::Node::containsMovHint):
2627         (Node):
2628         (JSC::DFG::Node::hasVariableAccessData):
2629         (JSC::DFG::Node::willHaveCodeGenOrOSR):
2630         * dfg/DFGNodeType.h:
2631         (DFG):
2632         * dfg/DFGPredictionPropagationPhase.cpp:
2633         (JSC::DFG::PredictionPropagationPhase::propagate):
2634         * dfg/DFGSpeculativeJIT.cpp:
2635         (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward):
2636         (JSC::DFG::SpeculativeJIT::compileMovHint):
2637         (JSC::DFG::SpeculativeJIT::compileMovHintAndCheck):
2638         (DFG):
2639         (JSC::DFG::SpeculativeJIT::compileInlineStart):
2640         (JSC::DFG::SpeculativeJIT::compile):
2641         * dfg/DFGSpeculativeJIT.h:
2642         (SpeculativeJIT):
2643         * dfg/DFGSpeculativeJIT32_64.cpp:
2644         (JSC::DFG::SpeculativeJIT::compile):
2645         * dfg/DFGSpeculativeJIT64.cpp:
2646         (JSC::DFG::SpeculativeJIT::compile):
2647         * dfg/DFGStructureCheckHoistingPhase.cpp:
2648         (JSC::DFG::StructureCheckHoistingPhase::run):
2649         (JSC::DFG::StructureCheckHoistingPhase::shouldConsiderForHoisting):
2650         (StructureCheckHoistingPhase):
2651         * dfg/DFGValidate.cpp:
2652         (JSC::DFG::Validate::validate):
2653
2654 2013-03-05  Mark Hahnenberg  <mhahnenberg@apple.com>
2655
2656         Objective-C API: JSValue should implement init and return nil in exceptional cases
2657         https://bugs.webkit.org/show_bug.cgi?id=111487
2658
2659         Reviewed by Darin Adler.
2660
2661         * API/JSValue.mm:
2662         (-[JSValue init]): We return nil here because there is no way to get the instance into a coherent state
2663         without a JSContext.
2664         (-[JSValue initWithValue:inContext:]): Similarly, we should also return nil here if either of the arguments is 0.
2665
2666 2013-03-05  Sheriff Bot  <webkit.review.bot@gmail.com>
2667
2668         Unreviewed, rolling out r144708.
2669         http://trac.webkit.org/changeset/144708
2670         https://bugs.webkit.org/show_bug.cgi?id=111447
2671
2672         random assertion crashes in inspector tests on qt+mac bots
2673         (Requested by kling on #webkit).
2674
2675         * CMakeLists.txt:
2676         * GNUmakefile.list.am:
2677         * JavaScriptCore.gypi:
2678         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
2679         * JavaScriptCore.xcodeproj/project.pbxproj:
2680         * Target.pri:
2681         * runtime/JSGlobalData.cpp:
2682         (JSC::JSGlobalData::JSGlobalData):
2683         * runtime/JSGlobalData.h:
2684         (JSGlobalData):
2685         * runtime/PropertyMapHashTable.h:
2686         (PropertyTable):
2687         (JSC::PropertyTable::PropertyTable):
2688         (JSC):
2689         (JSC::PropertyTable::~PropertyTable):
2690         (JSC::PropertyTable::copy):
2691         * runtime/PropertyTable.cpp: Removed.
2692         * runtime/Structure.cpp:
2693         (JSC::Structure::dumpStatistics):
2694         (JSC::Structure::materializePropertyMap):
2695         (JSC::Structure::despecifyDictionaryFunction):
2696         (JSC::Structure::addPropertyTransition):
2697         (JSC::Structure::changePrototypeTransition):
2698         (JSC::Structure::despecifyFunctionTransition):
2699         (JSC::Structure::attributeChangeTransition):
2700         (JSC::Structure::toDictionaryTransition):
2701         (JSC::Structure::sealTransition):
2702         (JSC::Structure::freezeTransition):
2703         (JSC::Structure::preventExtensionsTransition):
2704         (JSC::Structure::nonPropertyTransition):
2705         (JSC::Structure::isSealed):
2706         (JSC::Structure::isFrozen):
2707         (JSC::Structure::flattenDictionaryStructure):
2708         (JSC::Structure::pin):
2709         (JSC::Structure::copyPropertyTable):
2710         (JSC::Structure::copyPropertyTableForPinning):
2711         (JSC::Structure::get):
2712         (JSC::Structure::despecifyFunction):
2713         (JSC::Structure::despecifyAllFunctions):
2714         (JSC::Structure::putSpecificValue):
2715         (JSC::Structure::remove):
2716         (JSC::Structure::createPropertyMap):
2717         (JSC::Structure::getPropertyNamesFromStructure):
2718         (JSC::Structure::visitChildren):
2719         (JSC::Structure::checkConsistency):
2720         * runtime/Structure.h:
2721         (JSC):
2722         (JSC::Structure::putWillGrowOutOfLineStorage):
2723         (JSC::Structure::materializePropertyMapIfNecessary):
2724         (JSC::Structure::materializePropertyMapIfNecessaryForPinning):
2725         (JSC::Structure::checkOffsetConsistency):
2726         (Structure):
2727         * runtime/StructureInlines.h:
2728         (JSC::Structure::get):
2729         * runtime/WriteBarrier.h:
2730         (JSC::WriteBarrierBase::get):
2731
2732 2013-03-05  David Kilzer  <ddkilzer@apple.com>
2733
2734         BUILD FIX (r144698): Only enable SPEECH_SYNTHESIS for Mac
2735         <http://webkit.org/b/106742>
2736
2737         Fixes the following build failures:
2738
2739             Undefined symbols for architecture i386:
2740               "__ZTVN7WebCore25PlatformSpeechSynthesizerE", referenced from:
2741                   __ZN7WebCore25PlatformSpeechSynthesizerC2EPNS_31PlatformSpeechSynthesizerClientE in PlatformSpeechSynthesizer.o
2742               NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
2743               "__ZN7WebCore25PlatformSpeechSynthesizer19initializeVoiceListEv", referenced from:
2744                   __ZN7WebCore25PlatformSpeechSynthesizerC2EPNS_31PlatformSpeechSynthesizerClientE in PlatformSpeechSynthesizer.o
2745             ld: symbol(s) not found for architecture i386
2746
2747         * Configurations/FeatureDefines.xcconfig:
2748         - Fix definition of ENABLE_ENCRYPTED_MEDIA_V2_macosx to match
2749           other FeatureDefines.xcconfig files.
2750         - Only set ENABLE_SPEECH_SYNTHESIS for the macosx platform.
2751
2752 2013-03-04  Andreas Kling  <akling@apple.com>
2753
2754         Unused Structure property tables waste 14MB on Membuster.
2755         <http://webkit.org/b/110854>
2756         <rdar://problem/13292104>
2757
2758         Reviewed by Geoffrey Garen.
2759
2760         Turn PropertyTable into a GC object and have Structure drop unpinned tables when marking.
2761         14 MB progression on Membuster3.
2762
2763         * CMakeLists.txt:
2764         * GNUmakefile.list.am:
2765         * JavaScriptCore.gypi:
2766         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
2767         * JavaScriptCore.xcodeproj/project.pbxproj:
2768         * Target.pri:
2769
2770             Added PropertyTable.cpp.
2771
2772         * runtime/PropertyTable.cpp: Added.
2773         (JSC::PropertyTable::create):
2774         (JSC::PropertyTable::clone):
2775         (JSC::PropertyTable::PropertyTable):
2776         (JSC::PropertyTable::destroy):
2777         (JSC::PropertyTable::~PropertyTable):
2778         (JSC::PropertyTable::visitChildren):
2779
2780             Moved marking of property table values here from Structure::visitChildren().
2781
2782         * runtime/WriteBarrier.h:
2783         (JSC::WriteBarrierBase::get):
2784
2785             Move m_cell to a local before using it multiple times. This avoids a multiple-access race when
2786             Structure::checkOffsetConsistency() is used in assertions on the main thread while a marking thread
2787             zaps the property table.
2788
2789         * runtime/Structure.h:
2790         (JSC::Structure::materializePropertyMapIfNecessary):
2791         (JSC::Structure::materializePropertyMapIfNecessaryForPinning):
2792         * runtime/StructureInlines.h:
2793         (JSC::Structure::propertyTable):
2794
2795             Added a getter for the Structure's PropertyTable that ASSERTs GC currently isn't active.
2796             Because GC can zap an unpinned property table at any time, it's not entirely safe to access it.
2797             Renamed the variable itself to m_propertyTableUnsafe to force call sites into explaining themselves.
2798
2799         (JSC::Structure::putWillGrowOutOfLineStorage):
2800         (JSC::Structure::checkOffsetConsistency):
2801
2802             Moved these out of Structure.h to break header dependency cycle between Structure/PropertyTable.
2803
2804         * runtime/Structure.cpp:
2805         (JSC::Structure::visitChildren):
2806
2807             Null out m_propertyTable if the table is unpinned. This'll cause the table to get GC'd.
2808
2809         * runtime/JSGlobalData.h:
2810         * runtime/JSGlobalData.cpp:
2811         (JSC::JSGlobalData::JSGlobalData):
2812
2813             Add a global propertyTableStructure.
2814
2815         * runtime/PropertyMapHashTable.h:
2816         (PropertyTable):
2817         (JSC::PropertyTable::createStructure):
2818         (JSC::PropertyTable::copy):
2819
2820             Make PropertyTable a GC object.
2821
2822         * runtime/Structure.cpp:
2823         (JSC::Structure::dumpStatistics):
2824         (JSC::Structure::materializePropertyMap):
2825         (JSC::Structure::despecifyDictionaryFunction):
2826         (JSC::Structure::addPropertyTransition):
2827         (JSC::Structure::changePrototypeTransition):
2828         (JSC::Structure::despecifyFunctionTransition):
2829         (JSC::Structure::attributeChangeTransition):
2830         (JSC::Structure::toDictionaryTransition):
2831         (JSC::Structure::sealTransition):
2832         (JSC::Structure::freezeTransition):
2833         (JSC::Structure::preventExtensionsTransition):
2834         (JSC::Structure::nonPropertyTransition):
2835         (JSC::Structure::isSealed):
2836         (JSC::Structure::isFrozen):
2837         (JSC::Structure::flattenDictionaryStructure):
2838         (JSC::Structure::pin):
2839         (JSC::Structure::copyPropertyTable):
2840         (JSC::Structure::copyPropertyTableForPinning):
2841         (JSC::Structure::get):
2842         (JSC::Structure::despecifyFunction):
2843         (JSC::Structure::despecifyAllFunctions):
2844         (JSC::Structure::putSpecificValue):
2845         (JSC::Structure::remove):
2846         (JSC::Structure::createPropertyMap):
2847         (JSC::Structure::getPropertyNamesFromStructure):
2848         (JSC::Structure::checkConsistency):
2849
2850 2013-03-04  Chris Fleizach  <cfleizach@apple.com>
2851
2852         Support WebSpeech - Speech Synthesis
2853         https://bugs.webkit.org/show_bug.cgi?id=106742
2854
2855         Reviewed by Simon Fraser.
2856
2857         Enable speech synthesis for the Mac.
2858
2859         * Configurations/FeatureDefines.xcconfig:
2860
2861 2013-03-04  Mark Hahnenberg  <mhahnenberg@apple.com>
2862
2863         Remove contextInternalContext from JSContextInternal.h
2864         https://bugs.webkit.org/show_bug.cgi?id=111356
2865
2866         Reviewed by Geoffrey Garen.
2867
2868         We don't need it any more since we have globalContextRef in JSContext.
2869
2870         * API/JSContext.mm:
2871         * API/JSContextInternal.h:
2872         * API/JSValue.mm:
2873         (+[JSValue valueWithBool:inContext:]):
2874         (+[JSValue valueWithDouble:inContext:]):
2875         (+[JSValue valueWithInt32:inContext:]):
2876         (+[JSValue valueWithUInt32:inContext:]):
2877         (+[JSValue valueWithNewObjectInContext:]):
2878         (+[JSValue valueWithNewArrayInContext:]):
2879         (+[JSValue valueWithNewRegularExpressionFromPattern:flags:inContext:]):
2880         (+[JSValue valueWithNewErrorFromMessage:inContext:]):
2881         (+[JSValue valueWithNullInContext:]):
2882         (+[JSValue valueWithUndefinedInContext:]):
2883         (-[JSValue toBool]):
2884         (-[JSValue toDouble]):
2885         (-[JSValue toNumber]):
2886         (-[JSValue toString]):
2887         (-[JSValue toDate]):
2888         (-[JSValue toArray]):
2889         (-[JSValue toDictionary]):
2890         (-[JSValue valueForProperty:]):
2891         (-[JSValue setValue:forProperty:]):
2892         (-[JSValue deleteProperty:]):
2893         (-[JSValue hasProperty:]):
2894         (-[JSValue valueAtIndex:]):
2895         (-[JSValue setValue:atIndex:]):
2896         (-[JSValue isUndefined]):
2897         (-[JSValue isNull]):
2898         (-[JSValue isBoolean]):
2899         (-[JSValue isNumber]):
2900         (-[JSValue isString]):
2901         (-[JSValue isObject]):
2902         (-[JSValue isEqualToObject:]):
2903         (-[JSValue isEqualWithTypeCoercionToObject:]):
2904         (-[JSValue isInstanceOf:]):
2905         (-[JSValue callWithArguments:]):
2906         (-[JSValue constructWithArguments:]):
2907         (-[JSValue invokeMethod:withArguments:]):
2908         (valueToObject):
2909         (objectToValueWithoutCopy):
2910         (objectToValue):
2911         (-[JSValue initWithValue:inContext:]):
2912         (-[JSValue dealloc]):
2913         (-[JSValue description]):
2914         * API/JSWrapperMap.mm:
2915         (createObjectWithCustomBrand):
2916         (-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]):
2917         (-[JSObjCClassInfo wrapperForObject:]):
2918         (-[JSWrapperMap jsWrapperForObject:]):
2919         * API/ObjCCallbackFunction.mm:
2920         (ObjCCallbackFunction::call):
2921         (objCCallbackFunctionForInvocation):
2922
2923 2013-03-04  Andreas Kling  <akling@apple.com>
2924
2925         Add simple vector traits for JSC::Identifier.
2926         <http://webkit.org/b/111323>
2927
2928         Reviewed by Geoffrey Garen.
2929
2930         Identifiers are really just Strings, giving them simple vector traits makes
2931         Vector move them with memcpy() instead of churning the refcounts.
2932
2933         * runtime/Identifier.h:
2934         (WTF):
2935
2936 2013-03-04  Kunihiko Sakamoto  <ksakamoto@chromium.org>
2937
2938         Add build flag for FontLoader
2939         https://bugs.webkit.org/show_bug.cgi?id=111289
2940
2941         Reviewed by Benjamin Poulain.
2942
2943         Add ENABLE_FONT_LOAD_EVENTS build flag (disabled by default).
2944
2945         * Configurations/FeatureDefines.xcconfig:
2946
2947 2013-03-03  Andreas Kling  <akling@apple.com>
2948
2949         Shrink JSC::HashTable entries.
2950         <http://webkit.org/b/111275>
2951         <rdar://problem/13333511>
2952
2953         Reviewed by Anders Carlsson.
2954
2955         Move the Intrinsic value out of the function-specific part of the union,
2956         and store it next to m_attributes. Reduces the size of HashEntry by 8 bytes.
2957
2958         990 kB progression on Membuster3. (PTUS: 797 kB)
2959
2960         * runtime/Lookup.h:
2961         (JSC::HashEntry::initialize):
2962         (JSC::HashEntry::intrinsic):
2963         (HashEntry):
2964
2965 2013-03-01  David Kilzer  <ddkilzer@apple.com>
2966
2967         BUILD FIX: testapi should link to Foundation, not CoreFoundation
2968
2969         * JavaScriptCore.xcodeproj/project.pbxproj: Change testapi to
2970         link to Foundation.framework instead of CoreFoundation.framework
2971         since it uses NS types.
2972
2973 2013-03-01  Mark Hahnenberg  <mhahnenberg@apple.com>
2974
2975         Objective-C API: Passing JS functions to Objective-C callbacks causes JSValue to leak
2976         https://bugs.webkit.org/show_bug.cgi?id=107836
2977
2978         Reviewed by Oliver Hunt.
2979
2980         We've decided to remove support for this feature from the API because there's no way to automatically manage 
2981         the memory for clients in a satisfactory manner. Clients can still pass JS functions to Objective-C methods, 
2982         but the methods must accept plain JSValues instead of Objective-C blocks.
2983
2984         We now ignore functions that are part of a protocol that inherits from JSExport that accept blocks as arguments.
2985
2986         * API/JSBlockAdaptor.h: Removed.
2987         * API/JSBlockAdaptor.mm: Removed.
2988         * API/ObjCCallbackFunction.mm:
2989         (ArgumentTypeDelegate::typeBlock): Return nil to signal that we want to ignore this function when copying it
2990         to the object from the protocol.
2991         * API/tests/testapi.mm: Added a test to make sure that we ignore methods declared as part of a JSExport-ed protocol
2992         that have block arguments.
2993         (-[TestObject bogusCallback:]):
2994         * JavaScriptCore.gypi: Updated build files.
2995         * JavaScriptCore.xcodeproj/project.pbxproj:
2996
2997 2013-03-01  Filip Pizlo  <fpizlo@apple.com>
2998
2999         DFG Branch(LogicalNot) peephole should not try to optimize and work-around the case where LogicalNot may be otherwise live
3000         https://bugs.webkit.org/show_bug.cgi?id=111209
3001
3002         Reviewed by Oliver Hunt.
3003         
3004         Even if it is then everything will work just fine. It's not necessary to check the ref count here.
3005
3006         * dfg/DFGFixupPhase.cpp:
3007         (JSC::DFG::FixupPhase::fixupNode):
3008
3009 2013-03-01  Filip Pizlo  <fpizlo@apple.com>
3010
3011         DFG CSE phase shouldn't rely on ref count of nodes, since it doesn't have to
3012         https://bugs.webkit.org/show_bug.cgi?id=111205
3013
3014         Reviewed by Oliver Hunt.
3015         
3016         I don't understand the intuition behind setLocalStoreElimination() validating that the SetLocal's ref count
3017         is 1. I believe this is a hold-over from when setLocalStoreElimination() would match one SetLocal to another,
3018         and then try to eliminate the first SetLocal. But that's not how it works now. Now, setLocalStoreElimination()
3019         is actually Flush elimination: it eliminates any Flush that anchors a SetLocal if it proves that every path
3020         from the SetLocal to the Flush is devoid of operations that may observe the local. It doesn't actually kill
3021         the SetLocal itself: if the SetLocal is live because of other things (other Flushes or GetLocals in other
3022         basic blocks), then the SetLocal will naturally still be alive because th Flush was only keeping the SetLocal
3023         alive by one count rather than being solely responsible for its liveness.
3024
3025         * dfg/DFGCSEPhase.cpp:
3026         (JSC::DFG::CSEPhase::setLocalStoreElimination):
3027         (JSC::DFG::CSEPhase::eliminate):
3028         (JSC::DFG::CSEPhase::performNodeCSE):
3029
3030 2013-03-01  Filip Pizlo  <fpizlo@apple.com>
3031
3032         Rename MovHint to MovHintEvent so I can create a NodeType called MovHint
3033
3034         Rubber stamped by Mark Hahnenberg.
3035         
3036         This is similar to the SetLocal/SetLocalEvent naming scheme, where SetLocal is the
3037         NodeType and SetLocalEvent is the VariableEventKind.
3038
3039         * dfg/DFGVariableEvent.cpp:
3040         (JSC::DFG::VariableEvent::dump):
3041         * dfg/DFGVariableEvent.h:
3042         (JSC::DFG::VariableEvent::movHint):
3043         (JSC::DFG::VariableEvent::id):
3044         (JSC::DFG::VariableEvent::operand):
3045         (VariableEvent):
3046         * dfg/DFGVariableEventStream.cpp:
3047         (JSC::DFG::VariableEventStream::reconstruct):
3048
3049 2013-03-01  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
3050
3051         [JSC] Fix sign comparison warning/error after r144340.
3052         https://bugs.webkit.org/show_bug.cgi?id=111164
3053
3054         Reviewed by Mark Hahnenberg.
3055
3056         gcc (both 4.2.1 and 4.7.2) complain about comparing signed and
3057         unsigned terms (clang accepts it just fine).
3058
3059         Work around that by casting the 1 to an uintptr_t as well.
3060
3061         * dfg/DFGEdge.h:
3062         (JSC::DFG::Edge::makeWord):
3063
3064 2013-02-28  Filip Pizlo  <fpizlo@apple.com>
3065
3066         DFG CFA should not do liveness pruning
3067         https://bugs.webkit.org/show_bug.cgi?id=111119
3068
3069         Reviewed by Mark Hahnenberg.
3070         
3071         It adds complexity and probably buys nothing.  Moreover, I'm transitioning to having
3072         liveness only available at the bitter end of compilation, so this will stop working
3073         after https://bugs.webkit.org/show_bug.cgi?id=109389 anyway.
3074
3075         * dfg/DFGAbstractState.cpp:
3076         (JSC::DFG::AbstractState::initialize):
3077         (JSC::DFG::AbstractState::mergeStateAtTail):
3078
3079 2013-02-28  Filip Pizlo  <fpizlo@apple.com>
3080
3081         Don't try to emit profiling if you don't have the DFG JIT.
3082
3083         Rubber stamped by Mark Hahnenberg.
3084
3085         * jit/JIT.h:
3086         (JSC::JIT::shouldEmitProfiling):
3087
3088 2013-02-28  Filip Pizlo  <fpizlo@apple.com>
3089
3090         DFG Phantom node should be honest about the fact that it can exit
3091         https://bugs.webkit.org/show_bug.cgi?id=111115
3092
3093         Reviewed by Mark Hahnenberg.
3094         
3095         The chances of this having cause serious issues are low, since most clients of the
3096         NodeDoesNotExit flag run after CFA and CFA updates this properly. But one possible
3097         case of badness is if the ByteCodeParser inserted a Phantom with a type check in
3098         between a LogicalNot and a Branch; then that peephole optimization in Fixup might
3099         go slightly wrong.
3100
3101         * dfg/DFGNodeType.h:
3102         (DFG):
3103
3104 2013-02-28  Mark Hahnenberg  <mhahnenberg@apple.com>
3105
3106         Add casts in DFGGPRInfo.h to suppress warnings
3107         https://bugs.webkit.org/show_bug.cgi?id=111104
3108
3109         Reviewed by Filip Pizlo.
3110
3111         With certain flags on, we get compiler warnings on ARM. We should do the proper casts to make these warnings go away.
3112
3113         * dfg/DFGGPRInfo.h:
3114         (JSC::DFG::GPRInfo::toIndex):
3115         (JSC::DFG::GPRInfo::debugName):
3116
3117 2013-02-28  Filip Pizlo  <fpizlo@apple.com>
3118
3119         It should be easy to determine if a DFG node exits forward or backward when doing type checks
3120         https://bugs.webkit.org/show_bug.cgi?id=111102
3121
3122         Reviewed by Mark Hahnenberg.
3123         
3124         This adds a NodeExitsForward flag, which tells you the exit directionality of
3125         type checks performed by the node. Even if you convert the node to a Phantom
3126         and use the Edge UseKind for type checks, you'll still get the same exit
3127         directionality that the original node would have wanted.
3128
3129         * dfg/DFGArgumentsSimplificationPhase.cpp:
3130         (JSC::DFG::ArgumentsSimplificationPhase::run):
3131         * dfg/DFGArrayifySlowPathGenerator.h:
3132         (JSC::DFG::ArrayifySlowPathGenerator::ArrayifySlowPathGenerator):
3133         * dfg/DFGCFGSimplificationPhase.cpp:
3134         (JSC::DFG::CFGSimplificationPhase::run):
3135         (JSC::DFG::CFGSimplificationPhase::mergeBlocks):
3136         * dfg/DFGCPSRethreadingPhase.cpp:
3137         (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor):
3138         * dfg/DFGCSEPhase.cpp:
3139         (JSC::DFG::CSEPhase::setReplacement):
3140         (JSC::DFG::CSEPhase::eliminate):
3141         (JSC::DFG::CSEPhase::performNodeCSE):
3142         * dfg/DFGConstantFoldingPhase.cpp:
3143         (JSC::DFG::ConstantFoldingPhase::foldConstants):
3144         * dfg/DFGFixupPhase.cpp:
3145         (JSC::DFG::FixupPhase::checkArray):
3146         * dfg/DFGNode.h:
3147         (Node):
3148         (JSC::DFG::Node::setOpAndDefaultNonExitFlags):
3149         (JSC::DFG::Node::convertToPhantom):
3150         * dfg/DFGNodeFlags.cpp:
3151         (JSC::DFG::nodeFlagsAsString):
3152         * dfg/DFGNodeFlags.h:
3153         (DFG):
3154         * dfg/DFGNodeType.h:
3155         (DFG):
3156         * dfg/DFGSpeculativeJIT.cpp:
3157         (JSC::DFG::SpeculativeJIT::backwardSpeculationCheck):
3158         (DFG):
3159         (JSC::DFG::SpeculativeJIT::speculationCheck):
3160         (JSC::DFG::SpeculativeJIT::speculationWatchpoint):
3161         (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck):
3162         (JSC::DFG::SpeculativeJIT::backwardTypeCheck):
3163         (JSC::DFG::SpeculativeJIT::typeCheck):
3164         (JSC::DFG::SpeculativeJIT::forwardTypeCheck):
3165         (JSC::DFG::SpeculativeJIT::fillStorage):
3166         (JSC::DFG::SpeculativeJIT::compile):
3167         (JSC::DFG::SpeculativeJIT::checkArgumentTypes):
3168         (JSC::DFG::SpeculativeJIT::compileValueToInt32):
3169         (JSC::DFG::SpeculativeJIT::compileInt32ToDouble):
3170         * dfg/DFGSpeculativeJIT.h:
3171         (SpeculativeJIT):
3172         (JSC::DFG::SpeculateIntegerOperand::SpeculateIntegerOperand):
3173         (JSC::DFG::SpeculateIntegerOperand::gpr):
3174         (SpeculateIntegerOperand):
3175         (JSC::DFG::SpeculateDoubleOperand::SpeculateDoubleOperand):
3176         (JSC::DFG::SpeculateDoubleOperand::fpr):
3177         (SpeculateDoubleOperand):
3178         (JSC::DFG::SpeculateCellOperand::SpeculateCellOperand):
3179         (JSC::DFG::SpeculateCellOperand::gpr):
3180         (SpeculateCellOperand):
3181         (JSC::DFG::SpeculateBooleanOperand::SpeculateBooleanOperand):
3182         (JSC::DFG::SpeculateBooleanOperand::gpr):
3183         (SpeculateBooleanOperand):
3184         * dfg/DFGSpeculativeJIT32_64.cpp:
3185         (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal):
3186         (JSC::DFG::SpeculativeJIT::fillSpeculateInt):
3187         (JSC::DFG::SpeculativeJIT::fillSpeculateIntStrict):
3188         (JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
3189         (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
3190         (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean):
3191         (JSC::DFG::SpeculativeJIT::compile):
3192         * dfg/DFGSpeculativeJIT64.cpp:
3193         (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal):
3194         (JSC::DFG::SpeculativeJIT::fillSpeculateInt):
3195         (JSC::DFG::SpeculativeJIT::fillSpeculateIntStrict):
3196         (JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
3197         (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
3198         (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean):
3199         (JSC::DFG::SpeculativeJIT::compile):
3200
3201 2013-02-28  Filip Pizlo  <fpizlo@apple.com>
3202
3203         CodeBlock::valueProfile() has a bogus assertion
3204         https://bugs.webkit.org/show_bug.cgi?id=111106
3205         <rdar://problem/13131427>
3206
3207         Reviewed by Mark Hahnenberg.
3208         
3209         This was just a bad assertion: m_bytecodeOffset == -1 means that the value profile is constructed but not initialized.
3210         ValueProfile constructs itself in a safe way; you can call any method you want on a constructed but not initialized
3211         ValueProfile. CodeBlock first constructs all ValueProfiles (by growing the ValueProfile vector) and then initializes
3212         their m_bytecodeOffset later. This is necessary because the initialization is linking bytecode instructions to their
3213         ValueProfiles, so at that point we don't want the ValueProfile vector to resize, which implies that we want all of
3214         them to already be constructed. A GC can happen during this phase, and the GC may want to walk all ValueProfiles.
3215         This is safe, but one of the ValueProfile getters (CodeBlock::valueProfile()) was asserting that any value profile
3216         you get has had its m_bytecodeOffset initialized. This need not be the case and nothing will go wrong if it isn't.
3217
3218         The solution is to remove the assertion, which I believe was put there to ensure that my m_valueProfiles refactoring
3219         a long time ago was sound: it used to be that a ValueProfile with m_bytecodeOffset == -1 was an argument profile; now
3220         all argument profiles are in m_argumentValueProfiles instead. I think it's safe to say that this refactoring was done
3221         soundly since it was a long time ago. So we should kill the assertion - I don't see an easy way to make the assertion
3222         sound with respect to the GC-during-CodeBlock-construction issue, and I don't believe that the assertion is buying us
3223         anything at this point.
3224
3225         * bytecode/CodeBlock.h:
3226         (JSC::CodeBlock::valueProfile):
3227
3228 2013-02-27  Filip Pizlo  <fpizlo@apple.com>
3229
3230         DFG CFA should leave behind information in Edge that says if the Edge's type check is proven to succeed
3231         https://bugs.webkit.org/show_bug.cgi?id=110840
3232
3233         Reviewed by Mark Hahnenberg.
3234         
3235         This doesn't add any observable functionality to the compiler, yet. But it does give
3236         every phase that runs after CFA the ability to know, in O(1) time, whether an edge
3237         will need to execute a type check.
3238
3239         * dfg/DFGAbstractState.h:
3240         (JSC::DFG::AbstractState::filterEdgeByUse):
3241         (JSC::DFG::AbstractState::filterByType):
3242         * dfg/DFGCommon.cpp:
3243         (WTF):
3244         (WTF::printInternal):
3245         * dfg/DFGCommon.h:
3246         (JSC::DFG::isProved):
3247         (DFG):
3248         (JSC::DFG::proofStatusForIsProved):
3249         (WTF):
3250         * dfg/DFGEdge.cpp:
3251         (JSC::DFG::Edge::dump):
3252         * dfg/DFGEdge.h:
3253         (JSC::DFG::Edge::Edge):
3254         (JSC::DFG::Edge::setNode):
3255         (JSC::DFG::Edge::useKindUnchecked):
3256         (JSC::DFG::Edge::setUseKind):
3257         (Edge):
3258         (JSC::DFG::Edge::proofStatusUnchecked):
3259         (JSC::DFG::Edge::proofStatus):
3260         (JSC::DFG::Edge::setProofStatus):
3261         (JSC::DFG::Edge::isProved):
3262         (JSC::DFG::Edge::needsCheck):
3263         (JSC::DFG::Edge::shift):
3264         (JSC::DFG::Edge::makeWord):
3265
3266 2013-02-28  Simon Hausmann  <simon.hausmann@digia.com>
3267
3268         [Qt][Mac] Fix massive parallel builds
3269
3270         Reviewed by Tor Arne Vestbø.
3271
3272         There exists a race condition that LLIntDesiredOffsets.h is written to
3273         by two parllel instances of the ruby script. This patch ensures that similar to the output file,
3274         the generated file is also prefixed according to the build configuration.
3275
3276         * LLIntOffsetsExtractor.pro:
3277
3278 2013-02-27  Sheriff Bot  <webkit.review.bot@gmail.com>
3279
3280         Unreviewed, rolling out r144168.
3281         http://trac.webkit.org/changeset/144168
3282         https://bugs.webkit.org/show_bug.cgi?id=111019
3283
3284         It broke the build and tronical is unavailable (Requested by
3285         Ossy_night on #webkit).
3286
3287         * LLIntOffsetsExtractor.pro:
3288
3289 2013-02-26  Filip Pizlo  <fpizlo@apple.com>
3290
3291         Disable some unsound DFG DCE
3292         https://bugs.webkit.org/show_bug.cgi?id=110948
3293
3294         Reviewed by Michael Saboff.
3295         
3296         DCE of bitops is not sound since the bitops might call some variant of valueOf.
3297         
3298         This used to work right because ValueToInt32 was MustGenerate. From the DFG IR
3299         standpoint it feels weird to make ValueToInt32 be MustGenerate since that node is
3300         implemented entirely as a pure conversion. If we ever gave the DFG the ability to
3301         do effectful bitops, we would most likely implement them as special nodes not
3302         related to the ValueToInt32 and bitop nodes we have now.
3303         
3304         This change is performance neutral.
3305
3306         * dfg/DFGNodeType.h:
3307         (DFG):
3308
3309 2013-02-27  Glenn Adams  <glenn@skynav.com>
3310
3311         Add ENABLE_CSS3_TEXT_LINE_BREAK flag.
3312         https://bugs.webkit.org/show_bug.cgi?id=110944
3313
3314         Reviewed by Dean Jackson.
3315
3316         * Configurations/FeatureDefines.xcconfig:
3317
3318 2013-02-27  Julien Brianceau   <jbrianceau@nds.com>
3319
3320         Fix build when DFG_JIT is not enabled
3321         https://bugs.webkit.org/show_bug.cgi?id=110991
3322
3323         Reviewed by Csaba Osztrogonác.
3324
3325         * jit/JIT.h:
3326         (JSC::JIT::canBeOptimizedOrInlined):
3327
3328 2013-02-27  Simon Hausmann  <simon.hausmann@digia.com>
3329
3330         [Qt][Mac] Fix massive parallel builds
3331
3332         Reviewed by Tor Arne Vestbø.
3333
3334         There exists a race condition that LLIntDesiredOffsets.h is written to
3335         by two parllel instances of the ruby script. This patch ensures that similar to the output file,
3336         the generated file is also prefixed according to the build configuration.
3337
3338         * LLIntOffsetsExtractor.pro:
3339
3340 2013-02-26  Filip Pizlo  <fpizlo@apple.com>
3341
3342         DFG OSR exit doesn't know which virtual register to use for the last result register for post_inc and post_dec
3343         https://bugs.webkit.org/show_bug.cgi?id=109036
3344         <rdar://problem/13292139>
3345
3346         Reviewed by Gavin Barraclough.
3347         
3348         This was a two-fold problem:
3349         
3350         1) post_inc/dec has two results - the new value of the variable, and the old value of the variable. DFG OSR exit
3351            assumed that the "last result" used for the Baseline JIT's register allocation would be the new value. It was
3352            wrong in this assumption.
3353         
3354         2) The Baseline JIT knew to disable its last result optimization in cases where it might confuse the DFG. But it
3355            was doing this only for code blocks that could be totally optimized, but not code blocks that could only be
3356