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