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