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