2008-10-03 Maciej Stachowiak <mjs@apple.com>
[WebKit.git] / JavaScriptCore / ChangeLog
1 2008-10-03  Maciej Stachowiak  <mjs@apple.com>
2
3         Rubber stamped by Cameron Zwarich.
4         
5         - fix mistaken change of | to || which caused a big perf regression on EarleyBoyer
6
7         * kjs/grammar.y:
8
9 2008-10-02  Darin Adler  <darin@apple.com>
10
11         Reviewed by Geoff Garen.
12
13         - https://bugs.webkit.org/show_bug.cgi?id=21321
14           Bug 21321: speed up JavaScriptCore by inlining Heap in JSGlobalData
15
16         1.019x as fast on SunSpider.
17
18         * API/JSBase.cpp:
19         (JSEvaluateScript): Use heap. instead of heap-> to work with the heap.
20         (JSCheckScriptSyntax): Ditto.
21         (JSGarbageCollect): Ditto.
22         (JSReportExtraMemoryCost): Ditto.
23         * API/JSContextRef.cpp:
24         (JSGlobalContextRetain): Ditto.
25         (JSGlobalContextRelease): Destroy the heap with the destroy function instead
26         of the delete operator.
27         (JSContextGetGlobalObject): Use heap. instead of heap-> to work with the heap.
28         * API/JSObjectRef.cpp:
29         (JSObjectMake): Use heap. instead of heap-> to work with the heap.
30         (JSObjectMakeFunctionWithCallback): Ditto.
31         (JSObjectMakeConstructor): Ditto.
32         (JSObjectMakeFunction): Ditto.
33         (JSObjectMakeArray): Ditto.
34         (JSObjectMakeDate): Ditto.
35         (JSObjectMakeError): Ditto.
36         (JSObjectMakeRegExp): Ditto.
37         (JSObjectHasProperty): Ditto.
38         (JSObjectGetProperty): Ditto.
39         (JSObjectSetProperty): Ditto.
40         (JSObjectGetPropertyAtIndex): Ditto.
41         (JSObjectSetPropertyAtIndex): Ditto.
42         (JSObjectDeleteProperty): Ditto.
43         (JSObjectCallAsFunction): Ditto.
44         (JSObjectCallAsConstructor): Ditto.
45         (JSObjectCopyPropertyNames): Ditto.
46         (JSPropertyNameAccumulatorAddName): Ditto.
47         * API/JSValueRef.cpp:
48         (JSValueIsEqual): Ditto.
49         (JSValueIsInstanceOfConstructor): Ditto.
50         (JSValueMakeNumber): Ditto.
51         (JSValueMakeString): Ditto.
52         (JSValueToNumber): Ditto.
53         (JSValueToStringCopy): Ditto.
54         (JSValueToObject): Ditto.
55         (JSValueProtect): Ditto.
56         (JSValueUnprotect): Ditto.
57
58         * kjs/ExecState.h:
59         (JSC::ExecState::heap): Update to use the & operator.
60
61         * kjs/JSGlobalData.cpp:
62         (JSC::JSGlobalData::JSGlobalData): Update to initialize a heap member
63         instead of calling new to make a heap.
64         (JSC::JSGlobalData::~JSGlobalData): Destroy the heap with the destroy
65         function instead of the delete operator.
66         * kjs/JSGlobalData.h: Change from Heap* to a Heap.
67         * kjs/JSGlobalObject.cpp:
68         (JSC::JSGlobalObject::mark): Use the & operator here.
69         (JSC::JSGlobalObject::operator new): Use heap. instead of heap-> to work
70         with the heap.
71
72 2008-10-02  Cameron Zwarich  <zwarich@apple.com>
73
74         Reviewed by Geoff Garen.
75
76         Bug 21317: Replace RegisterFile size and capacity information with Register pointers
77         <https://bugs.webkit.org/show_bug.cgi?id=21317>
78
79         This is a 2.3% speedup on the V8 DeltaBlue benchmark, a 3.3% speedup on
80         the V8 Raytrace benchmark, and a 1.0% speedup on SunSpider.
81
82         * VM/Machine.cpp:
83         (JSC::slideRegisterWindowForCall):
84         (JSC::Machine::callEval):
85         (JSC::Machine::execute):
86         (JSC::Machine::privateExecute):
87         (JSC::Machine::cti_op_call_JSFunction):
88         (JSC::Machine::cti_op_construct_JSConstruct):
89         * VM/RegisterFile.cpp:
90         (JSC::RegisterFile::~RegisterFile):
91         * VM/RegisterFile.h:
92         (JSC::RegisterFile::RegisterFile):
93         (JSC::RegisterFile::start):
94         (JSC::RegisterFile::end):
95         (JSC::RegisterFile::size):
96         (JSC::RegisterFile::shrink):
97         (JSC::RegisterFile::grow):
98         (JSC::RegisterFile::lastGlobal):
99         (JSC::RegisterFile::markGlobals):
100         (JSC::RegisterFile::markCallFrames):
101         * kjs/JSGlobalObject.cpp:
102         (JSC::JSGlobalObject::copyGlobalsTo):
103
104 2008-10-02  Cameron Zwarich  <zwarich@apple.com>
105
106         Rubber-stamped by Darin Adler.
107
108         Change bitwise operations introduced in r37166 to boolean operations. We
109         only use bitwise operations over boolean operations for increasing
110         performance in extremely hot code, but that does not apply to anything
111         in the parser.
112
113         * kjs/grammar.y:
114
115 2008-10-02  Gavin Barraclough  <barraclough@apple.com>
116
117         Reviewed by Darin Adler.
118
119         Fix for bug #21232 - should reset m_isPendingDash on flush,
120         and should allow '\-' as beginning or end of a range (though
121         not to specifiy a range itself).
122
123         * ChangeLog:
124         * wrec/CharacterClassConstructor.cpp:
125         (JSC::CharacterClassConstructor::put):
126         (JSC::CharacterClassConstructor::flush):
127         * wrec/CharacterClassConstructor.h:
128         (JSC::CharacterClassConstructor::flushBeforeEscapedHyphen):
129         * wrec/WREC.cpp:
130         (JSC::WRECGenerator::generateDisjunction):
131         (JSC::WRECParser::parseCharacterClass):
132         (JSC::WRECParser::parseDisjunction):
133         * wrec/WREC.h:
134
135 2008-10-02  Darin Adler  <darin@apple.com>
136
137         Reviewed by Sam Weinig.
138
139         - remove the "static" from declarations in a header file, since we
140           don't want them to have internal linkage
141
142         * VM/Machine.h: Remove the static keyword from the constant and the
143         three inline functions that Geoff just moved here.
144
145 2008-10-02  Geoffrey Garen  <ggaren@apple.com>
146
147         Reviewed by Sam Weinig.
148         
149         Fixed https://bugs.webkit.org/show_bug.cgi?id=21283.
150         Profiler Crashes When Started
151
152         * VM/Machine.cpp:
153         * VM/Machine.h:
154         (JSC::makeHostCallFramePointer):
155         (JSC::isHostCallFrame):
156         (JSC::stripHostCallFrameBit): Moved some things to the header so
157         JSGlobalObject could use them.
158
159         * kjs/JSGlobalObject.h:
160         (JSC::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): Call the
161         new makeHostCallFramePointer API, since 0 no longer indicates a host
162         call frame.
163
164 2008-10-02  Alexey Proskuryakov  <ap@webkit.org>
165
166         Reviewed by Darin Adler.
167
168         https://bugs.webkit.org/show_bug.cgi?id=21304
169         Stop using a static wrapper map for WebCore JS bindings
170
171         * kjs/JSGlobalData.cpp:
172         (JSC::JSGlobalData::JSGlobalData):
173         (JSC::JSGlobalData::~JSGlobalData):
174         (JSC::JSGlobalData::ClientData::~ClientData):
175         * kjs/JSGlobalData.h:
176         Added a client data member to JSGlobalData. WebCore will use it to store bindings-related
177         global data.
178
179         * JavaScriptCore.exp: Export virtual ClientData destructor.
180
181 2008-10-02  Geoffrey Garen  <ggaren@apple.com>
182
183         Not reviewed.
184         
185         Try to fix Qt build.
186
187         * kjs/Error.h:
188
189 2008-10-01  Geoffrey Garen  <ggaren@apple.com>
190
191         Reviewed by Darin Adler and Cameron Zwarich.
192
193         Preliminary step toward dynamic recompilation: Standardized and
194         simplified the parsing interface.
195         
196         The main goal in this patch is to make it easy to ask for a duplicate
197         compilation, and get back a duplicate result -- same source URL, same
198         debugger / profiler ID, same toString behavior, etc.
199         
200         The basic unit of compilation and evaluation is now SourceCode, which
201         encompasses a SourceProvider, a range in that provider, and a starting
202         line number.
203
204         A SourceProvider now encompasses a source URL, and *is* a source ID,
205         since a pointer is a unique identifier.
206
207         * API/JSBase.cpp:
208         (JSEvaluateScript):
209         (JSCheckScriptSyntax): Provide a SourceCode to the Interpreter, since
210         other APIs are no longer supported.
211         
212         * VM/CodeBlock.h:
213         (JSC::EvalCodeCache::get): Provide a SourceCode to the Interpreter, since
214         other APIs are no longer supported.
215         (JSC::CodeBlock::CodeBlock): ASSERT something that used to be ASSERTed
216         by our caller -- this is a better bottleneck.
217
218         * VM/CodeGenerator.cpp:
219         (JSC::CodeGenerator::CodeGenerator): Updated for the fact that
220         FunctionBodyNode's parameters are no longer a WTF::Vector.
221
222         * kjs/Arguments.cpp:
223         (JSC::Arguments::Arguments): ditto
224
225         * kjs/DebuggerCallFrame.cpp:
226         (JSC::DebuggerCallFrame::evaluate): Provide a SourceCode to the Parser,
227         since other APIs are no longer supported.
228
229         * kjs/FunctionConstructor.cpp:
230         (JSC::constructFunction): Provide a SourceCode to the Parser, since
231         other APIs are no longer supported. Adopt FunctionBodyNode's new
232         "finishParsing" API.
233
234         * kjs/JSFunction.cpp:
235         (JSC::JSFunction::lengthGetter):
236         (JSC::JSFunction::getParameterName): Updated for the fact that
237         FunctionBodyNode's parameters are no longer a wtf::Vector.
238
239         * kjs/JSFunction.h: Nixed some cruft.
240
241         * kjs/JSGlobalObjectFunctions.cpp:
242         (JSC::globalFuncEval): Provide a SourceCode to the Parser, since
243         other APIs are no longer supported. 
244
245         * kjs/Parser.cpp:
246         (JSC::Parser::parse): Require a SourceCode argument, instead of a bunch
247         of broken out parameters. Stop tracking sourceId as an integer, since we
248         use the SourceProvider pointer for this now. Don't clamp the
249         startingLineNumber, since SourceCode does that now.
250
251         * kjs/Parser.h:
252         (JSC::Parser::parse): Standardized the parsing interface to require a
253         SourceCode.
254
255         * kjs/Shell.cpp:
256         (functionRun):
257         (functionLoad):
258         (prettyPrintScript):
259         (runWithScripts):
260         (runInteractive): Provide a SourceCode to the Interpreter, since
261         other APIs are no longer supported.
262
263         * kjs/SourceProvider.h:
264         (JSC::SourceProvider::SourceProvider):
265         (JSC::SourceProvider::url):
266         (JSC::SourceProvider::asId):
267         (JSC::UStringSourceProvider::create):
268         (JSC::UStringSourceProvider::UStringSourceProvider): Added new
269         responsibilities described above.
270
271         * kjs/SourceRange.h:
272         (JSC::SourceCode::SourceCode):
273         (JSC::SourceCode::toString):
274         (JSC::SourceCode::provider):
275         (JSC::SourceCode::firstLine):
276         (JSC::SourceCode::data):
277         (JSC::SourceCode::length): Added new responsibilities described above.
278         Renamed SourceRange to SourceCode, based on review feedback. Added
279         a makeSource function for convenience.
280
281         * kjs/debugger.h: Provide a SourceCode to the client, since other APIs
282         are no longer supported.
283
284         * kjs/grammar.y: Provide startingLineNumber when creating a SourceCode.
285
286         * kjs/debugger.h: Treat sourceId as intptr_t to avoid loss of precision
287         on 64bit platforms.
288
289         * kjs/interpreter.cpp:
290         (JSC::Interpreter::checkSyntax):
291         (JSC::Interpreter::evaluate):
292         * kjs/interpreter.h: Require a SourceCode instead of broken out arguments.
293
294         * kjs/lexer.cpp:
295         (JSC::Lexer::setCode):
296         * kjs/lexer.h:
297         (JSC::Lexer::sourceRange): Fold together the SourceProvider and line number
298         into a SourceCode. Fixed a bug where the Lexer would accidentally keep
299         alive the last SourceProvider forever.
300
301         * kjs/nodes.cpp:
302         (JSC::ScopeNode::ScopeNode):
303         (JSC::ProgramNode::ProgramNode):
304         (JSC::ProgramNode::create):
305         (JSC::EvalNode::EvalNode):
306         (JSC::EvalNode::generateCode):
307         (JSC::EvalNode::create):
308         (JSC::FunctionBodyNode::FunctionBodyNode):
309         (JSC::FunctionBodyNode::finishParsing):
310         (JSC::FunctionBodyNode::create):
311         (JSC::FunctionBodyNode::generateCode):
312         (JSC::ProgramNode::generateCode):
313         (JSC::FunctionBodyNode::paramString):
314         * kjs/nodes.h:
315         (JSC::ScopeNode::):
316         (JSC::ScopeNode::sourceId):
317         (JSC::FunctionBodyNode::):
318         (JSC::FunctionBodyNode::parameterCount):
319         (JSC::FuncExprNode::):
320         (JSC::FuncDeclNode::): Store a SourceCode in all ScopeNodes, since
321         SourceCode is now responsible for tracking URL, ID, etc. Streamlined
322         some ad hoc FunctionBodyNode fixups into a "finishParsing" function, to
323         help make clear what you need to do in order to finish parsing a
324         FunctionBodyNode.
325
326         * wtf/Vector.h:
327         (WTF::::releaseBuffer): Don't ASSERT that releaseBuffer() is only called
328         when buffer is not 0, since FunctionBodyNode is more than happy
329         to get back a 0 buffer, and other functions like RefPtr::release() allow
330         for 0, too.
331
332 2008-10-01  Cameron Zwarich  <zwarich@apple.com>
333
334         Reviewed by Maciej Stachowiak.
335
336         Bug 21289: REGRESSION (r37160): Inspector crashes on load
337         <https://bugs.webkit.org/show_bug.cgi?id=21289>
338
339         The code in Arguments::mark() in r37160 was wrong. It marks indices in
340         d->registers, but that makes no sense (they are local variables, not
341         arguments). It should mark those indices in d->registerArray instead.
342
343         This patch also changes Arguments::copyRegisters() to use d->numParameters
344         instead of recomputing it.
345
346         * kjs/Arguments.cpp:
347         (JSC::Arguments::mark):
348         * kjs/Arguments.h:
349         (JSC::Arguments::copyRegisters):
350
351 2008-09-30  Darin Adler  <darin@apple.com>
352
353         Reviewed by Eric Seidel.
354
355         - https://bugs.webkit.org/show_bug.cgi?id=21214
356           work on getting rid of ExecState
357
358         Eliminate some unneeded uses of dynamicGlobalObject.
359
360         * API/JSClassRef.cpp:
361         (OpaqueJSClass::contextData): Changed to use a map in the global data instead
362         of on the global object. Also fixed to use only a single hash table lookup.
363
364         * API/JSObjectRef.cpp:
365         (JSObjectMakeConstructor): Use lexicalGlobalObject rather than dynamicGlobalObject
366         to get the object prototype.
367
368         * kjs/ArrayPrototype.cpp:
369         (JSC::arrayProtoFuncToString): Use arrayVisitedElements set in global data rather
370         than in the global object.
371         (JSC::arrayProtoFuncToLocaleString): Ditto.
372         (JSC::arrayProtoFuncJoin): Ditto.
373
374         * kjs/JSGlobalData.cpp:
375         (JSC::JSGlobalData::JSGlobalData): Don't initialize opaqueJSClassData, since
376         it's no longer a pointer.
377         (JSC::JSGlobalData::~JSGlobalData): We still need to delete all the values, but
378         we don't need to delete the map since it's no longer a pointer.
379
380         * kjs/JSGlobalData.h: Made opaqueJSClassData a map instead of a pointer to a map.
381         Also added arrayVisitedElements.
382
383         * kjs/JSGlobalObject.h: Removed arrayVisitedElements.
384
385         * kjs/Shell.cpp:
386         (functionRun): Use lexicalGlobalObject instead of dynamicGlobalObject.
387         (functionLoad): Ditto.
388
389 2008-10-01  Cameron Zwarich  <zwarich@apple.com>
390
391         Not reviewed.
392
393         Speculative Windows build fix.
394
395         * kjs/grammar.y:
396
397 2008-10-01  Cameron Zwarich  <zwarich@apple.com>
398
399         Reviewed by Darin Adler.
400
401         Bug 21123: using "arguments" in a function should not force creation of an activation object
402         <https://bugs.webkit.org/show_bug.cgi?id=21123>
403
404         Make the 'arguments' object not require a JSActivation. We store the
405         'arguments' object in the OptionalCalleeArguments call frame slot. We
406         need to be able to get the original 'arguments' object to tear it off
407         when returning from a function, but 'arguments' may be assigned to in a
408         number of ways.
409
410         Therefore, we use the OptionalCalleeArguments slot when we want to get
411         the original activation or we know that 'arguments' was not assigned a
412         different value. When 'arguments' may have been assigned a new value,
413         we use a new local variable that is initialized with 'arguments'. Since
414         a function parameter named 'arguments' may overwrite the value of
415         'arguments', we also need to be careful to look up 'arguments' in the
416         symbol table, so we get the parameter named 'arguments' instead of the
417         local variable that we have added for holding the 'arguments' object.
418
419         This is a 19.1% win on the V8 Raytrace benchmark using the SunSpider
420         harness, and a 20.7% win using the V8 harness. This amounts to a 6.5%
421         total speedup on the V8 benchmark suite using the V8 harness.
422
423         * VM/CTI.cpp:
424         (JSC::CTI::privateCompileMainPass):
425         * VM/CodeBlock.h:
426         * VM/CodeGenerator.cpp:
427         (JSC::CodeGenerator::CodeGenerator):
428         * VM/Machine.cpp:
429         (JSC::Machine::unwindCallFrame):
430         (JSC::Machine::privateExecute):
431         (JSC::Machine::retrieveArguments):
432         (JSC::Machine::cti_op_init_arguments):
433         (JSC::Machine::cti_op_ret_activation_arguments):
434         * VM/Machine.h:
435         * VM/RegisterFile.h:
436         (JSC::RegisterFile::):
437         * kjs/Arguments.cpp:
438         (JSC::Arguments::mark):
439         (JSC::Arguments::fillArgList):
440         (JSC::Arguments::getOwnPropertySlot):
441         (JSC::Arguments::put):
442         * kjs/Arguments.h:
443         (JSC::Arguments::setRegisters):
444         (JSC::Arguments::init):
445         (JSC::Arguments::Arguments):
446         (JSC::Arguments::copyRegisters):
447         (JSC::JSActivation::copyRegisters):
448         * kjs/JSActivation.cpp:
449         (JSC::JSActivation::argumentsGetter):
450         * kjs/JSActivation.h:
451         (JSC::JSActivation::JSActivationData::JSActivationData):
452         * kjs/grammar.y:
453         * kjs/nodes.h:
454         (JSC::ScopeNode::setUsesArguments):
455         * masm/X86Assembler.h:
456         (JSC::X86Assembler::):
457         (JSC::X86Assembler::orl_mr):
458
459 2008-10-01  Kevin McCullough  <kmccullough@apple.com>
460
461         Rubberstamped by Geoff Garen.
462
463         Remove BreakpointCheckStatement because it's not used anymore.
464         No effect on sunspider or the jsc tests.
465
466         * kjs/nodes.cpp:
467         * kjs/nodes.h:
468
469 2008-09-30  Oliver Hunt  <oliver@apple.com>
470
471         Reviewed by Geoff Garen.
472
473         Improve performance of CTI on windows.
474
475         Currently on platforms where the compiler doesn't allow us to safely
476         index relative to the address of a parameter we need to actually
477         provide a pointer to CTI runtime call arguments.  This patch improves
478         performance in this case by making the CTI logic for restoring this
479         parameter much less conservative by only resetting it before we actually
480         make a call, rather than between each and every SF bytecode we generate
481         code for.
482
483         This results in a 3.6% progression on the v8 benchmark when compiled with MSVC.
484
485         * VM/CTI.cpp:
486         (JSC::CTI::emitCall):
487         (JSC::CTI::compileOpCall):
488         (JSC::CTI::privateCompileMainPass):
489         (JSC::CTI::privateCompileSlowCases):
490         (JSC::CTI::privateCompilePutByIdTransition):
491         * VM/CTI.h:
492         * masm/X86Assembler.h:
493         * wtf/Platform.h:
494
495 2008-09-30  Maciej Stachowiak  <mjs@apple.com>
496
497         Reviewed by Oliver Hunt.
498
499         - track uses of "this", "with" and "catch" in the parser
500         
501         Knowing this up front will be useful for future optimizations.
502         
503         Perf and correctness remain the same.
504         
505         * kjs/NodeInfo.h:
506         * kjs/grammar.y:
507
508 2008-09-30  Sam Weinig  <sam@webkit.org>
509
510         Reviewed by Mark Rowe.
511
512         Add WebKitAvailability macros for JSObjectMakeArray, JSObjectMakeDate, JSObjectMakeError,
513         and JSObjectMakeRegExp
514
515         * API/JSObjectRef.h:
516
517 2008-09-30  Darin Adler  <darin@apple.com>
518
519         Reviewed by Geoff Garen.
520
521         - https://bugs.webkit.org/show_bug.cgi?id=21214
522           work on getting rid of ExecState
523
524         Replaced the m_prev field of ExecState with a bit in the
525         call frame pointer to indicate "host" call frames.
526
527         * VM/Machine.cpp:
528         (JSC::makeHostCallFramePointer): Added. Sets low bit.
529         (JSC::isHostCallFrame): Added. Checks low bit.
530         (JSC::stripHostCallFrameBit): Added. Clears low bit.
531         (JSC::Machine::unwindCallFrame): Replaced null check that was
532         formerly used to detect host call frames with an isHostCallFrame check.
533         (JSC::Machine::execute): Pass in a host call frame pointer rather than
534         always passing 0 when starting execution from the host. This allows us
535         to follow the entire call frame pointer chain when desired, or to stop
536         at the host calls when that's desired.
537         (JSC::Machine::privateExecute): Replaced null check that was
538         formerly used to detect host call frames with an isHostCallFrame check.
539         (JSC::Machine::retrieveCaller): Ditto.
540         (JSC::Machine::retrieveLastCaller): Ditto.
541         (JSC::Machine::callFrame): Removed the code to walk up m_prev pointers
542         and replaced it with code that uses the caller pointer and uses the
543         stripHostCallFrameBit function.
544
545         * kjs/ExecState.cpp: Removed m_prev.
546         * kjs/ExecState.h: Ditto.
547
548 2008-09-30  Cameron Zwarich  <zwarich@apple.com>
549
550         Reviewed by Geoff Garen.
551
552         Move all detection of 'arguments' in a lexical scope to the parser, in
553         preparation for fixing
554
555         Bug 21123: using "arguments" in a function should not force creation of an activation object
556         <https://bugs.webkit.org/show_bug.cgi?id=21123>
557
558         * VM/CodeGenerator.cpp:
559         (JSC::CodeGenerator::CodeGenerator):
560         * kjs/NodeInfo.h:
561         * kjs/grammar.y:
562
563 2008-09-30  Geoffrey Garen  <ggaren@apple.com>
564
565         Not reviewed.
566
567         * kjs/Shell.cpp:
568         (runWithScripts): Fixed indentation.
569
570 2008-09-30  Mark Rowe  <mrowe@apple.com>
571
572         Rubber-stamped by Sam Weinig.
573
574         Build fix.  Move InternalFunction::classInfo implementation into the .cpp
575         file to prevent the vtable for InternalFunction being generated as a weak symbol.
576         Has no effect on SunSpider.
577
578         * kjs/InternalFunction.cpp:
579         (JSC::InternalFunction::classInfo):
580         * kjs/InternalFunction.h:
581
582 2008-09-29  Maciej Stachowiak  <mjs@apple.com>
583
584         Reviewed by Darin Adler.
585         
586         - optimize appending a number to a string
587         https://bugs.webkit.org/show_bug.cgi?id=21203
588         
589         It's pretty common in real-world code (and on some of the v8
590         benchmarks) to append a number to a string, so I made this one of
591         the fast cases, and also added support to UString to do it
592         directly without allocating a temporary UString.
593         
594         ~1% speedup on v8 benchmark.
595
596         * VM/Machine.cpp:
597         (JSC::jsAddSlowCase): Make this NEVER_INLINE because somehow otherwise
598         the change is a regression.
599         (JSC::jsAdd): Handle number + string special case.
600         (JSC::Machine::cti_op_add): Integrate much of the logic of jsAdd to
601         avoid exception check in the str + str, num + num and str + num cases.
602         * kjs/ustring.cpp:
603         (JSC::expandedSize): Make this a non-member function, since it needs to be 
604         called in non-member functions but not outside this file.
605         (JSC::expandCapacity): Ditto.
606         (JSC::UString::expandCapacity): Call the non-member version. 
607         (JSC::createRep): Helper to make a rep from a char*.
608         (JSC::UString::UString): Use above helper.
609         (JSC::concatenate): Guts of concatenating constructor for cases where first
610         item is a UString::Rep, and second is a UChar* and length, or a char*.
611         (JSC::UString::append): Implement for cases where first item is a UString::Rep,
612         and second is an int or double. Sadly duplicates logic of UString::from(int)
613         and UString::from(double).
614         * kjs/ustring.h:
615
616 2008-09-29  Darin Adler  <darin@apple.com>
617
618         Reviewed by Sam Weinig.
619
620         - https://bugs.webkit.org/show_bug.cgi?id=21214
621           work on getting rid of ExecState
622
623         * JavaScriptCore.exp: Updated since JSGlobalObject::init
624         no longer takes a parameter.
625
626         * VM/Machine.cpp:
627         (JSC::Machine::execute): Removed m_registerFile argument
628         for ExecState constructors.
629
630         * kjs/DebuggerCallFrame.cpp:
631         (JSC::DebuggerCallFrame::evaluate): Removed globalThisValue
632         argument for ExecState constructor.
633
634         * kjs/ExecState.cpp:
635         (JSC::ExecState::ExecState): Removed globalThisValue and
636         registerFile arguments to constructors.
637
638         * kjs/ExecState.h: Removed m_globalThisValue and
639         m_registerFile data members.
640
641         * kjs/JSGlobalObject.cpp:
642         (JSC::JSGlobalObject::init): Removed globalThisValue
643         argument for ExecState constructor.
644
645         * kjs/JSGlobalObject.h:
646         (JSC::JSGlobalObject::JSGlobalObject): Got rid of parameter
647         for the init function.
648
649 2008-09-29  Geoffrey Garen  <ggaren@apple.com>
650
651         Rubber-stamped by Cameron Zwarich.
652         
653         Fixed https://bugs.webkit.org/show_bug.cgi?id=21225
654         Machine::retrieveLastCaller should check for a NULL codeBlock
655         
656         In order to crash, you would need to call retrieveCaller in a situation
657         where you had two host call frames in a row in the register file. I
658         don't know how to make that happen, or if it's even possible, so I don't
659         have a test case -- but better safe than sorry!
660
661         * VM/Machine.cpp:
662         (JSC::Machine::retrieveLastCaller):
663
664 2008-09-29  Geoffrey Garen  <ggaren@apple.com>
665
666         Reviewed by Cameron Zwarich.
667         
668         Store the callee ScopeChain, not the caller ScopeChain, in the call frame
669         header. Nix the "scopeChain" local variable and ExecState::m_scopeChain, and
670         access the callee ScopeChain through the call frame header instead.
671
672         Profit: call + return are simpler, because they don't have to update the
673         "scopeChain" local variable, or ExecState::m_scopeChain.
674         
675         Because CTI keeps "r" in a register, reading the callee ScopeChain relative
676         to "r" can be very fast, in any cases we care to optimize.
677
678         0% speedup on empty function call benchmark. (5.5% speedup in bytecode.)
679         0% speedup on SunSpider. (7.5% speedup on controlflow-recursive.)
680         2% speedup on SunSpider --v8.
681         2% speedup on v8 benchmark.
682
683         * VM/CTI.cpp: Changed scope chain access to read the scope chain from
684         the call frame header. Sped up op_ret by changing it not to fuss with
685         the "scopeChain" local variable or ExecState::m_scopeChain.
686
687         * VM/CTI.h: Updated CTI trampolines not to take a ScopeChainNode*
688         argument, since that's stored in the call frame header now.
689
690         * VM/Machine.cpp: Access "scopeChain" and "codeBlock" through new helper
691         functions that read from the call frame header. Updated functions operating
692         on ExecState::m_callFrame to account for / take advantage of the fact that
693         Exec:m_callFrame is now never NULL.
694         
695         Fixed a bug in op_construct, where it would use the caller's default
696         object prototype, rather than the callee's, when constructing a new object.
697
698         * VM/Machine.h: Made some helper functions available. Removed
699         ScopeChainNode* arguments to a lot of functions, since the ScopeChainNode*
700         is now stored in the call frame header.
701
702         * VM/RegisterFile.h: Renamed "CallerScopeChain" to "ScopeChain", since
703         that's what it is now.
704
705         * kjs/DebuggerCallFrame.cpp: Updated for change to ExecState signature.
706
707         * kjs/ExecState.cpp:
708         * kjs/ExecState.h: Nixed ExecState::m_callFrame, along with the unused
709         isGlobalObject function.
710
711         * kjs/JSGlobalObject.cpp:
712         * kjs/JSGlobalObject.h: Gave the global object a fake call frame in
713         which to store the global scope chain, since our code now assumes that
714         it can always read the scope chain out of the ExecState's call frame.
715
716 2008-09-29  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
717
718         Reviewed by Sam Weinig.
719
720         Remove the isActivationObject() virtual method on JSObject and use
721         StructureID information instead. This should be slightly faster, but
722         isActivationObject() is only used in assertions and unwinding the stack
723         for exceptions.
724
725         * VM/Machine.cpp:
726         (JSC::depth):
727         (JSC::Machine::unwindCallFrame):
728         (JSC::Machine::privateExecute):
729         (JSC::Machine::cti_op_ret_activation):
730         * kjs/JSActivation.cpp:
731         * kjs/JSActivation.h:
732         * kjs/JSObject.h:
733
734 2008-09-29  Peter Gal  <galpeter@inf.u-szeged.hu>
735
736         Reviewed and tweaked by Darin Adler.
737
738         Fix build for non-all-in-one platforms.
739
740         * kjs/StringPrototype.cpp: Added missing ASCIICType.h include.
741
742 2008-09-29  Bradley T. Hughes  <bradley.hughes@nokia.com>
743
744         Reviewed by Simon Hausmann.
745
746         Fix compilation with icpc
747
748         * wtf/HashSet.h:
749         (WTF::::find):
750         (WTF::::contains):
751
752 2008-09-29  Thiago Macieira  <thiago.macieira@nokia.com>
753
754         Reviewed by Simon Hausmann.
755
756         Changed copyright from Trolltech ASA to Nokia.
757         
758         Nokia acquired Trolltech ASA, assets were transferred on September 26th 2008.
759         
760
761         * wtf/qt/MainThreadQt.cpp:
762
763 2008-09-29  Simon Hausmann  <hausmann@webkit.org>
764
765         Reviewed by Lars Knoll.
766
767         Don't accidentially install libJavaScriptCore.a for the build inside
768         Qt.
769
770         * JavaScriptCore.pro:
771
772 2008-09-28  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
773
774         Reviewed by Maciej Stachowiak.
775
776         Bug 21200: Allow direct access to 'arguments' without using op_resolve
777         <https://bugs.webkit.org/show_bug.cgi?id=21200>
778
779         Allow fast access to the 'arguments' object by adding an extra slot to
780         the callframe to store it.
781
782         This is a 3.0% speedup on the V8 Raytrace benchmark.
783
784         * JavaScriptCore.exp:
785         * VM/CTI.cpp:
786         (JSC::CTI::privateCompileMainPass):
787         * VM/CodeBlock.cpp:
788         (JSC::CodeBlock::dump):
789         * VM/CodeGenerator.cpp:
790         (JSC::CodeGenerator::CodeGenerator):
791         (JSC::CodeGenerator::registerFor):
792         * VM/CodeGenerator.h:
793         (JSC::CodeGenerator::registerFor):
794         * VM/Machine.cpp:
795         (JSC::Machine::initializeCallFrame):
796         (JSC::Machine::dumpRegisters):
797         (JSC::Machine::privateExecute):
798         (JSC::Machine::retrieveArguments):
799         (JSC::Machine::cti_op_call_JSFunction):
800         (JSC::Machine::cti_op_create_arguments):
801         (JSC::Machine::cti_op_construct_JSConstruct):
802         * VM/Machine.h:
803         * VM/Opcode.h:
804         * VM/RegisterFile.h:
805         (JSC::RegisterFile::):
806         * kjs/JSActivation.cpp:
807         (JSC::JSActivation::mark):
808         (JSC::JSActivation::argumentsGetter):
809         * kjs/JSActivation.h:
810         (JSC::JSActivation::JSActivationData::JSActivationData):
811         * kjs/NodeInfo.h:
812         * kjs/Parser.cpp:
813         (JSC::Parser::didFinishParsing):
814         * kjs/Parser.h:
815         (JSC::Parser::parse):
816         * kjs/grammar.y:
817         * kjs/nodes.cpp:
818         (JSC::ScopeNode::ScopeNode):
819         (JSC::ProgramNode::ProgramNode):
820         (JSC::ProgramNode::create):
821         (JSC::EvalNode::EvalNode):
822         (JSC::EvalNode::create):
823         (JSC::FunctionBodyNode::FunctionBodyNode):
824         (JSC::FunctionBodyNode::create):
825         * kjs/nodes.h:
826         (JSC::ScopeNode::usesArguments):
827
828 2008-09-28  Mark Rowe  <mrowe@apple.com>
829
830         Reviewed by Sam Weinig.
831
832         Add an ASCII fast-path to toLowerCase and toUpperCase.
833
834         The fast path speeds up the common case of an ASCII-only string by up to 60% while adding a less than 5% penalty
835         to the less common non-ASCII case.
836
837         This also removes stringProtoFuncToLocaleLowerCase and stringProtoFuncToLocaleUpperCase, which were identical
838         to the non-locale variants of the functions.  toLocaleLowerCase and toLocaleUpperCase now use the non-locale
839         variants of the functions directly.
840
841         * kjs/StringPrototype.cpp:
842         (JSC::stringProtoFuncToLowerCase):
843         (JSC::stringProtoFuncToUpperCase):
844
845 2008-09-28  Mark Rowe  <mrowe@apple.com>
846
847         Reviewed by Cameron Zwarich.
848
849         Speed up parseInt and parseFloat.
850
851         Repeatedly indexing into a UString is slow, so retrieve a pointer into the underlying buffer once up front
852         and use that instead.  This is a 7% win on a parseInt/parseFloat micro-benchmark.
853
854         * kjs/JSGlobalObjectFunctions.cpp:
855         (JSC::parseInt):
856         (JSC::parseFloat):
857
858 2008-09-28  Simon Hausmann  <hausmann@webkit.org>
859
860         Reviewed by David Hyatt.
861
862         In Qt's initializeThreading re-use an existing thread identifier for the main
863         thread if it exists.
864
865         currentThread() implicitly creates new identifiers and it could be that
866         it is called before initializeThreading().
867
868         * wtf/ThreadingQt.cpp:
869         (WTF::initializeThreading):
870
871 2008-09-27  Keishi Hattori  <casey.hattori@gmail.com>
872
873         Added Machine::retrieveCaller to the export list.
874
875         Reviewed by Kevin McCullough and Tim Hatcher.
876
877         * JavaScriptCore.exp: Added Machine::retrieveCaller.
878
879 2008-09-27  Anders Carlsson  <andersca@apple.com>
880
881         Fix build.
882
883         * VM/CTI.cpp:
884         (JSC::):
885
886 2008-09-27  Geoffrey Garen  <ggaren@apple.com>
887
888         Reviewed by Cameron Zwarich.
889         
890         https://bugs.webkit.org/show_bug.cgi?id=21175
891
892         Store the callee CodeBlock, not the caller CodeBlock, in the call frame
893         header. Nix the "codeBlock" local variable, and access the callee
894         CodeBlock through the call frame header instead.
895         
896         Profit: call + return are simpler, because they don't have to update the
897         "codeBlock" local variable.
898         
899         Because CTI keeps "r" in a register, reading the callee CodeBlock relative
900         to "r" can be very fast, in any cases we care to optimize. Presently,
901         no such cases seem important.
902         
903         Also, stop writing "dst" to the call frame header. CTI doesn't use it.
904         
905         21.6% speedup on empty function call benchmark.
906         3.8% speedup on SunSpider --v8.
907         2.1% speedup on v8 benchmark.
908         0.7% speedup on SunSpider (6% speedup on controlflow-recursive).
909         
910         Small regression in bytecode, because currently every op_ret reads the
911         callee CodeBlock to check needsFullScopeChain, and bytecode does not
912         keep "r" in a register. On-balance, this is probably OK, since CTI is
913         our high-performance execution model. Also, this should go away once
914         we make needsFullScopeChain statically determinable at parse time.
915
916         * VM/CTI.cpp:
917         (JSC::CTI::compileOpCall): The speedup!
918         (JSC::CTI::privateCompileSlowCases): ditto
919
920         * VM/CTI.h:
921         (JSC::): Fixed up magic trampoline constants to account for the nixed
922         "codeBlock" argument.
923         (JSC::CTI::execute): Changed trampoline function not to take a "codeBlock"
924         argument, since codeBlock is now stored in the call frame header.
925         
926         * VM/Machine.cpp: Read the callee CodeBlock from the register file. Use
927         a NULL CallerRegisters in the call frame header to signal a built-in
928         caller, since CodeBlock is now never NULL.
929
930         * VM/Machine.h: Made some stand-alone functions Machine member functions
931         so they could call the private codeBlock() accessor in the Register
932         class, of which Machine is a friend. Renamed "CallerCodeBlock" to
933         "CodeBlock", since it's no longer the caller's CodeBlock.
934
935         * VM/RegisterFile.h: Marked some methods const to accommodate a 
936         const RegisterFile* being passed around in Machine.cpp.
937
938 2008-09-26  Jan Michael Alonzo  <jmalonzo@webkit.org>
939
940         Gtk build fix. Not reviewed.
941
942         Narrow-down the target of the JavaScriptCore .lut.h generator so
943         it won't try to create the WebCore .lut.hs.
944
945         * GNUmakefile.am:
946
947 2008-09-26  Matt Lilek  <webkit@mattlilek.com>
948
949         Reviewed by Tim Hatcher.
950
951         Update FEATURE_DEFINES after ENABLE_CROSS_DOCUMENT_MESSAGING was removed.
952
953         * Configurations/JavaScriptCore.xcconfig:
954
955 2008-09-26  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
956
957         Rubber-stamped by Anders Carlson.
958
959         Change the name 'sc' to 'scopeChainNode' in a few places.
960
961         * kjs/nodes.cpp:
962         (JSC::EvalNode::generateCode):
963         (JSC::FunctionBodyNode::generateCode):
964         (JSC::ProgramNode::generateCode):
965
966 2008-09-26  Sam Weinig  <sam@webkit.org>
967
968         Reviewed by Darin Adler.
969
970         Patch for https://bugs.webkit.org/show_bug.cgi?id=21152
971         Speedup static property get/put
972
973         Convert getting/setting static property values to use static functions
974         instead of storing an integer and switching in getValueProperty/putValueProperty.
975
976         * kjs/JSObject.cpp:
977         (JSC::JSObject::deleteProperty):
978         (JSC::JSObject::getPropertyAttributes):
979         * kjs/MathObject.cpp:
980         (JSC::MathObject::getOwnPropertySlot):
981         * kjs/NumberConstructor.cpp:
982         (JSC::numberConstructorNaNValue):
983         (JSC::numberConstructorNegInfinity):
984         (JSC::numberConstructorPosInfinity):
985         (JSC::numberConstructorMaxValue):
986         (JSC::numberConstructorMinValue):
987         * kjs/PropertySlot.h:
988         (JSC::PropertySlot::):
989         * kjs/RegExpConstructor.cpp:
990         (JSC::regExpConstructorDollar1):
991         (JSC::regExpConstructorDollar2):
992         (JSC::regExpConstructorDollar3):
993         (JSC::regExpConstructorDollar4):
994         (JSC::regExpConstructorDollar5):
995         (JSC::regExpConstructorDollar6):
996         (JSC::regExpConstructorDollar7):
997         (JSC::regExpConstructorDollar8):
998         (JSC::regExpConstructorDollar9):
999         (JSC::regExpConstructorInput):
1000         (JSC::regExpConstructorMultiline):
1001         (JSC::regExpConstructorLastMatch):
1002         (JSC::regExpConstructorLastParen):
1003         (JSC::regExpConstructorLeftContext):
1004         (JSC::regExpConstructorRightContext):
1005         (JSC::setRegExpConstructorInput):
1006         (JSC::setRegExpConstructorMultiline):
1007         (JSC::RegExpConstructor::setInput):
1008         (JSC::RegExpConstructor::setMultiline):
1009         (JSC::RegExpConstructor::multiline):
1010         * kjs/RegExpConstructor.h:
1011         * kjs/RegExpObject.cpp:
1012         (JSC::regExpObjectGlobal):
1013         (JSC::regExpObjectIgnoreCase):
1014         (JSC::regExpObjectMultiline):
1015         (JSC::regExpObjectSource):
1016         (JSC::regExpObjectLastIndex):
1017         (JSC::setRegExpObjectLastIndex):
1018         * kjs/RegExpObject.h:
1019         (JSC::RegExpObject::setLastIndex):
1020         (JSC::RegExpObject::lastIndex):
1021         (JSC::RegExpObject::RegExpObjectData::RegExpObjectData):
1022         * kjs/StructureID.cpp:
1023         (JSC::StructureID::getEnumerablePropertyNames):
1024         * kjs/create_hash_table:
1025         * kjs/lexer.cpp:
1026         (JSC::Lexer::lex):
1027         * kjs/lookup.cpp:
1028         (JSC::HashTable::createTable):
1029         (JSC::HashTable::deleteTable):
1030         (JSC::setUpStaticFunctionSlot):
1031         * kjs/lookup.h:
1032         (JSC::HashEntry::initialize):
1033         (JSC::HashEntry::setKey):
1034         (JSC::HashEntry::key):
1035         (JSC::HashEntry::attributes):
1036         (JSC::HashEntry::function):
1037         (JSC::HashEntry::functionLength):
1038         (JSC::HashEntry::propertyGetter):
1039         (JSC::HashEntry::propertyPutter):
1040         (JSC::HashEntry::lexerValue):
1041         (JSC::HashEntry::):
1042         (JSC::HashTable::entry):
1043         (JSC::getStaticPropertySlot):
1044         (JSC::getStaticValueSlot):
1045         (JSC::lookupPut):
1046
1047 2008-09-26  Gavin Barraclough  <barraclough@apple.com>
1048
1049         Reviewed by Maciej Stachowiak & Oliver Hunt.
1050
1051         Add support for reusing temporary JSNumberCells.  This change is based on the observation
1052         that if the result of certain operations is a JSNumberCell and is consumed by a subsequent
1053         operation that would produce a JSNumberCell, we can reuse the object rather than allocating
1054         a fresh one.  E.g. given the expression ((a * b) * c), we can statically determine that
1055         (a * b) will have a numeric result (or else it will have thrown an exception), so the result
1056         will either be a JSNumberCell or a JSImmediate.
1057
1058         This patch changes three areas of JSC:
1059             * The AST now tracks type information about the result of each node.
1060             * This information is consumed in bytecode compilation, and certain bytecode operations
1061               now carry the statically determined type information about their operands.
1062             * CTI uses the information in a number of fashions:
1063                 * Where an operand to certain arithmetic operations is reusable, it will plant code
1064                   to try to perform the operation in JIT code & reuse the cell, where appropriate.
1065                 * Where it can be statically determined that an operand can only be numeric (typically
1066                   the result of another arithmetic operation) the code will not redundantly check that
1067                   the JSCell is a JSNumberCell.
1068                 * Where either of the operands to an add are non-numeric do not plant an optimized
1069                   arithmetic code path, just call straight out to the C function.
1070
1071         +6% Sunspider (10% progression on 3D, 16% progression on math, 60% progression on access-nbody),
1072         +1% v8-tests (improvements in raytrace & crypto)
1073
1074         * VM/CTI.cpp: Add optimized code generation with reuse of temporary JSNumberCells.
1075         * VM/CTI.h:
1076         * kjs/JSNumberCell.h:
1077         * masm/X86Assembler.h:
1078
1079         * VM/CodeBlock.cpp: Add type information to specific bytecodes.
1080         * VM/CodeGenerator.cpp:
1081         * VM/CodeGenerator.h:
1082         * VM/Machine.cpp:
1083
1084         * kjs/nodes.cpp: Track static type information for nodes.
1085         * kjs/nodes.h:
1086         * kjs/ResultDescriptor.h: (Added)
1087         * JavaScriptCore.xcodeproj/project.pbxproj:
1088
1089 2008-09-26  Yichao Yin  <yichao.yin@torchmobile.com.cn>
1090
1091         Reviewed by George Staikos, Maciej Stachowiak.
1092
1093         Add utility functions needed for upcoming WML code.
1094
1095         * wtf/ASCIICType.h:
1096         (WTF::isASCIIPrintable):
1097
1098 2008-09-26  Geoffrey Garen  <ggaren@apple.com>
1099
1100         Reviewed by Darin Adler.
1101         
1102         Reverted the part of r36614 that used static data because static data
1103         is not thread-safe.
1104
1105 2008-09-26  Geoffrey Garen  <ggaren@apple.com>
1106
1107         Reviewed by Maciej Stachowiak.
1108         
1109         Removed dynamic check for whether the callee needs an activation object.
1110         Replaced with callee code to create the activation object.
1111
1112         0.5% speedup on SunSpider.
1113         No change on v8 benchmark. (Might be a speedup, but it's in range of the
1114         variance.)
1115
1116         0.7% speedup on v8 benchmark in bytecode.
1117         1.3% speedup on empty call benchmark in bytecode.
1118
1119         * VM/CTI.cpp:
1120         (JSC::CTI::privateCompileMainPass): Added support for op_init_activation,
1121         the new opcode that specifies that the callee's initialization should
1122         create an activation object.
1123         (JSC::CTI::privateCompile): Removed previous code that did a similar
1124         thing in an ad-hoc way.
1125
1126         * VM/CodeBlock.cpp:
1127         (JSC::CodeBlock::dump): Added a case for dumping op_init_activation.
1128
1129         * VM/CodeGenerator.cpp:
1130         (JSC::CodeGenerator::generate): Added fixup code to change op_init to
1131         op_init_activation if necessary. (With a better parser, we would know
1132         which to use from the beginning.)
1133
1134         * VM/Instruction.h:
1135         (JSC::Instruction::Instruction):
1136         (WTF::): Faster traits for the instruction vector. An earlier version
1137         of this patch relied on inserting at the beginning of the vector, and
1138         depended on this change for speed.
1139
1140         * VM/Machine.cpp:
1141         (JSC::Machine::execute): Removed clients of setScopeChain, the old
1142         abstraction for dynamically checking for whether an activation object
1143         needed to be created.
1144         (JSC::Machine::privateExecute): ditto
1145
1146         (JSC::Machine::cti_op_push_activation): Renamed this function from
1147         cti_vm_updateScopeChain, and made it faster by removing the call to 
1148         setScopeChain.
1149         * VM/Machine.h:
1150
1151         * VM/Opcode.h: Declared op_init_activation.
1152
1153 2008-09-24  Geoffrey Garen  <ggaren@apple.com>
1154
1155         Reviewed by Maciej Stachowiak.
1156         
1157         Move most of the return code back into the callee, now that the callee
1158         doesn't have to calculate anything dynamically.
1159         
1160         11.5% speedup on empty function call benchmark.
1161         
1162         SunSpider says 0.3% faster. SunSpider --v8 says no change.
1163
1164         * VM/CTI.cpp:
1165         (JSC::CTI::compileOpCall):
1166         (JSC::CTI::privateCompileMainPass):
1167         (JSC::CTI::privateCompileSlowCases):
1168
1169 2008-09-24  Sam Weinig  <sam@webkit.org>
1170
1171         Reviewed by Maciej Stachowiak.
1172
1173         Remove staticFunctionGetter.  There is only one remaining user of
1174         staticFunctionGetter and it can be converted to use setUpStaticFunctionSlot.
1175
1176         * JavaScriptCore.exp:
1177         * kjs/lookup.cpp:
1178         * kjs/lookup.h:
1179
1180 2008-09-24  Maciej Stachowiak  <mjs@apple.com>
1181
1182         Reviewed by Oliver Hunt.
1183         
1184         - inline JIT fast case of op_neq
1185         - remove extra level of function call indirection from slow cases of eq and neq
1186         
1187         1% speedup on Richards
1188
1189         * VM/CTI.cpp:
1190         (JSC::CTI::privateCompileMainPass):
1191         (JSC::CTI::privateCompileSlowCases):
1192         * VM/Machine.cpp:
1193         (JSC::Machine::privateExecute):
1194         (JSC::Machine::cti_op_eq):
1195         (JSC::Machine::cti_op_neq):
1196         * kjs/operations.cpp:
1197         (JSC::equal):
1198         (JSC::equalSlowCase):
1199         * kjs/operations.h:
1200         (JSC::equalSlowCaseInline):
1201
1202 2008-09-24  Sam Weinig  <sam@webkit.org>
1203
1204         Reviewed by Darin Adler.
1205
1206         Fix for https://bugs.webkit.org/show_bug.cgi?id=21080
1207         <rdar://problem/6243534>
1208         Crash below Function.apply when using a runtime array as the argument list
1209
1210         Test: plugins/bindings-array-apply-crash.html
1211
1212         * kjs/FunctionPrototype.cpp:
1213         (JSC::functionProtoFuncApply): Revert to the slow case if the object inherits from 
1214         JSArray (via ClassInfo) but is not a JSArray.
1215
1216 2008-09-24  Kevin McCullough  <kmccullough@apple.com>
1217
1218         Style change.
1219
1220         * kjs/nodes.cpp:
1221         (JSC::statementListEmitCode):
1222
1223 2008-09-24  Kevin McCullough  <kmccullough@apple.com>
1224
1225         Reviewed by Geoff.
1226
1227         Bug 21031: Breakpoints in the condition of loops only breaks the first
1228         time
1229         - Now when setting breakpoints in the condition of a loop (for, while,
1230         for in, and do while) will successfully break each time throught the
1231         loop.
1232         - For 'for' loops we need a little more complicated behavior that cannot
1233         be accomplished without some more significant changes:
1234         https://bugs.webkit.org/show_bug.cgi?id=21073
1235
1236         * kjs/nodes.cpp:
1237         (JSC::statementListEmitCode): We don't want to blindly emit a debug hook
1238         at the first line of loops, instead let the loop emit the debug hooks.
1239         (JSC::DoWhileNode::emitCode):
1240         (JSC::WhileNode::emitCode):
1241         (JSC::ForNode::emitCode):
1242         (JSC::ForInNode::emitCode):
1243         * kjs/nodes.h:
1244         (JSC::StatementNode::):
1245         (JSC::DoWhileNode::):
1246         (JSC::WhileNode::):
1247         (JSC::ForInNode::):
1248
1249 2008-09-24  Geoffrey Garen  <ggaren@apple.com>
1250
1251         Reviewed by Darin Adler.
1252         
1253         Fixed <rdar://problem/5605532> Need a SPI for telling JS the size of
1254         the objects it retains
1255
1256         * API/tests/testapi.c: Test the new SPI a little.
1257
1258         * API/JSSPI.cpp: Add the new SPI.
1259         * API/JSSPI.h: Add the new SPI.
1260         * JavaScriptCore.exp: Add the new SPI.
1261         * JavaScriptCore.xcodeproj/project.pbxproj: Add the new SPI.
1262
1263 2008-09-24  Geoffrey Garen  <ggaren@apple.com>
1264
1265         Reviewed by Darin Adler.
1266
1267         * API/JSBase.h: Filled in some missing function names.
1268
1269 2008-09-24  Geoffrey Garen  <ggaren@apple.com>
1270
1271         Reviewed by Cameron Zwarich.
1272         
1273         Fixed https://bugs.webkit.org/show_bug.cgi?id=21057
1274         Crash in RegisterID::deref() running fast/canvas/canvas-putImageData.html
1275
1276         * VM/CodeGenerator.h: Changed declaration order to ensure the
1277         m_lastConstant, which is a RefPtr that points into m_calleeRegisters,
1278         has its destructor called before the destructor for m_calleeRegisters.
1279
1280 2008-09-24  Darin Adler  <darin@apple.com>
1281
1282         Reviewed by Sam Weinig.
1283
1284         - https://bugs.webkit.org/show_bug.cgi?id=21047
1285           speed up ret_activation with inlining
1286
1287         About 1% on v8-raytrace.
1288
1289         * JavaScriptCore.exp: Removed JSVariableObject::setRegisters.
1290
1291         * kjs/JSActivation.cpp: Moved copyRegisters to the header to make it inline.
1292         * kjs/JSActivation.h:
1293         (JSC::JSActivation::copyRegisters): Moved here. Also removed the registerArraySize
1294         argument to setRegisters, since the object doesn't need to store the number of
1295         registers.
1296
1297         * kjs/JSGlobalObject.cpp:
1298         (JSC::JSGlobalObject::reset): Removed unnecessary clearing left over from when we
1299         used this on objects that weren't brand new. These days, this function is really
1300         just part of the constructor.
1301
1302         * kjs/JSGlobalObject.h: Added registerArraySize to JSGlobalObjectData, since
1303         JSVariableObjectData no longer needs it. Added a setRegisters override here
1304         that handles storing the size.
1305
1306         * kjs/JSStaticScopeObject.h: Removed code to set registerArraySize, since it
1307         no longer exists.
1308
1309         * kjs/JSVariableObject.cpp: Moved copyRegisterArray and setRegisters to the
1310         header to make them inline.
1311         * kjs/JSVariableObject.h: Removed registerArraySize from JSVariableObjectData,
1312         since it was only used for the global object.
1313         (JSC::JSVariableObject::copyRegisterArray): Moved here ot make it inline.
1314         (JSC::JSVariableObject::setRegisters): Moved here to make it inline. Also
1315         removed the code to set registerArraySize and changed an if statement into
1316         an assert to save an unnnecessary branch.
1317
1318 2008-09-24  Maciej Stachowiak  <mjs@apple.com>
1319
1320         Reviewed by Oliver Hunt.
1321         
1322         - inline PropertyMap::getOffset to speed up polymorphic lookups
1323         
1324         ~1.5% speedup on v8 benchmark
1325         no effect on SunSpider
1326
1327         * JavaScriptCore.exp:
1328         * kjs/PropertyMap.cpp:
1329         * kjs/PropertyMap.h:
1330         (JSC::PropertyMap::getOffset):
1331
1332 2008-09-24  Jan Michael Alonzo  <jmalonzo@webkit.org>
1333
1334         Reviewed by Alp Toker.
1335
1336         https://bugs.webkit.org/show_bug.cgi?id=20992
1337         Build fails on GTK+ Mac OS
1338
1339         * wtf/ThreadingGtk.cpp: Remove platform ifdef as suggested by
1340           Richard Hult.
1341         (WTF::initializeThreading):
1342
1343 2008-09-23  Oliver Hunt  <oliver@apple.com>
1344
1345         Reviewed by Maciej Stachowiak.
1346
1347         Bug 19968: Slow Script at www.huffingtonpost.com
1348         <https://bugs.webkit.org/show_bug.cgi?id=19968>
1349
1350         Finally found the cause of this accursed issue.  It is triggered
1351         by synchronous creation of a new global object from JS.  The new
1352         global object resets the timer state in this execution group's
1353         Machine, taking timerCheckCount to 0.  Then when JS returns the
1354         timerCheckCount is decremented making it non-zero.  The next time
1355         we execute JS we will start the timeout counter, however the non-zero
1356         timeoutCheckCount means we don't reset the timer information. This
1357         means that the timeout check is now checking the cumulative time
1358         since the creation of the global object rather than the time since
1359         JS was last entered.  At this point the slow script dialog is guaranteed
1360         to eventually be displayed incorrectly unless a page is loaded
1361         asynchronously (which will reset everything into a sane state).
1362
1363         The fix for this is rather trivial -- the JSGlobalObject constructor
1364         should not be resetting the machine timer state.
1365
1366         * VM/Machine.cpp:
1367         (JSC::Machine::Machine):
1368           Now that we can't rely on the GlobalObject initialising the timeout
1369           state, we do it in the Machine constructor.
1370
1371         * VM/Machine.h:
1372         (JSC::Machine::stopTimeoutCheck):
1373           Add assertions to guard against this happening.
1374
1375         * kjs/JSGlobalObject.cpp:
1376         (JSC::JSGlobalObject::init):
1377           Don't reset the timeout state.
1378
1379 2008-09-23  Geoffrey Garen  <ggaren@apple.com>
1380
1381         Reviewed by Oliver Hunt.
1382         
1383         Fixed https://bugs.webkit.org/show_bug.cgi?id=21038 | <rdar://problem/6240812>
1384         Uncaught exceptions in regex replace callbacks crash webkit
1385         
1386         This was a combination of two problems:
1387         
1388         (1) the replace function would continue execution after an exception
1389         had been thrown.
1390         
1391         (2) In some cases, the Machine would return 0 in the case of an exception,
1392         despite the fact that a few clients dereference the Machine's return
1393         value without first checking for an exception.
1394         
1395         * VM/Machine.cpp:
1396         (JSC::Machine::execute):
1397         
1398         ^ Return jsNull() instead of 0 in the case of an exception, since some
1399         clients depend on using our return value.
1400         
1401         ^ ASSERT that execution does not continue after an exception has been
1402         thrown, to help catch problems like this in the future.
1403
1404         * kjs/StringPrototype.cpp:
1405         (JSC::stringProtoFuncReplace):
1406         
1407         ^ Stop execution if an exception has been thrown.
1408
1409 2008-09-23  Geoffrey Garen  <ggaren@apple.com>
1410
1411         Try to fix the windows build.
1412
1413         * VM/CTI.cpp:
1414         (JSC::CTI::compileOpCall):
1415         (JSC::CTI::privateCompileMainPass):
1416
1417 2008-09-23  Alp Toker  <alp@nuanti.com>
1418
1419         Build fix.
1420
1421         * VM/CTI.h:
1422
1423 2008-09-23  Geoffrey Garen  <ggaren@apple.com>
1424
1425         Reviewed by Darin Adler.
1426
1427         * wtf/Platform.h: Removed duplicate #if.
1428
1429 2008-09-23  Geoffrey Garen  <ggaren@apple.com>
1430
1431         Reviewed by Darin Adler.
1432         
1433         Changed the layout of the call frame from
1434         
1435         { header, parameters, locals | constants, temporaries }
1436         
1437         to
1438         
1439         { parameters, header | locals, constants, temporaries }
1440         
1441         This simplifies function entry+exit, and enables a number of future
1442         optimizations.
1443         
1444         13.5% speedup on empty call benchmark for bytecode; 23.6% speedup on
1445         empty call benchmark for CTI.
1446         
1447         SunSpider says no change. SunSpider --v8 says 1% faster.
1448
1449         * VM/CTI.cpp:
1450         
1451         Added a bit of abstraction for calculating whether a register is a
1452         constant, since this patch changes that calculation:
1453         (JSC::CTI::isConstant):
1454         (JSC::CTI::getConstant):
1455         (JSC::CTI::emitGetArg):
1456         (JSC::CTI::emitGetPutArg):
1457         (JSC::CTI::getConstantImmediateNumericArg):
1458
1459         Updated for changes to callframe header location:
1460         (JSC::CTI::emitPutToCallFrameHeader):
1461         (JSC::CTI::emitGetFromCallFrameHeader):
1462         (JSC::CTI::printOpcodeOperandTypes):
1463         
1464         Renamed to spite Oliver:
1465         (JSC::CTI::emitInitRegister):
1466         
1467         Added an abstraction for emitting a call through a register, so that
1468         calls through registers generate exception info, too:
1469         (JSC::CTI::emitCall):
1470
1471         Updated to match the new callframe header layout, and to support calls
1472         through registers, which have no destination address:
1473         (JSC::CTI::compileOpCall):
1474         (JSC::CTI::privateCompileMainPass):
1475         (JSC::CTI::privateCompileSlowCases):
1476         (JSC::CTI::privateCompile):
1477
1478         * VM/CTI.h:
1479
1480         More of the above:
1481         (JSC::CallRecord::CallRecord):
1482
1483         * VM/CodeBlock.cpp:
1484
1485         Updated for new register layout:
1486         (JSC::registerName):
1487         (JSC::CodeBlock::dump):
1488
1489         * VM/CodeBlock.h:
1490         
1491         Updated CodeBlock to track slightly different information about the
1492         register frame, and tweaked the style of an ASSERT_NOT_REACHED.
1493         (JSC::CodeBlock::CodeBlock):
1494         (JSC::CodeBlock::getStubInfo):
1495
1496         * VM/CodeGenerator.cpp:
1497         
1498         Added some abstraction around constant register allocation, since this
1499         patch changes it, changed codegen to account for the new callframe
1500         layout, and added abstraction around register fetching code
1501         that used to assume that all local registers lived at negative indices,
1502         since vars now live at positive indices:
1503         (JSC::CodeGenerator::generate):
1504         (JSC::CodeGenerator::addVar):
1505         (JSC::CodeGenerator::addGlobalVar):
1506         (JSC::CodeGenerator::allocateConstants):
1507         (JSC::CodeGenerator::CodeGenerator):
1508         (JSC::CodeGenerator::addParameter):
1509         (JSC::CodeGenerator::registerFor):
1510         (JSC::CodeGenerator::constRegisterFor):
1511         (JSC::CodeGenerator::newRegister):
1512         (JSC::CodeGenerator::newTemporary):
1513         (JSC::CodeGenerator::highestUsedRegister):
1514         (JSC::CodeGenerator::addConstant):
1515         
1516         ASSERT that our caller referenced the registers it passed to us.
1517         Otherwise, we might overwrite them with parameters:
1518         (JSC::CodeGenerator::emitCall):
1519         (JSC::CodeGenerator::emitConstruct):
1520
1521         * VM/CodeGenerator.h:
1522         
1523         Added some abstraction for getting a RegisterID for a given index,
1524         since the rules are a little weird:
1525         (JSC::CodeGenerator::registerFor):
1526
1527         * VM/Machine.cpp:
1528
1529         Utility function to transform a machine return PC to a virtual machine
1530         return VPC, for the sake of stack unwinding, since both PCs are stored
1531         in the same location now:
1532         (JSC::vPCForPC):
1533
1534         Tweaked to account for new call frame:
1535         (JSC::Machine::initializeCallFrame):
1536         
1537         Tweaked to account for registerOffset supplied by caller:
1538         (JSC::slideRegisterWindowForCall):
1539
1540         Tweaked to account for new register layout:
1541         (JSC::scopeChainForCall):
1542         (JSC::Machine::callEval):
1543         (JSC::Machine::dumpRegisters):
1544         (JSC::Machine::unwindCallFrame):
1545         (JSC::Machine::execute):
1546
1547         Changed op_call and op_construct to implement the new calling convention:
1548         (JSC::Machine::privateExecute):
1549
1550         Tweaked to account for the new register layout:
1551         (JSC::Machine::retrieveArguments):
1552         (JSC::Machine::retrieveCaller):
1553         (JSC::Machine::retrieveLastCaller):
1554         (JSC::Machine::callFrame):
1555         (JSC::Machine::getArgumentsData):
1556
1557         Changed CTI call helpers to implement the new calling convention:
1558         (JSC::Machine::cti_op_call_JSFunction):
1559         (JSC::Machine::cti_op_call_NotJSFunction):
1560         (JSC::Machine::cti_op_ret_activation):
1561         (JSC::Machine::cti_op_ret_profiler):
1562         (JSC::Machine::cti_op_construct_JSConstruct):
1563         (JSC::Machine::cti_op_construct_NotJSConstruct):
1564         (JSC::Machine::cti_op_call_eval):
1565
1566         * VM/Machine.h:
1567
1568         * VM/Opcode.h:
1569         
1570         Renamed op_initialise_locals to op_init, because this opcode
1571         doesn't initialize all locals, and it doesn't initialize only locals.
1572         Also, to spite Oliver.
1573         
1574         * VM/RegisterFile.h:
1575         
1576         New call frame enumeration values:
1577         (JSC::RegisterFile::):
1578
1579         Simplified the calculation of whether a RegisterID is a temporary,
1580         since we can no longer assume that all positive non-constant registers
1581         are temporaries:
1582         * VM/RegisterID.h:
1583         (JSC::RegisterID::RegisterID):
1584         (JSC::RegisterID::setTemporary):
1585         (JSC::RegisterID::isTemporary):
1586
1587         Renamed firstArgumentIndex to firstParameterIndex because the assumption
1588         that this variable pertained to the actual arguments supplied by the
1589         caller caused me to write some buggy code:
1590         * kjs/Arguments.cpp:
1591         (JSC::ArgumentsData::ArgumentsData):
1592         (JSC::Arguments::Arguments):
1593         (JSC::Arguments::fillArgList):
1594         (JSC::Arguments::getOwnPropertySlot):
1595         (JSC::Arguments::put):
1596
1597         Updated for new call frame layout:
1598         * kjs/DebuggerCallFrame.cpp:
1599         (JSC::DebuggerCallFrame::functionName):
1600         (JSC::DebuggerCallFrame::type):
1601         * kjs/DebuggerCallFrame.h:
1602
1603         Changed the activation object to account for the fact that a call frame
1604         header now sits between parameters and local variables. This change
1605         requires all variable objects to do their own marking, since they
1606         now use their register storage differently:
1607         * kjs/JSActivation.cpp:
1608         (JSC::JSActivation::mark):
1609         (JSC::JSActivation::copyRegisters):
1610         (JSC::JSActivation::createArgumentsObject):
1611         * kjs/JSActivation.h:
1612
1613         Updated global object to use the new interfaces required by the change
1614         to JSActivation above:
1615         * kjs/JSGlobalObject.cpp:
1616         (JSC::JSGlobalObject::reset):
1617         (JSC::JSGlobalObject::mark):
1618         (JSC::JSGlobalObject::copyGlobalsFrom):
1619         (JSC::JSGlobalObject::copyGlobalsTo):
1620         * kjs/JSGlobalObject.h:
1621         (JSC::JSGlobalObject::addStaticGlobals):
1622
1623         Updated static scope object to use the new interfaces required by the 
1624         change to JSActivation above:
1625         * kjs/JSStaticScopeObject.cpp:
1626         (JSC::JSStaticScopeObject::mark):
1627         (JSC::JSStaticScopeObject::~JSStaticScopeObject):
1628         * kjs/JSStaticScopeObject.h:
1629         (JSC::JSStaticScopeObject::JSStaticScopeObject):
1630         (JSC::JSStaticScopeObject::d):
1631
1632         Updated variable object to use the new interfaces required by the 
1633         change to JSActivation above:
1634         * kjs/JSVariableObject.cpp:
1635         (JSC::JSVariableObject::copyRegisterArray):
1636         (JSC::JSVariableObject::setRegisters):
1637         * kjs/JSVariableObject.h:
1638
1639         Changed the bit twiddling in symbol table not to assume that all indices
1640         are negative, since they can be positive now:
1641         * kjs/SymbolTable.h:
1642         (JSC::SymbolTableEntry::SymbolTableEntry):
1643         (JSC::SymbolTableEntry::isNull):
1644         (JSC::SymbolTableEntry::getIndex):
1645         (JSC::SymbolTableEntry::getAttributes):
1646         (JSC::SymbolTableEntry::setAttributes):
1647         (JSC::SymbolTableEntry::isReadOnly):
1648         (JSC::SymbolTableEntry::pack):
1649         (JSC::SymbolTableEntry::isValidIndex):
1650
1651         Changed call and construct nodes to ref their functions and/or bases,
1652         so that emitCall/emitConstruct doesn't overwrite them with parameters.
1653         Also, updated for rename to registerFor:
1654         * kjs/nodes.cpp:
1655         (JSC::ResolveNode::emitCode):
1656         (JSC::NewExprNode::emitCode):
1657         (JSC::EvalFunctionCallNode::emitCode):
1658         (JSC::FunctionCallValueNode::emitCode):
1659         (JSC::FunctionCallResolveNode::emitCode):
1660         (JSC::FunctionCallBracketNode::emitCode):
1661         (JSC::FunctionCallDotNode::emitCode):
1662         (JSC::PostfixResolveNode::emitCode):
1663         (JSC::DeleteResolveNode::emitCode):
1664         (JSC::TypeOfResolveNode::emitCode):
1665         (JSC::PrefixResolveNode::emitCode):
1666         (JSC::ReadModifyResolveNode::emitCode):
1667         (JSC::AssignResolveNode::emitCode):
1668         (JSC::ConstDeclNode::emitCodeSingle):
1669         (JSC::ForInNode::emitCode):
1670
1671         Added abstraction for getting exception info out of a call through a
1672         register:
1673         * masm/X86Assembler.h:
1674         (JSC::X86Assembler::emitCall):
1675         
1676         Removed duplicate #if:
1677         * wtf/Platform.h:
1678
1679 2008-09-23  Kevin McCullough  <kmccullough@apple.com>
1680
1681         Reviewed by Darin.
1682
1683         Bug 21030: The JS debugger breaks on the do of a do-while not the while
1684         (where the conditional statement is)
1685         https://bugs.webkit.org/show_bug.cgi?id=21030
1686         Now the statementListEmitCode detects if a do-while node is being
1687         emited and emits the debug hook on the last line instead of the first.
1688
1689         This change had no effect on sunspider.
1690
1691         * kjs/nodes.cpp:
1692         (JSC::statementListEmitCode):
1693         * kjs/nodes.h:
1694         (JSC::StatementNode::isDoWhile):
1695         (JSC::DoWhileNode::isDoWhile):
1696
1697 2008-09-23  Maciej Stachowiak  <mjs@apple.com>
1698
1699         Reviewed by Camron Zwarich.
1700
1701         - inline the fast case of instanceof
1702         https://bugs.webkit.org/show_bug.cgi?id=20818
1703
1704         ~2% speedup on EarleyBoyer test.
1705         
1706         * VM/CTI.cpp:
1707         (JSC::CTI::privateCompileMainPass):
1708         (JSC::CTI::privateCompileSlowCases):
1709         * VM/Machine.cpp:
1710         (JSC::Machine::cti_op_instanceof):
1711
1712 2008-09-23  Maciej Stachowiak  <mjs@apple.com>
1713
1714         Reviewed by Cameron Zwarich.
1715         
1716         - add forgotten slow case logic for !==
1717
1718         * VM/CTI.cpp:
1719         (JSC::CTI::privateCompileSlowCases):
1720
1721 2008-09-23  Maciej Stachowiak  <mjs@apple.com>
1722
1723         Reviewed by Cameron Zwarich.
1724
1725         - inline the fast cases of !==, same as for ===
1726         
1727         2.9% speedup on EarleyBoyer benchmark
1728
1729         * VM/CTI.cpp:
1730         (JSC::CTI::compileOpStrictEq): Factored stricteq codegen into this function,
1731         and parameterized so it can do the reverse version as well.
1732         (JSC::CTI::privateCompileMainPass): Use the above for stricteq and nstricteq.
1733         * VM/CTI.h:
1734         (JSC::CTI::): Declare above stuff.
1735         * VM/Machine.cpp:
1736         (JSC::Machine::cti_op_nstricteq): Removed fast cases, now handled inline.
1737
1738 2008-09-23  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
1739
1740         Reviewed by Oliver Hunt.
1741
1742         Bug 20989: Aguments constructor should put 'callee' and 'length' properties in a more efficient way
1743         <https://bugs.webkit.org/show_bug.cgi?id=20989>
1744
1745         Make special cases for the 'callee' and 'length' properties in the
1746         Arguments object.
1747
1748         This is somewhere between a 7.8% speedup and a 10% speedup on the V8
1749         Raytrace benchmark, depending on whether it is run alone or with the
1750         other V8 benchmarks.
1751
1752         * kjs/Arguments.cpp:
1753         (JSC::ArgumentsData::ArgumentsData):
1754         (JSC::Arguments::Arguments):
1755         (JSC::Arguments::mark):
1756         (JSC::Arguments::getOwnPropertySlot):
1757         (JSC::Arguments::put):
1758         (JSC::Arguments::deleteProperty):
1759
1760 2008-09-23  Maciej Stachowiak  <mjs@apple.com>
1761
1762         Reviewed by Darin.
1763
1764         - speed up instanceof some more
1765         https://bugs.webkit.org/show_bug.cgi?id=20818
1766         
1767         ~2% speedup on EarleyBoyer
1768
1769         The idea here is to record in the StructureID whether the class
1770         needs a special hasInstance or if it can use the normal logic from
1771         JSObject. 
1772         
1773         Based on this I inlined the real work directly into
1774         cti_op_instanceof and put the fastest checks up front and the
1775         error handling at the end (so it should be fairly straightforward
1776         to split off the beginning to be inlined if desired).
1777
1778         I only did this for CTI, not the bytecode interpreter.
1779         
1780         * API/JSCallbackObject.h:
1781         (JSC::JSCallbackObject::createStructureID):
1782         * ChangeLog:
1783         * VM/Machine.cpp:
1784         (JSC::Machine::cti_op_instanceof):
1785         * kjs/JSImmediate.h:
1786         (JSC::JSImmediate::isAnyImmediate):
1787         * kjs/TypeInfo.h:
1788         (JSC::TypeInfo::overridesHasInstance):
1789         (JSC::TypeInfo::flags):
1790
1791 2008-09-22  Darin Adler  <darin@apple.com>
1792
1793         Reviewed by Sam Weinig.
1794
1795         - https://bugs.webkit.org/show_bug.cgi?id=21019
1796           make FunctionBodyNode::ref/deref fast
1797
1798         Speeds up v8-raytrace by 7.2%.
1799
1800         * kjs/nodes.cpp:
1801         (JSC::FunctionBodyNode::FunctionBodyNode): Initialize m_refCount to 0.
1802         * kjs/nodes.h:
1803         (JSC::FunctionBodyNode::ref): Call base class ref once, and thereafter use
1804         m_refCount.
1805         (JSC::FunctionBodyNode::deref): Ditto, but the deref side.
1806
1807 2008-09-22  Darin Adler  <darin@apple.com>
1808
1809         Pointed out by Sam Weinig.
1810
1811         * kjs/Arguments.cpp:
1812         (JSC::Arguments::fillArgList): Fix bad copy and paste. Oops!
1813
1814 2008-09-22  Darin Adler  <darin@apple.com>
1815
1816         Reviewed by Cameron Zwarich.
1817
1818         - https://bugs.webkit.org/show_bug.cgi?id=20983
1819           ArgumentsData should have some room to allocate some extra arguments inline
1820
1821         Speeds up v8-raytrace by 5%.
1822
1823         * kjs/Arguments.cpp:
1824         (JSC::ArgumentsData::ArgumentsData): Use a fixed buffer if there are 4 or fewer
1825         extra arguments.
1826         (JSC::Arguments::Arguments): Use a fixed buffer if there are 4 or fewer
1827         extra arguments.
1828         (JSC::Arguments::~Arguments): Delete the buffer if necessary.
1829         (JSC::Arguments::mark): Update since extraArguments are now Register.
1830         (JSC::Arguments::fillArgList): Added special case for the only case that's
1831         actually used in the practice, when there are no parameters. There are some
1832         other special cases in there too, but that's the only one that matters.
1833         (JSC::Arguments::getOwnPropertySlot): Updated to use setValueSlot since there's
1834         no operation to get you at the JSValue* inside a Register as a "slot".
1835
1836 2008-09-22  Sam Weinig  <sam@webkit.org>
1837
1838         Reviewed by Maciej Stachowiak.
1839
1840         Patch for https://bugs.webkit.org/show_bug.cgi?id=21014
1841         Speed up for..in by using StructureID to avoid calls to hasProperty
1842
1843         Speeds up fasta by 8%.
1844
1845         * VM/JSPropertyNameIterator.cpp:
1846         (JSC::JSPropertyNameIterator::invalidate):
1847         * VM/JSPropertyNameIterator.h:
1848         (JSC::JSPropertyNameIterator::next):
1849         * kjs/PropertyNameArray.h:
1850         (JSC::PropertyNameArrayData::begin):
1851         (JSC::PropertyNameArrayData::end):
1852         (JSC::PropertyNameArrayData::setCachedStructureID):
1853         (JSC::PropertyNameArrayData::cachedStructureID):
1854         * kjs/StructureID.cpp:
1855         (JSC::StructureID::getEnumerablePropertyNames):
1856         (JSC::structureIDChainsAreEqual):
1857         * kjs/StructureID.h:
1858
1859 2008-09-22  Kelvin Sherlock  <ksherlock@gmail.com>
1860
1861         Updated and tweaked by Sam Weinig.
1862
1863         Reviewed by Geoffrey Garen.
1864
1865         Bug 20020: Proposed enhancement to JavaScriptCore API
1866         <https://bugs.webkit.org/show_bug.cgi?id=20020>
1867
1868         Add JSObjectMakeArray, JSObjectMakeDate, JSObjectMakeError, and JSObjectMakeRegExp
1869         functions to create JavaScript Array, Date, Error, and RegExp objects, respectively.
1870
1871         * API/JSObjectRef.cpp: The functions
1872         * API/JSObjectRef.h: Function prototype and documentation
1873         * JavaScriptCore.exp: Added functions to exported function list
1874         * API/tests/testapi.c: Added basic functionality tests.
1875
1876         * kjs/DateConstructor.cpp:
1877         Replaced static JSObject* constructDate(ExecState* exec, JSObject*, const ArgList& args)
1878         with JSObject* constructDate(ExecState* exec, const ArgList& args).
1879         Added static JSObject* constructWithDateConstructor(ExecState* exec, JSObject*, const ArgList& args) function
1880
1881         * kjs/DateConstructor.h:
1882         added prototype for JSObject* constructDate(ExecState* exec, const ArgList& args)
1883
1884         * kjs/ErrorConstructor.cpp:
1885         removed static qualifier from ErrorInstance* constructError(ExecState* exec, const ArgList& args)
1886
1887         * kjs/ErrorConstructor.h:
1888         added prototype for ErrorInstance* constructError(ExecState* exec, const ArgList& args)
1889
1890         * kjs/RegExpConstructor.cpp:
1891         removed static qualifier from JSObject* constructRegExp(ExecState* exec, const ArgList& args)
1892
1893         * kjs/RegExpConstructor.h:
1894         added prototype for JSObject* constructRegExp(ExecState* exec, const ArgList& args)
1895
1896 2008-09-22  Matt Lilek  <webkit@mattlilek.com>
1897
1898         Not reviewed, Windows build fix.
1899
1900         * kjs/Arguments.cpp:
1901         * kjs/FunctionPrototype.cpp:
1902
1903 2008-09-22  Sam Weinig  <sam@webkit.org>
1904
1905         Reviewed by Darin Adler.
1906
1907         Patch for https://bugs.webkit.org/show_bug.cgi?id=20982
1908         Speed up the apply method of functions by special-casing array and 'arguments' objects
1909
1910         1% speedup on v8-raytrace.
1911
1912         Test: fast/js/function-apply.html
1913
1914         * kjs/Arguments.cpp:
1915         (JSC::Arguments::fillArgList):
1916         * kjs/Arguments.h:
1917         * kjs/FunctionPrototype.cpp:
1918         (JSC::functionProtoFuncApply):
1919         * kjs/JSArray.cpp:
1920         (JSC::JSArray::fillArgList):
1921         * kjs/JSArray.h:
1922
1923 2008-09-22  Darin Adler  <darin@apple.com>
1924
1925         Reviewed by Sam Weinig.
1926
1927         - https://bugs.webkit.org/show_bug.cgi?id=20993
1928           Array.push/pop need optimized cases for JSArray
1929
1930         3% or so speedup on DeltaBlue benchmark.
1931
1932         * kjs/ArrayPrototype.cpp:
1933         (JSC::arrayProtoFuncPop): Call JSArray::pop when appropriate.
1934         (JSC::arrayProtoFuncPush): Call JSArray::push when appropriate.
1935
1936         * kjs/JSArray.cpp:
1937         (JSC::JSArray::putSlowCase): Set m_fastAccessCutoff when appropriate, getting
1938         us into the fast code path.
1939         (JSC::JSArray::pop): Added.
1940         (JSC::JSArray::push): Added.
1941         * kjs/JSArray.h: Added push and pop.
1942
1943         * kjs/operations.cpp:
1944         (JSC::throwOutOfMemoryError): Don't inline this. Helps us avoid PIC branches.
1945
1946 2008-09-22  Maciej Stachowiak  <mjs@apple.com>
1947
1948         Reviewed by Cameron Zwarich.
1949         
1950         - speed up instanceof operator by replacing implementsHasInstance method with a TypeInfo flag
1951
1952         Partial work towards <https://bugs.webkit.org/show_bug.cgi?id=20818>
1953         
1954         2.2% speedup on EarleyBoyer benchmark.
1955
1956         * API/JSCallbackConstructor.cpp:
1957         * API/JSCallbackConstructor.h:
1958         (JSC::JSCallbackConstructor::createStructureID):
1959         * API/JSCallbackFunction.cpp:
1960         * API/JSCallbackFunction.h:
1961         (JSC::JSCallbackFunction::createStructureID):
1962         * API/JSCallbackObject.h:
1963         (JSC::JSCallbackObject::createStructureID):
1964         * API/JSCallbackObjectFunctions.h:
1965         (JSC::::hasInstance):
1966         * API/JSValueRef.cpp:
1967         (JSValueIsInstanceOfConstructor):
1968         * JavaScriptCore.exp:
1969         * VM/Machine.cpp:
1970         (JSC::Machine::privateExecute):
1971         (JSC::Machine::cti_op_instanceof):
1972         * kjs/InternalFunction.cpp:
1973         * kjs/InternalFunction.h:
1974         (JSC::InternalFunction::createStructureID):
1975         * kjs/JSObject.cpp:
1976         * kjs/JSObject.h:
1977         * kjs/TypeInfo.h:
1978         (JSC::TypeInfo::implementsHasInstance):
1979
1980 2008-09-22  Maciej Stachowiak  <mjs@apple.com>
1981
1982         Reviewed by Dave Hyatt.
1983         
1984         Based on initial work by Darin Adler.
1985         
1986         - replace masqueradesAsUndefined virtual method with a flag in TypeInfo
1987         - use this to JIT inline code for eq_null and neq_null
1988         https://bugs.webkit.org/show_bug.cgi?id=20823
1989
1990         0.5% speedup on SunSpider
1991         ~4% speedup on Richards benchmark
1992         
1993         * VM/CTI.cpp:
1994         (JSC::CTI::privateCompileMainPass):
1995         * VM/Machine.cpp:
1996         (JSC::jsTypeStringForValue):
1997         (JSC::jsIsObjectType):
1998         (JSC::Machine::privateExecute):
1999         (JSC::Machine::cti_op_is_undefined):
2000         * VM/Machine.h:
2001         * kjs/JSCell.h:
2002         * kjs/JSValue.h:
2003         * kjs/StringObjectThatMasqueradesAsUndefined.h:
2004         (JSC::StringObjectThatMasqueradesAsUndefined::create):
2005         (JSC::StringObjectThatMasqueradesAsUndefined::createStructureID):
2006         * kjs/StructureID.h:
2007         (JSC::StructureID::mutableTypeInfo):
2008         * kjs/TypeInfo.h:
2009         (JSC::TypeInfo::TypeInfo):
2010         (JSC::TypeInfo::masqueradesAsUndefined):
2011         * kjs/operations.cpp:
2012         (JSC::equal):
2013         * masm/X86Assembler.h:
2014         (JSC::X86Assembler::):
2015         (JSC::X86Assembler::setne_r):
2016         (JSC::X86Assembler::setnz_r):
2017         (JSC::X86Assembler::testl_i32m):
2018
2019 2008-09-22  Tor Arne Vestbø  <tavestbo@trolltech.com>
2020
2021         Reviewed by Simon.
2022
2023         Initialize QCoreApplication in kjs binary/Shell.cpp
2024         
2025         This allows us to use QCoreApplication::instance() to
2026         get the main thread in ThreadingQt.cpp
2027
2028         * kjs/Shell.cpp:
2029         (main):
2030         * wtf/ThreadingQt.cpp:
2031         (WTF::initializeThreading):
2032
2033 2008-09-21  Darin Adler  <darin@apple.com>
2034
2035         - blind attempt to fix non-all-in-one builds
2036
2037         * kjs/JSGlobalObject.cpp: Added includes of Arguments.h and RegExpObject.h.
2038
2039 2008-09-21  Darin Adler  <darin@apple.com>
2040
2041         - fix debug build
2042
2043         * kjs/StructureID.cpp:
2044         (JSC::StructureID::addPropertyTransition): Use typeInfo().type() instead of m_type.
2045         (JSC::StructureID::createCachedPrototypeChain): Ditto.
2046
2047 2008-09-21  Maciej Stachowiak  <mjs@apple.com>
2048
2049         Reviewed by Darin Adler.
2050         
2051         - introduce a TypeInfo class, for holding per-type (in the C++ class sense) date in StructureID
2052         https://bugs.webkit.org/show_bug.cgi?id=20981
2053
2054         * JavaScriptCore.exp:
2055         * JavaScriptCore.xcodeproj/project.pbxproj:
2056         * VM/CTI.cpp:
2057         (JSC::CTI::privateCompileMainPass):
2058         (JSC::CTI::privateCompilePutByIdTransition):
2059         * VM/Machine.cpp:
2060         (JSC::jsIsObjectType):
2061         (JSC::Machine::Machine):
2062         * kjs/AllInOneFile.cpp:
2063         * kjs/JSCell.h:
2064         (JSC::JSCell::isObject):
2065         (JSC::JSCell::isString):
2066         * kjs/JSGlobalData.cpp:
2067         (JSC::JSGlobalData::JSGlobalData):
2068         * kjs/JSGlobalObject.cpp:
2069         (JSC::JSGlobalObject::reset):
2070         * kjs/JSGlobalObject.h:
2071         (JSC::StructureID::prototypeForLookup):
2072         * kjs/JSNumberCell.h:
2073         (JSC::JSNumberCell::createStructureID):
2074         * kjs/JSObject.cpp:
2075         (JSC::JSObject::createInheritorID):
2076         * kjs/JSObject.h:
2077         (JSC::JSObject::createStructureID):
2078         * kjs/JSString.h:
2079         (JSC::JSString::createStructureID):
2080         * kjs/NativeErrorConstructor.cpp:
2081         (JSC::NativeErrorConstructor::NativeErrorConstructor):
2082         * kjs/RegExpConstructor.cpp:
2083         * kjs/RegExpMatchesArray.h: Added.
2084         (JSC::RegExpMatchesArray::getOwnPropertySlot):
2085         (JSC::RegExpMatchesArray::put):
2086         (JSC::RegExpMatchesArray::deleteProperty):
2087         (JSC::RegExpMatchesArray::getPropertyNames):
2088         * kjs/StructureID.cpp:
2089         (JSC::StructureID::StructureID):
2090         (JSC::StructureID::addPropertyTransition):
2091         (JSC::StructureID::toDictionaryTransition):
2092         (JSC::StructureID::changePrototypeTransition):
2093         (JSC::StructureID::getterSetterTransition):
2094         * kjs/StructureID.h:
2095         (JSC::StructureID::create):
2096         (JSC::StructureID::typeInfo):
2097         * kjs/TypeInfo.h: Added.
2098         (JSC::TypeInfo::TypeInfo):
2099         (JSC::TypeInfo::type):
2100
2101 2008-09-21  Darin Adler  <darin@apple.com>
2102
2103         Reviewed by Cameron Zwarich.
2104
2105         - fix crash logging into Gmail due to recent Arguments change
2106
2107         * kjs/Arguments.cpp:
2108         (JSC::Arguments::Arguments): Fix window where mark() function could
2109         see d->extraArguments with uninitialized contents.
2110         (JSC::Arguments::mark): Check d->extraArguments for 0 to handle two
2111         cases: 1) Inside the constructor before it's initialized.
2112         2) numArguments <= numParameters.
2113
2114 2008-09-21  Darin Adler  <darin@apple.com>
2115
2116         - fix loose end from the "duplicate constant values" patch
2117
2118         * VM/CodeGenerator.cpp:
2119         (JSC::CodeGenerator::emitLoad): Add a special case for values the
2120         hash table can't handle.
2121
2122 2008-09-21  Mark Rowe  <mrowe@apple.com>
2123
2124         Fix the non-AllInOneFile build.
2125
2126         * kjs/Arguments.cpp: Add missing #include.
2127
2128 2008-09-21  Darin Adler  <darin@apple.com>
2129
2130         Reviewed by Cameron Zwarich and Mark Rowe.
2131
2132         - fix test failure caused by my recent IndexToNameMap patch
2133
2134         * kjs/Arguments.cpp:
2135         (JSC::Arguments::deleteProperty): Added the accidentally-omitted
2136         check of the boolean result from toArrayIndex.
2137
2138 2008-09-21  Darin Adler  <darin@apple.com>
2139
2140         Reviewed by Maciej Stachowiak.
2141
2142         - https://bugs.webkit.org/show_bug.cgi?id=20975
2143           inline immediate-number case of ==
2144
2145         * VM/CTI.h: Renamed emitJumpSlowCaseIfNotImm to
2146         emitJumpSlowCaseIfNotImmNum, since the old name was incorrect.
2147
2148         * VM/CTI.cpp: Updated for new name.
2149         (JSC::CTI::privateCompileMainPass): Added op_eq.
2150         (JSC::CTI::privateCompileSlowCases): Added op_eq.
2151
2152         * VM/Machine.cpp:
2153         (JSC::Machine::cti_op_eq): Removed fast case, since it's now
2154         compiled.
2155
2156 2008-09-21  Peter Gal  <galpter@inf.u-szeged.hu>
2157
2158         Reviewed by Tim Hatcher and Eric Seidel.
2159
2160         Fix the QT/Linux JavaScriptCore segmentation fault.
2161         https://bugs.webkit.org/show_bug.cgi?id=20914
2162
2163         * wtf/ThreadingQt.cpp:
2164         (WTF::initializeThreading): Use currentThread() if
2165         platform is not a MAC (like in pre 36541 revisions)
2166
2167 2008-09-21  Darin Adler  <darin@apple.com>
2168
2169         Reviewed by Sam Weinig.
2170
2171         * kjs/debugger.h: Removed some unneeded includes and declarations.
2172
2173 2008-09-21  Darin Adler  <darin@apple.com>
2174
2175         Reviewed by Sam Weinig.
2176
2177         - https://bugs.webkit.org/show_bug.cgi?id=20972
2178           speed up Arguments further by eliminating the IndexToNameMap
2179
2180         No change on SunSpider. 1.29x as fast on V8 Raytrace.
2181
2182         * kjs/Arguments.cpp: Moved ArgumentsData in here. Eliminated the
2183         indexToNameMap and hadDeletes data members. Changed extraArguments into
2184         an OwnArrayPtr and added deletedArguments, another OwnArrayPtr.
2185         Replaced numExtraArguments with numParameters, since that's what's
2186         used more directly in hot code paths.
2187         (JSC::Arguments::Arguments): Pass in argument count instead of ArgList.
2188         Initialize ArgumentsData the new way.
2189         (JSC::Arguments::mark): Updated.
2190         (JSC::Arguments::getOwnPropertySlot): Overload for the integer form so
2191         we don't have to convert integers to identifiers just to get an argument.
2192         Integrated the deleted case with the fast case.
2193         (JSC::Arguments::put): Ditto.
2194         (JSC::Arguments::deleteProperty): Ditto.
2195
2196         * kjs/Arguments.h: Minimized includes. Made everything private. Added
2197         overloads for the integral property name case. Eliminated mappedIndexSetter.
2198         Moved ArgumentsData into the .cpp file.
2199
2200         * kjs/IndexToNameMap.cpp: Emptied out and prepared for deletion.
2201         * kjs/IndexToNameMap.h: Ditto.
2202
2203         * kjs/JSActivation.cpp:
2204         (JSC::JSActivation::createArgumentsObject): Elminated ArgList.
2205
2206         * GNUmakefile.am:
2207         * JavaScriptCore.pri:
2208         * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
2209         * JavaScriptCore.xcodeproj/project.pbxproj:
2210         * JavaScriptCoreSources.bkl:
2211         * kjs/AllInOneFile.cpp:
2212         Removed IndexToNameMap.
2213
2214 2008-09-21  Darin Adler  <darin@apple.com>
2215
2216         * VM/CodeGenerator.cpp:
2217         (JSC::CodeGenerator::emitLoad): One more tweak: Wrote this in a slightly
2218         clearer style.
2219
2220 2008-09-21  Judit Jasz  <jasy@inf.u-szeged.hu>
2221
2222         Reviewed and tweaked by Darin Adler.
2223
2224         - https://bugs.webkit.org/show_bug.cgi?id=20645
2225           Elminate duplicate constant values in CodeBlocks.
2226
2227         Seems to be a wash on SunSpider.
2228
2229         * VM/CodeGenerator.cpp:
2230         (JSC::CodeGenerator::emitLoad): Use m_numberMap and m_stringMap to guarantee
2231         we emit the same JSValue* for identical numbers and strings.
2232         * VM/CodeGenerator.h: Added overload of emitLoad for const Identifier&.
2233         Add NumberMap and IdentifierStringMap types and m_numberMap and m_stringMap.
2234         * kjs/nodes.cpp:
2235         (JSC::StringNode::emitCode): Call the new emitLoad and let it do the
2236         JSString creation.
2237
2238 2008-09-21  Paul Pedriana  <webkit@pedriana.com>
2239
2240         Reviewed and tweaked by Darin Adler.
2241
2242         - https://bugs.webkit.org/show_bug.cgi?id=16925
2243           Fixed lack of Vector buffer alignment for both GCC and MSVC.
2244           Since there's no portable way to do this, for now we don't support
2245           other compilers.
2246
2247         * wtf/Vector.h: Added WTF_ALIGH_ON, WTF_ALIGNED, AlignedBufferChar, and AlignedBuffer.
2248         Use AlignedBuffer insteadof an array of char in VectorBuffer.
2249
2250 2008-09-21  Gabor Loki  <loki@inf.u-szeged.hu>
2251
2252         Reviewed by Darin Adler.
2253
2254         - https://bugs.webkit.org/show_bug.cgi?id=19408
2255           Add lightweight constant folding to the parser for *, /, + (only for numbers), <<, >>, ~ operators.
2256
2257         1.008x as fast on SunSpider.
2258
2259         * kjs/grammar.y:
2260         (makeNegateNode): Fold if expression is a number > 0.
2261         (makeBitwiseNotNode): Fold if expression is a number.
2262         (makeMultNode): Fold if expressions are both numbers.
2263         (makeDivNode): Fold if expressions are both numbers.
2264         (makeAddNode): Fold if expressions are both numbers.
2265         (makeLeftShiftNode): Fold if expressions are both numbers.
2266         (makeRightShiftNode): Fold if expressions are both numbers.
2267
2268 2008-09-21  Maciej Stachowiak  <mjs@apple.com>
2269
2270         Reviewed by Oliver.
2271         
2272         - speed up === operator by generating inline machine code for the fast paths
2273         https://bugs.webkit.org/show_bug.cgi?id=20820
2274
2275         * VM/CTI.cpp:
2276         (JSC::CTI::emitJumpSlowCaseIfNotImmediateNumber):
2277         (JSC::CTI::emitJumpSlowCaseIfNotImmediateNumbers):
2278         (JSC::CTI::emitJumpSlowCaseIfNotImmediates):
2279         (JSC::CTI::emitTagAsBoolImmediate):
2280         (JSC::CTI::privateCompileMainPass):
2281         (JSC::CTI::privateCompileSlowCases):
2282         * VM/CTI.h:
2283         * VM/Machine.cpp:
2284         (JSC::Machine::cti_op_stricteq):
2285         * masm/X86Assembler.h:
2286         (JSC::X86Assembler::):
2287         (JSC::X86Assembler::sete_r):
2288         (JSC::X86Assembler::setz_r):
2289         (JSC::X86Assembler::movzbl_rr):
2290         (JSC::X86Assembler::emitUnlinkedJnz):
2291
2292 2008-09-21  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
2293
2294         Reviewed by Maciej Stachowiak.
2295
2296         Free memory allocated for extra arguments in the destructor of the
2297         Arguments object.
2298
2299         * kjs/Arguments.cpp:
2300         (JSC::Arguments::~Arguments):
2301         * kjs/Arguments.h:
2302
2303 2008-09-21  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
2304
2305         Reviewed by Maciej Stachowiak.
2306
2307         Bug 20815: 'arguments' object creation is non-optimal
2308         <https://bugs.webkit.org/show_bug.cgi?id=20815>
2309
2310         Fix our inefficient way of creating the arguments object by only
2311         creating named properties for each of the arguments after a use of the
2312         'delete' statement. This patch also speeds up access to the 'arguments'
2313         object slightly, but it still does not use the array fast path for
2314         indexed access that exists for many opcodes.
2315
2316         This is about a 20% improvement on the V8 Raytrace benchmark, and a 1.5%
2317         improvement on the Earley-Boyer benchmark, which gives a 4% improvement
2318         overall.
2319
2320         * kjs/Arguments.cpp:
2321         (JSC::Arguments::Arguments):
2322         (JSC::Arguments::mark):
2323         (JSC::Arguments::getOwnPropertySlot):
2324         (JSC::Arguments::put):
2325         (JSC::Arguments::deleteProperty):
2326         * kjs/Arguments.h:
2327         (JSC::Arguments::ArgumentsData::ArgumentsData):
2328         * kjs/IndexToNameMap.h:
2329         (JSC::IndexToNameMap::size):
2330         * kjs/JSActivation.cpp:
2331         (JSC::JSActivation::createArgumentsObject):
2332         * kjs/JSActivation.h:
2333         (JSC::JSActivation::uncheckedSymbolTableGet):
2334         (JSC::JSActivation::uncheckedSymbolTableGetValue):
2335         (JSC::JSActivation::uncheckedSymbolTablePut):
2336         * kjs/JSFunction.h:
2337         (JSC::JSFunction::numParameters):
2338
2339 2008-09-20  Darin Adler  <darin@apple.com>
2340
2341         Reviewed by Mark Rowe.
2342
2343         - fix crash seen on buildbot
2344
2345         * kjs/JSGlobalObject.cpp:
2346         (JSC::JSGlobalObject::mark): Add back mark of arrayPrototype,
2347         deleted by accident in my recent check-in.
2348
2349 2008-09-20  Maciej Stachowiak  <mjs@apple.com>
2350
2351         Not reviewed, build fix.
2352         
2353         - speculative fix for non-AllInOne builds
2354
2355         * kjs/operations.h:
2356
2357 2008-09-20  Maciej Stachowiak  <mjs@apple.com>
2358
2359         Reviewed by Darin Adler.
2360         
2361         - assorted optimizations to === and !== operators
2362         (work towards <https://bugs.webkit.org/show_bug.cgi?id=20820>)
2363         
2364         2.5% speedup on earley-boyer test
2365
2366         * VM/Machine.cpp:
2367         (JSC::Machine::cti_op_stricteq): Use inline version of
2368         strictEqualSlowCase; remove unneeded exception check.
2369         (JSC::Machine::cti_op_nstricteq): ditto
2370         * kjs/operations.cpp:
2371         (JSC::strictEqual): Use strictEqualSlowCaseInline
2372         (JSC::strictEqualSlowCase): ditto
2373         * kjs/operations.h:
2374         (JSC::strictEqualSlowCaseInline): Version of strictEqualSlowCase that can be inlined,
2375         since the extra function call indirection is a lose for CTI.
2376
2377 2008-09-20  Darin Adler  <darin@apple.com>
2378
2379         Reviewed by Maciej Stachowiak.
2380
2381         - finish https://bugs.webkit.org/show_bug.cgi?id=20858
2382           make each distinct C++ class get a distinct JSC::Structure
2383
2384         This also includes some optimizations that make the change an overall
2385         small speedup. Without those it was a bit of a slowdown.
2386
2387         * API/JSCallbackConstructor.cpp:
2388         (JSC::JSCallbackConstructor::JSCallbackConstructor): Take a structure.
2389         * API/JSCallbackConstructor.h: Ditto.
2390         * API/JSCallbackFunction.cpp:
2391         (JSC::JSCallbackFunction::JSCallbackFunction): Pass a structure.
2392         * API/JSCallbackObject.h: Take a structure.
2393         * API/JSCallbackObjectFunctions.h:
2394         (JSC::JSCallbackObject::JSCallbackObject): Ditto.
2395
2396         * API/JSClassRef.cpp:
2397         (OpaqueJSClass::prototype): Pass in a structure. Call setPrototype
2398         if there's a custom prototype involved.
2399         * API/JSObjectRef.cpp:
2400         (JSObjectMake): Ditto.
2401         (JSObjectMakeConstructor): Pass in a structure.
2402
2403         * JavaScriptCore.exp: Updated.
2404
2405         * VM/Machine.cpp:
2406         (JSC::jsLess): Added a special case for when both arguments are strings.
2407         This avoids converting both strings to with UString::toDouble.
2408         (JSC::jsLessEq): Ditto.
2409         (JSC::Machine::privateExecute): Pass in a structure.
2410         (JSC::Machine::cti_op_construct_JSConstruct): Ditto.
2411         (JSC::Machine::cti_op_new_regexp): Ditto.
2412         (JSC::Machine::cti_op_is_string): Ditto.
2413         * VM/Machine.h: Made isJSString public so it can be used in the CTI.
2414
2415         * kjs/Arguments.cpp:
2416         (JSC::Arguments::Arguments): Pass in a structure.
2417
2418         * kjs/JSCell.h: Mark constructor explicit.
2419
2420         * kjs/JSGlobalObject.cpp:
2421         (JSC::markIfNeeded): Added an overload for marking structures.
2422         (JSC::JSGlobalObject::reset): Eliminate code to set data members to
2423         zero. We now do that in the constructor, and we no longer use this
2424         anywhere except in the constructor. Added code to create structures.
2425         Pass structures rather than prototypes when creating objects.
2426         (JSC::JSGlobalObject::mark): Mark the structures.
2427
2428         * kjs/JSGlobalObject.h: Removed unneeded class declarations.
2429         Added initializers for raw pointers in JSGlobalObjectData so
2430         everything starts with a 0. Added structure data and accessor
2431         functions.
2432
2433         * kjs/JSImmediate.cpp:
2434         (JSC::JSImmediate::nonInlineNaN): Added.
2435         * kjs/JSImmediate.h:
2436         (JSC::JSImmediate::toDouble): Rewrote to avoid PIC branches.
2437
2438         * kjs/JSNumberCell.cpp:
2439         (JSC::jsNumberCell): Made non-inline to avoid PIC branches
2440         in functions that call this one.
2441         (JSC::jsNaN): Ditto.
2442         * kjs/JSNumberCell.h: Ditto.
2443
2444         * kjs/JSObject.h: Removed constructor that takes a prototype.
2445         All callers now pass structures.
2446
2447         * kjs/ArrayConstructor.cpp:
2448         (JSC::ArrayConstructor::ArrayConstructor):
2449         (JSC::constructArrayWithSizeQuirk):
2450         * kjs/ArrayConstructor.h:
2451         * kjs/ArrayPrototype.cpp:
2452         (JSC::ArrayPrototype::ArrayPrototype):
2453         * kjs/ArrayPrototype.h:
2454         * kjs/BooleanConstructor.cpp:
2455         (JSC::BooleanConstructor::BooleanConstructor):
2456         (JSC::constructBoolean):
2457         (JSC::constructBooleanFromImmediateBoolean):
2458         * kjs/BooleanConstructor.h:
2459         * kjs/BooleanObject.cpp:
2460         (JSC::BooleanObject::BooleanObject):
2461         * kjs/BooleanObject.h:
2462         * kjs/BooleanPrototype.cpp:
2463         (JSC::BooleanPrototype::BooleanPrototype):
2464         * kjs/BooleanPrototype.h:
2465         * kjs/DateConstructor.cpp:
2466         (JSC::DateConstructor::DateConstructor):
2467         (JSC::constructDate):
2468         * kjs/DateConstructor.h:
2469         * kjs/DateInstance.cpp:
2470         (JSC::DateInstance::DateInstance):
2471         * kjs/DateInstance.h:
2472         * kjs/DatePrototype.cpp:
2473         (JSC::DatePrototype::DatePrototype):
2474         * kjs/DatePrototype.h:
2475         * kjs/ErrorConstructor.cpp:
2476         (JSC::ErrorConstructor::ErrorConstructor):
2477         (JSC::constructError):
2478         * kjs/ErrorConstructor.h:
2479         * kjs/ErrorInstance.cpp:
2480         (JSC::ErrorInstance::ErrorInstance):
2481         * kjs/ErrorInstance.h:
2482         * kjs/ErrorPrototype.cpp:
2483         (JSC::ErrorPrototype::ErrorPrototype):
2484         * kjs/ErrorPrototype.h:
2485         * kjs/FunctionConstructor.cpp:
2486         (JSC::FunctionConstructor::FunctionConstructor):
2487         * kjs/FunctionConstructor.h:
2488         * kjs/FunctionPrototype.cpp:
2489         (JSC::FunctionPrototype::FunctionPrototype):
2490         (JSC::FunctionPrototype::addFunctionProperties):
2491         * kjs/FunctionPrototype.h:
2492         * kjs/GlobalEvalFunction.cpp:
2493         (JSC::GlobalEvalFunction::GlobalEvalFunction):
2494         * kjs/GlobalEvalFunction.h:
2495         * kjs/InternalFunction.cpp:
2496         (JSC::InternalFunction::InternalFunction):
2497         * kjs/InternalFunction.h:
2498         (JSC::InternalFunction::InternalFunction):
2499         * kjs/JSArray.cpp:
2500         (JSC::JSArray::JSArray):
2501         (JSC::constructEmptyArray):
2502         (JSC::constructArray):
2503         * kjs/JSArray.h:
2504         * kjs/JSFunction.cpp:
2505         (JSC::JSFunction::JSFunction):
2506         (JSC::JSFunction::construct):
2507         * kjs/JSObject.cpp:
2508         (JSC::constructEmptyObject):
2509         * kjs/JSString.cpp:
2510         (JSC::StringObject::create):
2511         * kjs/JSWrapperObject.h:
2512         * kjs/MathObject.cpp:
2513         (JSC::MathObject::MathObject):
2514         * kjs/MathObject.h:
2515         * kjs/NativeErrorConstructor.cpp:
2516         (JSC::NativeErrorConstructor::NativeErrorConstructor):
2517         (JSC::NativeErrorConstructor::construct):
2518         * kjs/NativeErrorConstructor.h:
2519         * kjs/NativeErrorPrototype.cpp:
2520         (JSC::NativeErrorPrototype::NativeErrorPrototype):
2521         * kjs/NativeErrorPrototype.h:
2522         * kjs/NumberConstructor.cpp:
2523         (JSC::NumberConstructor::NumberConstructor):
2524         (JSC::constructWithNumberConstructor):
2525         * kjs/NumberConstructor.h:
2526         * kjs/NumberObject.cpp:
2527         (JSC::NumberObject::NumberObject):
2528         (JSC::constructNumber):
2529         (JSC::constructNumberFromImmediateNumber):
2530         * kjs/NumberObject.h:
2531         * kjs/NumberPrototype.cpp:
2532         (JSC::NumberPrototype::NumberPrototype):
2533         * kjs/NumberPrototype.h:
2534         * kjs/ObjectConstructor.cpp:
2535         (JSC::ObjectConstructor::ObjectConstructor):
2536         (JSC::constructObject):
2537         * kjs/ObjectConstructor.h:
2538         * kjs/ObjectPrototype.cpp:
2539         (JSC::ObjectPrototype::ObjectPrototype):
2540         * kjs/ObjectPrototype.h:
2541         * kjs/PrototypeFunction.cpp:
2542         (JSC::PrototypeFunction::PrototypeFunction):
2543         * kjs/PrototypeFunction.h:
2544         * kjs/RegExpConstructor.cpp:
2545         (JSC::RegExpConstructor::RegExpConstructor):
2546         (JSC::RegExpMatchesArray::RegExpMatchesArray):
2547         (JSC::constructRegExp):
2548         * kjs/RegExpConstructor.h:
2549         * kjs/RegExpObject.cpp:
2550         (JSC::RegExpObject::RegExpObject):
2551         * kjs/RegExpObject.h:
2552         * kjs/RegExpPrototype.cpp:
2553         (JSC::RegExpPrototype::RegExpPrototype):
2554         * kjs/RegExpPrototype.h:
2555         * kjs/Shell.cpp:
2556         (GlobalObject::GlobalObject):
2557         * kjs/StringConstructor.cpp:
2558         (JSC::StringConstructor::StringConstructor):
2559         (JSC::constructWithStringConstructor):
2560         * kjs/StringConstructor.h:
2561         * kjs/StringObject.cpp:
2562         (JSC::StringObject::StringObject):
2563         * kjs/StringObject.h:
2564         * kjs/StringObjectThatMasqueradesAsUndefined.h:
2565         (JSC::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined):
2566         * kjs/StringPrototype.cpp:
2567         (JSC::StringPrototype::StringPrototype):
2568         * kjs/StringPrototype.h:
2569         Take and pass structures.
2570
2571 2008-09-19  Alp Toker  <alp@nuanti.com>
2572
2573         Build fix for the 'gold' linker and recent binutils. New behaviour
2574         requires that we link to used libraries explicitly.
2575
2576         * GNUmakefile.am:
2577
2578 2008-09-19  Sam Weinig  <sam@webkit.org>
2579
2580         Roll r36694 back in.  It did not cause the crash.
2581
2582         * JavaScriptCore.exp:
2583         * VM/JSPropertyNameIterator.cpp:
2584         (JSC::JSPropertyNameIterator::~JSPropertyNameIterator):
2585         (JSC::JSPropertyNameIterator::invalidate):
2586         * VM/JSPropertyNameIterator.h:
2587         (JSC::JSPropertyNameIterator::JSPropertyNameIterator):
2588         (JSC::JSPropertyNameIterator::create):
2589         * kjs/JSObject.cpp:
2590         (JSC::JSObject::getPropertyNames):
2591         * kjs/PropertyMap.cpp:
2592         (JSC::PropertyMap::getEnumerablePropertyNames):
2593         * kjs/PropertyMap.h:
2594         * kjs/PropertyNameArray.cpp:
2595         (JSC::PropertyNameArray::add):
2596         * kjs/PropertyNameArray.h:
2597         (JSC::PropertyNameArrayData::create):
2598         (JSC::PropertyNameArrayData::propertyNameVector):
2599         (JSC::PropertyNameArrayData::setCachedPrototypeChain):
2600         (JSC::PropertyNameArrayData::cachedPrototypeChain):
2601         (JSC::PropertyNameArrayData::begin):
2602         (JSC::PropertyNameArrayData::end):
2603         (JSC::PropertyNameArrayData::PropertyNameArrayData):
2604         (JSC::PropertyNameArray::PropertyNameArray):
2605         (JSC::PropertyNameArray::addKnownUnique):
2606         (JSC::PropertyNameArray::size):
2607         (JSC::PropertyNameArray::operator[]):
2608         (JSC::PropertyNameArray::begin):
2609         (JSC::PropertyNameArray::end):
2610         (JSC::PropertyNameArray::setData):
2611         (JSC::PropertyNameArray::data):
2612         (JSC::PropertyNameArray::releaseData):
2613         * kjs/StructureID.cpp:
2614         (JSC::structureIDChainsAreEqual):
2615         (JSC::StructureID::getEnumerablePropertyNames):
2616         (JSC::StructureID::clearEnumerationCache):
2617         (JSC::StructureID::createCachedPrototypeChain):
2618         * kjs/StructureID.h:
2619
2620 2008-09-19  Sam Weinig  <sam@webkit.org>
2621
2622         Roll out r36694.
2623
2624         * JavaScriptCore.exp:
2625         * VM/JSPropertyNameIterator.cpp:
2626         (JSC::JSPropertyNameIterator::~JSPropertyNameIterator):
2627         (JSC::JSPropertyNameIterator::invalidate):
2628         * VM/JSPropertyNameIterator.h:
2629         (JSC::JSPropertyNameIterator::JSPropertyNameIterator):
2630         (JSC::JSPropertyNameIterator::create):
2631         * kjs/JSObject.cpp:
2632         (JSC::JSObject::getPropertyNames):
2633         * kjs/PropertyMap.cpp:
2634         (JSC::PropertyMap::getEnumerablePropertyNames):
2635         * kjs/PropertyMap.h:
2636         * kjs/PropertyNameArray.cpp:
2637         (JSC::PropertyNameArray::add):
2638         * kjs/PropertyNameArray.h:
2639         (JSC::PropertyNameArray::PropertyNameArray):
2640         (JSC::PropertyNameArray::addKnownUnique):
2641         (JSC::PropertyNameArray::begin):
2642         (JSC::PropertyNameArray::end):
2643         (JSC::PropertyNameArray::size):
2644         (JSC::PropertyNameArray::operator[]):
2645         (JSC::PropertyNameArray::releaseIdentifiers):
2646         * kjs/StructureID.cpp:
2647         (JSC::StructureID::getEnumerablePropertyNames):
2648         * kjs/StructureID.h:
2649         (JSC::StructureID::clearEnumerationCache):
2650
2651 2008-09-19  Oliver Hunt  <oliver@apple.com>
2652
2653         Reviewed by Maciej Stachowiak.
2654
2655         Improve peformance of local variable initialisation.
2656
2657         Pull local and constant initialisation out of slideRegisterWindowForCall
2658         and into its own opcode.  This allows the JIT to generate the initialisation
2659         code for a function directly into the instruction stream and so avoids a few
2660         branches on function entry.
2661
2662         Results a 1% progression in SunSpider, particularly in a number of the bitop
2663         tests where the called functions are very fast. 
2664
2665         * VM/CTI.cpp:
2666         (JSC::CTI::emitInitialiseRegister):
2667         (JSC::CTI::privateCompileMainPass):
2668         * VM/CTI.h:
2669         * VM/CodeBlock.cpp:
2670         (JSC::CodeBlock::dump):
2671         * VM/CodeGenerator.cpp:
2672         (JSC::CodeGenerator::CodeGenerator):
2673         * VM/Machine.cpp:
2674         (JSC::slideRegisterWindowForCall):
2675         (JSC::Machine::privateExecute):
2676         * VM/Opcode.h:
2677
2678 2008-09-19  Sam Weinig  <sam@webkit.org>
2679
2680         Reviewed by Darin Adler.
2681
2682         Patch for https://bugs.webkit.org/show_bug.cgi?id=20928
2683         Speed up JS property enumeration by caching entire PropertyNameArray
2684
2685         1.3% speedup on Sunspider, 30% on string-fasta.
2686
2687         * JavaScriptCore.exp:
2688         * VM/JSPropertyNameIterator.cpp:
2689         (JSC::JSPropertyNameIterator::~JSPropertyNameIterator):
2690         (JSC::JSPropertyNameIterator::invalidate):
2691         * VM/JSPropertyNameIterator.h:
2692         (JSC::JSPropertyNameIterator::JSPropertyNameIterator):
2693         (JSC::JSPropertyNameIterator::create):
2694         * kjs/JSObject.cpp:
2695         (JSC::JSObject::getPropertyNames):
2696         * kjs/PropertyMap.cpp:
2697         (JSC::PropertyMap::getEnumerablePropertyNames):
2698         * kjs/PropertyMap.h:
2699         * kjs/PropertyNameArray.cpp:
2700         (JSC::PropertyNameArray::add):
2701         * kjs/PropertyNameArray.h:
2702         (JSC::PropertyNameArrayData::create):
2703         (JSC::PropertyNameArrayData::propertyNameVector):
2704         (JSC::PropertyNameArrayData::setCachedPrototypeChain):
2705         (JSC::PropertyNameArrayData::cachedPrototypeChain):
2706         (JSC::PropertyNameArrayData::begin):
2707         (JSC::PropertyNameArrayData::end):
2708         (JSC::PropertyNameArrayData::PropertyNameArrayData):
2709         (JSC::PropertyNameArray::PropertyNameArray):
2710         (JSC::PropertyNameArray::addKnownUnique):
2711         (JSC::PropertyNameArray::size):
2712         (JSC::PropertyNameArray::operator[]):
2713         (JSC::PropertyNameArray::begin):
2714         (JSC::PropertyNameArray::end):
2715         (JSC::PropertyNameArray::setData):
2716         (JSC::PropertyNameArray::data):
2717         (JSC::PropertyNameArray::releaseData):
2718         * kjs/ScopeChain.cpp:
2719         (JSC::ScopeChainNode::print):
2720         * kjs/StructureID.cpp:
2721         (JSC::structureIDChainsAreEqual):
2722         (JSC::StructureID::getEnumerablePropertyNames):
2723         (JSC::StructureID::clearEnumerationCache):
2724         (JSC::StructureID::createCachedPrototypeChain):
2725         * kjs/StructureID.h:
2726
2727 2008-09-19  Holger Hans Peter Freyther  <zecke@selfish.org>
2728
2729         Reviewed by Maciej Stachowiak.
2730
2731         Fix a mismatched new[]/delete in JSObject::allocatePropertyStorage
2732
2733         * kjs/JSObject.cpp:
2734         (JSC::JSObject::allocatePropertyStorage): Spotted by valgrind.
2735
2736 2008-09-19  Darin Adler  <darin@apple.com>
2737
2738         Reviewed by Sam Weinig.
2739
2740         - part 2 of https://bugs.webkit.org/show_bug.cgi?id=20858
2741           make each distinct C++ class get a distinct JSC::Structure
2742
2743         * JavaScriptCore.exp: Exported constructEmptyObject for use in WebCore.
2744
2745         * kjs/JSGlobalObject.h: Changed the protected constructor to take a
2746         structure instead of a prototype.
2747
2748         * kjs/JSVariableObject.h: Removed constructor that takes a prototype.
2749
2750 2008-09-19  Julien Chaffraix  <jchaffraix@pleyo.com>
2751
2752         Reviewed by Alexey Proskuryakov.
2753
2754         Use the template hoisting technique on the RefCounted class. This reduces the code bloat due to
2755         non-template methods' code been copied for each instance of the template.
2756         The patch splits RefCounted between a base class that holds non-template methods and attributes
2757         and the template RefCounted class that keeps the same functionnality.
2758
2759         On my Linux with gcc 4.3 for the Gtk port, this is:
2760         - a ~600KB save on libwebkit.so in release.
2761         - a ~1.6MB save on libwebkit.so in debug.
2762
2763         It is a wash on Sunspider and a small win on Dromaeo (not sure it is relevant).
2764         On the whole, it should be a small win as we reduce the compiled code size and the only
2765         new function call should be inlined by the compiler.
2766
2767         * wtf/RefCounted.h:
2768         (WTF::RefCountedBase::ref): Copied from RefCounted.
2769         (WTF::RefCountedBase::hasOneRef): Ditto.
2770         (WTF::RefCountedBase::refCount): Ditto.
2771         (WTF::RefCountedBase::RefCountedBase): Ditto.
2772         (WTF::RefCountedBase::~RefCountedBase): Ditto.
2773         (WTF::RefCountedBase::derefBase): Tweaked from the RefCounted version to remove
2774         template section.
2775         (WTF::RefCounted::RefCounted):
2776         (WTF::RefCounted::deref): Small wrapper around RefCountedBase::derefBase().
2777         (WTF::RefCounted::~RefCounted): Keep private destructor.
2778
2779 2008-09-18  Darin Adler  <darin@apple.com>
2780
2781         Reviewed by Maciej Stachowiak.
2782
2783         - part 1 of https://bugs.webkit.org/show_bug.cgi?id=20858
2784           make each distinct C++ class get a distinct JSC::Structure
2785
2786         * kjs/lookup.h: Removed things here that were used only in WebCore:
2787         cacheGlobalObject, JSC_DEFINE_PROTOTYPE, JSC_DEFINE_PROTOTYPE_WITH_PROTOTYPE,
2788         and JSC_IMPLEMENT_PROTOTYPE.
2789
2790 2008-09-18  Darin Adler  <darin@apple.com>
2791
2792         Reviewed by Maciej Stachowiak.
2793
2794         - https://bugs.webkit.org/show_bug.cgi?id=20927
2795           simplify/streamline the code to turn strings into identifiers while parsing
2796
2797         * kjs/grammar.y: Get rid of string from the union, and use ident for STRING as
2798         well as for IDENT.
2799
2800         * kjs/lexer.cpp:
2801         (JSC::Lexer::lex): Use makeIdentifier instead of makeUString for String.
2802         * kjs/lexer.h: Remove makeUString.
2803
2804         * kjs/nodes.h: Changed StringNode to hold an Identifier instead of UString.
2805
2806         * VM/CodeGenerator.cpp:
2807         (JSC::keyForCharacterSwitch): Updated since StringNode now holds an Identifier.
2808         (JSC::prepareJumpTableForStringSwitch): Ditto.
2809         * kjs/nodes.cpp:
2810         (JSC::StringNode::emitCode): Ditto. The comment from here is now in the lexer.
2811         (JSC::processClauseList): Ditto.
2812         * kjs/nodes2string.cpp:
2813         (JSC::StringNode::streamTo): Ditto.
2814
2815 2008-09-18  Sam Weinig  <sam@webkit.org>
2816
2817         Fix style.
2818
2819         * VM/Instruction.h:
2820         (JSC::Instruction::Instruction):
2821
2822 2008-09-18  Oliver Hunt  <oliver@apple.com>
2823
2824         Reviewed by Maciej Stachowiak.
2825
2826         Bug 20911: REGRESSION(r36480?): Reproducible assertion failure below derefStructureIDs 64-bit JavaScriptCore
2827         <https://bugs.webkit.org/show_bug.cgi?id=20911>
2828
2829         The problem was simply caused by the int constructor for Instruction
2830         failing to initialise the full struct in 64bit builds.
2831
2832         * VM/Instruction.h:
2833         (JSC::Instruction::Instruction):
2834
2835 2008-09-18  Darin Adler  <darin@apple.com>
2836
2837         - fix release build
2838
2839         * wtf/RefCountedLeakCounter.cpp: Removed stray "static".
2840
2841 2008-09-18  Darin Adler  <darin@apple.com>
2842
2843         Reviewed by Sam Weinig.
2844
2845         * kjs/JSGlobalObject.h: Tiny style guideline tweak.
2846
2847 2008-09-18  Darin Adler  <darin@apple.com>
2848
2849         Reviewed by Sam Weinig.
2850
2851         - fix https://bugs.webkit.org/show_bug.cgi?id=20925
2852           LEAK messages appear every time I quit
2853
2854         * JavaScriptCore.exp: Updated, and also added an export
2855         needed for future WebCore use of JSC::StructureID.
2856
2857         * wtf/RefCountedLeakCounter.cpp:
2858         (WTF::RefCountedLeakCounter::suppressMessages): Added.
2859         (WTF::RefCountedLeakCounter::cancelMessageSuppression): Added.
2860         (WTF::RefCountedLeakCounter::RefCountedLeakCounter): Tweaked a bit.
2861         (WTF::RefCountedLeakCounter::~RefCountedLeakCounter): Added code to
2862         log the reason there was no leak checking done.
2863         (WTF::RefCountedLeakCounter::increment): Tweaked a bit.
2864         (WTF::RefCountedLeakCounter::decrement): Ditto.
2865
2866         * wtf/RefCountedLeakCounter.h: Replaced setLogLeakMessages with two
2867         new functions, suppressMessages and cancelMessageSuppression. Also
2868         added m_ prefixes to the data member names.
2869
2870 2008-09-18  Holger Hans Peter Freyther  <zecke@selfish.org>
2871
2872         Reviewed by Mark Rowe.
2873
2874         https://bugs.webkit.org/show_bug.cgi?id=20437
2875
2876         Add a proper #define to define which XML Parser implementation to use. Client
2877         code can use #if USE(QXMLSTREAM) to decide if the Qt XML StreamReader
2878         implementation is going to be used.
2879
2880         * wtf/Platform.h:
2881
2882 2008-09-18  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
2883
2884         Reviewed by Maciej Stachowiak.
2885
2886         Make a Unicode non-breaking space count as a whitespace character in
2887         PCRE. This change was already made in WREC, and it fixes one of the
2888         Mozilla JS tests. Since it is now fixed in PCRE as well, we can check
2889         in a new set of expected test results.
2890
2891         * pcre/pcre_internal.h:
2892         (isSpaceChar):
2893         * tests/mozilla/expected.html:
2894
2895 2008-09-18  Stephanie Lewis  <slewis@apple.com>
2896
2897         Reviewed by Mark Rowe and Maciej Stachowiak.
2898
2899         add an option use arch to specify which architecture to run.
2900
2901         * tests/mozilla/jsDriver.pl:
2902
2903 2008-09-17  Oliver Hunt  <oliver@apple.com>
2904
2905         Correctly restore argument reference prior to SFX runtime calls.
2906         
2907         Reviewed by Steve Falkenburg.
2908
2909         * VM/CTI.cpp:
2910         (JSC::CTI::privateCompileSlowCases):
2911         (JSC::CTI::privateCompile):
2912
2913 2008-09-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
2914
2915         Reviewed by Maciej Stachowiak.
2916
2917         Bug 20876: REGRESSION (r36417, r36427): fast/js/exception-expression-offset.html fails
2918         <https://bugs.webkit.org/show_bug.cgi?id=20876>
2919
2920         r36417 and r36427 caused an get_by_id opcode to be emitted before the
2921         instanceof and construct opcodes, in order to enable inline caching of
2922         the prototype property. Unfortunately, this regressed some tests dealing
2923         with exceptions thrown by 'instanceof' and the 'new' operator. We fix
2924         these problems by detecting whether an "is not an object" exception is
2925         thrown before op_instanceof or op_construct, and emit the proper
2926         exception in those cases.
2927
2928         * VM/CodeGenerator.cpp:
2929         (JSC::CodeGenerator::emitConstruct):
2930         * VM/CodeGenerator.h:
2931         * VM/ExceptionHelpers.cpp:
2932         (JSC::createInvalidParamError):
2933         (JSC::createNotAConstructorError):
2934         (JSC::createNotAnObjectError):
2935         * VM/ExceptionHelpers.h:
2936         * VM/Machine.cpp:
2937         (JSC::Machine::getOpcode):
2938         (JSC::Machine::privateExecute):
2939         * VM/Machine.h:
2940         * kjs/nodes.cpp:
2941         (JSC::NewExprNode::emitCode):
2942         (JSC::InstanceOfNode::emitCode):
2943
2944 2008-09-17  Gavin Barraclough  <barraclough@apple.com>
2945
2946         Reviewed by Oliver Hunt.
2947
2948         JIT generation cti_op_construct_verify.
2949         
2950         Quarter to half percent progression on v8-tests.
2951         Roughly not change on SunSpider (possible minor progression).
2952
2953         * VM/CTI.cpp:
2954         (JSC::CTI::privateCompileMainPass):
2955         * VM/Machine.cpp:
2956         * VM/Machine.h:
2957
2958 2008-09-15  Steve Falkenburg  <sfalken@apple.com>
2959
2960         Improve timer accuracy for JavaScript Date object on Windows.
2961         
2962         Use a combination of ftime and QueryPerformanceCounter.
2963         ftime returns the information we want, but doesn't have sufficient resolution.
2964         QueryPerformanceCounter has high resolution, but is only usable to measure time intervals.
2965         To combine them, we call ftime and QueryPerformanceCounter initially. Later calls will use
2966         QueryPerformanceCounter by itself, adding the delta to the saved ftime.  We re-sync to
2967         correct for drift if the low-res and high-res elapsed time between calls differs by more
2968         than twice the low-resolution timer resolution.
2969         
2970         QueryPerformanceCounter may be inaccurate due to a problems with:
2971         - some PCI bridge chipsets (http://support.microsoft.com/kb/274323)
2972         - BIOS bugs (http://support.microsoft.com/kb/895980/)
2973         - BIOS/HAL bugs on multiprocessor/multicore systems (http://msdn.microsoft.com/en-us/library/ms644904.aspx)
2974         
2975         Reviewed by Darin Adler.
2976
2977         * kjs/DateMath.cpp:
2978         (JSC::highResUpTime):
2979         (JSC::lowResUTCTime):
2980         (JSC::qpcAvailable):
2981         (JSC::getCurrentUTCTimeWithMicroseconds):
2982
2983 2008-09-17  Gavin Barraclough  <barraclough@apple.com>
2984
2985         Reviewed by Geoff Garen.
2986
2987         Implement JIT generation of CallFrame initialization, for op_call.
2988
2989         1% sunspider 2.5% v8-tests.
2990
2991         * VM/CTI.cpp:
2992         (JSC::CTI::compileOpCall):
2993         * VM/Machine.cpp:
2994         (JSC::Machine::cti_op_call_JSFunction):
2995         (JSC::Machine::cti_op_call_NotJSFunction):
2996
2997 2008-09-17  Gavin Barraclough  <barraclough@apple.com>
2998
2999         Reviewed by Geoff Garen.
3000
3001         Optimizations for op_call in CTI.  Move check for (ctiCode == 0) into JIT code,
3002         move copying of scopeChain for CodeBlocks that needFullScopeChain into head of
3003         functions, instead of checking prior to making the call.
3004
3005         3% on v8-tests (4% on richards, 6% in delta-blue)
3006
3007         * VM/CTI.cpp:
3008         (JSC::CTI::compileOpCall):
3009         (JSC::CTI::privateCompileSlowCases):
3010         (JSC::CTI::privateCompile):
3011         * VM/Machine.cpp:
3012         (JSC::Machine::execute):
3013         (JSC::Machine::cti_op_call_JSFunction):
3014         (JSC::Machine::cti_vm_compile):
3015         (JSC::Machine::cti_vm_updateScopeChain):
3016         (JSC::Machine::cti_op_construct_JSConstruct):
3017         * VM/Machine.h:
3018
3019 2008-09-17  Tor Arne Vestbø  <tavestbo@trolltech.com>
3020
3021         Fix the QtWebKit/Mac build
3022
3023         * wtf/ThreadingQt.cpp:
3024         (WTF::initializeThreading): use QCoreApplication to get the main thread
3025
3026 2008-09-16  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
3027
3028         Reviewed by Maciej Stachowiak.
3029
3030         Bug 20857: REGRESSION (r36427): ASSERTION FAILED: m_refCount >= 0 in RegisterID::deref()
3031         <https://bugs.webkit.org/show_bug.cgi?id=20857>
3032
3033         Fix a problem stemming from the slightly unsafe behaviour of the
3034         CodeGenerator::finalDestination() method by putting the "func" argument
3035         of the emitConstruct() method in a RefPtr in its caller. Also, add an
3036         assertion guaranteeing that this is always the case.
3037
3038         CodeGenerator::finalDestination() is still incorrect and can cause
3039         problems with a different allocator; see bug 20340 for more details.
3040
3041         * VM/CodeGenerator.cpp:
3042         (JSC::CodeGenerator::emitConstruct):
3043         * kjs/nodes.cpp:
3044         (JSC::NewExprNode::emitCode):
3045
3046 2008-09-16  Alice Liu  <alice.liu@apple.com>
3047
3048         build fix.
3049
3050         * VM/CTI.cpp:
3051         (JSC::CTI::privateCompileMainPass):
3052
3053 2008-09-16  Gavin Barraclough  <barraclough@apple.com>
3054
3055         Reviewed by Geoff Garen.
3056
3057         CTI code generation for op_ret.  The majority of the work
3058         (updating variables on the stack & on exec) can be performed
3059         directly in generated code.
3060
3061         We still need to check, & to call out to C-code to handle
3062         activation records, profiling, and full scope chains.
3063
3064         +1.5% Sunspider, +5/6% v8 tests.
3065
3066         * VM/CTI.cpp:
3067         (JSC::CTI::emitPutCTIParam):
3068         (JSC::CTI::compileOpCall):
3069         (JSC::CTI::privateCompileMainPass):
3070         * VM/CTI.h:
3071         * VM/Machine.cpp:
3072         (JSC::Machine::cti_op_ret_activation):
3073         (JSC::Machine::cti_op_ret_profiler):
3074         (JSC::Machine::cti_op_ret_scopeChain):
3075         * VM/Machine.h:
3076
3077 2008-09-16  Dimitri Glazkov  <dglazkov@chromium.org>
3078
3079         Fix the Windows build.
3080
3081         Add some extra parentheses to stop MSVC from complaining so much.
3082
3083         * VM/Machine.cpp:
3084         (JSC::Machine::privateExecute):
3085         (JSC::Machine::cti_op_stricteq):
3086         (JSC::Machine::cti_op_nstricteq):
3087         * kjs/operations.cpp:
3088         (JSC::strictEqual):
3089
3090 2008-09-15  Maciej Stachowiak  <mjs@apple.com>
3091
3092         Reviewed by Cameron Zwarich.
3093         
3094         - speed up the === and !== operators by choosing the fast cases better
3095         
3096         No effect on SunSpider but speeds up the V8 EarlyBoyer benchmark about 4%.
3097
3098         * VM/Machine.cpp:
3099         (JSC::Machine::privateExecute):
3100         (JSC::Machine::cti_op_stricteq):
3101         (JSC::Machine::cti_op_nstricteq):
3102         * kjs/JSImmediate.h:
3103         (JSC::JSImmediate::areBothImmediate):
3104         * kjs/operations.cpp:
3105         (JSC::strictEqual):
3106         (JSC::strictEqualSlowCase):
3107         * kjs/operations.h:
3108
3109 2008-09-15  Oliver Hunt  <oliver@apple.com>
3110
3111         RS=Sam Weinig.
3112
3113         Coding style cleanup.
3114
3115         * VM/Machine.cpp:
3116         (JSC::Machine::privateExecute):
3117
3118 2008-09-15  Oliver Hunt  <oliver@apple.com>
3119
3120         Reviewed by Cameron Zwarich.
3121
3122         Bug 20874: op_resolve does not do any form of caching
3123         <https://bugs.webkit.org/show_bug.cgi?id=20874>
3124
3125         This patch adds an op_resolve_global opcode to handle (and cache)
3126         property lookup we can statically determine must occur on the global
3127         object (if at all).
3128
3129         3% progression on sunspider, 3.2x improvement to bitops-bitwise-and, and
3130         10% in math-partial-sums
3131
3132         * VM/CTI.cpp:
3133         (JSC::CTI::privateCompileMainPass):
3134         * VM/CTI.h:
3135         * VM/CodeBlock.cpp:
3136         (JSC::CodeBlock::dump):
3137         * VM/CodeGenerator.cpp:
3138         (JSC::CodeGenerator::findScopedProperty):
3139         (JSC::CodeGenerator::emitResolve):
3140         * VM/Machine.cpp:
3141         (JSC::resolveGlobal):
3142         (JSC::Machine::privateExecute):
3143         (JSC::Machine::cti_op_resolve_global):
3144         * VM/Machine.h:
3145         * VM/Opcode.h:
3146
3147 2008-09-15  Sam Weinig  <sam@webkit.org>
3148
3149         Roll out r36462.  It broke document.all.
3150
3151         * VM/CTI.cpp:
3152         (JSC::CTI::privateCompileMainPass):
3153         (JSC::CTI::privateCompileSlowCases):
3154         * VM/CTI.h:
3155         * VM/Machine.cpp:
3156         (JSC::Machine::Machine):
3157         (JSC::Machine::cti_op_eq_null):
3158         (JSC::Machine::cti_op_neq_null):
3159         * VM/Machine.h:
3160         (JSC::Machine::isJSString):
3161         * kjs/JSCell.h:
3162         * kjs/JSWrapperObject.h:
3163         * kjs/StringObject.h:
3164         * kjs/StringObjectThatMasqueradesAsUndefined.h:
3165
3166 2008-09-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
3167
3168         Reviewed by Maciej Stachowiak.
3169
3170         Bug 20863: ASSERTION FAILED: addressOffset < instructions.size() in CodeBlock::getHandlerForVPC
3171         <https://bugs.webkit.org/show_bug.cgi?id=20863>
3172
3173         r36427 changed the number of arguments to op_construct without changing
3174         the argument index for the vPC in the call to initializeCallFrame() in
3175         the CTI case. This caused a JSC test failure. Correcting the argument
3176         index fixes the test failure.
3177
3178         * VM/Machine.cpp:
3179         (JSC::Machine::cti_op_construct_JSConstruct):
3180
3181 2008-09-15  Mark Rowe  <mrowe@apple.com>
3182
3183         Fix GCC 4.2 build.
3184
3185         * VM/CTI.h:
3186
3187 2008-09-15  Geoffrey Garen  <ggaren@apple.com>
3188
3189         Reviewed by Maciej Stachowiak.
3190         
3191         Fixed a typo in op_get_by_id_chain that caused it to miss every time
3192         in the interpreter.
3193         
3194         Also, a little cleanup.
3195
3196         * VM/Machine.cpp:
3197         (JSC::Machine::privateExecute): Set up baseObject before entering the
3198         loop, so we compare against the right values.
3199
3200 2008-09-15  Geoffrey Garen  <ggaren@apple.com>
3201
3202         Reviewed by Sam Weinig.
3203         
3204         Removed the CalledAsConstructor flag from the call frame header. Now,
3205         we use an explicit opcode at the call site to fix up constructor results.
3206
3207         SunSpider says 0.4% faster.
3208         
3209         cti_op_construct_verify is an out-of-line function call for now, but we
3210         can fix that once StructureID holds type information like isObject.
3211
3212         * VM/CTI.cpp:
3213         (JSC::CTI::privateCompileMainPass): Codegen for the new opcode.
3214
3215         * VM/CodeBlock.cpp:
3216         (JSC::CodeBlock::dump):
3217
3218         * VM/CodeGenerator.cpp: Codegen for the new opcode. Also...
3219         (JSC::CodeGenerator::emitCall): ... don't test for known non-zero value.
3220         (JSC::CodeGenerator::emitConstruct): ... ditto.
3221
3222         * VM/Machine.cpp: No more CalledAsConstructor
3223         (JSC::Machine::privateExecute): Implementation for the new opcode.
3224         (JSC::Machine::cti_op_ret): The speedup: no need to check whether we were
3225         called as a constructor.
3226         (JSC::Machine::cti_op_construct_verify): Implementation for the new opcode.
3227         * VM/Machine.h:
3228
3229         * VM/Opcode.h: Declare new opcode.
3230
3231         * VM/RegisterFile.h:
3232         (JSC::RegisterFile::): No more CalledAsConstructor
3233
3234 2008-09-15  Gavin Barraclough  <barraclough@apple.com>
3235
3236         Reviewed by Geoff Garen.
3237
3238         Inline code generation of eq_null/neq_null for CTI.  Uses vptr checking for
3239         StringObjectsThatAreMasqueradingAsBeingUndefined.  In the long run, the
3240         masquerading may be handled differently (through the StructureIDs - see bug
3241         #20823).
3242
3243         >1% on v8-tests.
3244
3245         * VM/CTI.cpp:
3246         (JSC::CTI::emitJumpSlowCaseIfIsJSCell):
3247         (JSC::CTI::privateCompileMainPass):
3248         (JSC::CTI::privateCompileSlowCases):
3249         * VM/CTI.h:
3250         * VM/Machine.cpp:
3251         (JSC::Machine::Machine):
3252         (JSC::Machine::cti_op_eq_null):
3253         (JSC::Machine::cti_op_neq_null):
3254         * VM/Machine.h:
3255         (JSC::Machine::doesMasqueradesAsUndefined):
3256         * kjs/JSWrapperObject.h:
3257         (JSC::JSWrapperObject::):
3258         (JSC::JSWrapperObject::JSWrapperObject):
3259         * kjs/StringObject.h:
3260         (JSC::StringObject::StringObject):
3261         * kjs/StringObjectThatMasqueradesAsUndefined.h:
3262         (JSC::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined):
3263
3264 2008-09-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
3265
3266         Rubber-stamped by Oliver Hunt.
3267
3268         r36427 broke CodeBlock::dump() by changing the number of arguments to
3269         op_construct without changing the code that prints it. This patch fixes
3270         it by printing the additional argument.
3271
3272         * JavaScriptCore.xcodeproj/project.pbxproj:
3273         * VM/CodeBlock.cpp:
3274         (JSC::CodeBlock::dump):
3275
3276 2008-09-15  Adam Roben  <aroben@apple.com>
3277
3278         Build fix
3279
3280         * kjs/StructureID.cpp: Removed a stray semicolon.
3281
3282 2008-09-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
3283
3284         Reviewed by Maciej Stachowiak.
3285
3286         Fix a crash in fast/js/exception-expression-offset.html caused by not
3287         updating all mentions of the length of op_construct in r36427.
3288
3289         * VM/Machine.cpp:
3290         (JSC::Machine::cti_op_construct_NotJSConstruct):
3291
3292 2008-09-15  Maciej Stachowiak  <mjs@apple.com>
3293
3294         Reviewed by Cameron Zwarich.
3295         
3296         - fix layout test failure introduced by fix for 20849
3297         
3298         (The failing test was fast/js/delete-then-put.html)
3299
3300         * kjs/JSObject.cpp:
3301         (JSC::JSObject::removeDirect): Clear enumeration cache
3302         in the dictionary case.
3303         * kjs/JSObject.h:
3304         (JSC::JSObject::putDirect): Ditto.
3305         * kjs/StructureID.h:
3306         (JSC::StructureID::clearEnumerationCache): Inline to handle the
3307         clear.
3308
3309 2008-09-15  Maciej Stachowiak  <mjs@apple.com>
3310
3311         Reviewed by Cameron Zwarich.
3312         
3313         - fix JSC test failures introduced by fix for 20849
3314
3315         * kjs/PropertyMap.cpp:
3316         (JSC::PropertyMap::getEnumerablePropertyNames): Use the correct count.
3317
3318 2008-09-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
3319
3320         Reviewed by Maciej Stachowiak.
3321
3322         Bug 20851: REGRESSION (r36410): fast/js/kde/GlobalObject.html fails
3323         <https://bugs.webkit.org/show_bug.cgi?id=20851>
3324
3325         r36410 introduced an optimization for parseInt() that is incorrect when
3326         its argument is larger than the range of a 32-bit integer. If the
3327         argument is a number that is not an immediate integer, then the correct
3328         behaviour is to return the floor of its value, unless it is an infinite
3329         value, in which case the correct behaviour is to return 0.
3330
3331         * kjs/JSGlobalObjectFunctions.cpp:
3332         (JSC::globalFuncParseInt):
3333
3334 2008-09-15  Sam Weinig  <sam@webkit.org>
3335
3336         Reviewed by Maciej Stachowiak.
3337
3338         Patch for https://bugs.webkit.org/show_bug.cgi?id=20849
3339         Cache property names for getEnumerablePropertyNames in the StructureID.
3340
3341         ~0.5% speedup on Sunspider overall (9.7% speedup on string-fasta).  ~1% speedup
3342         on the v8 test suite.
3343
3344         * kjs/JSObject.cpp:
3345         (JSC::JSObject::getPropertyNames):
3346         * kjs/PropertyMap.cpp:
3347         (JSC::PropertyMap::getEnumerablePropertyNames):
3348         * kjs/PropertyMap.h:
3349         * kjs/StructureID.cpp:
3350         (JSC::StructureID::StructureID):
3351         (JSC::StructureID::getEnumerablePropertyNames):
3352         * kjs/StructureID.h:
3353
3354 2008-09-14  Maciej Stachowiak  <mjs@apple.com>
3355
3356         Reviewed by Cameron Zwarich.
3357         
3358         - speed up JS construction by extracting "prototype" lookup so PIC applies.
3359         
3360         ~0.5% speedup on SunSpider
3361         Speeds up some of the V8 tests as well, most notably earley-boyer.
3362
3363         * VM/CTI.cpp:
3364         (JSC::CTI::compileOpCall): Account for extra arg for prototype.
3365         (JSC::CTI::privateCompileMainPass): Account for increased size of op_construct.
3366         * VM/CodeGenerator.cpp:
3367         (JSC::CodeGenerator::emitConstruct): Emit separate lookup to get prototype property.
3368         * VM/Machine.cpp:
3369         (JSC::Machine::privateExecute): Expect prototype arg in op_construct.
3370         (JSC::Machine::cti_op_construct_JSConstruct): ditto
3371         (JSC::Machine::cti_op_construct_NotJSConstruct): ditto
3372
3373 2008-09-10  Alexey Proskuryakov  <ap@webkit.org>
3374
3375         Reviewed by Eric Seidel.
3376
3377         Add a protected destructor for RefCounted.
3378
3379         It is wrong to call its destructor directly, because (1) this should be taken care of by
3380         deref(), and (2) many classes that use RefCounted have non-virtual destructors.
3381
3382         No change in behavior.
3383
3384         * wtf/RefCounted.h: (WTF::RefCounted::~RefCounted):
3385
3386 2008-09-14  Gavin Barraclough  <barraclough@apple.com>
3387
3388         Reviewed by Sam Weinig.
3389
3390         Accelerated property accesses.
3391
3392         Inline more of the array access code into the JIT code for get/put_by_val.
3393         Accelerate get/put_by_id by speculatively inlining a disable direct access
3394         into the hot path of the code, and repatch this with the correct StructureID
3395         and property map offset once these are known.  In the case of accesses to the
3396         prototype and reading the array-length a trampoline is genertaed, and the
3397         branch to the slow-case is relinked to jump to this.
3398
3399         By repatching, we mean rewriting the x86 instruction stream.  Instructions are
3400         only modified in a simple fasion - altering immediate operands, memory access
3401         deisplacements, and branch offsets.
3402         
3403         For regular get_by_id/put_by_id accesses to an object, a StructureID in an
3404         instruction's immediate operant is updateded, and a memory access operation's
3405         displacement is updated to access the correct field on the object.  In the case
3406         of more complex accesses (array length and get_by_id_prototype) the offset on
3407         the branch to slow-case is updated, to now jump to a trampoline.
3408
3409         +2.8% sunspider, +13% v8-tests
3410
3411         * VM/CTI.cpp:
3412         (JSC::CTI::emitCall):
3413         (JSC::CTI::emitJumpSlowCaseIfNotJSCell):
3414         (JSC::CTI::CTI):
3415         (JSC::CTI::privateCompileMainPass):
3416         (JSC::CTI::privateCompileSlowCases):
3417         (JSC::CTI::privateCompile):
3418         (JSC::CTI::privateCompileGetByIdSelf):
3419         (JSC::CTI::privateCompileGetByIdProto):
3420         (JSC::CTI::privateCompileGetByIdChain):
3421         (JSC::CTI::privateCompilePutByIdReplace):
3422         (JSC::CTI::privateCompilePutByIdTransition):
3423         (JSC::CTI::privateCompileArrayLengthTrampoline):
3424         (JSC::CTI::privateCompileStringLengthTrampoline):
3425         (JSC::CTI::patchGetByIdSelf):
3426         (JSC::CTI::patchPutByIdReplace):
3427         (JSC::CTI::privateCompilePatchGetArrayLength):
3428         (JSC::CTI::privateCompilePatchGetStringLength):
3429         * VM/CTI.h:
3430         (JSC::CTI::compileGetByIdSelf):
3431         (JSC::CTI::compileGetByIdProto):
3432         (JSC::CTI::compileGetByIdChain):
3433         (JSC::CTI::compilePutByIdReplace):
3434         (JSC::CTI::compilePutByIdTransition):
3435         (JSC::CTI::compileArrayLengthTrampoline):
3436         (JSC::CTI::compileStringLengthTrampoline):
3437         (JSC::CTI::compilePatchGetArrayLength):
3438         (JSC::CTI::compilePatchGetStringLength):
3439         * VM/CodeBlock.cpp:
3440         (JSC::CodeBlock::dump):
3441         (JSC::CodeBlock::~CodeBlock):
3442         * VM/CodeBlock.h:
3443         (JSC::StructureStubInfo::StructureStubInfo):
3444         (JSC::CodeBlock::getStubInfo):
3445         * VM/Machine.cpp:
3446         (JSC::Machine::tryCTICachePutByID):
3447         (JSC::Machine::tryCTICacheGetByID):
3448         (JSC::Machine::cti_op_put_by_val_array):
3449         * VM/Machine.h:
3450         * masm/X86Assembler.h:
3451         (JSC::X86Assembler::):
3452         (JSC::X86Assembler::cmpl_i8m):
3453         (JSC::X86Assembler::emitUnlinkedJa):
3454         (JSC::X86Assembler::getRelocatedAddress):
3455         (JSC::X86Assembler::getDifferenceBetweenLabels):
3456         (JSC::X86Assembler::emitModRm_opmsib):
3457
3458 2008-09-14  Maciej Stachowiak  <mjs@apple.com>
3459
3460         Reviewed by Cameron Zwarich.
3461         
3462         - split the "prototype" lookup for hasInstance into opcode stream so it can be cached
3463         
3464         ~5% speedup on v8 earley-boyer test
3465
3466         * API/JSCallbackObject.h: Add a parameter for the pre-looked-up prototype.
3467         * API/JSCallbackObjectFunctions.h:
3468         (JSC::::hasInstance): Ditto.
3469         * API/JSValueRef.cpp:
3470         (JSValueIsInstanceOfConstructor): Look up and pass in prototype.
3471         * JavaScriptCore.exp:
3472         * VM/CTI.cpp:
3473         (JSC::CTI::privateCompileMainPass): Pass along prototype.
3474         * VM/CodeBlock.cpp:
3475         (JSC::CodeBlock::dump): Print third arg.
3476         * VM/CodeGenerator.cpp:
3477         (JSC::CodeGenerator::emitInstanceOf): Implement this, now that there
3478         is a third argument.
3479         * VM/CodeGenerator.h:
3480         * VM/Machine.cpp:
3481         (JSC::Machine::privateExecute): Pass along the prototype.
3482         (JSC::Machine::cti_op_instanceof): ditto
3483         * kjs/JSObject.cpp:
3484         (JSC::JSObject::hasInstance): Expect to get a pre-looked-up prototype.
3485         * kjs/JSObject.h:
3486         * kjs/nodes.cpp:
3487         (JSC::InstanceOfNode::emitCode): Emit a get_by_id of the prototype
3488         property and pass that register to instanceof.
3489         * kjs/nodes.h:
3490
3491 2008-09-14  Gavin Barraclough  <barraclough@apple.com>
3492
3493         Reviewed by Sam Weinig.
3494
3495         Remove unnecessary virtual function call from cti_op_call_JSFunction -
3496         ~5% on richards, ~2.5% on v8-tests, ~0.5% on sunspider.
3497
3498         * VM/Machine.cpp:
3499         (JSC::Machine::cti_op_call_JSFunction):
3500
3501 2008-09-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
3502
3503         Reviewed by Maciej Stachowiak.
3504
3505         Bug 20827: the 'typeof' operator is slow
3506         <https://bugs.webkit.org/show_bug.cgi?id=20827>
3507
3508         Optimize the 'typeof' operator when its result is compared to a constant
3509         string.
3510
3511         This is a 5.5% speedup on the V8 Earley-Boyer test.
3512
3513         * VM/CTI.cpp:
3514         (JSC::CTI::privateCompileMainPass):
3515         * VM/CodeBlock.cpp:
3516         (JSC::CodeBlock::dump):
3517         * VM/CodeGenerator.cpp:
3518         (JSC::CodeGenerator::emitEqualityOp):
3519         * VM/CodeGenerator.h:
3520         * VM/Machine.cpp:
3521         (JSC::jsIsObjectType):
3522         (JSC::jsIsFunctionType):
3523         (JSC::Machine::privateExecute):
3524         (JSC::Machine::cti_op_is_undefined):
3525         (JSC::Machine::cti_op_is_boolean):
3526         (JSC::Machine::cti_op_is_number):
3527         (JSC::Machine::cti_op_is_string):
3528         (JSC::Machine::cti_op_is_object):
3529         (JSC::Machine::cti_op_is_function):
3530         * VM/Machine.h:
3531         * VM/Opcode.h:
3532         * kjs/nodes.cpp:
3533         (JSC::BinaryOpNode::emitCode):
3534         (JSC::EqualNode::emitCode):
3535         (JSC::StrictEqualNode::emitCode):
3536         * kjs/nodes.h:
3537
3538 2008-09-14  Sam Weinig  <sam@webkit.org>
3539
3540         Reviewed by Cameron Zwarich.
3541
3542         Patch for https://bugs.webkit.org/show_bug.cgi?id=20844
3543         Speed up parseInt for numbers
3544
3545         Sunspider reports this as 1.029x as fast overall and 1.37x as fast on string-unpack-code.
3546         No change on the v8 suite.
3547
3548         * kjs/JSGlobalObjectFunctions.cpp:
3549         (JSC::globalFuncParseInt): Don't convert numbers to strings just to
3550         convert them back to numbers.
3551
3552 2008-09-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
3553
3554         Reviewed by Oliver Hunt.
3555
3556         Bug 20816: op_lesseq should be optimized
3557         <https://bugs.webkit.org/show_bug.cgi?id=20816>
3558
3559         Add a loop_if_lesseq opcode that is similar to the loop_if_less opcode.
3560
3561         This is a 9.4% speedup on the V8 Crypto benchmark.
3562
3563         * VM/CTI.cpp:
3564         (JSC::CTI::privateCompileMainPass):
3565         (JSC::CTI::privateCompileSlowCases):
3566         * VM/CodeBlock.cpp:
3567         (JSC::CodeBlock::dump):
3568         * VM/CodeGenerator.cpp:
3569         (JSC::CodeGenerator::emitJumpIfTrue):
3570         * VM/Machine.cpp:
3571         (JSC::Machine::privateExecute):
3572         (JSC::Machine::cti_op_loop_if_lesseq):
3573         * VM/Machine.h:
3574         * VM/Opcode.h:
3575
3576 2008-09-14  Sam Weinig  <sam@webkit.org>
3577
3578         Reviewed by Cameron Zwarich.
3579
3580         Cleanup Sampling code.
3581
3582         * VM/CTI.cpp:
3583         (JSC::CTI::emitCall):
3584         (JSC::CTI::privateCompileMainPass):
3585         * VM/CTI.h:
3586         (JSC::CTI::execute):
3587         * VM/SamplingTool.cpp:
3588         (JSC::):
3589         (JSC::SamplingTool::run):
3590         (JSC::SamplingTool::dump):
3591         * VM/SamplingTool.h:
3592         (JSC::SamplingTool::callingHostFunction):
3593
3594 2008-09-13  Oliver Hunt  <oliver@apple.com>
3595
3596         Reviewed by Cameron Zwarich.
3597
3598         Bug 20821: Cache property transitions to speed up object initialization
3599         https://bugs.webkit.org/show_bug.cgi?id=20821
3600
3601         Implement a transition cache to improve the performance of new properties
3602         being added to objects.  This is extremely beneficial in constructors and
3603         shows up as a 34% improvement on access-binary-trees in SunSpider (0.8%
3604         overall)
3605
3606         * VM/CTI.cpp:
3607         (JSC::CTI::privateCompileMainPass):