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