2008-06-15 Maciej Stachowiak <mjs@apple.com>
[WebKit.git] / JavaScriptCore / ChangeLog
1 2008-06-15  Maciej Stachowiak  <mjs@apple.com>
2
3         Reviewed by Alexey.
4         
5         - add emitUnaryOp, emitNullaryOp and emitUnaryOpNoDst; use them
6         
7         This removes some boilerplate code and also reduces the number of
8         places that will need to be changed to do on-demand emit of
9         loads (and thus support k operands).
10
11         * VM/CodeGenerator.cpp:
12         (KJS::CodeGenerator::emitUnaryOp):
13         (KJS::CodeGenerator::emitNullaryOp):
14         (KJS::CodeGenerator::emitUnaryOpNoDst):
15         (KJS::CodeGenerator::emitPushScope):
16         * VM/CodeGenerator.h:
17         (KJS::CodeGenerator::emitNewObject):
18         (KJS::CodeGenerator::emitNewArray):
19         (KJS::CodeGenerator::emitNot):
20         (KJS::CodeGenerator::emitBitNot):
21         (KJS::CodeGenerator::emitToJSNumber):
22         (KJS::CodeGenerator::emitNegate):
23         (KJS::CodeGenerator::emitInstanceOf):
24         (KJS::CodeGenerator::emitTypeOf):
25         (KJS::CodeGenerator::emitIn):
26         (KJS::CodeGenerator::emitReturn):
27         (KJS::CodeGenerator::emitEnd):
28         (KJS::CodeGenerator::emitGetPropertyNames):
29
30 2008-06-15  Alp Toker  <alp@nuanti.com>
31
32         Rubber-stamped by Maciej.
33
34         Install 'jsc' application by default.
35
36         * GNUmakefile.am:
37
38 2008-06-15  Maciej Stachowiak  <mjs@apple.com>
39
40         Reviewed by Oliver.
41         
42         - rename testkjs to jsc
43
44         * GNUmakefile.am:
45         * JavaScriptCore.vcproj/JavaScriptCore.sln:
46         * JavaScriptCore.vcproj/jsc: Added.
47         * JavaScriptCore.vcproj/jsc/jsc.vcproj: Copied from JavaScriptCore.vcproj/testkjs/testkjs.vcproj.
48         * JavaScriptCore.vcproj/testkjs: Removed.
49         * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Removed.
50         * JavaScriptCore.xcodeproj/project.pbxproj:
51         * jscore.bkl:
52         * kjs/Shell.cpp: Copied from kjs/testkjs.cpp.
53         (main):
54         (printUsageStatement):
55         (jscmain):
56         * kjs/jsc.pro: Copied from kjs/testkjs.pro.
57         * kjs/testkjs.cpp: Removed.
58         * kjs/testkjs.pro: Removed.
59         * tests/mozilla/expected.html:
60         * tests/mozilla/js1_2/Array/tostring_1.js:
61         * tests/mozilla/js1_2/Array/tostring_2.js:
62         * tests/mozilla/jsDriver.pl:
63
64 2008-06-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
65
66         Reviewed by Maciej.
67
68         Mac build fix.
69
70         * JavaScriptCore.xcodeproj/project.pbxproj:
71         * kjs/nodes.h:
72
73 2008-06-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
74
75         Reviewed by Maciej.
76
77         Change the spelling of PrecMultiplicitave to PrecMultiplicative.
78
79         * kjs/nodes.h:
80         (KJS::):
81         (KJS::MultNode::precedence):
82         (KJS::DivNode::precedence):
83         (KJS::ModNode::precedence):
84
85 2008-06-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
86
87         Reviewed by Maciej.
88
89         Remove unused preprocessor macros related to exceptions in the old
90         interpreter.
91
92         * kjs/nodes.cpp:
93
94 2008-06-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
95
96         Reviewed by Maciej.
97
98         Bug 19484: More instructions needs to use temporary registers
99         <https://bugs.webkit.org/show_bug.cgi?id=19484>
100
101         Fix codegen for all binary operations so that temporaries are used if
102         necessary. This was done by making BinaryOpNode and ReverseBinaryOpNode
103         subclasses of ExpressionNode, and eliminating the custom emitCode()
104         methods for the individual node classes.
105
106         This only adds 3 new instructions to SunSpider code, and there is no
107         difference in SunSpider execution time.
108
109         * VM/CodeGenerator.cpp:
110         (KJS::CodeGenerator::emitBitNot):
111         (KJS::CodeGenerator::emitBinaryOp):
112         * VM/CodeGenerator.h:
113         * kjs/grammar.y:
114         * kjs/nodes.cpp:
115         (KJS::PreIncResolveNode::emitCode):
116         (KJS::PreDecResolveNode::emitCode):
117         (KJS::BinaryOpNode::emitCode):
118         (KJS::ReverseBinaryOpNode::emitCode):
119         (KJS::emitReadModifyAssignment):
120         (KJS::CaseBlockNode::emitCodeForBlock):
121         * kjs/nodes.h:
122         (KJS::BinaryOpNode::BinaryOpNode):
123         (KJS::ReverseBinaryOpNode::ReverseBinaryOpNode):
124         (KJS::MultNode::):
125         (KJS::DivNode::):
126         (KJS::DivNode::precedence):
127         (KJS::ModNode::):
128         (KJS::ModNode::precedence):
129         (KJS::AddNode::):
130         (KJS::AddNode::precedence):
131         (KJS::SubNode::):
132         (KJS::SubNode::precedence):
133         (KJS::LeftShiftNode::):
134         (KJS::LeftShiftNode::precedence):
135         (KJS::RightShiftNode::):
136         (KJS::RightShiftNode::precedence):
137         (KJS::UnsignedRightShiftNode::):
138         (KJS::UnsignedRightShiftNode::precedence):
139         (KJS::LessNode::):
140         (KJS::LessNode::precedence):
141         (KJS::GreaterNode::):
142         (KJS::GreaterNode::precedence):
143         (KJS::LessEqNode::):
144         (KJS::LessEqNode::precedence):
145         (KJS::GreaterEqNode::):
146         (KJS::GreaterEqNode::precedence):
147         (KJS::InstanceOfNode::):
148         (KJS::InstanceOfNode::precedence):
149         (KJS::InNode::):
150         (KJS::InNode::precedence):
151         (KJS::EqualNode::):
152         (KJS::EqualNode::precedence):
153         (KJS::NotEqualNode::):
154         (KJS::NotEqualNode::precedence):
155         (KJS::StrictEqualNode::):
156         (KJS::StrictEqualNode::precedence):
157         (KJS::NotStrictEqualNode::):
158         (KJS::NotStrictEqualNode::precedence):
159         (KJS::BitAndNode::):
160         (KJS::BitAndNode::precedence):
161         (KJS::BitOrNode::):
162         (KJS::BitOrNode::precedence):
163         (KJS::BitXOrNode::):
164         (KJS::BitXOrNode::precedence):
165         * kjs/nodes2string.cpp:
166         (KJS::LessNode::streamTo):
167         (KJS::GreaterNode::streamTo):
168         (KJS::LessEqNode::streamTo):
169         (KJS::GreaterEqNode::streamTo):
170         (KJS::InstanceOfNode::streamTo):
171         (KJS::InNode::streamTo):
172         (KJS::EqualNode::streamTo):
173         (KJS::NotEqualNode::streamTo):
174         (KJS::StrictEqualNode::streamTo):
175         (KJS::NotStrictEqualNode::streamTo):
176         (KJS::BitAndNode::streamTo):
177         (KJS::BitXOrNode::streamTo):
178         (KJS::BitOrNode::streamTo):
179
180 2008-06-14  Darin Adler  <darin@apple.com>
181
182         Rubber stamped by Sam.
183
184         - rename a bunch of local symbols within the regular expression code to
185           follow our usual coding style, and do a few other name tweaks
186
187         * pcre/pcre_compile.cpp:
188         (CompileData::CompileData):
189         (checkEscape):
190         (readRepeatCounts):
191         (compileBranch):
192         (compileBracket):
193         (calculateCompiledPatternLength):
194         (returnError):
195         (jsRegExpCompile):
196         * pcre/pcre_exec.cpp:
197         (MatchStack::MatchStack):
198         (MatchStack::canUseStackBufferForNextFrame):
199         (MatchStack::popCurrentFrame):
200         (match):
201         (tryFirstByteOptimization):
202         (tryRequiredByteOptimization):
203         (jsRegExpExecute):
204         * pcre/pcre_internal.h:
205
206 2008-06-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
207
208         Reviewed by Darin.
209
210         Remove redundant uses of get().
211
212         * kjs/nodes.cpp:
213         (KJS::BracketAccessorNode::emitCode):
214         (KJS::AddNode::emitCode):
215         (KJS::SubNode::emitCode):
216         (KJS::ReadModifyResolveNode::emitCode):
217         (KJS::AssignDotNode::emitCode):
218         (KJS::ReadModifyDotNode::emitCode):
219         (KJS::AssignBracketNode::emitCode):
220         (KJS::ReadModifyBracketNode::emitCode):
221
222 2008-06-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
223
224         Reviewed by Maciej.
225
226         Make code generation not use a temporary for the left-hand side of an
227         expression if the right-hand side is a local variable.
228
229         * VM/CodeGenerator.cpp:
230         (KJS::CodeGenerator::isLocal):
231         * VM/CodeGenerator.h:
232         (KJS::CodeGenerator::leftHandSideNeedsCopy):
233         (KJS::CodeGenerator::emitNodeForLeftHandSide):
234         * kjs/nodes.cpp:
235         (KJS::ResolveNode::isPure):
236         (KJS::BracketAccessorNode::emitCode):
237         (KJS::AddNode::emitCode):
238         (KJS::SubNode::emitCode):
239         (KJS::ReadModifyResolveNode::emitCode):
240         (KJS::AssignDotNode::emitCode):
241         (KJS::ReadModifyDotNode::emitCode):
242         (KJS::AssignBracketNode::emitCode):
243         (KJS::ReadModifyBracketNode::emitCode):
244         * kjs/nodes.h:
245         (KJS::ExpressionNode::):
246         (KJS::BooleanNode::):
247         (KJS::NumberNode::):
248         (KJS::StringNode::):
249
250 2008-06-14  Darin Adler  <darin@apple.com>
251
252         Reviewed by Sam.
253
254         - more of https://bugs.webkit.org/show_bug.cgi?id=17257
255           start ref counts at 1 instead of 0 for speed
256
257         * kjs/nodes.cpp:
258         (KJS::ParserRefCounted::hasOneRef): Added. Replaces refcount.
259         * kjs/nodes.h: Replaced refcount with hasOneRef.
260
261         * wtf/ListRefPtr.h:
262         (WTF::ListRefPtr::~ListRefPtr): Changed to use hasOneRef instead of
263         refcount, so this class can be used with the RefCounted template.
264
265         * wtf/RefCounted.h:
266         (WTF::RefCounted::hasOneRef): Made const, since there's no reason for
267         it to be non-const.
268
269 2008-06-14  Maciej Stachowiak  <mjs@apple.com>
270
271         Reviewed by Oliver.
272         
273         - initialize local vars as side effect of call instead of in bytecode
274         1.004x speedup on SunSpider.
275
276         This removes just the dispatch overhead for these loads - in the
277         future, dead store elimination might be able to eliminate them
278         entirely.
279         
280         * VM/CodeGenerator.cpp:
281         (KJS::CodeGenerator::CodeGenerator): For function blocks, don't
282         emit loads of undefined for var initialization.
283         * VM/Machine.cpp:
284         (KJS::slideRegisterWindowForCall): Instead, initialize locals
285         as part of the call.
286
287 2008-06-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
288
289         Reviewed by Oliver.
290
291         Remove helper functions in the parser that are no longer needed.
292
293         * kjs/grammar.y:
294
295 2008-06-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
296
297         Reviewed by Oliver.
298
299         Bug 19484: More instructions needs to use temporary registers
300         <https://bugs.webkit.org/show_bug.cgi?id=19484>
301
302         Make code generation for AddNode and SubNode use temporaries when
303         necessary.
304
305         * kjs/grammar.y:
306         * kjs/nodes.cpp:
307         (KJS::AddNode::emitCode):
308         (KJS::SubNode::emitCode):
309         * kjs/nodes.h:
310         (KJS::AddNode::):
311         (KJS::SubNode::):
312
313 2008-06-13  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
314
315         Reviewed by Maciej.
316
317         Combine TrueNode and FalseNode to make BooleanNode, and remove the
318         unused class PlaceholderTrueNode.
319
320         * kjs/grammar.y:
321         * kjs/nodes.cpp:
322         (KJS::BooleanNode::emitCode):
323         * kjs/nodes.h:
324         (KJS::BooleanNode::):
325         (KJS::BooleanNode::precedence):
326         * kjs/nodes2string.cpp:
327         (KJS::BooleanNode::streamTo):
328
329 2008-06-13  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
330
331         Reviewed by Maciej.
332
333         Eliminate the use of temporaries to store the left hand side of an
334         expression when the right hand side is a constant. This slightly
335         improves the generated bytecode for a few SunSpider tests, but it is
336         mostly in preparation for fixing
337
338         Bug 19484: More instructions needs to use temporary registers
339         <https://bugs.webkit.org/show_bug.cgi?id=19484>
340
341         * VM/CodeGenerator.h:
342         (KJS::CodeGenerator::leftHandSideNeedsCopy):
343         (KJS::CodeGenerator::emitNodeForLeftHandSide):
344         * kjs/nodes.cpp:
345         (KJS::BracketAccessorNode::emitCode):
346         (KJS::ReadModifyResolveNode::emitCode):
347         (KJS::AssignDotNode::emitCode):
348         (KJS::ReadModifyDotNode::emitCode):
349         (KJS::AssignBracketNode::emitCode):
350         (KJS::ReadModifyBracketNode::emitCode):
351         * kjs/nodes.h:
352         (KJS::ExpressionNode::):
353         (KJS::FalseNode::):
354         (KJS::TrueNode::):
355         (KJS::NumberNode::):
356         (KJS::StringNode::):
357
358 2008-06-13  Maciej Stachowiak  <mjs@apple.com>
359
360         Reviewed by Oliver.
361         
362         - prettify opcode stats output
363         
364         I changed things to be a bit more aligned, also there is a new
365         section listing most common opcodes and most common sequences that
366         include them.
367
368         * VM/Opcode.cpp:
369         (KJS::):
370         (KJS::OpcodeStats::~OpcodeStats):
371         * VM/Opcode.h:
372
373 2008-06-13  Kevin McCullough  <kmccullough@apple.com>
374
375         Reviewed by Geoff.
376
377         <rdar://problem/5969992> JSProfiler: Remove the recursion limit in the
378         profiler.
379         - Remove recursion from exclude().  This leaves only focus() to fix.
380
381         * JavaScriptCore.exp: Change the signatures of the exported functions.
382         * profiler/Profile.cpp:
383         (KJS::Profile::forEach): I added a traverseNextNodePreOrder() function
384         and so needed to distinguish the other function by labeling it
385         traverseNextNodePostOrder().
386         (KJS::Profile::exclude): All new exclude that iteratively walks the tree
387         * profiler/Profile.h:
388         (KJS::Profile::focus): Add a null check for m_head.
389         * profiler/ProfileNode.cpp:
390         (KJS::ProfileNode::traverseNextNodePostOrder): Renamed
391         (KJS::ProfileNode::traverseNextNodePreOrder): Walks the tree in pre-
392         order, where the parent is processed before the children.
393         (KJS::ProfileNode::setTreeVisible): Iterate over the sub-tree and set
394         all of the nodes visible value.  This changes another function that used
395         recursion.
396         (KJS::ProfileNode::exclude): Remove recursion from this function.
397         Because we now check for m_visible and we are walking the tree in pre-
398         order we do not need to check if an excluded node is in an excluded
399         sub-tree.
400         * profiler/ProfileNode.h: Added specific selfTime functions to
401         facilitate exclude().
402         (KJS::ProfileNode::setSelfTime):
403         (KJS::ProfileNode::setActualSelfTime):
404         (KJS::ProfileNode::setVisibleSelfTime):
405
406 2008-06-12  Darin Adler  <darin@apple.com>
407
408         Reviewed by Maciej.
409
410         - https://bugs.webkit.org/show_bug.cgi?id=19434
411           speed up SunSpider by avoiding some string boxing
412
413         Speeds up SunSpider by 1.1%.
414
415         Optimized code path for getting built-in properties from strings -- avoid
416         boxing with a string object in that case. We can make further changes to avoid
417         even more boxing, but this change alone is a win.
418
419         * API/JSCallbackObjectFunctions.h:
420         (KJS::JSCallbackObject::staticValueGetter): Use isObject instead of inherits
421         in asssert, since the type of slotBase() is now JSValue, not JSObject.
422         (KJS::JSCallbackObject::staticFunctionGetter): Ditto.
423         (KJS::JSCallbackObject::callbackGetter): Ditto.
424
425         * kjs/internal.cpp:
426         (KJS::StringImp::getPrimitiveNumber): Updated for change of data member name.
427         (KJS::StringImp::toBoolean): Ditto.
428         (KJS::StringImp::toNumber): Ditto.
429         (KJS::StringImp::toString): Ditto.
430         (KJS::StringInstance::create): Added; avoids a bit of cut and paste code.
431         (KJS::StringImp::toObject): Use StringInstance::create.
432         (KJS::StringImp::toThisObject): Ditto.
433         (KJS::StringImp::lengthGetter): Added. Replaces the getter that used to live in
434         the StringInstance class.
435         (KJS::StringImp::indexGetter): Ditto.
436         (KJS::StringImp::indexNumericPropertyGetter): Ditto.
437         (KJS::StringImp::getOwnPropertySlot): Added. Deals with built in properties of
438         the string class without creating a StringInstance.
439
440         * kjs/internal.h:
441         (KJS::StringImp::getStringPropertySlot): Added. To be used by both the string
442         and string object getOwnPropertySlot function.
443
444         * kjs/lookup.h:
445         (KJS::staticFunctionGetter): Updated since slotBase() is now a JSValue rather
446         than a JSObject.
447
448         * kjs/object.h: Removed PropertySlot::slotBase() function, which can now move
449         back into property_slot.h where it belongs since it doesn't have to cast to
450         JSObject*.
451
452         * kjs/property_slot.cpp:
453         (KJS::PropertySlot::functionGetter): Updated since slot.slotBase() is now a JSValue*
454         instead of JSObject*. setGetterSlot still guarantees the base is a JSObject*.
455         * kjs/property_slot.h:
456         (KJS::PropertySlot::PropertySlot): Changed base to JSValue* intead of JSCell*.
457         (KJS::PropertySlot::setStaticEntry): Ditto.
458         (KJS::PropertySlot::setCustom): Ditto.
459         (KJS::PropertySlot::setCustomIndex): Ditto.
460         (KJS::PropertySlot::setCustomNumeric): Ditto.
461         (KJS::PropertySlot::slotBase): Moved inline here since it no longer involves a
462         downcast to JSObject*.
463         (KJS::PropertySlot::setBase): Changed to JSValue*.
464
465         * kjs/string_object.cpp:
466         (KJS::StringInstance::getOwnPropertySlot): Changed to use getStringPropertySlot
467         instead of coding the properties here. This allows sharing the code with StringImp.
468
469         * kjs/string_object.h: Removed inlineGetOwnPropertySlot, lengthGetter, and indexGetter.
470         Made one of the constructors protected.
471
472         * kjs/value.h: Made getOwnPropertySlot private in the JSCell class -- this is better
473         since it's not the real JSObject getOwnPropertySlot semantic and most callers shouldn't
474         use it.
475
476 2008-06-12  Alexey Proskuryakov  <ap@webkit.org>
477
478         Reviewed by Maciej.
479
480         Preparation to making JavaScript heap per-thread.
481
482         * kjs/collector.cpp:
483         (KJS::Collector::collect):
484         * kjs/collector.h:
485         (KJS::Collector::markListSet):
486         The collector now holds the list of protected lists itself, to be made per-instance.
487
488         * kjs/list.h: Changed to hold a pointer to a mark set this list is in, if any.
489         (KJS::List::List): Explicitly initialize m_size with zero, as m_vector.size() is
490         guaranteed to be such anyway.
491         (KJS::List::append): Changed the fast case to only be executed as long as inline buffer
492         is used, because otherwise, we now do more expensive checks.
493
494         * kjs/list.cpp:
495         (KJS::List::markLists): Renamed from markProtectedListsSlowCase, made it take the list set
496         as a parameter.
497         (KJS::List::slowAppend): If a non-immediate value is appended, the list needs to be added
498         to an appropriate Heap's protected list. For now, a static Collector::markListSet() is
499         used, but the code is layed out in preparation to making the switch to multiple heaps.
500
501         * JavaScriptCore.exp: Updated export list.
502
503 2008-06-12  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
504
505         Reviewed by Maciej.
506
507         Bug 19510: CodeBlock::needsFullScopeChain not always set for global code
508         <https://bugs.webkit.org/show_bug.cgi?id=19510>
509
510         This fixes the symptoms by using CodeGenerator::m_codeType to determine
511         when to use temporaries instead of CodeBlock::needsFullScopeChain, but
512         it does not fix the problem itself.
513
514         * VM/CodeGenerator.h:
515         (KJS::CodeGenerator::leftHandSideNeedsCopy):
516
517 2008-06-11  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
518
519         Reviewed by Maciej.
520
521         Bug 19498: REGRESSION (r34497): crash while loading GMail
522         <https://bugs.webkit.org/show_bug.cgi?id=19498>
523
524         * VM/CodeGenerator.cpp:
525         (KJS::CodeGenerator::emitJumpIfTrueMayCombine):
526         (KJS::CodeGenerator::emitJumpIfTrue):
527         * VM/CodeGenerator.h:
528         * kjs/nodes.cpp:
529         (KJS::DoWhileNode::emitCode):
530         (KJS::WhileNode::emitCode):
531         (KJS::ForNode::emitCode):
532         (KJS::CaseBlockNode::emitCodeForBlock):
533
534 2008-06-11  Darin Adler  <darin@apple.com>
535
536         Reviewed by Maciej.
537
538         - a little bit of cleanup and prep for some upcoming optimizations
539
540         * JavaScriptCore.exp: Re-sorted this file (with sort command line tool).
541         * VM/CodeBlock.cpp:
542         (KJS::CodeBlock::dump): Fixed printf to avoid warnings -- to use %lu we
543         need to make sure the type is unsigned long.
544         * kjs/object.cpp:
545         (KJS::Error::create): Eliminated unused error names array, and also put
546         the strings into the code since there was already a switch statment.
547         This also avoids having to contemplate a hypothetical access past the
548         end of the array.
549         * kjs/object.h: Got rid of errorNames.
550         * kjs/property_slot.cpp: Deleted unused ungettableGetter.
551         * kjs/property_slot.h: Ditto.
552         * wtf/AlwaysInline.h: Added LIKELY alongside UNLIKELY.
553
554 2008-06-11  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
555
556         Reviewed by Darin.
557
558         Bug 19457: Create fused opcodes for tests and conditional jumps
559         <https://bugs.webkit.org/show_bug.cgi?id=19457>
560
561         Add a new jless instruction, and modify the code generator to emit it
562         instead of the pair (less, jtrue).
563
564         Gives a 3.6% improvement on SunSpider.
565
566         * VM/CodeBlock.cpp:
567         (KJS::CodeBlock::dump):
568         * VM/CodeGenerator.cpp:
569         (KJS::CodeGenerator::CodeGenerator):
570         (KJS::CodeGenerator::emitOpcode):
571         (KJS::CodeGenerator::retrieveLastBinaryOp):
572         (KJS::CodeGenerator::rewindBinaryOp):
573         (KJS::CodeGenerator::emitJump):
574         (KJS::CodeGenerator::emitJumpIfTrue):
575         (KJS::CodeGenerator::emitJumpIfFalse):
576         (KJS::CodeGenerator::emitMove):
577         (KJS::CodeGenerator::emitNot):
578         (KJS::CodeGenerator::emitEqual):
579         (KJS::CodeGenerator::emitNotEqual):
580         (KJS::CodeGenerator::emitStrictEqual):
581         (KJS::CodeGenerator::emitNotStrictEqual):
582         (KJS::CodeGenerator::emitLess):
583         (KJS::CodeGenerator::emitLessEq):
584         (KJS::CodeGenerator::emitPreInc):
585         (KJS::CodeGenerator::emitPreDec):
586         (KJS::CodeGenerator::emitPostInc):
587         (KJS::CodeGenerator::emitPostDec):
588         (KJS::CodeGenerator::emitToJSNumber):
589         (KJS::CodeGenerator::emitNegate):
590         (KJS::CodeGenerator::emitAdd):
591         (KJS::CodeGenerator::emitMul):
592         (KJS::CodeGenerator::emitDiv):
593         (KJS::CodeGenerator::emitMod):
594         (KJS::CodeGenerator::emitSub):
595         (KJS::CodeGenerator::emitLeftShift):
596         (KJS::CodeGenerator::emitRightShift):
597         (KJS::CodeGenerator::emitUnsignedRightShift):
598         (KJS::CodeGenerator::emitBitAnd):
599         (KJS::CodeGenerator::emitBitXOr):
600         (KJS::CodeGenerator::emitBitOr):
601         (KJS::CodeGenerator::emitBitNot):
602         (KJS::CodeGenerator::emitInstanceOf):
603         (KJS::CodeGenerator::emitTypeOf):
604         (KJS::CodeGenerator::emitIn):
605         (KJS::CodeGenerator::emitLoad):
606         (KJS::CodeGenerator::emitNewObject):
607         (KJS::CodeGenerator::emitNewArray):
608         (KJS::CodeGenerator::emitResolve):
609         (KJS::CodeGenerator::emitGetScopedVar):
610         (KJS::CodeGenerator::emitPutScopedVar):
611         (KJS::CodeGenerator::emitResolveBase):
612         (KJS::CodeGenerator::emitResolveWithBase):
613         (KJS::CodeGenerator::emitResolveFunction):
614         (KJS::CodeGenerator::emitGetById):
615         (KJS::CodeGenerator::emitPutById):
616         (KJS::CodeGenerator::emitPutGetter):
617         (KJS::CodeGenerator::emitPutSetter):
618         (KJS::CodeGenerator::emitDeleteById):
619         (KJS::CodeGenerator::emitGetByVal):
620         (KJS::CodeGenerator::emitPutByVal):
621         (KJS::CodeGenerator::emitDeleteByVal):
622         (KJS::CodeGenerator::emitPutByIndex):
623         (KJS::CodeGenerator::emitNewFunction):
624         (KJS::CodeGenerator::emitNewRegExp):
625         (KJS::CodeGenerator::emitNewFunctionExpression):
626         (KJS::CodeGenerator::emitCall):
627         (KJS::CodeGenerator::emitReturn):
628         (KJS::CodeGenerator::emitEnd):
629         (KJS::CodeGenerator::emitConstruct):
630         (KJS::CodeGenerator::emitPushScope):
631         (KJS::CodeGenerator::emitPopScope):
632         (KJS::CodeGenerator::emitDebugHook):
633         (KJS::CodeGenerator::emitComplexJumpScopes):
634         (KJS::CodeGenerator::emitJumpScopes):
635         (KJS::CodeGenerator::emitNextPropertyName):
636         (KJS::CodeGenerator::emitGetPropertyNames):
637         (KJS::CodeGenerator::emitCatch):
638         (KJS::CodeGenerator::emitThrow):
639         (KJS::CodeGenerator::emitNewError):
640         (KJS::CodeGenerator::emitJumpSubroutine):
641         (KJS::CodeGenerator::emitSubroutineReturn):
642         * VM/CodeGenerator.h:
643         * VM/Machine.cpp:
644         (KJS::Machine::privateExecute):
645         * VM/Opcode.cpp:
646         (KJS::):
647         * VM/Opcode.h:
648
649 2008-06-11  Darin Adler  <darin@apple.com>
650
651         Reviewed by Alexey.
652
653         - fix https://bugs.webkit.org/show_bug.cgi?id=19442
654           JavaScript array implementation doesn't maintain m_numValuesInVector when sorting
655
656         * kjs/array_instance.cpp:
657         (KJS::ArrayInstance::checkConsistency): Added. Empty inline version for when
658         consistency checks are turned off.
659         (KJS::ArrayInstance::ArrayInstance): Check consistency after construction.
660         (KJS::ArrayInstance::~ArrayInstance): Check consistency before destruction.
661         (KJS::ArrayInstance::put): Check consistency before and after.
662         (KJS::ArrayInstance::deleteProperty): Ditto.
663         (KJS::ArrayInstance::setLength): Ditto.
664         (KJS::compareByStringPairForQSort): Use typedef for clarity.
665         (KJS::ArrayInstance::sort): Check consistency before and after. Also broke the loop
666         to set up sorting into two separate passes. Added FIXMEs about various exception
667         safety issues. Added code to set m_numValuesInVector after sorting.
668         (KJS::ArrayInstance::compactForSorting): Ditto.
669
670         * kjs/array_instance.h: Added a definition of an enum for the types of consistency
671         check and a declaration of the consistency checking function.
672
673 2008-06-10  Kevin Ollivier  <kevino@theolliviers.com>
674
675         wx build fix. Link against libedit on Mac since HAVE(READLINE) is defined there.
676
677         * jscore.bkl:
678
679 2008-06-10  Alexey Proskuryakov  <ap@webkit.org>
680
681         Reviewed by Darin.
682
683         https://bugs.webkit.org/show_bug.cgi?id=16503
684         match limit takes at least 13% of the time on the SunSpider regexp-dna test
685
686         Make the limit test slightly more efficient. It is not clear how much of a win it is,
687         as the improvement on regexp-dna varies from 2.3% to 0.6% depending on what revision I
688         apply the patch to. Today, the win on regexp-dna was minimal, but the total win was whopping
689         0.5%, due to random code generation changes.
690
691         * pcre/pcre_exec.cpp: (match): Avoid loading a constant on each iteration.
692
693 2008-06-09  Alp Toker  <alp@nuanti.com>
694
695         gcc3/autotools build fix. Add explicit -O2 -fno-strict-aliasing to
696         each of the tools since these are no longer set globally.
697
698         * GNUmakefile.am:
699
700 2008-06-09  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
701
702         Reviewed by Sam.
703
704         Add an include for readline/history.h to fix the build for Darwin users
705         with the GNU readline library installed. Also, clean up the style of
706         the HAVE(READLINE) check.
707
708         * kjs/testkjs.cpp:
709         (runInteractive):
710
711 2008-06-09  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
712
713         Reviewed by Darin.
714
715         Bug 17531: Add interactive mode to testkjs
716         <https://bugs.webkit.org/show_bug.cgi?id=17531>
717
718         This is a cleaned up version of Sam's earlier patch to add an
719         interactive mode to testkjs.
720
721         Readline support is only enabled on Darwin platforms for now, but
722         other ports can enable it by defining HAVE_READLINE in kjs/config.h.
723
724         * JavaScriptCore.xcodeproj/project.pbxproj:
725         * kjs/config.h:
726         * kjs/testkjs.cpp:
727         (Options::Options):
728         (runWithScripts):
729         (runInteractive):
730         (printUsageStatement):
731         (parseArguments):
732         (kjsmain):
733
734 2008-06-08  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
735
736         Reviewed by Darin.
737
738         Bug 19346: REGRESSION: Mootools 1.2 Class inheritance broken in post-SquirrelFish merge
739         <https://bugs.webkit.org/show_bug.cgi?id=19346>
740
741         A check for whether a function's caller is eval code accidentally included
742         the case where the caller's caller is native code. Add a CodeType field to
743         CodeBlock and use this for the eval caller test instead.
744
745         * VM/CodeBlock.h:
746         (KJS::CodeBlock::CodeBlock):
747         (KJS::ProgramCodeBlock::ProgramCodeBlock):
748         (KJS::EvalCodeBlock::EvalCodeBlock):
749         * VM/Machine.cpp:
750         (KJS::getCallerFunctionOffset):
751         * kjs/nodes.cpp:
752         (KJS::FunctionBodyNode::generateCode):
753         (KJS::ProgramNode::generateCode):
754
755 2008-06-07  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
756
757         Reviewed by Dan Bernstein.
758
759         Bug 17928: testkjs shouldn't require "-f"
760         <https://bugs.webkit.org/show_bug.cgi?id=17928>
761
762         * kjs/testkjs.cpp:
763         (printUsageStatement):
764         (parseArguments):
765
766 2008-06-07  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
767
768         Reviewed by Eric.
769
770         Bug 17548: JavaScriptCore print(a, b) differs from Spidermonkey Behavior
771         <https://bugs.webkit.org/show_bug.cgi?id=17548>
772
773         * kjs/testkjs.cpp:
774         (functionPrint):
775
776 2008-06-07  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
777
778         Reviewed by Sam.
779
780         Bug 17547: JavaScriptCore print() differs from Spidermonkey Behavior
781         <https://bugs.webkit.org/show_bug.cgi?id=17547>
782
783         * kjs/testkjs.cpp:
784         (functionPrint):
785
786 2008-06-07  Alexey Proskuryakov  <ap@webkit.org>
787
788         More build fixes.
789
790         * kjs/JSGlobalData.cpp: Fixed an included file name for case-sensitive file systems, fixed
791         JSGlobalData::threadInstance() for non-multithreaded builds.
792
793 2008-06-07  Alexey Proskuryakov  <ap@webkit.org>
794
795         Build fix - actually adding JSGlobalData.cpp to non-Mac builds!
796
797         * GNUmakefile.am:
798         * JavaScriptCore.pri:
799         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
800         * JavaScriptCoreSources.bkl:
801
802 2008-06-07  Alexey Proskuryakov  <ap@webkit.org>
803
804         Try to fix Gtk/gcc 4.3 build.
805
806         * kjs/JSGlobalData.h: Include ustring.h instead of forward-declaring UString::Rep.
807
808 2008-06-06  Alexey Proskuryakov  <ap@webkit.org>
809
810         Reviewed by Darin.
811
812         Combine per-thread objects into one, to make it easier to support legacy clients (for
813         which they shouldn't be really per-thread).
814
815         No change on SunSpider total.
816
817         * JavaScriptCore.xcodeproj/project.pbxproj: Added JSGlobalData.{h,cpp}
818
819         * kjs/JSGlobalData.cpp: Added.
820         (KJS::JSGlobalData::JSGlobalData):
821         (KJS::JSGlobalData::~JSGlobalData):
822         (KJS::JSGlobalData::threadInstance):
823         * kjs/JSGlobalData.h: Added.
824         This class encapsulates all data that should be per-thread (or shared between legacy clients).
825         It will also keep a Heap pointer, but right now, Heap (Collector) methods are all static.
826
827         * kjs/identifier.h:
828         (KJS::Identifier::Identifier):
829         Added a constructor explicitly taking JSGlobalData to access IdentifierTable. Actually,
830         all of them should, but this will be a separate patch.
831
832         * kjs/identifier.cpp:
833         (KJS::IdentifierTable::literalTable):
834         (KJS::createIdentifierTable):
835         (KJS::deleteIdentifierTable):
836         (KJS::Identifier::add):
837         (KJS::Identifier::addSlowCase):
838         Combined IdentifierTable and LiteralIdentifierTable into a single class for simplicity.
839
840         * kjs/grammar.y: kjsyyparse now takes JSGlobalData, not just a Lexer.
841
842         * kjs/nodes.cpp:
843         (KJS::Node::Node):
844         (KJS::EvalFunctionCallNode::emitCode):
845         (KJS::ScopeNode::ScopeNode):
846         Changed to access Lexer and Parser via JSGlobalData::threadInstance(). This is also a
847         temporary measure, they will need to use JSGlobalData explicitly.
848
849         * VM/CodeGenerator.cpp:
850         (KJS::CodeGenerator::CodeGenerator):
851         * VM/CodeGenerator.h:
852         * VM/Machine.cpp:
853         (KJS::callEval):
854         * kjs/CommonIdentifiers.cpp:
855         (KJS::CommonIdentifiers::CommonIdentifiers):
856         * kjs/CommonIdentifiers.h:
857         * kjs/DebuggerCallFrame.cpp:
858         (KJS::DebuggerCallFrame::evaluate):
859         * kjs/ExecState.cpp:
860         (KJS::ExecState::ExecState):
861         * kjs/ExecState.h:
862         (KJS::ExecState::globalData):
863         (KJS::ExecState::identifierTable):
864         (KJS::ExecState::propertyNames):
865         (KJS::ExecState::emptyList):
866         (KJS::ExecState::lexer):
867         (KJS::ExecState::parser):
868         (KJS::ExecState::arrayTable):
869         (KJS::ExecState::dateTable):
870         (KJS::ExecState::mathTable):
871         (KJS::ExecState::numberTable):
872         (KJS::ExecState::RegExpImpTable):
873         (KJS::ExecState::RegExpObjectImpTable):
874         (KJS::ExecState::stringTable):
875         * kjs/InitializeThreading.cpp:
876         (KJS::initializeThreadingOnce):
877         * kjs/JSGlobalObject.cpp:
878         (KJS::JSGlobalObject::init):
879         * kjs/JSGlobalObject.h:
880         (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData):
881         (KJS::JSGlobalObject::head):
882         (KJS::JSGlobalObject::globalData):
883         * kjs/Parser.cpp:
884         (KJS::Parser::parse):
885         * kjs/Parser.h:
886         * kjs/function.cpp:
887         (KJS::FunctionImp::getParameterName):
888         (KJS::IndexToNameMap::unMap):
889         (KJS::globalFuncEval):
890         * kjs/function_object.cpp:
891         (KJS::FunctionObjectImp::construct):
892         * kjs/interpreter.cpp:
893         (KJS::Interpreter::checkSyntax):
894         (KJS::Interpreter::evaluate):
895         * kjs/lexer.cpp:
896         (kjsyylex):
897         * kjs/lexer.h:
898         * kjs/testkjs.cpp:
899         (prettyPrintScript):
900         Updated for the above changes. Most of threadInstance uses here will need to be replaced with
901         explicitly passed pointers to support legacy JSC clients.
902
903         * JavaScriptCore.exp: Removed KJS::parser().
904
905 2008-06-06  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
906
907         Reviewed by Oliver.
908
909         Bug 19424: Add support for logging opcode pair counts
910         <https://bugs.webkit.org/show_bug.cgi?id=19424>
911
912         * VM/Machine.cpp:
913         (KJS::Machine::privateExecute):
914         * VM/Opcode.cpp:
915         (KJS::OpcodeStats::OpcodeStats):
916         (KJS::compareOpcodeIndices):
917         (KJS::compareOpcodePairIndices):
918         (KJS::OpcodeStats::~OpcodeStats):
919         (KJS::OpcodeStats::recordInstruction):
920         (KJS::OpcodeStats::resetLastInstruction):
921         * VM/Opcode.h:
922
923 2008-06-06  Kevin McCullough  <kmccullough@apple.com>
924
925         Reviewed by Adam.
926
927         <rdar://problem/5969992> JSProfiler: Remove the recursion limit in the
928         profiler.
929         - Change the remaining functions that do not take arguments, from using
930         recursion to using iteration.
931
932         * JavaScriptCore.exp:
933         * profiler/Profile.cpp:
934         (KJS::stopProfiling):
935         (KJS::restoreAll):
936         (KJS::Profile::stopProfiling): Use foreach instead of recursion.
937         (KJS::Profile::restoreAll): Ditto.
938         * profiler/Profile.h:
939         * profiler/ProfileNode.cpp: Remove recursion.
940         (KJS::ProfileNode::stopProfiling):
941         (KJS::ProfileNode::restore):
942         * profiler/ProfileNode.h:
943
944 2008-06-05  Oliver Hunt  <oliver@apple.com>
945
946         Reviewed by Alexey.
947
948         Fix Greater and GreaterEq nodes to emit code for the left
949         and right sub-expressions in the correct order.
950
951         * kjs/nodes.cpp:
952         (KJS::GreaterNode::emitCode):
953         (KJS::GreaterEqNode::emitCode):
954
955 2008-06-05  Antti Koivisto  <antti@apple.com>
956
957         Reviewed by Alp Toker.
958         
959         Fix whitespaces.
960
961         * kjs/collector.cpp:
962         (KJS::getPlatformThreadRegisters):
963
964 2008-06-05  Antti Koivisto  <antti@apple.com>
965
966         Reviewed by Darin.
967         
968         Support compiling JavaScriptCore for ARM.
969
970         * kjs/collector.cpp:
971         (KJS::getPlatformThreadRegisters):
972         (KJS::otherThreadStackPointer):
973
974 2008-06-05  Kevin McCullough  <kmccullough@apple.com>
975
976         Reviewed by Jon.
977
978         - Name changes.
979
980         * JavaScriptCore.exp:
981         * profiler/Profile.cpp:
982         (KJS::Profile::Profile):
983         (KJS::Profile::stopProfiling):
984         (KJS::Profile::didExecute):
985         (KJS::Profile::forEach):
986         (KJS::Profile::debugPrintData):
987         (KJS::Profile::debugPrintDataSampleStyle):
988         * profiler/Profile.h:
989         (KJS::Profile::callTree):
990         (KJS::Profile::totalTime):
991         (KJS::Profile::sortTotalTimeDescending):
992         (KJS::Profile::sortTotalTimeAscending):
993         (KJS::Profile::sortSelfTimeDescending):
994         (KJS::Profile::sortSelfTimeAscending):
995         (KJS::Profile::sortCallsDescending):
996         (KJS::Profile::sortCallsAscending):
997         (KJS::Profile::sortFunctionNameDescending):
998         (KJS::Profile::sortFunctionNameAscending):
999         (KJS::Profile::focus):
1000         (KJS::Profile::exclude):
1001         (KJS::Profile::restoreAll):
1002
1003 2008-06-05  Geoffrey Garen  <ggaren@apple.com>
1004
1005         Reviewed by Stephanie Lewis.
1006
1007         Added the -fno-move-loop-invariants flag to the pcre_exec.cpp build, to
1008         tell GCC not to perform loop invariant motion, since GCC's loop
1009         invariant motion doesn't do very well with computed goto code.
1010         
1011         SunSpider reports no change.
1012
1013 2008-06-05  Geoffrey Garen  <ggaren@apple.com>
1014
1015         Reviewed by Stephanie Lewis.
1016         
1017         Added the -fno-tree-pre flag to the Machine.cpp build, to tell GCC not
1018         to perform Partial Redundancy Elimination (PRE) on trees in Machine.cpp,
1019         since GCC's PRE doesn't do very well with computed goto code.
1020         
1021         SunSpider reports a .7% speedup.
1022         
1023 2008-06-05  Geoffrey Garen  <ggaren@apple.com>
1024
1025         Reviewed by Stephanie Lewis (or maybe the other way around).
1026         
1027         Minor change to PCRE to help out certain compilers.
1028         
1029         SunSpider reports no change, maybe a small speedup.
1030
1031         * pcre/pcre_exec.cpp:
1032         (match): Use instructionPtr++ a little less, to avoid confusing the
1033         optimizer.
1034
1035 2008-06-05  Alexey Proskuryakov  <ap@webkit.org>
1036
1037         Re-landing an independent part of a previously rolled out threading patch.
1038
1039         * wtf/ThreadSpecific.h: Make sure to initialize POD thread-specific varaibles, too
1040         (replaced "new T" with "new T()").
1041
1042 2008-06-05  Maciej Stachowiak  <mjs@apple.com>
1043
1044         Reviewed by Hyatt.
1045         
1046         - force inlining of a template function that only has one call site per specialization
1047         1.3% speedup on SunSpider
1048
1049         * kjs/collector.cpp:
1050         (KJS::Collector::heapAllocate): This template function is only
1051         called from allocate() and allocateNumber() (once per
1052         specialization) and the extra call overhead for GC allocation
1053         shows up, so force inlining.
1054
1055 2008-06-05  Maciej Stachowiak  <mjs@apple.com>
1056
1057         Reviewed by Alexey and Oliver.
1058         
1059         - remove profiler fetch hack
1060         I measure an 0.5% progression from this, others show a wash. It seems not needed any more.
1061
1062         * VM/Machine.cpp:
1063         (KJS::Machine::privateExecute):
1064
1065 2008-06-05  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
1066
1067         Reviewed by Maciej.
1068
1069         Bug 19400: subscript operator does not protect base when necessary
1070         <https://bugs.webkit.org/show_bug.cgi?id=19400>
1071
1072         Use a temporary for the base in BracketAccessorNode if the subscript
1073         might possibly modify it.
1074
1075         * kjs/grammar.y:
1076         * kjs/nodes.cpp:
1077         (KJS::BracketAccessorNode::emitCode):
1078         * kjs/nodes.h:
1079         (KJS::BracketAccessorNode::):
1080
1081 2008-06-04  Sam Weinig  <sam@webkit.org>
1082
1083         Reviewed by Maciej Stachowiak.
1084
1085         Big cleanup of formatting and whitespace.
1086
1087 2008-06-04  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
1088
1089         Reviewed by Oliver.
1090
1091         Add an option to dump statistics on executed instructions.
1092
1093         * VM/Machine.cpp:
1094         (KJS::Machine::privateExecute):
1095         * VM/Opcode.cpp:
1096         (KJS::):
1097         (KJS::OpcodeStats::~OpcodeStats):
1098         (KJS::OpcodeStats::recordInstruction):
1099         * VM/Opcode.h:
1100
1101 2008-06-04  Kevin McCullough  <kmccullough@apple.com>
1102
1103         Reviewed by Geoff.
1104
1105         <rdar://problem/5969992> JSProfiler: Remove the recursion limit in the
1106         profiler.
1107         - This patch removes the use of recursion for the sort functions.
1108
1109         * JavaScriptCore.exp: Change the signatures of the functions being
1110         exported.
1111         * profiler/Profile.cpp:
1112         (KJS::Profile::sort): This generic function will accept any of the
1113         static sort functions and apply them to the whole tree.
1114         * profiler/Profile.h: All of the sorting functions now call the new
1115         sort() function.
1116         (KJS::Profile::sortTotalTimeDescending):
1117         (KJS::Profile::sortTotalTimeAscending):
1118         (KJS::Profile::sortSelfTimeDescending):
1119         (KJS::Profile::sortSelfTimeAscending):
1120         (KJS::Profile::sortCallsDescending):
1121         (KJS::Profile::sortCallsAscending):
1122         (KJS::Profile::sortFunctionNameDescending):
1123         (KJS::Profile::sortFunctionNameAscending):
1124         * profiler/ProfileNode.cpp:
1125         (KJS::ProfileNode::ProfileNode): m_head used to point to the head node
1126         if this was the head node.  It now points to null to make iteration easy
1127         (KJS::ProfileNode::willExecute): Now must check if m_head is null, this
1128         check used to happend in the constructor.
1129         (KJS::ProfileNode::stopProfiling): Again the check is slightly different
1130         to determine if this is the head.
1131         (KJS::ProfileNode::traverseNextNode): This function returns the next
1132         node in post order.
1133         (KJS::ProfileNode::sort): This generic function will sort according to
1134         the comparator passed in, then reset the children pointers to macth the
1135         new order.
1136         * profiler/ProfileNode.h: The sorting function were removed from the
1137         definition file and instead use the new generic sort() function
1138         (KJS::ProfileNode::totalPercent): because the head can now be empty we
1139         need to check here too for the head node.
1140         (KJS::ProfileNode::selfPercent): Ditto
1141         (KJS::ProfileNode::firstChild): This function is necessary for the 
1142         iterative algorithm in Profile.cpp.
1143         (KJS::ProfileNode::sortTotalTimeDescending):
1144         (KJS::ProfileNode::sortTotalTimeAscending):
1145         (KJS::ProfileNode::sortSelfTimeDescending):
1146         (KJS::ProfileNode::sortSelfTimeAscending):
1147         (KJS::ProfileNode::sortCallsDescending):
1148         (KJS::ProfileNode::sortCallsAscending):
1149         (KJS::ProfileNode::sortFunctionNameDescending):
1150         (KJS::ProfileNode::sortFunctionNameAscending):
1151         (KJS::ProfileNode::childrenBegin):
1152         (KJS::ProfileNode::childrenEnd):
1153         (KJS::ProfileNode::totalTimeDescendingComparator):
1154         (KJS::ProfileNode::totalTimeAscendingComparator):
1155         (KJS::ProfileNode::selfTimeDescendingComparator):
1156         (KJS::ProfileNode::selfTimeAscendingComparator):
1157         (KJS::ProfileNode::callsDescendingComparator):
1158         (KJS::ProfileNode::callsAscendingComparator):
1159         (KJS::ProfileNode::functionNameDescendingComparator):
1160         (KJS::ProfileNode::functionNameAscendingComparator):
1161
1162 2008-06-04  Alexey Proskuryakov  <ap@webkit.org>
1163
1164         Reviewed by Darin.
1165
1166         Fix JSClassCreate to work with old JSCore API threading model.
1167
1168         No change on SunSpider.
1169
1170         * API/JSClassRef.cpp: (OpaqueJSClass::OpaqueJSClass): Since JSClass is constructed without
1171         a context, there is no way for it to create Identifiers.
1172         Also, added initializeThreading(), just for good measure.
1173
1174         * API/JSCallbackObjectFunctions.h: (KJS::::getPropertyNames): Make an Identifier out of the
1175         string here, because propertyNames.add() needs that.
1176
1177         * kjs/identifier.cpp:
1178         * kjs/identifier.h:
1179         (KJS::Identifier::equal):
1180         * kjs/ustring.cpp:
1181         (KJS::equal):
1182         Moved equal() from identifier.h to ustring.h, because it's not really about Identifiers,
1183         and to make it possible to use it from StrHash.
1184         Include StrHash.h from ustring.h to avoid having the behavior depend on headers that happen
1185         to be included.
1186
1187         * wtf/StrHash.h: Removed.
1188         * kjs/ustring.h: Made RefPtr<UString::Rep> use the same default hash as UString::Rep* (it
1189         used to default to pointer equality). Moved the whole StrHash header into ustring.h.
1190
1191         * JavaScriptCore.exp: Export equal() for WebCore use (this StrHash is used in c_class.cpp,
1192         jni_class.cpp, and npruntime.cpp).
1193
1194 2008-06-04  Alexey Proskuryakov  <ap@webkit.org>
1195
1196         Rubber-stamped by Darin.
1197
1198         Fix spacing in collector.{h,cpp}.
1199
1200         * kjs/collector.cpp:
1201         * kjs/collector.h:
1202
1203 2008-06-03  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
1204
1205         Reviewed by Maciej.
1206
1207         Build fix. The cleanup in r34355 missed a method.
1208
1209         * kjs/nodes.cpp:
1210         * kjs/nodes.h:
1211
1212 2008-06-03  Darin Adler  <darin@apple.com>
1213
1214         Reviewed by Geoff.
1215
1216         - https://bugs.webkit.org/show_bug.cgi?id=19269
1217           speed up SunSpider by eliminating the toObject call for most get/put/delete
1218
1219         Makes standalone SunSpider 1.025x as fast as before.
1220
1221         The getOwnPropertySlot virtual function now takes care of the toObject call
1222         for get. Similarly, the put function (and later deleteProperty) does the
1223         same for those operations. To do this, the virtual functions were moved from
1224         the JSObject class to the JSCell class. Also, since the caller no longer knows
1225         the identity of the "original object", which is used by JavaScript-function
1226         based getters, changed the PropertySlot class so the original object is
1227         already stored in the slot when getOwnPropertySlot is called, if the caller
1228         intends to call getValue.
1229
1230         This affected the old interpreter code enough that the easiest thing for me
1231         was to just delete it. While I am not certain the mysterious slowdown is not
1232         still occurring, the net change is definitely a significant speedup.
1233
1234         * JavaScriptCore.exp: Updated.
1235
1236         * VM/Machine.cpp: Moved the UNLIKELY macro into AlwaysInline.h.
1237         (KJS::resolve): Set up the originalObject in the PropertySlot before
1238         calling getPropertySlot. Also removed the originalObject argument from
1239         getValue.
1240         (KJS::resolve_skip): Ditto.
1241         (KJS::resolveBaseAndProperty): Ditto.
1242         (KJS::resolveBaseAndFunc): Ditto.
1243         (KJS::Machine::privateExecute): Removed the toObject calls from the get and
1244         put functions where possible, instead calling directly with JSValue and letting
1245         the JSValue and JSCell calls handle toObject. Same for toThisObject.
1246
1247         * kjs/ExecState.h: Removed OldInterpreterExecState.
1248
1249         * API/JSBase.cpp: Updated includes.
1250
1251         * kjs/LocalStorageEntry.h: Removed contents. Later we can remove the file too.
1252
1253         * kjs/array_instance.cpp:
1254         (KJS::ArrayInstance::lengthGetter): Removed originalObject argumet.
1255         (KJS::ArrayInstance::inlineGetOwnPropertySlot): Don't pass a base value to
1256         setValueSlot. Also use UNLIKELY around the "getting elements past the end of
1257         the array" code path; less common than successfully getting an element.
1258
1259         * kjs/array_object.cpp:
1260         (KJS::getProperty): Initialize the PropertySlot with the original object.
1261         Don't pass the original object to the get function.
1262         (KJS::arrayProtoFuncFilter): Ditto.
1263         (KJS::arrayProtoFuncMap): Ditto.
1264         (KJS::arrayProtoFuncEvery): Ditto.
1265         (KJS::arrayProtoFuncForEach): Ditto.
1266         (KJS::arrayProtoFuncSome): Ditto.
1267
1268         * kjs/function_object.cpp:
1269         (KJS::FunctionObjectImp::construct): Removed an obsolete comment.
1270
1271         * kjs/grammar.y: Eliminated support for some of the node types that were
1272         used to optimize executing from the syntax tree.
1273
1274         * kjs/internal.cpp:
1275         (KJS::StringImp::toThisObject): Added. Same as toObject.
1276         (KJS::NumberImp::toThisObject): Ditto.
1277         (KJS::GetterSetterImp::getOwnPropertySlot): Added. Not reached.
1278         (KJS::GetterSetterImp::put): Ditto.
1279         (KJS::GetterSetterImp::toThisObject): Ditto.
1280
1281         * kjs/internal.h: Added toThisObject to NumberImp for speed.
1282
1283         * kjs/lexer.cpp:
1284         (KJS::Lexer::shift): Changed shift to just do a single character, to unroll
1285         the loop and especially to make the one character case faster.
1286         (KJS::Lexer::setCode): Call shift multiple times instead of passing a number.
1287         (KJS::Lexer::lex): Ditto.
1288         (KJS::Lexer::matchPunctuator): Ditto. Also removed unneeded elses after returns.
1289         (KJS::Lexer::scanRegExp): Ditto.
1290         * kjs/lexer.h: Removed the count argument from shift.
1291
1292         * kjs/math_object.cpp:
1293         (KJS::mathProtoFuncPow): Call jsNaN instead of jsNumber(NaN).
1294
1295         * kjs/nodes.cpp: Removed some of the things needed only for the pre-SquirrelFish
1296         execution model.
1297         (KJS::ForNode::emitCode): Handle cases where some expressions are missing by
1298         not emitting any code at all. The old way was to emit code for "true", but
1299         this is an unnecessary remnant of the old way of doing things.
1300
1301         * kjs/nodes.h: Removed some of the things needed only for the pre-SquirrelFish
1302         execution model.
1303
1304         * kjs/object.cpp:
1305         (KJS::JSObject::fillGetterPropertySlot): Changed to only pass in the getter
1306         function. The old code passed in a base, but it was never used when
1307         actually getting the property; the toThisObject call was pointless. Also
1308         changed to not pass a base for setUndefined.
1309
1310         * kjs/object.h: Added the new JSCell operations to GetterSetterImp.
1311         Never called.
1312         (KJS::JSObject::get): Initialize the object in the PropertySlot and don't
1313         pass it in getValue.
1314         (KJS::JSObject::getOwnPropertySlotForWrite): Removed the base argument
1315         in calls to setValueSlot.
1316         (KJS::JSObject::getOwnPropertySlot): Ditto.
1317         (KJS::JSValue::get): Added. Here because it calls through to JSObject.
1318         A version of JSObject::get that also handles the other types of JSValue
1319         by creating the appropriate wrapper. Saves the virtual call to toObject.
1320         (KJS::JSValue::put): Ditto.
1321         (KJS::JSValue::deleteProperty): Ditto.
1322
1323         * kjs/property_slot.cpp:
1324         (KJS::PropertySlot::undefinedGetter): Removed the originalObject argument.
1325         (KJS::PropertySlot::ungettableGetter): Ditto.
1326         (KJS::PropertySlot::functionGetter): Ditto. Use the value in the base
1327         as the "this" object, which will be set to the original object by the new
1328         PropertySlot initialization code. Also call toThisObject. The old code did
1329         not do this, but needed to so we can properly handle the activation object
1330         like the other similar code paths.
1331
1332         * kjs/property_slot.h:
1333         (KJS::PropertySlot::PropertySlot): Added a constructor that takes a base
1334         object. In debug builds, set the base to 0 if you don't pass one.
1335         (KJS::PropertySlot::getValue): Don't take or pass the originalObject.
1336         (KJS::PropertySlot::setValueSlot): Don't take a base object, and clear the
1337         base object in debug builds.
1338         (KJS::PropertySlot::setGetterSlot): Ditto.
1339         (KJS::PropertySlot::setUndefined): Ditto.
1340         (KJS::PropertySlot::setUngettable): Ditto.
1341         (KJS::PropertySlot::slotBase): Assert that a base object is present.
1342         This will fire if someone actually calls the get function without having
1343         passed in a base object and the getter needs it.
1344         (KJS::PropertySlot::setBase): Added. Used by the code that implements
1345         toObject so it can supply the original object after the fact.
1346         (KJS::PropertySlot::clearBase): Added. Clears the base, but is debug-only
1347         code because it's an error to fetch the base if you don't have a guarantee
1348         it was set.
1349
1350         * API/JSCallbackObject.h:
1351         * API/JSCallbackObjectFunctions.h:
1352         (KJS::JSCallbackObject::cachedValueGetter):
1353         (KJS::JSCallbackObject::staticValueGetter):
1354         (KJS::JSCallbackObject::staticFunctionGetter):
1355         (KJS::JSCallbackObject::callbackGetter):
1356         * kjs/JSActivation.cpp:
1357         (KJS::JSActivation::getOwnPropertySlot):
1358         (KJS::JSActivation::argumentsGetter):
1359         * kjs/JSActivation.h:
1360         * kjs/JSVariableObject.h:
1361         (KJS::JSVariableObject::symbolTableGet):
1362         * kjs/array_instance.h:
1363         * kjs/function.cpp:
1364         (KJS::FunctionImp::argumentsGetter):
1365         (KJS::FunctionImp::callerGetter):
1366         (KJS::FunctionImp::lengthGetter):
1367         (KJS::Arguments::mappedIndexGetter):
1368         * kjs/function.h:
1369         * kjs/lookup.h:
1370         (KJS::staticFunctionGetter):
1371         (KJS::staticValueGetter):
1372         * kjs/string_object.cpp:
1373         (KJS::StringInstance::lengthGetter):
1374         (KJS::StringInstance::indexGetter):
1375         (KJS::stringInstanceNumericPropertyGetter):
1376         * kjs/string_object.h:
1377         Removed originalObject arguments from getters. Don't pass base values to
1378         the various PropertySlot functions that no longer take them.
1379
1380         * kjs/value.cpp:
1381         (KJS::JSCell::getOwnPropertySlot): Added. Calls toObject and then sets the slot.
1382         This function has to always return true, because the caller can't walk the prototype
1383         chain. Because of that, we do a getPropertySlot, not getOwnPropertySlot, which works
1384         for the caller. This is private, only called by getOwnPropertySlotInternal.
1385         (KJS::JSCell::put): Added. Calls toObject and then put.
1386         (KJS::JSCell::toThisObject): Added. Calls toObject.
1387
1388         * kjs/value.h: Added get, put, and toThisObject to both JSValue
1389         and JSCell. These take care of the toObject operation without an additional virtual
1390         function call, and so make the common "already an object" case faster.
1391
1392         * wtf/AlwaysInline.h: Moved the UNLIKELY macro here for now. Maybe we can find a
1393         better place later, or rename this header.
1394
1395 2008-06-03  Oliver Hunt  <oliver@apple.com>
1396
1397         Reviewed by Tim.
1398
1399         Bug 12983: Web Inspector break on the debugger keyword
1400         <https://bugs.webkit.org/show_bug.cgi?id=12983>
1401
1402         Added a DebuggerStatementNode to handle codegen, and added a new
1403         DidReachBreakPoint debug event (which will hopefully be useful
1404         if we ever move breakpoint management into JSC proper).  Also
1405         added didReachBreakpoint to Debugger to allow us to actually respond
1406         to this event.
1407
1408         * VM/CodeBlock.cpp:
1409         (KJS::debugHookName):
1410         * VM/Machine.cpp:
1411         (KJS::Machine::debug):
1412         * VM/Machine.h:
1413         (KJS::):
1414         * kjs/debugger.h:
1415         * kjs/grammar.y:
1416         * kjs/nodes.cpp:
1417         (KJS::DebuggerStatementNode::emitCode):
1418         (KJS::DebuggerStatementNode::execute):
1419         * kjs/nodes.h:
1420         (KJS::DebuggerStatementNode::):
1421         * kjs/nodes2string.cpp:
1422         (KJS::DebuggerStatementNode::streamTo):
1423
1424 2008-06-03  Maciej Stachowiak  <mjs@apple.com>
1425
1426         Reviewed by Oliver.
1427         
1428         - document remaining opcodes.
1429
1430         * VM/Machine.cpp:
1431         (KJS::Machine::privateExecute): Document call, call_eval,
1432         construct, ret and end opcodes.
1433
1434 2008-06-03  Maciej Stachowiak  <mjs@apple.com>
1435
1436         Reviewed by Oliver.
1437
1438         * VM/Machine.cpp:
1439         (KJS::Machine::privateExecute): Document throw and catch opcodes.
1440
1441 2008-06-02  Geoffrey Garen  <ggaren@apple.com>
1442
1443         Reviewed by Alexey Proskuryakov.
1444
1445         Removed JSObject::call, since it just called JSObject::callAsFunction.
1446
1447         SunSpider reports no change.
1448
1449 2008-06-02  Geoffrey Garen  <ggaren@apple.com>
1450
1451         Reviewed by Darin Adler.
1452         
1453         A little cleanup in the CodeGenerator.
1454
1455         * VM/CodeGenerator.cpp: A few changes here.
1456
1457         (1) Removed remaining cases of the old hack of putting "this" into the
1458         symbol table; replaced with explicit tracking of m_thisRegister.
1459
1460         (2) Made m_thisRegister behave the same for function, eval, and program
1461         code, removing the static programCodeThis() function.
1462
1463         (3) Added a feature to nix a ScopeNode's declaration stacks when done
1464         compiling, to save memory.
1465
1466         (4) Removed code that copied eval declarations into special vectors: we
1467         just use the originals in the ScopeNode now.
1468         
1469         * VM/CodeGenerator.h: Removed unneded parameters from the CodeGenerator
1470         constructor: we just use get that data from the ScopeNode now.
1471
1472         * VM/Machine.cpp:
1473         (KJS::Machine::execute): When executing an eval node, don't iterate a
1474         special copy of its declarations; iterate the originals, instead.
1475
1476         * kjs/nodes.cpp: Moved responsibility for knowing what AST data to throw
1477         away into the CodeGenerator. Nodes no longer call shrinkCapacity on
1478         their data directly.
1479         
1480         * kjs/nodes.h: Changed FunctionStack to ref its contents, so declaration
1481         data stays around even after we've thrown away the AST, unless we explicitly
1482         throw away the declaration data, too. This is useful for eval code, which
1483         needs to reference its declaration data at execution time. (Soon, it will
1484         be useful for program code, too, since program code should do the same.)
1485
1486 2008-06-02  Adam Roben  <aroben@apple.com>
1487
1488         Build fix for non-AllInOne builds
1489
1490         * kjs/array_object.cpp: Added a missing #include.
1491
1492 2008-06-02  Kevin McCullough  <kmccullough@apple.com>
1493
1494         Took out accidental confilct lines I checked in.
1495
1496         * ChangeLog:
1497
1498 2008-06-02  Kevin McCullough  <kmccullough@apple.com>
1499
1500         Reviewed by Darin.
1501
1502         <rdar://problem/5969992> JSProfiler: Remove the recursion limit in the
1503         profiler
1504         Implement Next Sibling pointers as groundwork for removing the recursion
1505         limit in the profiler.
1506
1507         * profiler/ProfileNode.cpp: Also I renamed parentNode and headNode since
1508         'node' is redundant.
1509         (KJS::ProfileNode::ProfileNode): Initialize the nextSibling.
1510         (KJS::ProfileNode::willExecute): If there are already children then the
1511         new child needs to be the nextSibling of the last child.
1512         (KJS::ProfileNode::didExecute):
1513         (KJS::ProfileNode::addChild): Ditto.
1514         (KJS::ProfileNode::stopProfiling):
1515         (KJS::ProfileNode::sortTotalTimeDescending): For all of the sorting
1516         algorithms once the children are sorted their nextSibling pointers need
1517         to be reset to reflect the new order.
1518         (KJS::ProfileNode::sortTotalTimeAscending):
1519         (KJS::ProfileNode::sortSelfTimeDescending):
1520         (KJS::ProfileNode::sortSelfTimeAscending):
1521         (KJS::ProfileNode::sortCallsDescending):
1522         (KJS::ProfileNode::sortCallsAscending):
1523         (KJS::ProfileNode::sortFunctionNameDescending):
1524         (KJS::ProfileNode::sortFunctionNameAscending):
1525         (KJS::ProfileNode::resetChildrensSiblings): This new function simply
1526         loops over all of the children and sets their nextSibling pointers to
1527         the next child in the Vector
1528         (KJS::ProfileNode::debugPrintData):
1529         * profiler/ProfileNode.h:
1530         (KJS::ProfileNode::parent):
1531         (KJS::ProfileNode::setParent):
1532         (KJS::ProfileNode::nextSibling):
1533         (KJS::ProfileNode::setNextSibling):
1534         (KJS::ProfileNode::totalPercent):
1535         (KJS::ProfileNode::selfPercent):
1536
1537 2008-06-02  Geoffrey Garen  <ggaren@apple.com>
1538
1539         Reviewed by Maciej Stachowiak.
1540
1541         Removed the recursion limit from JSObject::call, since the VM does
1542         recursion checking now.
1543
1544         This should allow us to remove JSObject::call entirely, netting a small
1545         speedup.
1546
1547         * kjs/object.cpp:
1548         (KJS::JSObject::call):
1549
1550 2008-06-02  Geoffrey Garen  <ggaren@apple.com>
1551
1552         Reviewed by Adele Peterson.
1553
1554         Added a specific affordance for avoiding stack overflow when converting
1555         recursive arrays to string, in preparation for removing generic stack
1556         overflow checking from JSObject::call.
1557         
1558         Tested by fast/js/toString-stack-overflow.html.
1559
1560 2008-06-02  Geoffrey Garen  <ggaren@apple.com>
1561
1562         Reviewed by Alice Liu.
1563         
1564         Refactored some hand-rolled code to call ScopeChain::globalObject instead.
1565
1566 2008-06-02  Geoffrey Garen  <ggaren@apple.com>
1567
1568         Reviewed by Darin Adler.
1569         
1570         Fixed ASSERT due to execution continuing after an exception is thrown
1571         during array sort.
1572
1573         * kjs/array_instance.cpp:
1574         (KJS::AVLTreeAbstractorForArrayCompare::compare_key_key): Don't call the
1575         custom comparator function if an exception has been thrown. Just return
1576         1 for everything, so the sort completes quickly. (The result will be
1577         thrown away.)
1578
1579 2008-05-30  Timothy Hatcher  <timothy@apple.com>
1580
1581         Made the starting line number of scripts be 1-based throughout the engine.
1582         This cleans up script line numbers so they are all consistent now and fixes
1583         some cases where script execution was shown as off by one line in the debugger.
1584
1585         No change in SunSpider.
1586
1587         Reviewed by Oliver Hunt.
1588
1589         * API/minidom.c:
1590         (main): Pass a line number of 1 instead of 0 to parser().parse().
1591         * API/testapi.c:
1592         (main): Ditto. And removes a FIXME and changed an assertEqualsAsNumber
1593         to use 1 instead of 2 for the line number.
1594         * VM/Machine.cpp:
1595         (KJS::callEval): Pass a line number of 1 instead of 0.
1596         (KJS::Machine::debug): Use firstLine for WillExecuteProgram instead of
1597         lastLine. Use lastLine for DidExecuteProgram instead of firstLine.
1598         * kjs/DebuggerCallFrame.cpp:
1599         (KJS::DebuggerCallFrame::evaluate): Pass a line number of 1 instead of
1600         0 to parser().parse().
1601         * kjs/Parser.cpp:
1602         (KJS::Parser::parse): ASSERT startingLineNumber is greatter than 0. Change
1603         the startingLineNumber to be 1 if it was less than or equal to 0. This is needed
1604         for release builds to maintain compatibility with the JavaScriptCore API.
1605         * kjs/function.cpp:
1606         (KJS::globalFuncEval): Pass a line number of 1 instead of 0 to parser().parse().
1607         * kjs/function_object.cpp:
1608         (FunctionObjectImp::construct): Pass a line number of 1 instead of 0 to construct().
1609         * kjs/lexer.cpp:
1610         (Lexer::setCode): Made yylineno = startingLineNumber instead of adding 1.
1611         * kjs/testkjs.cpp:
1612         (functionRun): Pass a line number of 1 instead of 0 to Interpreter::evaluate().
1613         (functionLoad): Ditto.
1614         (prettyPrintScript): Ditto.
1615         (runWithScripts): Ditto.
1616         * profiler/Profiler.cpp:
1617         (WebCore::createCallIdentifier): Removed a plus 1 of startingLineNumber.
1618
1619 2008-05-30  Alexey Proskuryakov  <ap@webkit.org>
1620
1621         Reviewed by Darin.
1622
1623         https://bugs.webkit.org/show_bug.cgi?id=19180
1624         speed up SunSpider by optimizing immediate number cases
1625
1626         Also fixed a JavaScriptCore regression seen on PowerPC - we didn't clip left shift
1627         parameter to 0...31.
1628
1629         0.5% improvement on SunSpider overall, although a 8.5 regression on bitops-3bit-bits-in-byte.
1630
1631         * VM/Machine.cpp:
1632         (KJS::Machine::privateExecute):
1633
1634         * kjs/JSImmediate.h:
1635         (KJS::JSImmediate::toTruncatedUInt32): Added. Same as getTruncatedInt32, but casts the result
1636         to unsigned.
1637
1638 2008-05-30  Alexey Proskuryakov  <ap@webkit.org>
1639
1640         Reviewed by Oliver Hunt.
1641
1642         https://bugs.webkit.org/show_bug.cgi?id=19180
1643         speed up SunSpider by optimizing immediate number cases
1644
1645         Also fixed two JavaScriptCore regressions seen on PowerPC - we didn't clip right shift
1646         parameter to 0...31.
1647
1648         1.6% improvement on SunSpider, without significant regressions on any tests.
1649
1650         * VM/Machine.cpp:
1651         (KJS::Machine::privateExecute):
1652         Added fast paths for >>, ==, ===, !=, !==. Changed order of memory accesses in many
1653         cases, making them less dependent on gcc's ability to properly assign registers. With this,
1654         I could move exception checks back into slow code paths, and saw less randomness in general.
1655
1656         * kjs/JSImmediate.h:
1657         (KJS::JSImmediate::rightShiftImmediateNumbers):
1658         Added.
1659
1660 2008-05-29  Maciej Stachowiak  <mjs@apple.com>
1661
1662         Reviewed by Oliver.
1663
1664         - fixed <rdar://problem/5972943> REGRESSION(r33979): Flash clips do not play on cnn.com
1665         
1666         Finally blocks could clobber registers that had to remain live
1667         until they returned. This patch takes a conservative approach and
1668         makes sure that finally blocks do not reuse any registers that
1669         were previously allocated for the function. In the future this
1670         could probably be tightened up to be less profligate with the
1671         register allocation.
1672         
1673         * VM/CodeGenerator.cpp:
1674         (KJS::CodeGenerator::highestUsedRegister):
1675         * VM/CodeGenerator.h:
1676         * kjs/nodes.cpp:
1677         (KJS::TryNode::emitCode):
1678
1679 2008-05-29  Steve Falkenburg  <sfalken@apple.com>
1680
1681         Build fix.
1682
1683         * kjs/array_instance.cpp:
1684
1685 2008-05-29  Alexey Proskuryakov  <ap@webkit.org>
1686
1687         Reviewed by Darin.
1688
1689         https://bugs.webkit.org/show_bug.cgi?id=19294
1690         <rdar://problem/5969062> A crash when iterating over a sparse array backwards.
1691
1692         * kjs/array_instance.cpp: Turned sparseArrayCutoff into a macro, so that using max() on it
1693         doesn't cause a PIC branch.
1694         (KJS::ArrayInstance::increaseVectorLength): Added a comment about this function not
1695         preserving class invariants.
1696         (KJS::ArrayInstance::put): Update m_storage after reallocation. Move values that fit to
1697         the vector from the map in all code paths.
1698
1699 2008-05-29  Thiago Macieira  <tjmaciei@trolltech.com>
1700
1701         Reviewed by Simon.
1702
1703         Fix compilation in Solaris with Sun CC
1704
1705         Lots of WebKit code uses C99 functions that, strict as it
1706         is, the Solaris system doesn't provide in C++. So we must define them
1707         for both GCC and the Sun CC.
1708
1709         * wtf/MathExtras.h:
1710
1711 2008-05-28  Oliver Hunt  <oliver@apple.com>
1712
1713         Reviewed by Anders.
1714
1715         Fix codegen for assignment being used as a function.
1716
1717         FunctionCallValueNode::emitCode failed to account for the
1718         potential of the function expression to allocate arbitrary
1719         registers.
1720
1721         * kjs/nodes.cpp:
1722         (KJS::FunctionCallValueNode::emitCode):
1723
1724 2008-05-27  Geoffrey Garen  <ggaren@apple.com>
1725
1726         Reviewed by Tim Hatcher.
1727
1728         Fixed https://bugs.webkit.org/show_bug.cgi?id=19183
1729         REGRESSION (r33979): Crash in DebuggerCallFrame::functionName when
1730         clicking button in returnEvent-crash.html
1731
1732         Added two new debugger hooks, willExecuteProgram and didExecuteProgram,
1733         along with code to generate them, code to invoke them when unwinding
1734         due to an exception, and code to dump them.
1735         
1736         SunSpider reports no change.
1737
1738         * VM/CodeBlock.cpp:
1739         (KJS::debugHookName): I had to mark this function NEVER_INLINE to avoid
1740         a .4% performance regression. The mind boggles.
1741
1742 2008-05-28  Adam Roben  <aroben@apple.com>
1743
1744         Fix JavaScriptCore tests on OS X
1745
1746         We were quoting the path to testkjs too late, after it had already
1747         been combined with spaces and other options.
1748
1749         * tests/mozilla/jsDriver.pl:
1750         (top level): Move path quoting from here...
1751         (sub get_kjs_engine_command): ...to here.
1752
1753 2008-05-28  Anders Carlsson  <andersca@apple.com>
1754
1755         Reviewed by Oliver.
1756
1757         <rdar://problem/5968071> "const f" crashes in JavaScriptCore
1758         
1759         Make sure to null check the initializer.
1760         
1761         * kjs/nodes.cpp:
1762         (KJS::ConstDeclNode::emitCodeSingle):
1763
1764 2008-05-28  Adam Roben  <aroben@apple.com>
1765
1766         Make run-javascriptcore-tests work with a space in the path to testkjs
1767
1768         Reviewed by Alexey Proskuryakov.
1769
1770         * tests/mozilla/jsDriver.pl: Quote the path to the engine so that
1771         spaces will be interpreted correctly.
1772
1773 2008-05-28  Alexey Proskuryakov  <ap@webkit.org>
1774
1775         Fixed a misguiding comment - my measurement for negative numbers only included cases
1776         where both operands were negative, which is not very interesting.
1777
1778         * VM/Machine.cpp:
1779
1780 2008-05-28  Alexey Proskuryakov  <ap@webkit.org>
1781
1782         Reviewed by Maciej.
1783
1784         Based on a patch by Oliver Hunt.
1785
1786         https://bugs.webkit.org/show_bug.cgi?id=19180
1787         speed up SunSpider by optimizing immediate number cases
1788
1789         1.4% speedup on SunSpider.
1790
1791         * VM/Machine.cpp:
1792         (KJS::Machine::privateExecute):
1793         * kjs/JSImmediate.h:
1794         (KJS::JSImmediate::incImmediateNumber):
1795         (KJS::JSImmediate::decImmediateNumber):
1796         Added fast paths for ++ and --.
1797
1798         (KJS::JSImmediate::canDoFastAdditiveOperations): Corrected a comment.
1799
1800 2008-05-28  Alexey Proskuryakov  <ap@webkit.org>
1801
1802         Reviewed by Darin.
1803
1804         https://bugs.webkit.org/show_bug.cgi?id=19180
1805         speed up SunSpider by optimizing immediate number cases
1806
1807         2% speedup overall, maximum 10% on controlflow-recursive and bitops-3bit-bits-in-byte,
1808         but a 4% regression on bitops-bits-in-byte and bitops-bitwise-and.
1809
1810         * kjs/JSImmediate.h:
1811         (KJS::JSImmediate::canDoFastAdditiveOperations):
1812         (KJS::JSImmediate::addImmediateNumbers):
1813         (KJS::JSImmediate::subImmediateNumbers):
1814         Added fast cases that work with positive values less than 2^30.
1815
1816         * VM/Machine.cpp:
1817         (KJS::Machine::privateExecute): Use the above operations. Also updated SunSpider frequencies
1818         with my results (looks like tag values have changed, not sure what caused the minor variation
1819         in actual frequencies).
1820
1821 2008-05-27  Adam Roben  <aroben@apple.com>
1822
1823         Windows build fix
1824
1825         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make:
1826         Remove code that appended Cygwin's /bin directory to PATH.
1827         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj:
1828         Prepend Cygwin's /bin directory to PATH. We prepend instead of append
1829         so that Cygwin's utilities will win out over Win32 versions of the
1830         same utilities (particularly perl). We do the prepend here instead of
1831         in the Makefile because nmake doesn't seem to like prepending to PATH
1832         inside the Makefile. This also matches the way WebCoreGenerated works.
1833
1834 2008-05-27  Adam Roben  <aroben@apple.com>
1835
1836         Roll out r34163
1837
1838         A better fix is on the way.
1839
1840         * DerivedSources.make:
1841         * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh:
1842
1843 2008-05-27  Adam Roben  <aroben@apple.com>
1844
1845         Windows build fix
1846
1847         * DerivedSources.make: Don't generate the bytecode docs if
1848         OMIT_BYTECODE_DOCS is set to 1.
1849         * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh: Set
1850         OMIT_BYTECODE_DOCS for production builds.
1851
1852 2008-05-27  Anders Carlsson  <andersca@apple.com>
1853
1854         Reviewed by Geoff and Maciej.
1855
1856         <rdar://problem/5806428> 
1857         https://bugs.webkit.org/show_bug.cgi?id=17925
1858         Crash in KJS::JSObject::put after setting this.__proto__
1859
1860         Set slotIsWriteable to false for __proto__, we want setting __proto__ to go through JSObject::put instead.
1861         
1862         * kjs/object.h:
1863         (KJS::JSObject::getOwnPropertySlotForWrite):
1864
1865 2008-05-27  Kevin Ollivier  <kevino@theolliviers.com>
1866
1867         wx build fixes to catch up with SquirrelFish, etc.
1868
1869         * JavaScriptCoreSources.bkl:
1870         * jscore.bkl:
1871         * wtf/Platform.h:
1872
1873 2008-05-27  Darin Adler  <darin@apple.com>
1874
1875         Reviewed by Tim Hatcher.
1876
1877         - https://bugs.webkit.org/show_bug.cgi?id=19180
1878           speed up SunSpider by optimizing immediate number cases
1879
1880         Add immediate number cases for the &, |, and ^ operators.
1881         Makes standalone SunSpider 1.010x faster.
1882
1883         * VM/Machine.cpp:
1884         (KJS::Machine::privateExecute): Add areBothImmediateNumbers special cases
1885         for the &, |, and ^ operators.
1886
1887         * kjs/JSImmediate.h:
1888         (KJS::JSImmediate::xorImmediateNumbers): Added.
1889         (KJS::JSImmediate::orImmediateNumbers): Added.
1890
1891 2008-05-26  Stephanie Lewis  <slewis@apple.com>
1892
1893         Windows build fix. 
1894
1895         * kjs/testkjs.cpp:
1896
1897 2008-05-26  Maciej Stachowiak  <mjs@apple.com>
1898
1899         Reviewed by Anders.
1900         
1901         - make addStaticGlobals protected instead of private so subclasses can use it
1902
1903         * JavaScriptCore.exp:
1904         * kjs/JSGlobalObject.h:
1905
1906 2008-05-26  Geoffrey Garen  <ggaren@apple.com>
1907
1908         Reviewed by Darin Adler.
1909         
1910         Fixed <rdar://problem/5960859> After an eval of a non-string or a syntax
1911         error, all profile stack frames are incorrect
1912         
1913         SunSpider reports a .3% speedup, possibly because eval of a string is a
1914         little more efficient now.
1915
1916         * VM/Machine.cpp:
1917         (KJS::callEval): Make sure to call didExecute when returning early. I
1918         simplified this function to remove one early return, making the job
1919         of adding special code to early returns easier.
1920
1921         (KJS::Machine::execute): Use the new function ExecState when notifying
1922         the profiler. (This doesn't change behavior now, but it might prevent
1923         subtle errors in the future.)
1924
1925 2008-05-23  Tor Arne Vestbø  <tavestbo@trolltech.com>
1926
1927         Reviewed by Simon.
1928
1929         Fixed toLower and toUpper implementations to allow being called
1930         with a null result pointer and resultLength, to determine the
1931         number of characters needed for the case conversion.
1932
1933         * wtf/unicode/qt4/UnicodeQt4.h:
1934         (WTF::Unicode::toLower):
1935         (WTF::Unicode::toUpper):
1936
1937 2008-05-25  Alexey Proskuryakov  <ap@webkit.org>
1938
1939         Fixing a typo in the previous commit made as a last minute change.
1940
1941         * kjs/regexp_object.cpp:
1942
1943 2008-05-24  Alexey Proskuryakov  <ap@webkit.org>
1944
1945         Reviewed by Darin.
1946
1947         Changed regular expression matching result array to be lazily filled, because many callers
1948         only care about it being non-null.
1949
1950         2% improvement on Acid3 test 26.
1951
1952         * kjs/array_instance.cpp: Added a void* member to ArrayStorage for ArrayInstance subclasses
1953         to use.
1954         * kjs/array_instance.h:
1955         (KJS::ArrayInstance::lazyCreationData):
1956         (KJS::ArrayInstance::setLazyCreationData):
1957         Added methods to access it from subclasses.
1958
1959         * kjs/regexp_object.cpp:
1960         (KJS::RegExpMatchesArray::RegExpMatchesArray):
1961         (KJS::RegExpMatchesArray::getOwnPropertySlot):
1962         (KJS::RegExpMatchesArray::put):
1963         (KJS::RegExpMatchesArray::deleteProperty):
1964         (KJS::RegExpMatchesArray::getPropertyNames):
1965         (KJS::RegExpMatchesArray::fillArrayInstanceIfNeeded):
1966         (KJS::RegExpMatchesArray::~RegExpMatchesArray):
1967         (KJS::RegExpObjectImp::arrayOfMatches):
1968         RegExpMatchesArray is a subclass of ArrayInstance that isn't filled until
1969         accessed for the first time.
1970
1971 2008-05-24  Alp Toker  <alp@nuanti.com>
1972
1973         Win32/gcc build fix. Remove MSVC assumption.
1974
1975         * wtf/TCSpinLock.h:
1976         (TCMalloc_SlowLock):
1977
1978 2008-05-24  Oleg Finkelshteyn <olegfink@gmail.com>
1979
1980         Rubber-stamped, tweaked and landed by Alexey.
1981
1982         Build fix for gcc 4.3.
1983
1984         * JavaScriptCore/kjs/testkjs.cpp:
1985         * JavaScriptCore/VM/CodeBlock.cpp:
1986         Add missing standard includes.
1987
1988 2008-05-23  Anders Carlsson  <andersca@apple.com>
1989
1990         Reviewed by Geoff.
1991
1992         <rdar://problem/5959886> REGRESSION: Assertion failure in JSImmediate::toString when loading GMail (19217)
1993         
1994         Change List to store a JSValue*** pointer + an offset instead of a JSValue** pointer to protect against the case where 
1995         a register file changes while a list object points to its buffer.
1996         
1997         * VM/Machine.cpp:
1998         (KJS::Machine::privateExecute):
1999         * kjs/JSActivation.cpp:
2000         (KJS::JSActivation::createArgumentsObject):
2001         * kjs/list.cpp:
2002         (KJS::List::getSlice):
2003         * kjs/list.h:
2004         (KJS::List::List):
2005         (KJS::List::at):
2006         (KJS::List::append):
2007         (KJS::List::begin):
2008         (KJS::List::end):
2009         (KJS::List::buffer):
2010
2011 2008-05-23  Kevin McCullough  <kmccullough@apple.com>
2012
2013         Reviewed by Sam.
2014
2015         <rdar://problem/5960012> JSProfiler: Stack overflow if recursion is
2016         too deep.
2017         -Use a simple depth limit to restrict too deep of recursion.
2018
2019         * profiler/Profile.cpp:
2020         (KJS::Profile::willExecute):
2021         (KJS::Profile::didExecute):
2022         * profiler/Profile.h:
2023
2024 2008-05-23  Geoffrey Garen  <ggaren@apple.com>
2025
2026         Rolling back in r34085, with performance resolved.
2027         
2028         Apparently, passing the eval function to callEval gave GCC a hernia.
2029
2030         Reviewed by Darin Adler, Kevin McCullough, and Oliver Hunt.
2031         
2032         Fixed <rdar://problem/5959447> Crashes and incorrect reporting in the
2033         JavaScript profiler
2034
2035         * VM/Machine.cpp:
2036         (KJS::Machine::unwindCallFrame): Fixed incorrect reporting / a crash
2037         when unwinding from inside eval and/or program code: detect the
2038         difference, and do the right thing. Also, be sure to notify the profiler
2039         *before* deref'ing the scope chain, since the profiler uses the scope chain.
2040
2041         (KJS::Machine::execute): Fixed incorrect reporting / crash when calling
2042         a JS function re-entrently: Machine::execute(FunctionBodyNode*...)
2043         should not invoke the didExecute hook, because op_ret already does that.
2044         Also, use the new function's ExecState when calling out to the profiler.
2045         (Not important now, but could have become a subtle bug later.)
2046
2047         (KJS::Machine::privateExecute): Fixed a hard to reproduce crash when
2048         profiling JS functions: notify the profiler *before* deref'ing the scope
2049         chain, since the profiler uses the scope chain.
2050
2051         * kjs/object.cpp:
2052         (KJS::JSObject::call): Removed these hooks, because they are now unnecessary.
2053
2054         * profiler/Profile.cpp: Added a comment to explain a subtlety that only
2055         Kevin and I understood previously. (Now, the whole world can understand!)
2056
2057         * profiler/Profiler.cpp:
2058         (KJS::shouldExcludeFunction): Don't exclude .call and .apply. That was
2059         a hack to fix bugs that no longer exist.
2060
2061         Finally, sped things up a little bit by changing the "Is the profiler
2062         running?" check into an ASSERT, since we only call into the profiler
2063         when it's running:
2064
2065         (KJS::Profiler::willExecute):
2066         (KJS::Profiler::didExecute):
2067
2068 2008-05-23  Geoffrey Garen  <ggaren@apple.com>
2069
2070         Reviewed by Oliver Hunt.
2071
2072         - fixed <rdar://problem/5957662> REGRESSION(r33943-r33980): Can't send email , attach file or save as draft from hotmail.com
2073         
2074         SunSpider reports no change.
2075         
2076         This is a reworking of r34073, which I rolled out because it caused
2077         lots of crashes.
2078
2079         * VM/CodeGenerator.cpp:
2080         (KJS::CodeGenerator::CodeGenerator): Use removeDirect to nix old
2081         properties whose names collide with new functions. (Don't use putWithAttributes
2082         because that tries to write to the register file, which hasn't grown to
2083         fit this program yet.)
2084
2085 2008-05-23  Darin Adler  <darin@apple.com>
2086
2087         Reviewed by Mark Rowe.
2088
2089         As allocateNumber is used via jsNumberCell outside of JavaScriptCore,
2090         we need to provide a non-inlined version of it to avoid creating a
2091         weak external symbol.
2092
2093         * JavaScriptCore.exp:
2094         * kjs/AllInOneFile.cpp:
2095         * kjs/collector.cpp:
2096         (KJS::Collector::allocate):
2097         (KJS::Collector::allocateNumber):
2098         * kjs/collector.h:
2099         (KJS::Collector::allocate):
2100         (KJS::Collector::inlineAllocateNumber):
2101         * kjs/value.h:
2102         (KJS::NumberImp::operator new):
2103
2104 2008-05-23  Geoffrey Garen  <ggaren@apple.com>
2105
2106         Rolled out r34073 because it caused lots of layout test crashes.
2107
2108 2008-05-23  Geoffrey Garen  <ggaren@apple.com>
2109
2110         Rolled out r34085 because it measured as a 7.6% performance regression.
2111
2112 2008-05-23  Adam Roben  <aroben@apple.com>
2113
2114         Windows build fix
2115
2116         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add the
2117         profiler directory to the include path.
2118
2119 2008-05-23  Oliver Hunt  <oliver@apple.com>
2120
2121         Reviewed by Anders.
2122
2123         SQUIRRELFISH: JavaScript error messages are missing informative text
2124
2125         Partial fix.
2126         Tidy up error messages, makes a couple of them provide slightly more info.
2127         Inexplicably leads to a 1% SunSpider Progression.
2128
2129         * VM/ExceptionHelpers.cpp:
2130         (KJS::createError):
2131         (KJS::createInvalidParamError):
2132         (KJS::createNotAConstructorError):
2133         (KJS::createNotAFunctionError):
2134         * VM/ExceptionHelpers.h:
2135         * VM/Machine.cpp:
2136         (KJS::isNotObject):
2137
2138 2008-05-23  Oliver Hunt  <oliver@apple.com>
2139
2140         Reviewed by Tim H.
2141
2142         Fix call stack reported by profiler when entering event handlers.
2143
2144         JSObject::call was arbitrarily notifying the profiler when it was
2145         called, even if it was JS code, which notifies the profile on entry
2146         in any case.
2147
2148         * kjs/object.cpp:
2149         (KJS::JSObject::call):
2150
2151 2008-05-16  Alp Toker  <alp@nuanti.com>
2152
2153         Build fix for gcc 3. Default constructor required in ExecState,
2154         used by OldInterpreterExecState.
2155
2156         * kjs/ExecState.h:
2157         (KJS::ExecState::ExecState):
2158
2159 2008-05-23  Mark Rowe  <mrowe@apple.com>
2160
2161         Reviewed by Oliver Hunt.
2162
2163         Fix <rdar://problem/5954997> global-recursion-on-full-stack.html crashes under guardmalloc.
2164
2165         Growing the register file with uncheckedGrow from within Machine::execute is not safe as the
2166         register file may be too close to its maximum size to grow successfully.  By using grow,
2167         checking the result and throwing a stack overflow error we can avoid crashing.
2168
2169         * VM/Machine.cpp:
2170         (KJS::Machine::execute):
2171         * VM/RegisterFile.h: Remove the now-unused uncheckedGrow.
2172
2173 2008-05-23  Oliver Hunt  <oliver@apple.com>
2174
2175         RS=Kevin McCullough
2176
2177         Remove JAVASCRIPT_PROFILER define
2178
2179         * VM/Machine.cpp:
2180         (KJS::callEval):
2181         (KJS::Machine::unwindCallFrame):
2182         (KJS::Machine::execute):
2183         (KJS::Machine::privateExecute):
2184         * kjs/config.h:
2185         * kjs/object.cpp:
2186         (KJS::JSObject::call):
2187
2188 2008-05-23  Oliver Hunt  <oliver@apple.com>
2189
2190        <rdar://problem/5951561> Turn on JavaScript Profiler
2191
2192         Reviewed by Kevin McCullough.
2193
2194         Flipped the switch on the profiler, rearranged how we
2195         signal the the profiler is active so that calls aren't
2196         needed in the general case.
2197         
2198         Also fixed the entry point for Machine::execute(FunctionBodyNode..)
2199         to correctly indicate function exit.
2200
2201         Results in a 0.7-1.0% regression in SunSpider :-(
2202
2203         * VM/Machine.cpp:
2204         (KJS::callEval):
2205         (KJS::Machine::unwindCallFrame):
2206         (KJS::Machine::execute):
2207         (KJS::Machine::privateExecute):
2208         * kjs/config.h:
2209         * profiler/Profiler.cpp:
2210         (KJS::Profiler::profiler):
2211         (KJS::Profiler::startProfiling):
2212         (KJS::Profiler::stopProfiling):
2213         * profiler/Profiler.h:
2214         (KJS::Profiler::enabledProfilerReference):
2215
2216 2008-05-23  Simon Hausmann  <hausmann@webkit.org>
2217
2218         Fix the Qt build by adding profiler/ to the include search path.
2219
2220         * JavaScriptCore.pri:
2221
2222 2008-05-22  Kevin McCullough  <kmccullough@apple.com>
2223
2224         Reviewed by Adam.
2225
2226         Fix a bug in the profiler where time in the current function is given to
2227         (idle).
2228
2229         * profiler/Profile.cpp:
2230         (KJS::Profile::didExecute): Set the start time and then call didExecute
2231         to calculate the time spent in this function.
2232         * profiler/ProfileNode.cpp: Remove confusing calculations that are no
2233         longer necessary.
2234         (KJS::ProfileNode::insertNode):
2235         * profiler/ProfileNode.h: Expose access to the start time to allow the
2236         simpler time calculations above.
2237         (KJS::ProfileNode::startTime):
2238         (KJS::ProfileNode::setStartTime):
2239
2240 2008-05-22  Adam Roben  <aroben@apple.com>
2241
2242         Show "(Function object)" instead of "(JSInpectorCallbackWrapper
2243         object)" in profiles
2244
2245         Reviewed by Kevin McCullough.
2246
2247         * profiler/Profiler.cpp:
2248         (KJS::createCallIdentifier): Use JSObject::className instead of
2249         getting the class name from the ClassInfo directly. JSObject
2250         subclasses can override className to provide a custom class name, and
2251         it seems like we should honor that.
2252
2253 2008-05-22  Timothy Hatcher  <timothy@apple.com>
2254
2255         Added Profile::restoreAll and added ProfileNode::restoreAll
2256         to the export file.
2257
2258         Reviewed by Adam Roben.
2259
2260         * JavaScriptCore.exp:
2261         * profiler/Profile.h:
2262
2263 2008-05-22  Alp Toker  <alp@nuanti.com>
2264
2265         GTK+ build fix. Add JavaScriptCore/profiler to include path.
2266
2267         * GNUmakefile.am:
2268
2269 2008-05-22  Adam Roben  <aroben@apple.com>
2270
2271         Implement sub-millisecond profiling on Windows
2272
2273         Reviewed by Kevin McCullough.
2274
2275         * profiler/ProfileNode.cpp:
2276         (KJS::getCount): Added. On Windows, we use QueryPerformanceCounter. On
2277         other platforms, we use getCurrentUTCTimeWithMicroseconds.
2278         (KJS::ProfileNode::endAndRecordCall): Use getCount instead of
2279         getCurrentUTCTimeWithMicroseconds.
2280         (KJS::ProfileNode::startTimer): Ditto.
2281
2282 2008-05-22  Adam Roben  <aroben@apple.com>
2283
2284         Fix a profiler assertion when calling a NodeList as a function
2285
2286         Reviewed by Kevin McCullough.
2287
2288         * profiler/Profiler.cpp:
2289         (KJS::createCallIdentifier): Don't assert when a non-function object
2290         is called as a function. Instead, build up a CallIdentifier using the
2291         object's class name.
2292
2293 2008-05-22  Kevin McCullough  <kmccullough@apple.com>
2294
2295         Reviewed by Darin.
2296
2297         <rdar://problem/5951529> JSProfiler: Allow the profiler to "Exclude" a
2298         profile node.
2299         -Implement 'exclude'; where the excluded node attributes its time to its
2300         parent's self time.
2301
2302         * JavaScriptCore.exp: Export the exclude function.
2303         * profiler/Profile.h: 
2304         (KJS::Profile::exclude):
2305         * profiler/ProfileNode.cpp: 
2306         (KJS::ProfileNode::setTreeVisible): New function that allows a change in
2307         visiblitiy to be propogated to all the children of a node.
2308         (KJS::ProfileNode::exclude): If the node matches the callIdentifier then
2309         set the visiblity of this node and all of its children to false and
2310         attribute it's total time to it's caller's self time.
2311         * profiler/ProfileNode.h:
2312
2313 2008-05-22  Mark Rowe  <mrowe@apple.com>
2314
2315         Reviewed by Oliver Hunt.
2316
2317         Fix access to static global variables in Windows release builds.
2318
2319         * kjs/JSGlobalObject.h: Don't store a reference to an Identifier
2320         in GlobalPropertyInfo as the Identifier is likely to be a temporary
2321         and therefore may be destroyed before the GlobalPropertyInfo.
2322
2323 2008-05-22  Kevin McCullough  <kmccullough@apple.com>
2324
2325         Build fix.
2326
2327         * VM/Machine.cpp:
2328         (KJS::callEval):
2329
2330 2008-05-22  Kevin McCullough  <kmccullough@apple.com>
2331
2332         Reviewed by Sam.
2333
2334         <rdar://problem/5951561> Turn on JavaScript Profiler
2335         Get basic JS profiling working.
2336         Even with this patch the profiler will not be compiled in because we do
2337         not know the extend, if any, of the performance regression it would cause
2338         when it is not in use. However with these changes, if the profiler were
2339         on, it would not crash and show good profiling data.
2340
2341         * VM/Machine.cpp: Instrument the calls sites that are needed for profiling.
2342         (KJS::callEval):
2343         (KJS::Machine::unwindCallFrame):
2344         (KJS::Machine::execute):
2345         (KJS::Machine::privateExecute):
2346         * kjs/function.cpp: Ditto.
2347         (KJS::globalFuncEval):
2348         * kjs/interpreter.cpp: Ditto.
2349         (KJS::Interpreter::evaluate):
2350         * profiler/Profile.cpp: 
2351         (KJS::Profile::willExecute):
2352         (KJS::Profile::didExecute): Because we do not get a good context when
2353         startProfiling is called it is possible that m_currentNode will be at the
2354         top of the known stack when a didExecute() is called.  What we then do is
2355         create a new node that represents the function being exited and insert
2356         it between the head and the currently known children, since they should
2357         be children of this new node.
2358         * profiler/ProfileNode.cpp:
2359         (KJS::ProfileNode::ProfileNode):
2360         (KJS::ProfileNode::willExecute): Rename the add function for consistency.
2361         (KJS::ProfileNode::addChild): Appends the child to this node but also
2362         sets the parent pointer of the children to this node.
2363         (KJS::ProfileNode::insertNode): Insert a node between this node and its
2364         children.  Also set the time for the new node since it is now exiting
2365         and we don't really know when it started.
2366         (KJS::ProfileNode::stopProfiling):
2367         (KJS::ProfileNode::startTimer):
2368         * profiler/ProfileNode.h:
2369         (KJS::CallIdentifier::toString): Added for debugging.
2370         (KJS::ProfileNode::setParent):
2371         (KJS::ProfileNode::setSelfTime): Fixed an old bug where we set the
2372         visibleTotalTime not the visibleSelfTime.
2373         (KJS::ProfileNode::children):
2374         (KJS::ProfileNode::toString): Added for debugging.
2375         * profiler/Profiler.cpp: remove unecessary calls.
2376         (KJS::Profiler::startProfiling):
2377
2378 2008-05-22  Sam Weinig  <sam@webkit.org>
2379
2380         Reviewed by Oliver Hunt.
2381
2382         Rename register arguments for op_call, op_call_eval, op_end, and op_construct 
2383         to document what they are for.
2384
2385         * VM/CodeGenerator.cpp:
2386         (KJS::CodeGenerator::emitCall):
2387         (KJS::CodeGenerator::emitCallEval):
2388         (KJS::CodeGenerator::emitEnd):
2389         (KJS::CodeGenerator::emitConstruct):
2390         * VM/CodeGenerator.h:
2391         * VM/Machine.cpp:
2392         (KJS::Machine::privateExecute):
2393
2394 2008-05-22  Oliver Hunt  <oliver@apple.com>
2395
2396         Reviewed by Darin.
2397
2398         Bug 19116: SquirrelFish shouldn't regress on variable lookups
2399         <https://bugs.webkit.org/show_bug.cgi?id=19116>
2400
2401         Last of the multiscope look up optimisations.  This is a wash overall on SunSpider
2402         but is a factor of 5-10 improvement in multiscope read/write/modify (eg. ++, --, +=,
2403         ... applied to any non-local var).
2404
2405         * kjs/nodes.cpp:
2406         (KJS::PostIncResolveNode::emitCode):
2407         (KJS::PostDecResolveNode::emitCode):
2408         (KJS::PreIncResolveNode::emitCode):
2409         (KJS::PreDecResolveNode::emitCode):
2410         (KJS::ReadModifyResolveNode::emitCode):
2411
2412 2008-05-22  David Kilzer  <ddkilzer@apple.com>
2413
2414         <rdar://problem/5954233> Add method to release free memory from FastMalloc
2415
2416         Patch suggested by Mark Rowe.  Rubber-stamped by Maciej.
2417
2418         * JavaScriptCore.exp: Export _releaseFastMallocFreeMemory.
2419         * wtf/FastMalloc.cpp:
2420         (WTF::TCMallocStats::): Added releaseFastMallocFreeMemory() for both
2421         system malloc and FastMalloc code paths.
2422         * wtf/FastMalloc.h: Define releaseFastMallocFreeMemory().
2423
2424 2008-05-22  Oliver Hunt  <oliver@apple.com>
2425
2426         RS=Maciej.
2427
2428         Roll out r34020 as it causes recursion tests to fail.
2429
2430         * kjs/object.cpp:
2431         (KJS::JSObject::call):
2432
2433 2008-05-22  Oliver Hunt  <oliver@apple.com>
2434
2435         Reviewed by Mark.
2436
2437         Don't leak the SymbolTable when compiling eval code.
2438
2439         * kjs/nodes.cpp:
2440         (KJS::EvalNode::generateCode):
2441
2442 2008-05-22  Simon Hausmann  <hausmann@webkit.org>
2443
2444         Reviewed by Oliver.
2445
2446         Qt build fix.
2447
2448         * JavaScriptCore.pri: Added DebuggerCallFrame to the build.
2449         * VM/LabelID.h: Include limits.h for UINT_MAX.
2450         * wtf/VectorTraits.h: Include memory for std::auto_ptr.
2451
2452 2008-05-22  Geoffrey Garen  <ggaren@apple.com>
2453
2454         Reviewed by Adam Roben.
2455         
2456         Removed the old recursion guard mechanism, since squirrelfish has its
2457         own mechanism. Also removed some old JS call tracing code, since we
2458         have other ways to do that, too.
2459         
2460         SunSpider reports no change.
2461
2462         * kjs/object.cpp:
2463         (KJS::JSObject::call):
2464
2465 2008-05-22  Maciej Stachowiak  <mjs@apple.com>
2466
2467         Reviewed by Oliver.
2468         
2469         - fixed <rdar://problem/5954979> crash on celtic kane JS benchmark
2470
2471         * kjs/nodes.cpp:
2472         (KJS::WithNode::emitCode):
2473         (KJS::TryNode::emitCode):
2474
2475 2008-05-21  Kevin McCullough  <kmccullough@apple.com>
2476
2477         Reviewed by Maciej and Geoff.
2478
2479         <rdar://problem/5951561> Turn on JavaScript Profiler
2480         -As part of the effort to turn on the profiler it would be helpful if it
2481         did not need ExecStates to represent the stack location of the currently
2482         executing statement.
2483         -We now create each node as necessary with a reference to the current
2484         node and each node knows its parent so that the tree can be made without
2485         the entire stack.
2486
2487         * profiler/Profile.cpp:
2488         (KJS::Profile::Profile): The current node starts at the head.
2489         (KJS::Profile::stopProfiling): The current node is cleared when profiling
2490         stops.
2491         (KJS::Profile::willExecute): The current node either adds a new child or
2492         starts and returns a reference to an already existing child if the call
2493         ID that is requested already exists.
2494         (KJS::Profile::didExecute): The current node finishes and returns its
2495         parent.
2496         * profiler/Profile.h: Use a single callIdentifier instead of a vector
2497         since we no longer use the whole stack.
2498         * profiler/ProfileNode.cpp: Now profile nodes keep a reference to their
2499         parent.
2500         (KJS::ProfileNode::ProfileNode): Initialize the parent.
2501         (KJS::ProfileNode::didExecute): Record the time and return the parent.
2502         (KJS::ProfileNode::addOrStartChild): If the given callIdentifier is
2503         already a child, start it and return it, otherwise create a new one and
2504         return that.
2505         (KJS::ProfileNode::stopProfiling): Same logic, just use the new function.
2506         * profiler/ProfileNode.h: Utilize the parent.
2507         (KJS::ProfileNode::create):
2508         (KJS::ProfileNode::parent):
2509         * profiler/Profiler.cpp: 
2510         (KJS::Profiler::startProfiling): Here is the only place where the
2511         ExecState is used to figure out where in the stack the profiler is
2512         currently profiling.
2513         (KJS::dispatchFunctionToProfiles): Only send one CallIdentifier instead
2514         of a vector of them.
2515         (KJS::Profiler::willExecute): Ditto.
2516         (KJS::Profiler::didExecute): Ditto.
2517         (KJS::createCallIdentifier): Create only one CallIdentifier.
2518         (KJS::createCallIdentifierFromFunctionImp): Ditto.
2519         * profiler/Profiler.h:
2520
2521 2008-05-21  Darin Adler  <darin@apple.com>
2522
2523         Reviewed by Maciej.
2524
2525         - https://bugs.webkit.org/show_bug.cgi?id=19180
2526           speed up the < operator for the case when both values are integers
2527
2528         Makes standalone SunSpider 1.022x faster.
2529
2530         * VM/Machine.cpp:
2531         (KJS::jsLess): Add a special case for when both are numbers that fit in a JSImmediate.
2532
2533 2008-05-21  Maciej Stachowiak  <mjs@apple.com>
2534
2535         Reviewed by Oliver and Sam.
2536         
2537         - fixed <rdar://problem/5815631> REGRESSION (r31239): Multiscope optimisation of function calls results in incorrect this value (breaks tvtv.de)
2538         
2539         Track global this value in the scope chain so we can retrieve it
2540         efficiently but it follows lexical scope properly.
2541
2542         * kjs/ExecState.h:
2543         (KJS::ExecState::globalThisValue):
2544         * kjs/JSGlobalObject.h:
2545         (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData):
2546         * kjs/function_object.cpp:
2547         (KJS::FunctionObjectImp::construct):
2548         * kjs/scope_chain.h:
2549         (KJS::ScopeChainNode::ScopeChainNode):
2550         (KJS::ScopeChainNode::globalThisObject):
2551         (KJS::ScopeChainNode::push):
2552         (KJS::ScopeChain::ScopeChain):
2553
2554 2008-05-21  Kevin McCullough  <kmccullough@apple.com>
2555
2556         Sadness :(
2557
2558         * kjs/config.h:
2559
2560 2008-05-21  Kevin McCullough  <kmccullough@apple.com>
2561
2562         Reviewed by Maciej.
2563
2564         <rdar://problem/5950867> JSProfiler: Allow the profiler to "Focus" a
2565         profile node.
2566         - This patch updatest the times of the visible nodes correctly, but to do
2567         so, some of the design of the ProfileNode changed.
2568
2569         * JavaScriptCore.exp: export focus' symbol.
2570         * profiler/Profile.cpp: ProfileNodes now take a reference to the head of
2571         the profile tree to get up-to-date accurate total profile time.
2572         (KJS::Profile::Profile): Pass 0 for the head node.
2573         (KJS::Profile::stopProfiling): stopProfiling no longer needs the time
2574         passed into it, since it can get it from the head and it does not need to
2575         be told it is the head because it can figure it out on it's own.
2576         (KJS::Profile::willExecute): Set the head node for each created node.
2577         * profiler/Profile.h:
2578         (KJS::Profile::focus): Instead of taking a CallIdentifier that the caller
2579         would have to create, now focus() takes a ProfileNode that they should
2580         already have a reference to and focus() can extract the CallIdentifier
2581         from it.
2582         * profiler/ProfileNode.cpp: Create actual and visible versions fo the
2583         total and self times for focus and exclude.  Also add a head node
2584         reference so that nodes can get information from their head.
2585         (KJS::ProfileNode::ProfileNode):
2586         (KJS::ProfileNode::stopProfiling): Rename the total and self time
2587         variables and set the visual ones to the actual ones, so that without any
2588         changes to the visual versions of these variables, their times will match
2589         the actual times.
2590         (KJS::ProfileNode::focus): Now focus() has a bool to force it's children
2591         to be visible if this node is visible.  If this node does not match the
2592         CallIdentifier being focused then the visibleTotalTime is only updated if
2593         one or more of it's children is the CallIdentifier being focused. 
2594         (KJS::ProfileNode::restoreAll): Restores all variables with respect to
2595         the visible data in the ProfileNode.
2596         (KJS::ProfileNode::endAndRecordCall): Name change.
2597         (KJS::ProfileNode::debugPrintData): Dump the new variables.
2598         (KJS::ProfileNode::debugPrintDataSampleStyle): Name change.
2599         * profiler/ProfileNode.h: Use the new variables and reference to the head
2600         node.
2601         (KJS::ProfileNode::create):
2602         (KJS::ProfileNode::totalTime):
2603         (KJS::ProfileNode::setTotalTime):
2604         (KJS::ProfileNode::selfTime):
2605         (KJS::ProfileNode::setSelfTime):
2606         (KJS::ProfileNode::totalPercent):
2607         (KJS::ProfileNode::selfPercent):
2608         (KJS::ProfileNode::setVisible):
2609
2610 2008-05-21  Alp Toker  <alp@nuanti.com>
2611
2612         GTK+/UNIX testkjs build fix. Include signal.h.
2613
2614         * kjs/testkjs.cpp:
2615
2616 2008-05-21  Oliver Hunt  <oliver@apple.com>
2617
2618         Yet more windows build fixes
2619
2620         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
2621
2622 2008-05-21  Oliver Hunt  <oliver@apple.com>
2623
2624         Yet more windows build fixes
2625
2626         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
2627
2628 2008-05-21  Alp Toker  <alp@nuanti.com>
2629
2630         GTK+ build fix. Add DebuggerCallFrame.cpp and take AllInOneFile.cpp
2631         changes into account.
2632
2633         * GNUmakefile.am:
2634
2635 2008-05-21  Oliver Hunt  <oliver@apple.com>
2636
2637         Add DebuggerCallFrame.{h,cpp} to the project file
2638
2639         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
2640
2641 2008-05-21  Alp Toker  <alp@nuanti.com>
2642
2643         GTK+ port build fixes following squirrelfish merge r33979.
2644
2645         * GNUmakefile.am:
2646
2647 2008-05-21  Maciej Stachowiak  <mjs@apple.com>
2648
2649         Reviewed by Darin.
2650         
2651         - save a hash lookup wne writing to global properties
2652         0.3% speedup on SunSpider, 7% on bitops-bitwise-and
2653
2654         * VM/Machine.cpp:
2655         (KJS::resolveBase): Check for being a the end of the scope chain
2656         before hash lookup.
2657
2658 2008-05-21  Alp Toker  <alp@nuanti.com>
2659
2660         Rubber-stamped by Maciej.
2661
2662         Replace non-standard #pragma marks with comments to avoid compiler
2663         warnings.
2664
2665         * profiler/ProfileNode.cpp:
2666
2667 2008-05-21  Geoffrey Garen  <ggaren@apple.com>
2668
2669         Reviewed by Mark Rowe.
2670
2671         Fix layout test failure in fast/dom/getter-on-window-object2 introduced in r33961.
2672
2673         * JavaScriptCore.exp:
2674         * kjs/JSGlobalObject.cpp:
2675         (KJS::JSGlobalObject::defineGetter):
2676         (KJS::JSGlobalObject::defineSetter):
2677         * kjs/JSGlobalObject.h:
2678
2679 === End merge of squirrelfish ===
2680
2681 2008-05-21  Geoffrey Garen  <ggaren@apple.com>
2682
2683         Reviewed by Tim Hatcher.
2684         
2685         Merged with trunk WebCore's new debugger.
2686
2687         * kjs/DebuggerCallFrame.cpp:
2688         (KJS::DebuggerCallFrame::evaluate): Changed this function to separate
2689         the exception value from the return value. The WebKit debugger treats
2690         them as one, but the WebCore debugger doesn't.
2691
2692         * kjs/DebuggerCallFrame.h:
2693         (KJS::DebuggerCallFrame::dynamicGlobalObject): Added a new accessor for
2694         the dynamic global object, since the debugger doesn't want the lexical
2695         global object.
2696
2697 2008-05-21  Oliver Hunt  <oliver@apple.com>
2698
2699         Reviewed by Maciej.
2700
2701         Bug 19116: SquirrelFish shouldn't regress on variable lookups
2702         <https://bugs.webkit.org/show_bug.cgi?id=19116>
2703
2704         Optimise cross scope assignment, 0.4% progression in sunspider.
2705
2706         * VM/CodeBlock.cpp:
2707         (KJS::CodeBlock::dump):
2708         * VM/CodeGenerator.cpp:
2709         (KJS::CodeGenerator::emitPutScopedVar):
2710         * VM/CodeGenerator.h:
2711         * VM/Machine.cpp:
2712         (KJS::Machine::privateExecute):
2713         * VM/Opcode.h:
2714         * kjs/nodes.cpp:
2715         (KJS::AssignResolveNode::emitCode):
2716
2717 2008-05-21  Maciej Stachowiak  <mjs@apple.com>
2718
2719         Reviewed by Oliver.
2720         
2721         - check property map before symbol table in JSGlobalObject::getOwnPropertySlot
2722         0.5% speedup on SunSpider
2723
2724         * kjs/JSGlobalObject.h:
2725         (KJS::JSGlobalObject::getOwnPropertySlot): Check property map before symbol table
2726         because symbol table access is likely to have been optimized.
2727
2728 2008-05-21  Oliver Hunt  <oliver@apple.com>
2729
2730         Reviewed by Maciej.
2731
2732         Bug 19116: SquirrelFish shouldn't regress on variable lookups
2733         <https://bugs.webkit.org/show_bug.cgi?id=19116>
2734
2735         Optimise multiscope lookup of statically resolvable function calls.
2736         SunSpider reports a 1.5% improvement, including 37% on 
2737         controlflow-recursive for some reason :D
2738
2739         * VM/CodeBlock.cpp:
2740         (KJS::CodeBlock::dump):
2741         * VM/CodeGenerator.cpp:
2742         (KJS::CodeGenerator::emitResolve):
2743         * VM/CodeGenerator.h:
2744         * kjs/nodes.cpp:
2745         (KJS::FunctionCallResolveNode::emitCode):
2746
2747 2008-05-21  Maciej Stachowiak  <mjs@apple.com>
2748
2749         Reviewed by Oliver.
2750         
2751         - give JSGlobalObject a special version of getOwnPropertySlot that tells you if the slot is directly writable
2752         (WebCore change using this is a 2.6% speedup on in-browser SunSpider).
2753
2754         * JavaScriptCore.exp:
2755         * kjs/JSGlobalObject.h:
2756         (KJS::JSGlobalObject::getOwnPropertySlot):
2757         * kjs/JSVariableObject.h:
2758         (KJS::JSVariableObject::symbolTableGet):
2759         * kjs/object.h:
2760         (KJS::JSObject::getDirectLocation):
2761         (KJS::JSObject::getOwnPropertySlotForWrite):
2762         * kjs/property_map.cpp:
2763         (KJS::PropertyMap::getLocation):
2764         * kjs/property_map.h:
2765         * kjs/property_slot.h:
2766         (KJS::PropertySlot::putValue):
2767
2768 2008-05-20  Oliver Hunt  <oliver@apple.com>
2769
2770         Reviewed by Maciej.
2771
2772         Bug 19116: SquirrelFish shouldn't regress on variable lookups
2773         <https://bugs.webkit.org/show_bug.cgi?id=19116>
2774
2775         This restores multiscope optimisation to simple resolve, producing
2776         a 2.6% progression in SunSpider.  Have verified that none of the
2777         sites broken by the multiscope optimisation in trunk were effected
2778         by this change.
2779
2780         * VM/CodeBlock.cpp:
2781         (KJS::CodeBlock::dump):
2782         * VM/CodeBlock.h:
2783         (KJS::CodeBlock::CodeBlock):
2784         * VM/CodeGenerator.cpp:
2785         (KJS::CodeGenerator::findScopedProperty):
2786         (KJS::CodeGenerator::emitResolve):
2787         * VM/CodeGenerator.h:
2788         * VM/Machine.cpp:
2789         (KJS::resolve_n):
2790         (KJS::Machine::privateExecute):
2791         * VM/Opcode.h:
2792         * kjs/JSVariableObject.h:
2793
2794 2008-05-20  Oliver Hunt  <oliver@apple.com>
2795
2796         Fixerate the windows build.
2797
2798         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
2799         * VM/CodeGenerator.cpp:
2800         * VM/RegisterFile.h:
2801         * kjs/JSGlobalObject.h:
2802         * kjs/Parser.cpp:
2803         * kjs/interpreter.h:
2804
2805 2008-05-20  Oliver Hunt  <oliver@apple.com>
2806
2807         Reviewed by Geoff.
2808
2809         Bug 19110: SquirrelFish: Google Maps - no maps
2810         <https://bugs.webkit.org/show_bug.cgi?id=19110>
2811
2812         Correct a comedy of errors present in my original patch to "fix"
2813         exceptions occurring midway through pre and post increment. This
2814         solution is cleaner than the original, doesn't need the additional
2815         opcodes, and as an added benefit does not break Google Maps.
2816
2817         Sunspider reports a 0.4% progression.
2818
2819         * VM/CodeBlock.cpp:
2820         (KJS::CodeBlock::dump):
2821         * VM/CodeGenerator.cpp:
2822         * VM/CodeGenerator.h:
2823         * VM/Machine.cpp:
2824         (KJS::Machine::privateExecute):
2825         * VM/Opcode.h:
2826         * kjs/nodes.cpp:
2827         (KJS::PreIncResolveNode::emitCode):
2828         (KJS::PreDecResolveNode::emitCode):
2829         (KJS::PreIncBracketNode::emitCode):
2830         (KJS::PreDecBracketNode::emitCode):
2831         (KJS::PreIncDotNode::emitCode):
2832         (KJS::PreDecDotNode::emitCode):
2833
2834 2008-05-20  Maciej Stachowiak  <mjs@apple.com>
2835
2836         Reviewed by Oliver.
2837         
2838         - inline JSGlobalObject::getOwnPropertySlot
2839         1% improvement on in-browser SunSpider (a wash command-line)
2840
2841         * kjs/JSGlobalObject.cpp:
2842         * kjs/JSGlobalObject.h:
2843         (KJS::JSGlobalObject::getOwnPropertySlot):
2844
2845 2008-05-18  Oliver Hunt  <oliver@apple.com>
2846
2847         Reviewed by Maciej.
2848
2849         Bug 18752: SQUIRRELFISH: exceptions are not always handled by the vm
2850         <https://bugs.webkit.org/show_bug.cgi?id=18752>
2851
2852         Handle exceptions thrown by toString conversion in subscript operators,
2853         this should basically complete exception handling in SquirrelFish.
2854
2855         Sunspider reports no regression.
2856
2857         * VM/Machine.cpp:
2858         (KJS::Machine::privateExecute):
2859
2860 2008-05-17  Geoffrey Garen  <ggaren@apple.com>
2861
2862         Reviewed by Oliver Hunt.
2863
2864         [Reapplying patch with previously missing files from r33553 -- Oliver]
2865
2866         Behold: debugging.
2867         
2868         SunSpider reports no change.
2869
2870         * JavaScriptCore.xcodeproj/project.pbxproj: Added DebuggerCallFrame.h/.cpp,
2871         and created a debugger folder.
2872
2873         * VM/CodeGenerator.cpp:
2874         (KJS::CodeGenerator::generate): If the debugger is attached, always
2875         generate full scope chains for its sake.
2876
2877         * VM/Machine.cpp:
2878         (KJS::Machine::unwindCallFrame): Notify the debugger when unwinding
2879         due to an exception, so it doesn't keep stale call frames around.
2880
2881         (KJS::Machine::execute): Set Callee to 0 in eval frames, so the
2882         debugger can distinguish them from function call frames.
2883
2884         (KJS::Machine::debug): Simplified this function, since the debugger
2885         doesn't actually need all the information we used to provide.
2886
2887         (KJS::Machine::privateExecute): Treat debugging hooks like other function
2888         calls, so the code we hook into (the debugger UI) can be optimized.
2889
2890         * kjs/debugger.cpp: Nixed these default callback implementations and
2891         made the callbacks pure virtual instead, so the compiler could tell me
2892         if I made a mistake in one of the subclasses.
2893
2894         * kjs/debugger.h: Removed a bunch of irrelevent data from the debugger
2895         callbacks. Changed from passing an ExecState* to passing a
2896         DebuggerCallFrame*, since an ExecState* doesn't contain sufficient
2897         information anymore.
2898
2899         * kjs/function.cpp:
2900         (KJS::globalFuncEval): Easiest bug fix evar!
2901
2902         [Previously missing files from r33553]
2903         * kjs/DebuggerCallFrame.cpp: Copied from JavaScriptCore/profiler/FunctionCallProfile.h.
2904         (KJS::DebuggerCallFrame::functionName):
2905         (KJS::DebuggerCallFrame::thisObject):
2906         (KJS::DebuggerCallFrame::evaluateScript):
2907         * kjs/DebuggerCallFrame.h: Copied from JavaScriptCore/VM/Register.h.
2908         (KJS::DebuggerCallFrame::DebuggerCallFrame):
2909         (KJS::DebuggerCallFrame::scopeChain):
2910         (KJS::DebuggerCallFrame::exception):
2911
2912 2008-05-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
2913
2914         Reviewed by Oliver.
2915
2916         Bug 18991: SquirrelFish: Major codegen issue in a.b=expr, a[b]=expr
2917         <https://bugs.webkit.org/show_bug.cgi?id=18991>
2918
2919         Fix the last remaining blocking cases of this bug.
2920
2921         * kjs/grammar.y:
2922         * kjs/nodes.cpp:
2923         (KJS::ReadModifyResolveNode::emitCode):
2924
2925 2008-05-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
2926
2927         Reviewed by Oliver.
2928
2929         Partial fix for:
2930
2931         Bug 18991: SquirrelFish: Major codegen issue in a.b=expr, a[b]=expr
2932         <https://bugs.webkit.org/show_bug.cgi?id=18991>
2933
2934         Ensure that the code generated for assignments uses temporaries whenever
2935         necessary. This patch covers the vast majority of situations, but there
2936         are still a few left.
2937
2938         This patch also adds some missing cases to CodeBlock::dump().
2939
2940         * VM/CodeBlock.cpp:
2941         (KJS::CodeBlock::dump):
2942         * VM/CodeGenerator.h:
2943         (KJS::CodeGenerator::destinationForAssignResult):
2944         (KJS::CodeGenerator::leftHandSideNeedsCopy):
2945         (KJS::CodeGenerator::emitNodeForLeftHandSide):
2946         * kjs/NodeInfo.h:
2947         * kjs/grammar.y:
2948         * kjs/nodes.cpp:
2949         (KJS::AssignDotNode::emitCode):
2950         (KJS::ReadModifyDotNode::emitCode):
2951         (KJS::AssignBracketNode::emitCode):
2952         (KJS::ReadModifyBracketNode::emitCode):
2953         (KJS::ForInNode::ForInNode):
2954         * kjs/nodes.h:
2955         (KJS::ReadModifyResolveNode::):
2956         (KJS::AssignResolveNode::):
2957         (KJS::ReadModifyBracketNode::):
2958         (KJS::AssignBracketNode::):
2959         (KJS::AssignDotNode::):
2960         (KJS::ReadModifyDotNode::):
2961
2962 2008-05-17  Oliver Hunt  <oliver@apple.com>
2963
2964         Reviewed by Maciej.
2965
2966         Bug 19106: SquirrelFish: Activation is not marked correctly
2967         <https://bugs.webkit.org/show_bug.cgi?id=19106>
2968
2969         We can't rely on the symbol table for a count of the number of globals
2970         we need to mark as that misses duplicate parameters and 'this'.  Now we
2971         use the actual local register count from the codeBlock.
2972
2973         * kjs/JSActivation.cpp:
2974         (KJS::JSActivation::mark):
2975
2976 2008-05-16  Oliver Hunt  <oliver@apple.com>
2977
2978         Reviewed by Geoff.
2979
2980         Bug 19076: SquirrelFish: RegisterFile can be corrupted if implictly reenter global scope with no declared vars
2981         <https://bugs.webkit.org/show_bug.cgi?id=19076>
2982
2983         Don't delay allocation of initial global RegisterFile, as we can't guarantee we will be able
2984         to allocate the global 'this' register safely at any point after initialisation of the Global
2985         Object.
2986
2987         Unfortunately this initial allocation caused a regression of 0.2-0.3%, however this patch adds
2988         support for the static slot optimisation for the global Math object which brings it to a 0.3%
2989         progression.
2990
2991         * VM/CodeGenerator.cpp:
2992         (KJS::CodeGenerator::programCodeThis):
2993         (KJS::CodeGenerator::CodeGenerator):
2994         (KJS::CodeGenerator::addParameter):
2995         * VM/CodeGenerator.h:
2996         * VM/Machine.cpp:
2997         (KJS::Machine::execute):
2998         * kjs/ExecState.h:
2999         * kjs/JSGlobalObject.cpp:
3000         (KJS::JSGlobalObject::reset):
3001         * kjs/JSGlobalObject.h:
3002         (KJS::JSGlobalObject::GlobalPropertyInfo::GlobalPropertyInfo):
3003         (KJS::JSGlobalObject::addStaticGlobals):
3004         * kjs/nodes.cpp:
3005
3006 2008-05-16  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
3007
3008         Reviewed by Oliver Hunt.
3009
3010         Bug 19098: SquirrelFish: Ref'd temporaries can be clobbered
3011         <https://bugs.webkit.org/show_bug.cgi?id=19098>
3012
3013         When doing code generation for a statement list, increase the reference
3014         count on a register that might eventually be returned, so that it doesn't
3015         get clobbered by a request for a new temporary.
3016
3017         * kjs/nodes.cpp:
3018         (KJS::statementListEmitCode):
3019
3020 2008-05-16  Maciej Stachowiak  <mjs@apple.com>
3021
3022         Reviewed by Oliver.
3023         
3024         - fixed Bug 19044: SquirrelFish: Bogus values enter evaluation when closing over scope with parameter and var with same name
3025         https://bugs.webkit.org/show_bug.cgi?id=19044
3026
3027         * kjs/JSActivation.cpp:
3028         (KJS::JSActivation::copyRegisters): Use numLocals from the code
3029         block rather than the size of the symbol table for the number of
3030         registers to copy, to account for duplicate parameters and vars
3031         with the same name as parameters (we still have potentially
3032         suboptimal codegen in that we allocate a local register for the
3033         var in the latter case but it is never used).
3034         
3035 2008-05-15  Geoffrey Garen  <ggaren@apple.com>
3036
3037         Not reviewed.
3038         
3039         We regret to inform you that your program is crashing because you were
3040         stupid.
3041
3042         * VM/Machine.cpp:
3043         (KJS::Machine::privateExecute): Math is hard.
3044
3045 2008-05-14  Geoffrey Garen  <ggaren@apple.com>
3046
3047         Reviewed by Oliver Hunt.
3048
3049         A little more debugger action: filled in op_debug. All debugger control
3050         flow works now, but variable inspection and backtraces still don't.
3051         
3052         SunSpider reports no change.
3053
3054         * VM/CodeGenerator.cpp: Changed op_debug to accept line number parameters.
3055
3056         * VM/Machine.cpp:
3057         (KJS::Machine::getFunctionAndArguments): Moved op_debug into a
3058         NEVER_INLINE function to avoid a stunning 10% performance regression.
3059         Also factored out a common function for retrieving the function and 
3060         arguments from a  call frame. 
3061
3062         * kjs/JSActivation.cpp:
3063         (KJS::JSActivation::createArgumentsObject): Use the new factored out
3064         function mentioned above.
3065
3066         * kjs/Parser.cpp:
3067         (KJS::Parser::parse): Increment m_sourceId before assigning it, so the
3068         sourceId we send to the debugger matches the sourceId recorded in the
3069         node.
3070
3071         * kjs/nodes.cpp: Emit debugging hooks.
3072
3073 2008-05-14  Oliver Hunt  <oliver@apple.com>
3074
3075         Reviewed by Maciej.
3076
3077         Bug 19024: SQUIRRELFISH: ASSERTION FAILED: activation->isActivationObject() in Machine::unwindCallFrame
3078         <https://bugs.webkit.org/show_bug.cgi?id=19024>
3079
3080         This fixes a number of issues.  The most important is that we now check every register
3081         file for tainting rather than just looking for function register files as that was
3082         insufficient. Additionally guarded against implicit re-entry into Eval code.
3083
3084         Also added a few additional assertions to reduce the amout of time between something
3085         going wrong and us seeing the error.
3086
3087         * VM/Machine.cpp:
3088         (KJS::Machine::execute):
3089         (KJS::Machine::privateExecute):
3090         * VM/RegisterFile.cpp:
3091         (KJS::RegisterFile::growBuffer):
3092         (KJS::RegisterFile::addGlobalSlots):
3093         * VM/RegisterFileStack.cpp:
3094         (KJS::RegisterFileStack::pushGlobalRegisterFile):
3095         (KJS::RegisterFileStack::pushFunctionRegisterFile):
3096         * VM/RegisterFileStack.h:
3097         (KJS::RegisterFileStack::inImplicitCall):
3098
3099 2008-05-14  Geoffrey Garen  <ggaren@apple.com>
3100
3101         Reviewed by Oliver Hunt.
3102         
3103         A little more debugger action: emit opcodes for debugger hooks. Right
3104         now, the opcode implementation is just a stub.
3105         
3106         SunSpider reports no change.
3107         
3108         Some example codegen for "function f() { 1; }":
3109
3110             [   0] dbg         DidEnterCallFrame
3111             [   2] dbg         WillExecuteStatement
3112             [   4] load        tr0, 1(@k0)
3113             [   7] load        tr0, undefined(@k1)
3114             [  10] dbg         WillLeaveCallFrame
3115             [  12] ret         tr0
3116
3117 2008-05-14  Oliver Hunt  <oliver@apple.com>
3118
3119         Reviewed by Geoff.
3120
3121         Bug 19025: SQUIRRELFISH: malformed syntax in onload handler causes crash
3122         <https://bugs.webkit.org/show_bug.cgi?id=19025>
3123
3124         Simple fix -- move the use of functionBodyNode to after the null check.
3125
3126         * kjs/function_object.cpp:
3127         (KJS::FunctionObjectImp::construct):
3128
3129 2008-05-13  Geoffrey Garen  <ggaren@apple.com>
3130
3131         Reviewed by Oliver Hunt.
3132         
3133         Fixed a codegen crash with run-time parse errors.
3134         
3135         SunSpider reports no change.
3136         
3137         emitThrowError needs to return the temporary holding the error, not dst,
3138         since dst may be NULL. In fact, emitThrowError shouldn't take a dst
3139         parameter at all, since exceptions should not modify the destination
3140         register.
3141
3142 2008-05-13  Oliver Hunt  <oliver@apple.com>
3143
3144         Reviewed by Geoff.
3145
3146         Bug 19027: SquirrelFish: Incorrect codegen for pre-increment
3147         <https://bugs.webkit.org/show_bug.cgi?id=19027>
3148
3149         This fixes the codegen issues for the pre-inc/decrement operators
3150         to prevent incorrectly clobbering the destination in the event of
3151         an exception.
3152
3153         * VM/CodeBlock.cpp:
3154         (KJS::CodeBlock::dump):
3155         * VM/CodeGenerator.cpp:
3156         (KJS::CodeGenerator::emitPreInc):
3157         (KJS::CodeGenerator::emitPreDec):
3158         * VM/CodeGenerator.h:
3159         * VM/Machine.cpp:
3160         (KJS::Machine::privateExecute):
3161         * VM/Opcode.h:
3162         * kjs/nodes.cpp:
3163         (KJS::PreIncResolveNode::emitCode):
3164         (KJS::PreDecResolveNode::emitCode):
3165         (KJS::PreIncBracketNode::emitCode):
3166         (KJS::PreDecBracketNode::emitCode):
3167         (KJS::PreIncDotNode::emitCode):
3168         (KJS::PreDecDotNode::emitCode):
3169
3170 2008-05-13  Geoffrey Garen  <ggaren@apple.com>
3171
3172         Reviewed by Oliver Hunt.
3173         
3174         A little more debugger action: supply a real line number, sourceId,
3175         and sourceURL in op_new_error.
3176         
3177         SunSpider reports a .2% speedup. Not sure what that's about.
3178
3179         * VM/Machine.cpp:
3180         (KJS::Machine::privateExecute): Use the new good stuff in op_new_error.
3181
3182         * kjs/nodes.cpp:
3183         (KJS::RegExpNode::emitCode): Use the shared emitThrowError instead of
3184         rolling our own.
3185
3186 2008-05-13  Geoffrey Garen  <ggaren@apple.com>
3187
3188         Reviewed by Oliver Hunt.
3189         
3190         A little more debugger action: implemented the exception callback.
3191         
3192         SunSpider reports a .2% speedup. Not sure what that's about.
3193
3194         * VM/CodeBlock.h: A little refactoring here. Store a pointer to our
3195         owner ScopeNode so we can retrieve data from it. This allows us to
3196         stop storing copies of the data ourselves. Also, store a "this" register
3197         instead of a code type, since we were only using the code type to
3198         calculate the "this" register.
3199
3200         * VM/CodeGenerator.cpp:
3201         (KJS::CodeGenerator::generate): Calculate the "this" register mentioned
3202         above. Also, take care of removing "this" from the symbol table after
3203         codegen is done, since relying on the timing of a destructor for correct
3204         behavior is not so good.
3205
3206         * VM/Machine.cpp:
3207         (KJS::Machine::throwException): Invoke the debugger's exception callback.
3208         (KJS::Machine::privateExecute): Use the "this" register mentioned above.
3209
3210 2008-05-13  Geoffrey Garen  <ggaren@apple.com>
3211
3212         Reviewed by Oliver Hunt.
3213         
3214         Removed some unused exception machinery.
3215         
3216         SunSpider reports a .3% speedup.
3217
3218         * API/JSCallbackObject.h:
3219         * API/JSCallbackObjectFunctions.h:
3220         * JavaScriptCore.exp:
3221         * VM/Machine.cpp:
3222         (KJS::Machine::privateExecute):
3223         * kjs/internal.cpp:
3224         * kjs/object.cpp:
3225         * kjs/object.h:
3226         * kjs/value.h:
3227
3228 2008-05-13  Geoffrey Garen  <ggaren@apple.com>
3229
3230         Reviewed by Oliver Hunt.
3231         
3232         A little more debugger action.
3233
3234         * kjs/debugger.cpp:
3235         * kjs/debugger.h: Removed debuggersPresent because it was unused.
3236         Replaced AttachedGlobalObject linked list with a HashSet because HashSet
3237         is faster and simpler. Changed all functions to return void instead of
3238         bool, because no clients ever return false, and we don't want to support
3239         it.
3240
3241         * kjs/nodes.cpp: Did some up-keep to avoid build bustage.
3242         (KJS::Node::handleException):
3243         (KJS::BreakpointCheckStatement::execute):
3244         (KJS::FunctionBodyNodeWithDebuggerHooks::execute):
3245
3246 2008-05-13  Oliver Hunt  <oliver@apple.com>
3247
3248         Reviewed by Darin.
3249
3250         Bug 18752: SQUIRRELFISH: exceptions are not always handled by the vm
3251         <https://bugs.webkit.org/show_bug.cgi?id=18752>
3252
3253         Replace old attempt at "branchless" exceptions as the extra information
3254         being passed made gcc an unhappy compiler, replacing these custom toNumber
3255         calls with ordinary toNumber logic (by relying on toNumber now preventing
3256         side effects after an exception has been thrown) provided sufficient leeway
3257         to add the additional checks for the remaining unchecked cases.
3258
3259         This leaves only toString conversions in certain contexts as possibly
3260         misbehaving.
3261
3262         * VM/Machine.cpp:
3263         (KJS::jsAdd):
3264         (KJS::resolve):
3265         (KJS::resolveBaseAndProperty):
3266         (KJS::resolveBaseAndFunc):
3267         (KJS::Machine::privateExecute):
3268         * VM/Opcode.h:
3269         * kjs/value.h:
3270         (KJS::JSValue::safeGetNumber):
3271
3272 2008-05-13  Geoffrey Garen  <ggaren@apple.com>
3273
3274         Reviewed by Oliver Hunt.
3275         
3276         First steps toward supporting the debugger API: support the sourceParsed
3277         callback; plus some minor fixups.
3278
3279         SunSpider reports no regression.
3280
3281         * VM/CodeGenerator.h: Removed a misleading comment.
3282
3283         * kjs/Parser.h: Changed the parser to take an ExecState*, so it can
3284         implement the sourceParsed callback -- that way, we only have to
3285         implement the callback in one place.
3286
3287         * kjs/debugger.cpp: Nixed DebuggerImp, because its sole purpose in life
3288         was to demonstrate the misapplication of design patterns.
3289
3290         * kjs/debugger.h: Changed sourceParsed to take a SourceProvider, to
3291         reduce copying, and not to return a value, because pausing execution
3292         after parsing is complicated, and no clients needed that ability, anyway.
3293
3294         * kjs/grammar.y: Make sure never to pass a NULL SourceElements* to
3295         didFinishParsing -- that simplifies some code down the road.
3296         
3297         * kjs/nodes.cpp: Don't generate special AST nodes just because the
3298         debugger is attached -- that's a relic of the old AST execution model,
3299         and those nodes haven't been maintained.
3300
3301 2008-05-13  Oliver Hunt  <oliver@apple.com>
3302
3303         Reviewed by Geoff.
3304
3305         Bug 18752: SQUIRRELFISH: exceptions are not always handled by the vm
3306         <https://bugs.webkit.org/show_bug.cgi?id=18752>
3307
3308         First step: prevent incorrect evaluation of valueOf/toString conversion
3309         in right hand side of expression after earlier conversion throws.
3310
3311         * API/JSCallbackObjectFunctions.h:
3312         (KJS::::toNumber):
3313         * kjs/object.cpp:
3314         (KJS::JSObject::defaultValue):
3315
3316 2008-05-12  Oliver Hunt  <oliver@apple.com>
3317
3318         Reviewed by Geoff.
3319
3320         Bug 18934: SQUIRRELFISH: ASSERT @ nytimes.com due to RegisterFile being clobbered
3321         <https://bugs.webkit.org/show_bug.cgi?id=18934>
3322
3323         Unfortunately we cannot create new statically optimised globals if there are any
3324         tainted RegisterFiles on the RegisterFileStack.  To handle this we re-introduce
3325         (in a slightly cleaner form) the inImplicitCall concept to the RegisterFileStack.
3326
3327         * VM/Machine.cpp:
3328         (KJS::Machine::execute):
3329         * VM/RegisterFileStack.cpp:
3330         (KJS::RegisterFileStack::pushFunctionRegisterFile):
3331         * VM/RegisterFileStack.h:
3332
3333 2008-05-12  Geoffrey Garen  <ggaren@apple.com>
3334
3335         Reviewed by Maciej Stachowiak.
3336         
3337         Introduced support for function.caller.
3338         
3339         Improved support for walking interesting scopes for function introspection.
3340         
3341         This fixes all remaining layout tests not blocked by rebasing to trunk.
3342         
3343         SunSpider reports no change.
3344
3345         * VM/Machine.cpp:
3346         (KJS::Machine::dumpRegisters): Fixed a spacing issue.
3347
3348 2008-05-11  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
3349
3350         Reviewed by Oliver.
3351
3352         Bug 18961: SQUIRRELFISH: Gmail doesn't load
3353         <https://bugs.webkit.org/show_bug.cgi?id=18961>
3354
3355         Fix codegen for logical nodes so that they don't use their destination
3356         as a temporary.
3357
3358         * kjs/nodes.cpp:
3359         (KJS::LogicalAndNode::emitCode):
3360         (KJS::LogicalOrNode::emitCode):
3361
3362 2008-05-10  Maciej Stachowiak  <mjs@apple.com>
3363
3364         Reviewed by Oliver.
3365
3366         - JavaScriptCore part of fix for: "SQUIRRELFISH: function toString broken after calling"
3367         https://bugs.webkit.org/show_bug.cgi?id=18869
3368        
3369         Three layout tests are fixed:
3370           fast/js/toString-elision-trailing-comma.html
3371           fast/js/toString-prefix-postfix-preserve-parens.html
3372           fast/js/kde/lval-exceptions.html
3373         
3374         Functions now save a shared subrange of the original source used
3375         to make them (so in the common case this adds no storage above the
3376         memory cache).
3377         
3378         * kjs/SourceProvider.h: Added.
3379         (KJS::SourceProvider): New abstract base class for classes that provide on-demand access
3380         to the source for a JavaScript program. This allows function objects to have access to their
3381         original source without copying.
3382         (KJS::UStringSourceProvider): SourceProvider subclass backed by a KJS::UString.
3383         (KJS::UStringSourceProvider::create):
3384         (KJS::UStringSourceProvider::getRange):
3385         (KJS::UStringSourceProvider::data):
3386         (KJS::UStringSourceProvider::length):
3387         (KJS::UStringSourceProvider::UStringSourceProvider):
3388         * kjs/SourceRange.h: Added.
3389         (KJS::SourceRange::SourceRange): Class that holds a SourceProvider and a character range into
3390         the source, to encapsulate on-demand access to the source of a function.
3391         (KJS::SourceRange::toString):
3392         * VM/Machine.cpp:
3393         (KJS::eval): Pass a UStringSourceProvider to the parser.
3394         * kjs/Parser.cpp:
3395         (KJS::Parser::parse): Take a SourceProvider and pass it on to the lexer.
3396         * kjs/Parser.h:
3397         (KJS::Parser::parse): Take a SourceProvider.
3398         * kjs/lexer.cpp:
3399         (KJS::Lexer::setCode): Take a SourceProvider; keep it around, and
3400         use it to get the raw buffer and length.
3401         * kjs/lexer.h:
3402         (KJS::Lexer::sourceRange): Convenience function to get a source
3403         range based on the lexer's source provieder, and char offsets
3404         right before and after the desired range.
3405         * kjs/function.cpp:
3406         (KJS::globalFuncEval): Pass a UStringSourceProvider to the parser.
3407         * kjs/function_object.cpp:
3408         (KJS::functionProtoFuncToString): Use toSourceString to get the source.
3409         (KJS::FunctionObjectImp::construct): Give the parser a UStringSourceProvider.
3410         * kjs/grammar.y: When parsing a function declaration, function
3411         expression, or getter or setter, tell the function body about its
3412         SourceRange.
3413         * kjs/interpreter.cpp:
3414         (KJS::Interpreter::checkSyntax): Pass a SourceProvider to the parser.
3415         (KJS::Interpreter::evaluate): Pass a SourceProvider to the parser.
3416         * kjs/interpreter.h:
3417         * kjs/nodes.h:
3418         (KJS::FunctionBodyNode::setSource): Establish a SourceRange for this function.
3419         (KJS::FunctionBodyNode::toSourceString): Get the source string out
3420         of the SourceRange.
3421         (KJS::FuncExprNode::): Take a SourceRange and set it on the body.
3422         (KJS::FuncDeclNode::): ditto
3423         * kjs/testkjs.cpp:
3424         (prettyPrintScript): Use a SourceProvider appropriately.
3425         * JavaScriptCore.exp: Export new symbols.
3426         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add new files.
3427         * JavaScriptCore.xcodeproj/project.pbxproj: Add new files.
3428
3429 2008-05-09  Oliver Hunt  <oliver@apple.com>
3430
3431         Reviewed by Maciej.
3432
3433         Bring back RegisterFile tainting in order to correctly handle
3434         natively implemented getters and setters that re-enter JavaScript
3435
3436         * VM/Machine.cpp:
3437         (KJS::Machine::privateExecute):
3438         * VM/RegisterFile.h:
3439         * kjs/function.cpp:
3440         (KJS::FunctionImp::callAsFunction):
3441         * kjs/object.cpp:
3442         (KJS::JSObject::put):
3443         (KJS::tryGetAndCallProperty):
3444         * kjs/property_slot.cpp:
3445         (KJS::PropertySlot::functionGetter):
3446
3447 2008-05-09  Maciej Stachowiak  <mjs@apple.com>
3448
3449         Reviewed by Oliver.
3450         
3451         - track character offsets of open and close braces, in preparation for saving function source
3452         
3453         I verified that there is no performance regression from this change.
3454
3455         * kjs/grammar.y:
3456         * kjs/lexer.cpp:
3457         (KJS::Lexer::lex):
3458         (KJS::Lexer::matchPunctuator):
3459         * kjs/lexer.h:
3460
3461 2008-05-09  Oliver Hunt  <oliver@apple.com>
3462
3463         Debug build fix
3464
3465         * kjs/JSGlobalObject.cpp:
3466         (KJS::JSGlobalObject::restoreLocalStorage):
3467
3468 2008-05-09  Oliver Hunt  <oliver@apple.com>
3469
3470         Reviewed by Geoff.
3471
3472         Build fixes for SquirrelFish on windows.
3473
3474         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
3475         * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:
3476         * VM/Register.h:
3477         * kjs/JSGlobalObject.cpp:
3478         (KJS::JSGlobalObject::restoreLocalStorage):
3479         * kjs/collector.cpp:
3480         (KJS::Collector::allocate):
3481         (KJS::Collector::allocateNumber):
3482         * kjs/collector.h:
3483         (KJS::Collector::allocate):
3484         (KJS::Collector::allocateNumber):
3485         * kjs/property_slot.cpp:
3486
3487 2008-05-08  Maciej Stachowiak  <mjs@apple.com>
3488
3489         Reviewed by Geoff.
3490         
3491         - fix activation tearoff in the case where functions are called with too many arguments
3492         
3493         Fixes:
3494         fast/canvas/patternfill-repeat.html
3495         fast/dom/SelectorAPI/bug-17313.html
3496
3497         * VM/Machine.cpp:
3498         (KJS::slideRegisterWindowForCall):
3499         (KJS::scopeChainForCall):
3500         (KJS::Machine::execute):
3501         (KJS::Machine::privateExecute):
3502
3503 2008-05-08  Geoffrey Garen  <ggaren@apple.com>
3504
3505         Reviewed by Oliver Hunt.
3506         
3507         Fixed failure in fast/canvas/canvas-pattern-behaviour.html.
3508         
3509         SunSpider reports a small speedup. Not sure what that's about.
3510
3511         * VM/CodeBlock.cpp:
3512         (KJS::CodeBlock::dump): Fixed op_call_eval to dump as "op_call_eval".
3513         This helped me while debugging.
3514
3515         * VM/Machine.cpp:
3516         (KJS::Machine::unwindCallFrame): When looking for an activation to tear
3517         off, don't use the scope chain. Inside eval, the scope chain doesn't
3518         belong to us; it belongs to our calling function.
3519         
3520         Also, don't use the needsFullScopeChain flag to decide whether to tear
3521         off the activation. "function.arguments" can create an activation
3522         for a function whose needsFullScopeChain flag is set to false.
3523
3524 2008-05-08  Maciej Stachowiak  <mjs@apple.com>
3525
3526         Reviewed by Oliver.
3527         
3528         - fix function.call for calls of more than 8 arguments
3529         
3530         Fixes svg/carto.net/button.svg
3531
3532         * kjs/list.cpp:
3533         (KJS::List::getSlice): properly set up the m_buffer of the target list.
3534
3535 2008-05-08  Maciej Stachowiak  <mjs@apple.com>
3536
3537         Reviewed by Oliver.
3538         
3539         - don't return a null RegisterID from RegExpNode in the exception case, since the caller may need a real register
3540
3541         Fixes:
3542         - fast/regex/early-acid3-86.html
3543         - http/tests/misc/acid3.html
3544         
3545         * kjs/nodes.cpp:
3546         (KJS::RegExpNode::emitCode):
3547
3548 2008-05-07  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
3549
3550         Reviewed by Oliver.
3551
3552         Fix a performance regression caused by the introduction of property
3553         attributes to SymbolTable in r32859 by encoding the attributes and the
3554         register index into a single field of SymbolTableEntry.
3555
3556         This leaves Node::optimizeVariableAccess() definitely broken, although
3557         it was probably not entirely correct in SquirrelFish before this change.
3558
3559         * VM/CodeBlock.h:
3560         (KJS::missingThisObjectMarker):
3561         * VM/CodeGenerator.cpp:
3562         (KJS::CodeGenerator::addVar):
3563         (KJS::CodeGenerator::CodeGenerator):
3564         (KJS::CodeGenerator::registerForLocal):
3565         (KJS::CodeGenerator::registerForLocalConstInit):
3566         (KJS::CodeGenerator::isLocalConstant):
3567         (KJS::CodeGenerator::addConstant):
3568         (KJS::CodeGenerator::emitCall):
3569         * VM/CodeGenerator.h:
3570         (KJS::CodeGenerator::IdentifierMapIndexHashTraits::emptyValue):
3571         * VM/Machine.cpp:
3572         (KJS::Machine::privateExecute):
3573         * kjs/JSGlobalObject.cpp:
3574         (KJS::JSGlobalObject::saveLocalStorage):
3575         * kjs/JSVariableObject.cpp:
3576         (KJS::JSVariableObject::getPropertyNames):
3577         (KJS::JSVariableObject::getPropertyAttributes):
3578         * kjs/JSVariableObject.h:
3579         (KJS::JSVariableObject::symbolTableGet):
3580         (KJS::JSVariableObject::symbolTablePut):
3581         (KJS::JSVariableObject::symbolTablePutWithAttributes):
3582         * kjs/SymbolTable.h:
3583         (KJS::SymbolTableEntry::SymbolTableEntry):
3584         (KJS::SymbolTableEntry::isEmpty):
3585         (KJS::SymbolTableEntry::getIndex):
3586         (KJS::SymbolTableEntry::getAttributes):
3587         (KJS::SymbolTableEntry::setAttributes):
3588         (KJS::SymbolTableEntry::isReadOnly):
3589         * kjs/nodes.cpp:
3590         (KJS::getSymbolTableEntry):
3591         (KJS::PostIncResolveNode::optimizeVariableAccess):
3592         (KJS::PostDecResolveNode::optimizeVariableAccess):
3593         (KJS::DeleteResolveNode::optimizeVariableAccess):
3594         (KJS::TypeOfResolveNode::optimizeVariableAccess):
3595         (KJS::PreIncResolveNode::optimizeVariableAccess):
3596         (KJS::PreDecResolveNode::optimizeVariableAccess):
3597         (KJS::ReadModifyResolveNode::optimizeVariableAccess):
3598         (KJS::AssignResolveNode::optimizeVariableAccess):
3599         (KJS::ProgramNode::initializeSymbolTable):
3600
3601 2008-05-06  Maciej Stachowiak  <mjs@apple.com>
3602
3603