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