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