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