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