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