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