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