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