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