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