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