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