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