2008-08-10  Jan Michael Alonzo  <jmalonzo@webkit.org>

        Reviewed (and updated) by Alp Toker.

        https://bugs.webkit.org/show_bug.cgi?id=16620
        [GTK] Autotools make dist and make check support

        Get make dist working.

        Note that not all possible configurations have been tested yet.

        * GNUmakefile.am:

2008-08-09  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Sam Weinig.

        Added same heap debug checks to more code paths.

        * kjs/JSActivation.cpp:
        (KJS::JSActivation::put):
        (KJS::JSActivation::putWithAttributes):
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::putWithAttributes):
        * kjs/JSObject.h:
        (KJS::JSObject::putDirect):
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTablePut):
        (KJS::JSVariableObject::symbolTablePutWithAttributes):

2008-08-09  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Fix some style issues in the sampling tool.

        * VM/SamplingTool.cpp:
        (KJS::sleepForMicroseconds):
        (KJS::SamplingTool::dump):

2008-08-09  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Revision 35651, despite being a rather trivial change, introduced a
        large regression on the regexp-dna SunSpider test. This regression
        stemmed from an increase in the size of CodeBlock::dump(). There is
        no reason for this method (and several related methods) to be compiled
        in non-debug builds with the sampling tool disabled. This patch
        conditionally compiles them, reversing the regression on SunSpider.

        * JavaScriptCore.exp:
        * VM/CodeBlock.cpp:
        * VM/CodeBlock.h:
        * VM/Machine.cpp:

2008-08-08  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 20330: JSCore crash loading any filehurricane media page
        <https://bugs.webkit.org/show_bug.cgi?id=20330>

        Fix a typo in the constant loading patch. Also, add a case for
        op_unexpected_load to CodeBlock::dump().

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::addUnexpectedConstant):

2008-08-08  Matt Lilek  <webkit@mattlilek.com>

        Not reviewed, build fix.

        * JavaScriptCore.exp:

2008-08-08  Oliver Hunt  <oliver@apple.com>

        Reviewed by Cameron Zwarich.

        Improve performance of arithmetic operators

        Added a fast (non-virtual) mechanism to determine if a non-immediate JSValue*
        is a JSNumberCell.  We then use this to allow improved specialisation in many
        arithmetic operators.  SunSpider reports a 2.5% progression overall, with greater
        than 10% progressions on a number of arithmetic heavy tests.

        * VM/Machine.cpp:
        (KJS::fastIsNumber):
        (KJS::fastToInt32):
        (KJS::fastToUInt32):
        (KJS::jsLess):
        (KJS::jsLessEq):
        (KJS::jsAdd):
        (KJS::Machine::privateExecute):
        * kjs/JSNumberCell.h:
        (KJS::JSNumberCell::fastToInt32):
        (KJS::JSNumberCell::fastToUInt32):
        * kjs/collector.cpp:
        (KJS::allocateBlock):
        (KJS::Heap::heapAllocate):
        * kjs/collector.h:
        (KJS::Heap::fastIsNumber):

2008-08-06  Adam Roben  <aroben@apple.com>

        Try to fix the Windows build bots

        * API/JSBase.cpp: Touch this to force JSC to rebuild and re-copy the
        WTF headers.

2008-08-06  Tor Arne Vestbø  <tavestbo@trolltech.com>

        Revert change 35595.

        * wtf/RetainPtr.h:

2008-08-06  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Fix non-Mac build.

        * wtf/RetainPtr.h: CoreFoundation only for PLATFORM(MAC)

2008-08-06  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Fix non-Mac build.

        * wtf/RetainPtr.h: CoreFoundation only for PLATFORM(MAC)

2008-08-06  Csaba Osztrogonac  <oszi@inf.u-szeged.hu>

        Reviewed by Darin. Landed by Cameron.

        Bug 20272: typo in JavaScriptCore
        <https://bugs.webkit.org/show_bug.cgi?id=20272>

        Correct the documentation for op_not. (typo)
        Fix #undef. (typo)

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-08-06  Cameron Zwarich  <cwzwarich@webkit.org>

        Reviewed by Maciej.

        Bug 20286: Load constants all at once instead of using op_load
        <https://bugs.webkit.org/show_bug.cgi?id=20286>

        Load constants all at once into temporary registers instead of using
        individual instances of op_load.

        This is a 2.6% speedup on SunSpider.

        * JavaScriptCore.exp:
        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        (KJS::CodeBlock::mark):
        * VM/CodeBlock.h:
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::newTemporary):
        (KJS::CodeGenerator::addConstant):
        (KJS::CodeGenerator::addUnexpectedConstant):
        (KJS::CodeGenerator::emitLoad):
        (KJS::CodeGenerator::emitUnexpectedLoad):
        (KJS::CodeGenerator::emitNewError):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::slideRegisterWindowForCall):
        (KJS::Machine::unwindCallFrame):
        (KJS::Machine::throwException):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        * VM/Opcode.h:
        * VM/RegisterID.h:
        (KJS::RegisterID::RegisterID):
        (KJS::RegisterID::makeConstant):
        (KJS::RegisterID::isTemporary):
        * kjs/NodeInfo.h:
        * kjs/Parser.cpp:
        (KJS::Parser::didFinishParsing):
        * kjs/Parser.h:
        (KJS::Parser::parse):
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::NullNode::emitCode):
        (KJS::BooleanNode::emitCode):
        (KJS::NumberNode::emitCode):
        (KJS::StringNode::emitCode):
        (KJS::ArrayNode::emitCode):
        (KJS::DeleteResolveNode::emitCode):
        (KJS::DeleteValueNode::emitCode):
        (KJS::VoidNode::emitCode):
        (KJS::ConstDeclNode::emitCodeSingle):
        (KJS::ReturnNode::emitCode):
        (KJS::ScopeNode::ScopeNode):
        (KJS::ProgramNode::ProgramNode):
        (KJS::ProgramNode::create):
        (KJS::EvalNode::EvalNode):
        (KJS::EvalNode::create):
        (KJS::FunctionBodyNode::FunctionBodyNode):
        (KJS::FunctionBodyNode::create):
        (KJS::FunctionBodyNode::emitCode):
        * kjs/nodes.h:
        (KJS::ScopeNode::neededConstants):

2008-08-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Cameron.

        - add fast path for immediates to % operator, as we have for many other math ops
        
        This fixes handling for a 0 divisor relative to the last patch. Only an 0.2% speedup on SunSpider but
        still a 1.4x win on Oliver's prime test.
        
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-08-05  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Darin.

        Bug 20293: Crash in JavaScript codegen for eval("const a;")
        <https://bugs.webkit.org/show_bug.cgi?id=20293>

        Correctly handle constant declarations in eval code with no initializer.

        * kjs/nodes.cpp:
        (KJS::ConstDeclNode::emitCodeSingle):

2008-08-05  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Roll out r35555 because of correctness issues.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-08-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - add fast path for immediates to % operator, as we have for many other math ops
        
        0.6% speedup on SunSpider. 1.4x speedup on a prime testing torture test that Oliver whipped up.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-07-31  Oliver Hunt  <oliver@apple.com>

        Reviewed by Cameron Zwarich.

        Bug 19359: JavaScriptCore behaves differently from FF2/3 and IE when handling context in catch statement
        <https://bugs.webkit.org/show_bug.cgi?id=19359>

        Make our catch behave like Firefox and IE, we do this by using a StaticScopeObject
        instead of a generic JSObject for the scope node.  We still don't make use of the
        fact that we have a static scope inside the catch block, so the internal performance
        of the catch block is not improved, even though technically it would be possible to
        do so.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitPushNewScope):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::createExceptionScope):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        * VM/Opcode.h:
        * kjs/JSStaticScopeObject.cpp:
        (KJS::JSStaticScopeObject::toThisObject):
        (KJS::JSStaticScopeObject::put):
        * kjs/JSStaticScopeObject.h:
        * kjs/nodes.cpp:
        (KJS::TryNode::emitCode):

2008-08-02  Rob Gowin  <robg@gowin.net>

        Reviewed by Eric Seidel.

        Added JavaScriptCore/API/WebKitAvailability to list of files in
        javascriptcore_h_api.

        * GNUmakefile.am:

2008-08-01  Alexey Proskuryakov  <ap@webkit.org>

        Rubber-stamped by Maciej.

        Remove JSGlobalData::DataInstance. It was only needed when we had per-thread JSGlobalData
        instances.

        * kjs/JSGlobalData.h:

2008-07-31  Kevin Ollivier <kevino@theolliviers.com>

        Second attempt at Windows/wx build fix. Instead of avoiding inclusion of windows.h,
        use defines, etc. to avoid conflicts in each affected file. Also, change PLATFORM(WIN)
        to PLATFORM(WIN_OS) so that other ports using Windows headers get the right impls.

        * VM/SamplingTool.cpp:
        * wtf/Threading.h:

2008-07-31  Anders Carlsson  <andersca@apple.com>

        Reviewed by Adam.

        Fix Windows build.
        
        * kjs/collector.h:
        * wtf/FastMalloc.cpp:

2008-07-31  Csaba Osztrogonac  <oszi@inf.u-szeged.hu>

        Reviewed by Simon.

        Bug 20170: [Qt] missing namespace defines in JavaScriptCore.pro
        <https://bugs.webkit.org/show_bug.cgi?id=20170>

        * JavaScriptCore.pro: Added missing define.

2008-07-31  Alexey Proskuryakov  <ap@webkit.org>

        Rubber-stamped by Maciej.

        Eliminate JSLock (it was already disabled, removing the stub implementaion and all
        call sites now).

        * API/JSBase.cpp:
        (JSEvaluateScript):
        (JSCheckScriptSyntax):
        (JSGarbageCollect):
        * API/JSCallbackConstructor.cpp:
        (KJS::constructJSCallback):
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::call):
        * API/JSCallbackObjectFunctions.h:
        (KJS::::init):
        (KJS::::getOwnPropertySlot):
        (KJS::::put):
        (KJS::::deleteProperty):
        (KJS::::construct):
        (KJS::::hasInstance):
        (KJS::::call):
        (KJS::::getPropertyNames):
        (KJS::::toNumber):
        (KJS::::toString):
        (KJS::::staticValueGetter):
        (KJS::::callbackGetter):
        * API/JSContextRef.cpp:
        (JSGlobalContextCreateInGroup):
        (JSGlobalContextRetain):
        (JSGlobalContextRelease):
        * API/JSObjectRef.cpp:
        (JSObjectMake):
        (JSObjectMakeFunctionWithCallback):
        (JSObjectMakeConstructor):
        (JSObjectMakeFunction):
        (JSObjectHasProperty):
        (JSObjectGetProperty):
        (JSObjectSetProperty):
        (JSObjectGetPropertyAtIndex):
        (JSObjectSetPropertyAtIndex):
        (JSObjectDeleteProperty):
        (JSObjectCallAsFunction):
        (JSObjectCallAsConstructor):
        (JSObjectCopyPropertyNames):
        (JSPropertyNameArrayRelease):
        (JSPropertyNameAccumulatorAddName):
        * API/JSStringRef.cpp:
        (JSStringRelease):
        * API/JSValueRef.cpp:
        (JSValueIsEqual):
        (JSValueIsInstanceOfConstructor):
        (JSValueMakeNumber):
        (JSValueMakeString):
        (JSValueToNumber):
        (JSValueToStringCopy):
        (JSValueToObject):
        (JSValueProtect):
        (JSValueUnprotect):
        * ForwardingHeaders/JavaScriptCore/JSLock.h: Removed.
        * GNUmakefile.am:
        * JavaScriptCore.exp:
        * JavaScriptCore.order:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * kjs/AllInOneFile.cpp:
        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::JSGlobalData):
        * kjs/JSGlobalData.h:
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::~JSGlobalObject):
        (KJS::JSGlobalObject::init):
        * kjs/JSLock.cpp: Removed.
        * kjs/JSLock.h: Removed.
        * kjs/Shell.cpp:
        (functionGC):
        (jscmain):
        * kjs/collector.cpp:
        (KJS::Heap::~Heap):
        (KJS::Heap::heapAllocate):
        (KJS::Heap::setGCProtectNeedsLocking):
        (KJS::Heap::protect):
        (KJS::Heap::unprotect):
        (KJS::Heap::collect):
        * kjs/identifier.cpp:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::checkSyntax):
        (KJS::Interpreter::evaluate):

2008-07-31  Alexey Proskuryakov  <ap@webkit.org>

        Rubber-stamped by Oliver Hunt.

        Fix the Mac project to not display "test/" as part of file name for tests.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-07-31  Eric Seidel  <eric@webkit.org>

        Reviewed by Alexey Proskuryakov.
        
        Rename USE(MULTIPLE_THREADS) to ENABLE(JSC_MULTIPLE_THREADS)
        to better match the use/enable pattern (and better describe
        the usage of the feature in question.)
        
        I also fixed a couple other ENABLE_ macros to be pre-processor
        definition override-able to match the rest of the ENABLE_ macros
        since it seems to be our convention that build systems can set
        ENABLE_ macros in Makefiles.

        * kjs/InitializeThreading.cpp:
        (KJS::initializeThreadingOnce):
        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::JSGlobalData):
        (KJS::JSGlobalData::~JSGlobalData):
        * kjs/MathObject.cpp:
        * kjs/collector.cpp:
        (KJS::Heap::Heap):
        (KJS::Heap::~Heap):
        (KJS::allocateBlock):
        (KJS::Heap::markStackObjectsConservatively):
        * kjs/collector.h:
        * kjs/dtoa.cpp:
        (KJS::pow5mult):
        (KJS::rv_alloc):
        (KJS::freedtoa):
        (KJS::dtoa):
        * wtf/FastMalloc.cpp:
        * wtf/Platform.h:
        * wtf/RefCountedLeakCounter.cpp:

2008-07-30  Eric Seidel  <eric@webkit.org>

        Reviewed by Mark Rowe.
        
        Try to clean up our usage of USE(MULTIPLE_THREADS) vs. USE(PTHREADS) a little.
        It looks like JSC assumes that if MULTIPLE_THREADS is defined, then pthreads will always be available
        I'm not sure that's always the case for gtk, certainly not for Windows.  We should eventually go back
        and fix wtf/Threading.h to cover all these cases some day.

        * kjs/JSLock.cpp:
        * kjs/collector.h:
        * wtf/Platform.h:

2008-07-30  Eric Seidel  <eric@webkit.org>

        Reviewed by Oliver.
        
        MSVC warns when structs are called classes or vice versa.
        Make all the source refer to JSGlobalData as a class.

        * kjs/CommonIdentifiers.h:
        * kjs/JSGlobalData.h:
        * kjs/Parser.h:
        * kjs/lexer.h:

2008-07-30  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff Garen.

        Add consistency checks to UString to document and enforce its design.

        * kjs/ustring.cpp:
        (KJS::UString::Rep::create):
        (KJS::UString::Rep::destroy):
        (KJS::UString::Rep::checkConsistency):
        (KJS::UString::expandCapacity):
        (KJS::UString::expandPreCapacity):
        (KJS::UString::UString):
        (KJS::UString::spliceSubstringsWithSeparators):
        (KJS::UString::append):
        * kjs/ustring.h:
        (KJS::UString::Rep::checkConsistency):

2008-07-30  Gavin Barraclough  <barraclough@apple.com>

        Reviewed by Geoff Garen.

        Fixes for Windows and non-AllInOne file build with SamplingTool, plus review fixes.

        * GNUmakefile.am:              Adding SamplingTool.cpp to build.
        * JavaScriptCore.exp:          Export hooks to init & control SamplingTool.
        * JavaScriptCore.pri:          Adding SamplingTool.cpp to build.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Adding SamplingTool.cpp to build.
        * JavaScriptCore.xcodeproj/project.pbxproj: Adding SamplingTool.cpp to build.
        * JavaScriptCoreSources.bkl:   Adding SamplingTool.cpp to build.
        * VM/Machine.cpp:              MACHINE_SAMPLING_callingNativeFunction renamed MACHINE_SAMPLING_callingHostFunction
        * VM/Machine.h:
        * VM/Opcode.cpp:               SamplingTool moved to SamplingTool.cpp/.h, opcodeNames generated from FOR_EACH_OPCODE_ID.
        * VM/Opcode.h:
        * VM/SamplingTool.cpp:         Added .cpp/.h for SamplingTool.
        * VM/SamplingTool.h:
        * kjs/Shell.cpp:               Switched SAMPLING_TOOL_ENABLED to ENABLE_SAMPLING_TOOL.
        * wtf/Platform.h:              Added ENABLE_SAMPLING_TOOL config option.
        * kjs/nodes.cpp:               Header include to fix non-AllInOne builds.

2008-07-30  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Reviewed by Alexey Proskuryakov.

        Fix compilation without multi-threading support.

        * kjs/collector.cpp:
        (KJS::Heap::Heap):

2008-07-30  Anders Carlsson  <andersca@apple.com>
        
        Add WebKitAvailability.h forwarding header.
        
        * ForwardingHeaders/JavaScriptCore/WebKitAvailability.h: Added.

2008-07-30  Anders Carlsson  <andersca@apple.com>

        Fix the else.
        
        * API/WebKitAvailability.h:

2008-07-30  Anders Carlsson  <andersca@apple.com>

        * API/WebKitAvailability.h:
        Fix Windows (and other non-Mac builds).
        
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        Add WebKitAvailability.h to the project.

2008-07-30  Anders Carlsson  <andersca@apple.com>

        One step closer towards fixing the Windows build.
        
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make:
        Make sure to copy WebKitAvailability.h

2008-07-29  Gavin Barraclough  <barraclough@apple.com>

        Reviewed by Geoff Garen.

        Bug 20209: Atomize constant strings
        <https://bugs.webkit.org/show_bug.cgi?id=20209>

        Prevents significant performance degradation seen when a script contains multiple
        identical strings that are used as keys to identify properties on objects.

        No performance change on SunSpider.

        * kjs/nodes.cpp: Atomize constant strings.

2008-07-30  Oliver Hunt  <oliver@apple.com>

        Reviewed by Alexey Proskuryakov.

        <rdar://problem/6111648> JavaScript exceptions fail if the scope chain includes the global object

        In an attempt to remove the branch I just added to KJS::depth I
        used the existence of a Variable Object at a point in the scope
        chain as an indicator of function or global scope activation.
        However this assumption results in incorrect behaviour if the
        global object is injected into the scope chain with 'with'.

        * VM/Machine.cpp:
        (KJS::depth):

2008-07-30  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff Garen.

        Don't call JSGarbageCollect() on a released context.

        * API/testapi.c: (main):

2008-07-29  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff Garen.

        Implement JSContextGroup APIs to make concurrent execution possible for
        JavaScriptCore clients.

        This changes the behavior of JSGlobalContextCreate(), so that it now uses a private context
        group for each context, making JSlock implicit locking unnecessary.

        * API/JSContextRef.h:
        * API/JSContextRef.cpp:
        (JSContextGroupCreate):
        (JSContextGroupRetain):
        (JSContextGroupRelease):
        (JSGlobalContextCreate):
        (JSGlobalContextCreateInGroup):
        (JSGlobalContextRelease):
        (JSContextGetGroup):
        Added new methods. JSGlobalContextCreate() calls JSGlobalContextCreateInGroup() now.

        * API/APICast.h: (toJS): (toRef): Added converters for JSContextGroupRef.
        * API/JSBase.cpp: (JSGarbageCollect): JSGarbageCollect(0) is now a no-op, and the passed in
        context is actually used.

        * API/JSBase.h: Aded a typedef for JSContextGroupRef. Updated documentation for
        JSGarbageCollect().

        * JavaScriptCore.exp: Removed JSGlobalData::sharedInstance().

        * kjs/JSGlobalData.cpp:
        * kjs/JSGlobalData.h:
        Removed support for JSGlobalData shared instance. JSGlobalData::isSharedInstance member
        variable still remains, to be deleted in a followup patch.

        * kjs/JSLock.cpp: (KJS::JSLock::JSLock): Disabled JSLock, to be deleted in a follow-up patch.
        
        * kjs/collector.cpp:
        (KJS::Heap::markOtherThreadConservatively): Removed an assertion that referenced
        JSGlobalData::sharedInstance.

        * kjs/collector.h: Made Heap destructor public, so that JSContextRelease can use it.

2008-07-29  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff Garen.

        Fix a leak of ThreadRegistrar objects.

        As the heap is usually deleted when registered threads still exist, ThreadSpecific doesn't
        have a chance to clean up per-thread object. Switched to native pthread calls, storing a
        plain pointer that doesn't require cleanup.

        * kjs/collector.cpp:
        (KJS::PlatformThread::PlatformThread):
        (KJS::Heap::Thread::Thread):
        (KJS::Heap::Heap):
        (KJS::Heap::~Heap):
        (KJS::Heap::registerThread):
        (KJS::Heap::unregisterThread):
        * kjs/collector.h:

2008-07-29  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Sam Weinig.

        https://bugs.webkit.org/show_bug.cgi?id=20169
        Memory allocated with fastMalloc is freed with delete

        * VM/JSPropertyNameIterator.cpp:
        (KJS::JSPropertyNameIterator::invalidate): Free the array properly.
        (KJS::JSPropertyNameIterator::~JSPropertyNameIterator): Delete the array by calling
        invalidate().

2008-07-29  Mark Rowe  <mrowe@apple.com>

        Attempt to fix the Qt build.

        * wtf/ThreadingQt.cpp: Add the extra argument to createThread.

2008-07-29  Adam Roben  <aroben@apple.com>

        Change Vector::find to return an index instead of an iterator

        Indices are more natural than iterators when working with Vector.

        Reviewed by John Sullivan.

        * wtf/Vector.h:
        (WTF::Vector::find): Changed to iterate the Vector manually and return
        the index of the found item, rather than an iterator. When the item
        could not be found, we return WTF::notFound.

2008-07-29  Adam Roben  <aroben@apple.com>

        Windows build fix

        * wtf/ThreadingWin.cpp:
        (WTF::setThreadName): Move a misplaced assertion to here...
        (WTF::createThread): ...from here.

2008-07-29  Adam Roben  <aroben@apple.com>

        Add support for setting thread names on Windows

        These thread names make it much easier to identify particular threads
        in Visual Studio's Threads panel.

        WTF::createThread now takes a const char* representing the thread's
        name. On Windows, we throw a special exception to set this string as
        the thread's name. Other platforms do nothing with this name for now.

        Reviewed by Anders Carlsson.

        * JavaScriptCore.exp: Export the new version of createThread that
        takes 3 arguments (the old one continues to be exported for backward
        compatibility).
        * wtf/Threading.h: Add a threadName argument to createThread.

        * wtf/ThreadingGtk.cpp:
        (WTF::createThread):
        * wtf/ThreadingNone.cpp:
        (WTF::createThread):
        Updated for function signature change.

        * wtf/ThreadingPthreads.cpp:
        (WTF::createThread): Updated for function signature change. We keep
        around the old 2-argument version of createThread for backward
        compatibility.

        * wtf/ThreadingWin.cpp:
        (WTF::setThreadName): Added. This function's implementation came from
        MSDN.
        (WTF::initializeThreading): Set the name of the main thread.
        (WTF::createThread): Call setThreadName. We keep around the old
        2-argument version of createThread for backward compatibility.

2008-07-29  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Oliver Hunt.

        Store UString::Rep::isStatic bit in identifierTable pointer instead of reportedCost for
        slightly nicer code and a 0.5% SunSpider improvement.

        * API/JSClassRef.cpp:
        (OpaqueJSClass::~OpaqueJSClass):
        (OpaqueJSClassContextData::OpaqueJSClassContextData):
        * API/JSStringRef.cpp:
        (JSStringRelease):
        * kjs/PropertyNameArray.cpp:
        (KJS::PropertyNameArray::add):
        * kjs/identifier.cpp:
        (KJS::IdentifierTable::~IdentifierTable):
        (KJS::IdentifierTable::add):
        (KJS::Identifier::addSlowCase):
        (KJS::Identifier::remove):
        * kjs/identifier.h:
        (KJS::Identifier::add):
        * kjs/ustring.cpp:
        (KJS::):
        (KJS::UString::Rep::create):
        (KJS::UString::Rep::destroy):
        * kjs/ustring.h:
        (KJS::UString::Rep::identifierTable):
        (KJS::UString::Rep::setIdentifierTable):
        (KJS::UString::Rep::isStatic):
        (KJS::UString::Rep::setStatic):
        (KJS::UString::cost):

2008-07-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.

        Renamed "ConstructTypeNative" => "ConstructTypeHost".
        
2008-07-26  Mark Rowe  <mrowe@apple.com>

        Speculative fix for the wx build.

        * JavaScriptCoreSources.bkl:  Add JSStaticScopeObject.cpp to the list of source files.

2008-07-25  Oliver Hunt  <oliver@apple.com>

        RS=Cameron Zwarich.

        Whoops, forgot to save style correction.

        * kjs/JSStaticScopeObject.h:

2008-07-25  Oliver Hunt  <oliver@apple.com>

        Reviewed by Cameron Zwarich.

        Bug 19718: Named anonymous functions are slow accessing global variables
        <https://bugs.webkit.org/show_bug.cgi?id=19718>

        To fix this we switch over to an activation-like scope object for
        on which we attach the function name property, and add logic to 
        prevent cross scope assignment to read only properties.

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::findScopedProperty):
        (KJS::CodeGenerator::emitResolve):
        * VM/CodeGenerator.h:
        * kjs/AllInOneFile.cpp:
        * kjs/JSStaticScopeObject.cpp: Added.
        (KJS::JSStaticScopeObject::putWithAttributes):
        (KJS::JSStaticScopeObject::isDynamicScope):
        (KJS::JSStaticScopeObject::~JSStaticScopeObject):
        (KJS::JSStaticScopeObject::getOwnPropertySlot):
        * kjs/JSStaticScopeObject.h: Added.
        (KJS::JSStaticScopeObject::JSStaticScopeObjectData::JSStaticScopeObjectData):
        (KJS::JSStaticScopeObject::JSStaticScopeObject):
        * kjs/nodes.cpp:
        (KJS::FunctionCallResolveNode::emitCode):
        (KJS::PostfixResolveNode::emitCode):
        (KJS::PrefixResolveNode::emitCode):
        (KJS::ReadModifyResolveNode::emitCode):
        (KJS::AssignResolveNode::emitCode):
        (KJS::FuncExprNode::makeFunction):

2008-07-25  kevino  <kevino@theolliviers.com>

        wx build fix for Win.
        
        On wx/Win, including windows.h in Threading.h causes multiply-defined symbol errors
        for libjpeg and wx, and also wx needs to include windows.h itself first for wx
        includes to work right. So until we can find a better solution to this problem,
        on wx, we work around the need to include windows.h here.

        * wtf/Threading.h:

2008-07-25  Adam Roben  <aroben@apple.com>

        Windows build fix

        * JavaScriptCore.vcproj/testapi/testapi.vcproj: Add API/ to the
        include path.

2008-07-25  Simon Hausmann  <hausmann@webkit.org>

        Fix the build of jsc on Qt/Windows, make sure os-win32 is in the
        include search path (added by WebKit.pri).

        * kjs/jsc.pro:

2008-07-25  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Simon Hausmann.

        Move JavaScriptCore API tests into a subdirectory of their own to avoid header name
        conflicts and developer confusion.

        * API/JSNode.c: Removed.
        * API/JSNode.h: Removed.
        * API/JSNodeList.c: Removed.
        * API/JSNodeList.h: Removed.
        * API/Node.c: Removed.
        * API/Node.h: Removed.
        * API/NodeList.c: Removed.
        * API/NodeList.h: Removed.
        * API/minidom.c: Removed.
        * API/minidom.html: Removed.
        * API/minidom.js: Removed.
        * API/testapi.c: Removed.
        * API/testapi.js: Removed.
        * API/tests: Added.
        * API/tests/JSNode.c: Copied from JavaScriptCore/API/JSNode.c.
        * API/tests/JSNode.h: Copied from JavaScriptCore/API/JSNode.h.
        * API/tests/JSNodeList.c: Copied from JavaScriptCore/API/JSNodeList.c.
        * API/tests/JSNodeList.h: Copied from JavaScriptCore/API/JSNodeList.h.
        * API/tests/Node.c: Copied from JavaScriptCore/API/Node.c.
        * API/tests/Node.h: Copied from JavaScriptCore/API/Node.h.
        * API/tests/NodeList.c: Copied from JavaScriptCore/API/NodeList.c.
        * API/tests/NodeList.h: Copied from JavaScriptCore/API/NodeList.h.
        * API/tests/minidom.c: Copied from JavaScriptCore/API/minidom.c.
        * API/tests/minidom.html: Copied from JavaScriptCore/API/minidom.html.
        * API/tests/minidom.js: Copied from JavaScriptCore/API/minidom.js.
        * API/tests/testapi.c: Copied from JavaScriptCore/API/testapi.c.
        * API/tests/testapi.js: Copied from JavaScriptCore/API/testapi.js.
        * GNUmakefile.am:
        * JavaScriptCore.vcproj/testapi/testapi.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-07-25  Simon Hausmann  <hausmann@webkit.org>

        Prospective WX build fix, add JavaScriptCore/API to the include search
        path.

        * jscore.bkl:

2008-07-25  Simon Hausmann  <hausmann@webkit.org>

        Rubber-stamped by Lars.

        Fix the build on Windows. operator new for ArgList is implemented using fastMalloc()
        but operator delete was not implemented. Unfortunately MSVC decides to call/reference
        the function, so a simple implementation using fastFree() fixes the build.

        * kjs/ArgList.h:
        (KJS::ArgList::operator delete):

2008-07-25  Simon Hausmann  <hausmann@webkit.org>

        Discussed with and rubber-stamped by Lars.

        Fix the build system for the Qt port.

        Recent JavaScriptCore changes require the addition of JavaScriptCore/API to the
        include search path. With a build process that combines JavaScriptCore and
        WebCore in one build process/Makefile the existance of
        JavaScriptCore/API/Node.h and WebCore/dom/Node.h causes include conflicts.

        This commit solves this by introducing a separate build of JavaScriptCore into
        a static library.

        As a result of the split-up a race-condition due to broken dependencies of
        regular source files to header files of generated sources showed up very
        frequently when doing parallel builds (which the buildbot does). This commit at
        the same time tries to address the dependency problem by making the
        addExtraCompiler() function also generate a pseudo extra compiler that
        represents the header file output, so that qmake is aware of the creation of
        the header file for dependency calculation.

        At the same time I removed a lot of cruft from the pro files to ease maintenance.

        * JavaScriptCore.pri:
        * JavaScriptCore.pro: Added.
        * kjs/jsc.pro:

2008-07-24  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed a strict aliasing violation, which caused hash tables with floating
        point keys not to find items that were indeed in the tables
        (intermittently, and only in release builds, of course).
        
        SunSpider reports no change.
        
        This bug doesn't seem to affect any existing code, but it causes obvious
        crashes in some new code I'm working on.

        * wtf/HashFunctions.h:
        (WTF::FloatHash::hash): Use a union when punning between a float / double
        and an unsigned (bucket of bits). With strict aliasing enabled, unions
        are the only safe way to do this kind of type punning.

        * wtf/HashTable.h: When rehashing, ASSERT that the item we just added to
        the table is indeed in the table. In the buggy case described above, this
        ASSERT fires.

2008-07-24  Oliver Hunt  <oliver@apple.com>

        Reviewed by Alexey Proskuryakov.

        Bug 20142: REGRESSION(r35245): /=/ weirdness
        <https://bugs.webkit.org/show_bug.cgi?id=20142>

        When adding all the meta data needed for exception error messages
        I accidentally clobbered the handling of regex beginning with /=.

        * kjs/grammar.y:

2008-07-23  Alp Toker  <alp@nuanti.com>

        Build fix after r35293: Add API/ to the include path.

        * GNUmakefile.am:

2008-07-23  Adam Roben  <aroben@apple.com>

        Windows build fixes

        Build fix after r35293:

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add API/
        to the include path.

        Build fix after r35305:

        * VM/Machine.cpp:
        * VM/Machine.h:
        * VM/Opcode.cpp:
        * VM/Opcode.h:
        Completely compile out all sampler-related code when
        SAMPLING_TOOL_ENABLED is 0. The sampler code can't be compiled 1) on
        non-AllInOne configurations due to circular header dependencies, and
        2) on platforms that don't have a usleep() function, such as Windows.

2008-07-23  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff Garen and Sam Weinig.

        Improve switch performance.

        Improve switch performance by converting to a hashmap based jump
        table to avoid the sequence of dispatches that would otherwise be
        needed.  This results in a 9-19x performance win for string switches
        based on ad hoc testing, and a 6x improvement for integer switch
        statements.  SunSpider reports a 1.2% progression.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        (KJS::SimpleJumpTable::offsetForValue):
        * VM/CodeBlock.h:
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::beginSwitch):
        (KJS::prepareJumpTableForImmediateSwitch):
        (KJS::prepareJumpTableForCharacterSwitch):
        (KJS::prepareJumpTableForStringSwitch):
        (KJS::CodeGenerator::endSwitch):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::offsetForStringSwitch):
        (KJS::Machine::privateExecute):
        * VM/Opcode.cpp:
        (KJS::):
        * VM/Opcode.h:
        * kjs/JSImmediate.h:
        * kjs/nodes.cpp:
        (KJS::):
        (KJS::processClauseList):
        (KJS::CaseBlockNode::tryOptimisedSwitch):
        (KJS::CaseBlockNode::emitCodeForBlock):
        * kjs/nodes.h:
        (KJS::SwitchInfo::):

2008-07-23  Gavin Barraclough  <barraclough@apple.com>

        Reviewed by Geoff Garen.

        Sampling tool to analyze cost of instruction execution and identify hot regions of JS code.
        Enable Switches by setting SAMPLING_TOOL_ENABLED in Opcode.h.

        * JavaScriptCore.exp: Export symbols for Shell.cpp.
        * VM/Machine.cpp:     Added sampling hooks.
        * VM/Machine.h:       Machine contains a pointer to a sampler, when sampling.
        * VM/Opcode.cpp:      Tool implementation.
        * VM/Opcode.h:        Tool declaration.
        * kjs/Shell.cpp:      Initialize the sampler, if enabled.
        * kjs/nodes.cpp:      Added sampling hooks.

2008-07-23  Gabor Loki  <loki@inf.u-szeged.hu>

        Bug 20097: [Qt] 20% Sunspider slow-down

        <https://bugs.webkit.org/show_bug.cgi?id=20097>

        Reviewed by Simon Hausmann.

        * kjs/jsc.pro: Added missing NDEBUG define for release builds.

2008-07-23  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff Garen.

        JSClassRef is created context-free, but gets infatuated with the first context it sees.

        The implicit API contract is that JSClassRef can be used with any context on any thread.
        This no longer worked, because UStrings in the class were turned into per-context
        identifiers, and the cached JSObject prototype was tied to JSGlobalData, too.

        * API/JSClassRef.h: Made a separate struct for context-dependent parts of OpaqueJSClass.
        * API/JSClassRef.cpp:
        (OpaqueJSClass::OpaqueJSClass): Updated for renames and changed member variable order.
        (OpaqueJSClass::~OpaqueJSClass): Assert that string members are not identifiers.
        (clearReferenceToPrototype): Update for the new reference location.
        (OpaqueJSClassContextData::OpaqueJSClassContextData): Make a deep copy of all strings.
        (OpaqueJSClass::contextData): Added a function that finds the per-context part of
        OpaqueJSClass in JSGlobalData, or creates it if not found.
        (OpaqueJSClass::className): Always make a deep copy. Callers of this function do not have
        a way to access JSGlobalData, so a per-context copy could not be made.
        (OpaqueJSClass::staticValues): Updated for new data location.
        (OpaqueJSClass::staticFunctions): Ditto.
        (OpaqueJSClass::prototype): Changed to take an internal type for consistency.

        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::JSGlobalData):
        (KJS::JSGlobalData::~JSGlobalData):
        * kjs/JSGlobalData.h:
        Keep a HashMap to access per-context JSClass data given a pointr to the shared part.

        * API/JSCallbackObjectFunctions.h:
        (KJS::::className):
        (KJS::::getOwnPropertySlot):
        (KJS::::put):
        (KJS::::deleteProperty):
        (KJS::::getPropertyNames):
        (KJS::::staticValueGetter):
        (KJS::::staticFunctionGetter):j
        Use function accessors instead of accessing OpaqueJSClass members directly.

        * API/JSContextRef.cpp: (JSGlobalContextCreate): Updated for the change in
        OpaqueJSClass::prototype() argument type.

        * API/JSObjectRef.cpp:
        (JSObjectMake): Updated for the change in OpaqueJSClass::prototype() argument type.
        (JSObjectMakeConstructor): Ditto.

2008-07-23  Alexey Proskuryakov  <ap@webkit.org>

        Build fix.

        * kjs/ArgList.h: (KJS::ArgList::operator new): removed an extraneous "ArgList::" inside the
        class definition.

2008-07-22  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt and Sam Weinig.

        Next step toward putting doubles in registers: Prepare the Register class
        and its clients for registers that don't contain JSValue*s.
        
        This means a few things:
        
        1. Register::jsValue() clients, including ArgList clients, must now supply
        an ExecState* when accessing an entry in an ArgList, in case the entry
        will need to create a JSValue* on the fly.
        
        2. Register clients that definitely don't want to create a JSValue* on
        the fly now use different APIs: getJSValue() for clients that know
        the register contains a JSValue*, and v() for clients who just want a
        void*.
        
        3. I had to change some headers around in order to resolve dependency
        problems created by using a Register in the ArgList header.
        
        SunSpider reports no change.
        
2008-07-22  Gavin Barraclough  <barraclough@apple.com>

        Reviewed by Alexey Proskuryakov.

        Prevent integer overflow when reallocating storage vector for arrays.

        Sunspider reports 1.005x as fast (no change expected).

        * kjs/JSArray.cpp:

2008-07-21  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        <rdar://problem/6091287> Revamp the handling of CFBundleShortVersionString to be fixed at the major component of the version number.

        * Configurations/Version.xcconfig:
        * Info.plist:

2008-07-21  Adam Roben  <aroben@apple.com>

        Add Vector::find

        This is a convenience wrapper around std::find.

        Reviewed by Anders Carlsson.

        * wtf/Vector.h:

2008-07-19  Oliver Hunt  <oliver@apple.com>

        Reviewed by Cameron Zwarich.

        Bug 20104: Exception in tables/mozilla_expected_failures/bugs/bug92868_1.html includes the equals operator in the quoted expression
        <https://bugs.webkit.org/show_bug.cgi?id=20104>

        To make this correct we make the dot and bracket assign nodes emit the information to indicate
        the failure range is the dot/bracket accessor.

        * kjs/grammar.y:

2008-07-18  Steve Falkenburg  <sfalken@apple.com>

        Windows build fix.

        * kjs/JSGlobalObjectFunctions.cpp:
        (KJS::isStrWhiteSpace):

2008-07-18  Steve Falkenburg  <sfalken@apple.com>

        Windows build fix.

        * kjs/nodes.h:
        (KJS::ThrowableExpressionData::ThrowableExpressionData):

2008-07-18  Oliver Hunt  <oliver@apple.com>

        Reviewed by Cameron Zwarich.

        Bug 18774: SQUIRRELFISH: print meaningful error messages <https://bugs.webkit.org/show_bug.cgi?id=18774>
        <rdar://problem/5769353> SQUIRRELFISH: JavaScript error messages are missing informative text

        Add support for decent error messages in JavaScript.  This patch achieves this by providing
        ensuring the common errors and exceptions have messages that provide the text of expression
        that trigger the exception.  In addition it attaches a number of properties to the exception
        object detailing where in the source the expression came from.

        * JavaScriptCore.exp:
        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::lineNumberForVPC):
        (KJS::CodeBlock::expressionRangeForVPC): 
            Function to recover the expression range for an instruction
            that triggered an exception.
        * VM/CodeBlock.h:
        (KJS::ExpressionRangeInfo::):
        (KJS::CodeBlock::CodeBlock):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitCall):
        (KJS::CodeGenerator::emitCallEval):
            Emit call needed to be modified so to place the expression range info internally,
            as the CodeGenerator emits the arguments nodes itself, rather than the various call
            nodes.
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::emitExpressionInfo):
            Record the expression range info.
        * VM/ExceptionHelpers.cpp:
        (KJS::createErrorMessage):
        (KJS::createInvalidParamError):
        (KJS::createUndefinedVariableError):
        (KJS::createNotAConstructorError):
        (KJS::createNotAFunctionError):
        (KJS::createNotAnObjectErrorStub):
        (KJS::createNotAnObjectError):
            Rewrite all the code for the error messages so that they make use of the newly available
            information.
        * VM/ExceptionHelpers.h:
        * VM/Machine.cpp:
        (KJS::isNotObject):  Now needs vPC and codeBlock
        (KJS::Machine::throwException):
            New logic to handle the NotAnObjectErrorStub and to handle the absurd "no default value" edge case
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        * kjs/DebuggerCallFrame.cpp:
        (KJS::DebuggerCallFrame::evaluate):
        * kjs/Error.cpp:
        (KJS::Error::create):
        * kjs/Error.h:
        * kjs/JSGlobalObjectFunctions.cpp:
        * kjs/JSImmediate.cpp:
        (KJS::JSImmediate::toObject):
        (KJS::JSImmediate::prototype):
            My changes to the JSNotAnObject constructor needed to be handled here.
        * kjs/JSNotAnObject.h:
        (KJS::JSNotAnObjectErrorStub::JSNotAnObjectErrorStub):
        (KJS::JSNotAnObjectErrorStub::isNull):
        (KJS::JSNotAnObjectErrorStub::isNotAnObjectErrorStub):
            Added a JSNotAnObjectErrorStub class to ease the handling of toObject failure exceptions,
            and potentially allow even more detailed error messages in future.
        * kjs/JSObject.h:
        * kjs/Parser.h:
        (KJS::Parser::parse):
        * kjs/SourceRange.h:
        * kjs/grammar.y:
            Large amounts of position propagation.
        * kjs/lexer.cpp:
        (KJS::Lexer::Lexer):
        (KJS::Lexer::shift):
        (KJS::Lexer::lex):
            The lexer needed a few changes to be able to correctly track token character positions.
        * kjs/lexer.h:
        * kjs/nodes.cpp:
        (KJS::ThrowableExpressionData::emitThrowError):
        (KJS::StatementNode::StatementNode):
        (KJS::ResolveNode::emitCode):
        (KJS::BracketAccessorNode::emitCode):
        (KJS::DotAccessorNode::emitCode):
        (KJS::NewExprNode::emitCode):
        (KJS::EvalFunctionCallNode::emitCode):
        (KJS::FunctionCallValueNode::emitCode):
        (KJS::FunctionCallResolveNode::emitCode):
        (KJS::FunctionCallBracketNode::emitCode):
        (KJS::FunctionCallDotNode::emitCode):
        (KJS::PostfixResolveNode::emitCode):
        (KJS::PostfixBracketNode::emitCode):
        (KJS::PostfixDotNode::emitCode):
        (KJS::DeleteResolveNode::emitCode):
        (KJS::DeleteBracketNode::emitCode):
        (KJS::DeleteDotNode::emitCode):
        (KJS::PrefixResolveNode::emitCode):
        (KJS::PrefixBracketNode::emitCode):
        (KJS::PrefixDotNode::emitCode):
        (KJS::ThrowableBinaryOpNode::emitCode):
        (KJS::ReadModifyResolveNode::emitCode):
        (KJS::AssignResolveNode::emitCode):
        (KJS::AssignDotNode::emitCode):
        (KJS::ReadModifyDotNode::emitCode):
        (KJS::AssignBracketNode::emitCode):
        (KJS::ReadModifyBracketNode::emitCode):
        (KJS::ForInNode::ForInNode):
        (KJS::ForInNode::emitCode):
        (KJS::WithNode::emitCode):
        (KJS::LabelNode::emitCode):
        (KJS::ThrowNode::emitCode):
        (KJS::ProgramNode::ProgramNode):
        (KJS::ProgramNode::create):
        (KJS::EvalNode::generateCode):
        (KJS::FunctionBodyNode::create):
        (KJS::FunctionBodyNode::generateCode):
        (KJS::ProgramNode::generateCode):
            All of these methods were handling the position information.  
            Constructors and create methods were modified to store the information.
            All the emitCall implementations listed needed to be updated to actually
            record the position information we have so carefully collected.
        * kjs/nodes.h:
        (KJS::ThrowableExpressionData::ThrowableExpressionData):
        (KJS::ThrowableExpressionData::setExceptionSourceRange):
        (KJS::ThrowableExpressionData::divot):
        (KJS::ThrowableExpressionData::startOffset):
        (KJS::ThrowableExpressionData::endOffset):
        (KJS::ThrowableSubExpressionData::ThrowableSubExpressionData):
        (KJS::ThrowableSubExpressionData::setSubexpressionInfo):
        (KJS::ThrowablePrefixedSubExpressionData::ThrowablePrefixedSubExpressionData):
        (KJS::ThrowablePrefixedSubExpressionData::setSubexpressionInfo):
            ThrowableExpressionData is just a uniform mechanism for storing the position
            information.
        (KJS::ResolveNode::):
        (KJS::PrePostResolveNode::):
        (KJS::ThrowableBinaryOpNode::):
        (KJS::WithNode::):

2008-07-18  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Cameron Zwarich.
        
        Three renames:
        
        "CallTypeNative" => "CallTypeHost"
        "code" => "byteCode"
        "generatedCode" => "generatedByteCode"

2008-07-18  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Optimized <= for immediate number cases.
        
        SunSpider reports no overall change, but a 10% speedup on access-nsieve.

2008-07-18  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Sam Weinig.

        Fix some casts added in a previous build fix to match the style used
        throughout WebKit.

        * VM/Machine.cpp:
        (KJS::Machine::initializeCallFrame):
        * VM/Register.h:
        (KJS::Register::Register):

2008-07-18  Landry Breuil  <landry@openbsd.org>

        Bug 19975: [OpenBSD] Patches to enable build of WebKit

        <https://bugs.webkit.org/show_bug.cgi?id=19975>

        Reviewed by David Kilzer.

        Support for OpenBSD, mostly threading and libm tweaks.

        * kjs/collector.cpp: #include <pthread.h>
        (KJS::currentThreadStackBase): use pthread_stackseg_np() to get stack base
        * kjs/config.h: OpenBSD also provides <pthread_np.h>
        * wtf/MathExtras.h: #include <sys/types.h> and <machine/ieee.h>
        (isfinite), (signbit): as long as we don't have those functions provide fallback implementations
        * wtf/Platform.h: Add support for PLATFORM(OPENBSD) and PLATFORM(SPARC64) macro

2008-07-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Next step toward putting doubles in registers: Store constant pool
        entries as registers, not JSValue*s.
        
        SunSpider reports no change.

2008-07-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by John Sullivan and Oliver Hunt.
        
        A tiny bit of tidying in function call register allocation.
        
        This patch saves one register when invoking a function expression and/or
        a new expression that is stored in a temporary.
        
        Since it's just one register, I can't make a testcase for it.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitCall): No need to ref the function we're calling
        or its base. We'd like the call frame to overlap with them, if possible.
        op_call will read the function and its base before writing the call frame,
        so this is safe.

        * kjs/nodes.cpp:
        (KJS::NewExprNode::emitCode): No need to ref the function we're new-ing,
        for the same reasons stated above.
        
        (KJS::FunctionCallValueNode::emitCode): ditto

2008-07-17  Steve Falkenburg  <sfalken@apple.com>

        Build fix.
        
        * kjs/InternalFunction.cpp:

2008-07-17  Sam Weinig  <sam@webkit.org>

        Roll out r35199 as it is causing failures on the PPC build.

2008-07-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by David Kilzer.
        
        Fixed https://bugs.webkit.org/show_bug.cgi?id=20067
        Support function.name (Firefox extension)
        
        Pretty straight-forward.

2008-07-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed <rdar://problem/6081636> Functions calls use more temporary
        registers than necessary
        
        Holding a reference to the last statement result register caused each
        successive statement to output its result to an even higher register.
        
        Happily, statements don't actually need to return a result register
        at all. I hope to make this clearer in a future cleanup patch,
        but this change will fix the major bug for now.

        * kjs/nodes.cpp:
        (KJS::statementListEmitCode):

2008-07-17  Gavin Barraclough  <barraclough@apple.com>

        Reviewed by Sam Weinig.

        Merge pre&post dot nodes to simplify the parse tree.
        Sunspider results show 0.6% progression (no performance change expected).

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:

2008-07-17  Gavin Barraclough  <barraclough@apple.com>

        Reviewed by Cameron Zwarich.

        Merge pre&post resolve nodes to simplify the parse tree.
        Sunspider results show no performance change.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:

2008-07-17  Gavin Barraclough  <barraclough@apple.com>

        Reviewed by Cameron Zwarich.

        Merge logical nodes to simplify the parse tree.
        Sunspider results show 0.6% progression (no performance change expected).

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:

2008-07-17  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Reviewed by Simon.

        Fix MinGW build (broken in r35198) and simplify getLocalTime().

        * kjs/DateMath.cpp:
        (KJS::getLocalTime):

2008-07-17  Gavin Barraclough  <barraclough@apple.com>

        Reviewed by Sam Weinig.

        Merge pre&post bracket nodes to simplify the parse tree.
        Sunspider results show no performance change.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:

2008-07-17  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Reviewed by Simon.

        Fix the 32-bit gcc builds, conversion from "long int" to Register is
        ambiguous. Explicitly choose the intptr_t constructor.

        * VM/Machine.cpp:
        (KJS::Machine::initializeCallFrame):
        * VM/Register.h:
        (KJS::Register::Register):

2008-07-16  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Geoff Garen.

        Fix JavaScript in 64-bit by using a pointer-sized integer
        type in the Register union.  Also includes a rename of
        the intType constant to IntType.

        * VM/Machine.cpp:
        (KJS::Machine::initializeCallFrame):
        * VM/Register.h:
        (KJS::Register::):
        (KJS::Register::Register):

2008-07-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        First step toward putting doubles in registers: Turned Register into a
        proper abstraction layer. It is no longer possible to cast a Register
        to a JSValue*, or a Register& to a JSValue*&, or to access the union
        inside a Register directly.
        
        SunSpider reports no change.
        
        In support of this change, I had to make the following mechanical changes
        in a lot of places:
        
        1. Clients now use explicit accessors to read data out of Registers, and
        implicit copy constructors to write data into registers.
        
        So, assignment that used to look like
        
            x.u.jsValue = y;
        
        now looks like
        
            x = y;
            
        And access that used to look like
        
            x = y.u.jsValue;
        
        now looks like
        
            x = y.jsValue();

        2. I made generic flow control specific in opcodes that made their flow
        control generic by treating a Register& as a JSValue*&. This had the
        added benefit of removing some exception checking branches from immediate
        number code.

        3. I beefed up PropertySlot to support storing a Register* in a property
        slot. For now, only JSVariableObject's symbolTableGet and symbolTablePut
        use this functionality, but I expect more clients to use it in the future.
        
        4. I changed ArgList to be a buffer of Registers, not JSValue*'s, and I
        changed ArgList iterator clients to iterate Registers, not JSValue*'s.

2008-07-16  Ada Chan  <adachan@apple.com>

        Fixed build.

        * kjs/JSGlobalObject.cpp:

2008-07-16  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam and Geoff.

        <rdar://problem/5958840> Navigating to another page while profiler is
        attached results in slow JavaScript for all time.

        - The UNLIKELY keeps this from being a sunspider performance regression.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::~JSGlobalObject): Stop the profiler associated
        with this exec state.

2008-07-16  Sam Weinig  <sam@webkit.org>

        Reviewed by Steve Falkenburg.

        Replace adopting UString constructor in favor of explicit
        static adopt method.

        * API/JSStringRefCF.cpp:
        (JSStringCreateWithCFString):
        * kjs/StringConstructor.cpp:
        (KJS::stringFromCharCode):
        * kjs/StringPrototype.cpp:
        (KJS::stringProtoFuncToLowerCase):
        (KJS::stringProtoFuncToUpperCase):
        (KJS::stringProtoFuncToLocaleLowerCase):
        (KJS::stringProtoFuncToLocaleUpperCase):
        * kjs/ustring.cpp:
        (KJS::UString::adopt):
        * kjs/ustring.h:
        (KJS::UString::UString):
        (KJS::UString::~UString):

2008-07-16  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Reviewed by Simon.

        http://trolltech.com/developer/task-tracker/index_html?method=entry&id=216179
        Fix potential crash (on Qt for Windows port) when performing JavaScript date
        conversion.

        * kjs/DateMath.cpp:
        (KJS::getLocalTime): For the Qt port, prefer to use Windows code, i.e.
        localtime_s() instead of localtime() since the latter might crash (on Windows)
        given a non-sensible, e.g. NaN, argument.

2008-07-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Anders and Geoff.

        https://bugs.webkit.org/show_bug.cgi?id=20023
        Failed assertion in PropertyNameArray.cpp

        This is already tested by testapi.

        * API/JSObjectRef.cpp: (JSPropertyNameAccumulatorAddName): Add the string to identifier
        table to appease PropertyNameArray.

2008-07-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff.

        Dereference identifiers when deleting a hash table (fixes leaks with private JSGlobalData
        objects).

        * kjs/JSGlobalData.cpp: (KJS::JSGlobalData::~JSGlobalData):
        * kjs/lookup.cpp: (KJS::HashTable::deleteTable):
        * kjs/lookup.h:
        * kjs/lexer.cpp: (KJS::Lexer::~Lexer)
        HashTable cannot have a destructor, because check-for-global-initializers complains about
        having a global constructor then.

2008-07-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff.

        Check pthread_key_create return value.

        This check was helpful when debugging a crash in run-webkit-tests --threaded that happened
        because JSGlobalData objects were not deleted, and we were running out of pthread keys soon.
        It also looks useful for production builds.

        * wtf/ThreadSpecific.h: (WTF::::ThreadSpecific):

2008-07-15  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geoff.

        Rename pageGroupIdentifier to profileGroup to keep mention of a
        pageGroup out of JavaScriptCore.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::init):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::setProfileGroup):
        (KJS::JSGlobalObject::profileGroup):
        * profiler/ProfileGenerator.cpp:
        (KJS::ProfileGenerator::create):
        (KJS::ProfileGenerator::ProfileGenerator):
        * profiler/ProfileGenerator.h:
        (KJS::ProfileGenerator::profileGroup):
        * profiler/Profiler.cpp:
        (KJS::Profiler::startProfiling):
        (KJS::dispatchFunctionToProfiles):
        (KJS::Profiler::willExecute):
        (KJS::Profiler::didExecute):

2008-07-14  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        Fix https://bugs.webkit.org/show_bug.cgi?id=20037
        Bug 20037: GCC 4.2 build broken due to strict aliasing violation.

        * kjs/ustring.cpp:
        (KJS::UString::Rep::computeHash): Add a version of computeHash that takes a char* and explicit length.
        * kjs/ustring.h:
        * profiler/CallIdentifier.h:
        (WTF::): Use new version of computeHash that takes a char* and explicit length to avoid unsafe aliasing.

2008-07-14  David Hyatt  <hyatt@apple.com>

        Fix a crashing bug in ListHashSet's -- operator.  Make sure that end() can be -- by special-casing the null
        position.

        Reviewed by Maciej

        * wtf/ListHashSet.h:
        (WTF::ListHashSetConstIterator::operator--):

2008-07-14  David Hyatt  <hyatt@apple.com>

        Buidl fix.  Make sure the second insertBefore method returns a value.

        * wtf/ListHashSet.h:
        (WTF::::insertBefore):

2008-07-14  Adam Roben  <aroben@apple.com>

        Windows build fix

        * JavaScriptCore.vcproj/jsc/jsc.vcproj: Added include/pthreads to the
        include path.

2008-07-14  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Kevin McCullough.

        Make JSGlobalData refcounted in preparation to adding a way to create contexts that share
        global data.

        * JavaScriptCore.exp:
        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::create):
        * kjs/JSGlobalData.h:
        Made contructor private, and added a static create() method. Made the class inherit from
        RefCounted.

        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::globalData):
        JSGlobalData is now owned by JSGlobalObject (except for the shared one, and the common
        WebCore one, which are never deleted).

        * kjs/Shell.cpp: (main): Create JSGlobalData with create() method.

2008-07-14  Simon Hausmann  <hausmann@webkit.org>

        Fix the single-threaded build.

        * kjs/JSLock.cpp: Removed undeclared registerThread() function.
        * kjs/collector.cpp:
        (KJS::Heap::registerThread): Added dummy implementation.

2008-07-14  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff Garen.

        Eliminate per-thread JavaScript global data instance support and make arbitrary
        global data/global object combinations possible.

        * kjs/collector.cpp:
        (KJS::Heap::Heap): Store a JSGlobalData pointer instead of multiple pointers to its members.
        This allows for going from any JS object to its associated global data, currently used in
        JSGlobalObject constructor to initialize its JSGlobalData pointer.
        (KJS::Heap::registerThread): Changed thread registration data to be per-heap. Previously,
        only the shared heap could be used from multiple threads, so it was the only one that needed
        thread registration, but now this can happen to any heap.
        (KJS::Heap::unregisterThread): Ditto.
        (KJS::Heap::markStackObjectsConservatively): Adapt for the above changes.
        (KJS::Heap::setGCProtectNeedsLocking): Ditto.
        (KJS::Heap::protect): Ditto.
        (KJS::Heap::unprotect): Ditto.
        (KJS::Heap::collect): Ditto.
        (KJS::Heap::globalObjectCount): Use global object list associated with the current heap,
        not the late per-thread one.
        (KJS::Heap::protectedGlobalObjectCount): Ditto.

        * kjs/collector.h:
        (KJS::Heap::ThreadRegistrar): Added a helper object that unregisters a thread when it is
        destroyed.

        * kjs/JSLock.cpp:
        (KJS::JSLock::JSLock):
        * kjs/JSLock.h:
        (KJS::JSLock::JSLock):
        Don't use JSLock to implicitly register threads. I've added registerThread() calls to most
        places that use JSLock - we cannot guarantee absolute safety unless we always mark all
        threads in the process, but these implicit registration calls should cover reasonable usage
        scenarios, I hope.

        * API/JSBase.cpp:
        (JSEvaluateScript): Explicitly register the current thread.
        (JSCheckScriptSyntax): Explicitly register the current thread.
        (JSGarbageCollect): Changed to use the passed in context. Unfortunately, this creates a race
        condition for clients that pass an already released context to JSGarbageCollect - but it is
        unlikely to create real life problems.
        To maintain compatibility, the shared heap is collected if NULL is passed.

        * API/JSContextRef.cpp:
        (JSGlobalContextCreate): Use a new syntax for JSGlobalObject allocation.
        (JSGlobalContextRetain): Register the thread.
        (JSContextGetGlobalObject): Register the thread.

        * API/JSObjectRef.cpp:
        (JSObjectMake):
        (JSObjectMakeFunctionWithCallback):
        (JSObjectMakeConstructor):
        (JSObjectMakeFunction):
        (JSObjectHasProperty):
        (JSObjectGetProperty):
        (JSObjectSetProperty):
        (JSObjectGetPropertyAtIndex):
        (JSObjectSetPropertyAtIndex):
        (JSObjectDeleteProperty):
        (JSObjectCallAsFunction):
        (JSObjectCallAsConstructor):
        (JSObjectCopyPropertyNames):
        (JSPropertyNameAccumulatorAddName):
        * API/JSValueRef.cpp:
        (JSValueIsEqual):
        (JSValueIsInstanceOfConstructor):
        (JSValueMakeNumber):
        (JSValueMakeString):
        (JSValueToNumber):
        (JSValueToStringCopy):
        (JSValueToObject):
        (JSValueProtect):
        (JSValueUnprotect):
        Register the thread.

        * API/JSStringRef.cpp: (JSStringRelease): Changed a comment to not mention per-thread contexts.

        * API/JSStringRefCF.cpp: Removed an unnecessary include of JSLock.h.

        * JavaScriptCore.exp: Export JSGlobalData constructor/destructor, now that anyone can have
        their own instances. Adapt to other changes, too.

        * JavaScriptCore.xcodeproj/project.pbxproj: Made ThreadSpecific.h private, as it is now
        included by collector.h and is thus needed in other projects.

        * kjs/InitializeThreading.cpp: (KJS::initializeThreadingOnce): Don't initialize per-thread
        global data, as it no longer exists.

        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::JSGlobalData):
        (KJS::JSGlobalData::~JSGlobalData):
        * kjs/JSGlobalData.h:
        Removed support for per-thread instance. Made constructor and destructor public.

        * kjs/JSGlobalObject.cpp: (KJS::JSGlobalObject::init): Get to now arbitrary  JSGlobalData
        via the heap.
        (KJS::JSGlobalObject::operator new): Changed ot take JSGlobalDatra pointer.
        * kjs/JSGlobalObject.h:

        * kjs/Shell.cpp:
        (main):
        (jscmain):
        Changed to maintain a custom JSGlobalData pointer instead of a per-thread one.

2008-07-13  Ada Chan  <adachan@apple.com>

        Windows build fix: Add wtf/RefCountedLeakCounter to the project.

        * JavaScriptCore.vcproj/WTF/WTF.vcproj:

2008-07-12  Jan Michael Alonzo  <jmalonzo@webkit.org>

        Gtk, Qt and Wx build fix: Add wtf/RefCountedLeakCounter in the
        build scripts

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCoreSources.bkl:

2008-07-11  Stephanie Lewis  <slewis@apple.com>

        Reviewed by Darin Adler and Oliver Hunt.

        Refactor RefCounting Leak counting code into a common class.

        In order to export the symbols I needed to put the debug defines inside the function names
        
        Before we had a separate channel for each Logging each Leak type.  Since the leak channels were only used in one location, and only at quit for simplicity I combined them all into one leak channel.

        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj: add new class
        * kjs/nodes.cpp: remove old leak counting code
        * wtf/RefCountedLeakCounter.cpp: Added. create a common leak counting class
        * wtf/RefCountedLeakCounter.h: Added.

2008-07-11  David Hyatt  <hyatt@apple.com>

        Add an insertBefore method to ListHashSet to allow for insertions in the middle of the list (rather than just
        at the end).

        Reviewed by Anders

        * wtf/ListHashSet.h:
        (WTF::::insertBefore):
        (WTF::::insertNodeBefore):

2008-07-11  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Darin Adler.

        Move call function to CallData.cpp and construct to ConstructData.cpp.

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * kjs/AllInOneFile.cpp:
        * kjs/CallData.cpp: Copied from kjs/JSValue.cpp.
        * kjs/ConstructData.cpp: Copied from kjs/JSValue.cpp.
        * kjs/JSValue.cpp:

2008-07-10  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        Define WEBKIT_VERSION_MIN_REQUIRED=WEBKIT_VERSION_LATEST when building WebKit to ensure that no symbols end up with the weak_import attribute.

        * Configurations/Base.xcconfig:

2008-07-10  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        Fix the Tiger build by omitting annotations from methods declared in categories when using old versions of GCC.

        * API/WebKitAvailability.h:

2008-07-10  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Darin.

        -Minor cleanup. Renamed callTree() to head() and no longer use m_head
        directly but instead keep it private and access via a method().

        * profiler/HeavyProfile.cpp:
        (KJS::HeavyProfile::HeavyProfile):
        (KJS::HeavyProfile::generateHeavyStructure):
        (KJS::HeavyProfile::addNode):
        * profiler/Profile.h:
        (KJS::Profile::head):
        * profiler/ProfileGenerator.cpp:
        (KJS::ProfileGenerator::ProfileGenerator):

2008-07-10  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Mark Rowe.

        Eliminate CollectorHeapIntrospector.

        CollectorHeapIntrospector was added primarily in the hopes to improve leaks tool output,
        a result that it didn't deliver. Also, it helped by labeling JSC heap regions as reported by
        vmmap tool, but at the same time, it made them mislabeled as malloc'd ones - the correct
        way to label mapped regions is to use a VM tag.

        So, it makes more sense to remove it completely than to make it work with multiple heaps.

        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/AllInOneFile.cpp:
        * kjs/InitializeThreading.cpp:
        (KJS::initializeThreading):
        * kjs/collector.cpp:
        * kjs/collector.h:
        * kjs/CollectorHeapIntrospector.cpp: Removed.
        * kjs/CollectorHeapIntrospector.h: Removed.

2008-07-09  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Darin.

        <rdar://problem/5951532> JSProfiler: Implement heavy (or bottom-up)
        view (19228)
        - Implemented the time and call count portionof heavy.  Now all that we
        need is some UI.

        * profiler/CallIdentifier.h: Removed an unused constructor.
        * profiler/HeavyProfile.cpp: 
        (KJS::HeavyProfile::HeavyProfile): Set the initial time of the head
        node so that percentages work correctly.
        (KJS::HeavyProfile::mergeProfiles): Sum the times and call count of
        nodes being merged.
        * profiler/ProfileNode.cpp: Set the intital values of time and call
        count when copying ProfileNodes.
        (KJS::ProfileNode::ProfileNode):

2008-07-10  Jan Michael Alonzo  <jmalonzo@webkit.org>

        Gtk build fix.

        * GNUmakefile.am: Add HeavyProfile.cpp

2008-07-09  Mark Rowe  <mrowe@apple.com>

        Reviewed by Geoff Garen.

        Don't warn about deprecated functions in production builds.

        * Configurations/Base.xcconfig:
        * Configurations/DebugRelease.xcconfig:

2008-07-09  Darin Adler  <darin@apple.com>

        * JavaScriptCore.pri: Fix Qt build by adding HeavyProfile.cpp.

2008-07-09  Kevin Ollivier  <kevino@theolliviers.com>

        wx biuld fix. Add HeavyProfile.cpp to build files.

        * JavaScriptCoreSources.bkl:

2008-07-09  Kevin McCullough  <kmccullough@apple.com>

        - Windows build fix.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2008-07-09  Kevin McCullough  <kmccullough@apple.com>

        - Build fix.

        * profiler/HeavyProfile.cpp:
        (KJS::HeavyProfile::mergeProfiles):

2008-07-09  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geoff and Adam.

        <rdar://problem/5951532> JSProfiler: Implement Bottom-Up view (19228)
        - This is the plumbing for bottom-up, but does not include calculating
        time, mostly because I'm still undclear about what the end result should
        look like.
        - This, obviously, does not include the UI to expose this in the
        inspector yet.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * profiler/CallIdentifier.h:
        (KJS::CallIdentifier::CallIdentifier):
        (WTF::): Added HashTraits for CallIdentifiers to be used by a HashMap.
        * profiler/HeavyProfile.cpp: Added.
        (KJS::HeavyProfile::HeavyProfile):
        (KJS::HeavyProfile::generateHeavyStructure):
        (KJS::HeavyProfile::addNode):
        (KJS::HeavyProfile::mergeProfiles):
        (KJS::HeavyProfile::addAncestorsAsChildren):
        * profiler/HeavyProfile.h: Added.
        (KJS::HeavyProfile::create):
        (KJS::HeavyProfile::heavyProfile):
        (KJS::HeavyProfile::treeProfile):
        * profiler/Profile.cpp: Removed old commented out includes.
        * profiler/Profile.h: The m_head is needed by the HeavyProfile so it
        is now protected as opposed to private.
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::ProfileNode): Created a constructor to copy
        ProfileNodes.
        (KJS::ProfileNode::findChild): Added a null check to make HeavyProfile
        children finding easier and avoid a potential crasher.
        * profiler/ProfileNode.h: Mostly moved things around but also added some
        functionality needed by HeavyProfile.
        (KJS::ProfileNode::create):
        (KJS::ProfileNode::functionName):
        (KJS::ProfileNode::url):
        (KJS::ProfileNode::lineNumber):
        (KJS::ProfileNode::head):
        (KJS::ProfileNode::setHead):
        (KJS::ProfileNode::setNextSibling):
        (KJS::ProfileNode::actualTotalTime):
        (KJS::ProfileNode::actualSelfTime):
        * profiler/TreeProfile.cpp: Implemented the ability to get a
        HeavyProfile.
        (KJS::TreeProfile::heavyProfile):
        * profiler/TreeProfile.h:

2008-07-08  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Added support for checking if an object has custom properties in its
        property map. WebCore uses this to optimize marking DOM wrappers.

2008-07-08  Simon Hausmann  <hausmann@webkit.org>

        Prospective Gtk/Wx build fixes, add ProfileGenerator.cpp to the build.

        * GNUmakefile.am:
        * JavaScriptCoreSources.bkl:

2008-07-08  Simon Hausmann  <hausmann@webkit.org>

        Fix the Qt build, add ProfileGenerator.cpp to the build.

        * JavaScriptCore.pri:

2008-07-07  David Kilzer  <ddkilzer@apple.com>

        releaseFastMallocFreeMemory() should always be defined

        Reviewed by Darin.

        * JavaScriptCore.exp: Changed to export C++ binding for
        WTF::releaseFastMallocFreeMemory() instead of C binding for
        releaseFastMallocFreeMemory().
        * wtf/FastMalloc.cpp: Moved definitions of
        releaseFastMallocFreeMemory() to be in the WTF namespace
        regardless whether FORCE_SYSTEM_MALLOC is defined.
        * wtf/FastMalloc.h: Moved releaseFastMallocFreeMemory() from
        extern "C" binding to WTF::releaseFastMallocFreeMemory().

2008-07-07  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Geoff.

        Bug 19926: URL causes crash within a minute
        <https://bugs.webkit.org/show_bug.cgi?id=19926>

        Add a check that lastGlobalObject is non-null in Machine::execute()
        before copying its globals to the current register file.

        In theory, it is possible to make a test case for this, but it will
        take a while to get it right.

        * VM/Machine.cpp:
        (KJS::Machine::execute):

2008-07-07  Darin Adler  <darin@apple.com>

        Rubber stamped by Adele.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Fix a typo in a comment.

2008-07-07  Steve Falkenburg  <sfalken@apple.com>

        Build fixes.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/testapi/testapi.vcproj:

2008-07-07  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Darin.

        When the profiler is running it gathers information and creates a
        Profile.  After it finishes the Profile can be sorted and have other
        data refinements run over it.  Both of these were done in the same class
        before.  Now I split the gathering operations into a new class called
        ProfileGenerator.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * profiler/Profile.cpp: Removed code related to the gather stage of a
        Profile's creation.  
        (KJS::Profile::create):
        (KJS::Profile::Profile):
        * profiler/Profile.h: Ditto.
        (KJS::Profile::title):
        (KJS::Profile::callTree):
        (KJS::Profile::setHead):
        * profiler/ProfileGenerator.cpp: Added. This is the class that will
        handle the stage of creating a Profile.  Once the Profile is finished
        being created, this class goes away.
        (KJS::ProfileGenerator::create):
        (KJS::ProfileGenerator::ProfileGenerator):
        (KJS::ProfileGenerator::title):
        (KJS::ProfileGenerator::willExecute):
        (KJS::ProfileGenerator::didExecute):
        (KJS::ProfileGenerator::stopProfiling):
        (KJS::ProfileGenerator::didFinishAllExecution):
        (KJS::ProfileGenerator::removeProfileStart):
        (KJS::ProfileGenerator::removeProfileEnd):
        * profiler/ProfileGenerator.h: Added.
        (KJS::ProfileGenerator::profile):
        (KJS::ProfileGenerator::originatingGlobalExec):
        (KJS::ProfileGenerator::pageGroupIdentifier):
        (KJS::ProfileGenerator::client):
        (KJS::ProfileGenerator::stoppedProfiling):
        * profiler/Profiler.cpp: Now operates with the ProfileGenerator instead
        of the Profile.
        (KJS::Profiler::startProfiling):
        (KJS::Profiler::stopProfiling):
        (KJS::Profiler::didFinishAllExecution): It is here that the Profile is
        handed off to its client and the Profile Generator is no longer needed.
        (KJS::dispatchFunctionToProfiles):
        (KJS::Profiler::willExecute):
        (KJS::Profiler::didExecute):
        * profiler/Profiler.h: Cleaned up the includes and subsequently the
        forward declarations.  Also use the new ProfileGenerator.
        (KJS::ProfilerClient::~ProfilerClient):
        (KJS::Profiler::currentProfiles):
        * profiler/TreeProfile.cpp: Use Profile's new interface.
        (KJS::TreeProfile::create):
        (KJS::TreeProfile::TreeProfile):
        * profiler/TreeProfile.h:

2008-07-07  Sam Weinig  <sam@webkit.org>

        Reviewed by Cameron Zwarich.

        Third step in broad cleanup effort.

        [ File list elided ]

2008-07-06  Sam Weinig  <sam@webkit.org>

        Reviewed by Cameron Zwarich.

        Second step in broad cleanup effort.

        [ File list elided ]

2008-07-05  Sam Weinig  <sam@webkit.org>

        Reviewed by Cameron Zwarich.

        First step in broad cleanup effort.

        [ File list elided ]

2008-07-05  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Cameron Zwarich.

        Rename list.h/cpp to ArgList.h/cpp.

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * VM/Machine.h:
        * kjs/AllInOneFile.cpp:
        * kjs/ArgList.cpp: Copied from JavaScriptCore/kjs/list.cpp.
        * kjs/ArgList.h: Copied from JavaScriptCore/kjs/list.h.
        * kjs/IndexToNameMap.cpp:
        * kjs/JSGlobalData.cpp:
        * kjs/JSGlobalData.h:
        * kjs/JSObject.h:
        * kjs/collector.cpp:
        * kjs/list.cpp: Removed.
        * kjs/list.h: Removed.

2008-07-05  Sam Weinig  <sam@webkit.org>

        Fix non-AllInOne builds again.

        * kjs/BooleanPrototype.cpp:
        * kjs/ErrorPrototype.cpp:
        * kjs/FunctionPrototype.cpp:
        * kjs/NumberPrototype.cpp:
        * kjs/ObjectPrototype.cpp:

2008-07-05  Sam Weinig  <sam@webkit.org>

        Fix build on case-sensitive build systems.

        * kjs/IndexToNameMap.cpp:

2008-07-05  Sam Weinig  <sam@webkit.org>

        Fix build.

        * kjs/Arguments.cpp:
        * kjs/BooleanPrototype.cpp:
        * kjs/DateConstructor.cpp:
        * kjs/ErrorPrototype.cpp:
        * kjs/FunctionPrototype.cpp:
        * kjs/NumberPrototype.cpp:
        * kjs/ObjectPrototype.cpp:
        * kjs/RegExpPrototype.cpp:
        * kjs/StringConstructor.cpp:
        * kjs/lookup.cpp:

2008-07-05  Sam Weinig  <sam@webkit.org>

        Fix non-AllInOne build.

        * kjs/JSGlobalObject.cpp:

2008-07-05  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Cameron Zwarich.

        Split Arguments, IndexToNameMap, PrototypeFunction, GlobalEvalFunction and 
        the functions on the global object out of JSFunction.h/cpp.

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * VM/Machine.cpp:
        * kjs/AllInOneFile.cpp:
        * kjs/Arguments.cpp: Copied from JavaScriptCore/kjs/JSFunction.cpp.
        * kjs/Arguments.h: Copied from JavaScriptCore/kjs/JSFunction.h.
        * kjs/GlobalEvalFunction.cpp: Copied from JavaScriptCore/kjs/JSFunction.cpp.
        * kjs/GlobalEvalFunction.h: Copied from JavaScriptCore/kjs/JSFunction.h.
        * kjs/IndexToNameMap.cpp: Copied from JavaScriptCore/kjs/JSFunction.cpp.
        * kjs/IndexToNameMap.h: Copied from JavaScriptCore/kjs/JSFunction.h.
        * kjs/JSActivation.cpp:
        * kjs/JSFunction.cpp:
        * kjs/JSFunction.h:
        * kjs/JSGlobalObject.cpp:
        * kjs/JSGlobalObjectFunctions.cpp: Copied from JavaScriptCore/kjs/JSFunction.cpp.
        * kjs/JSGlobalObjectFunctions.h: Copied from JavaScriptCore/kjs/JSFunction.h.
        The functions on the global object should be in JSGlobalObject.cpp, but putting them there
        was a 0.5% regression.

        * kjs/PrototypeFunction.cpp: Copied from JavaScriptCore/kjs/JSFunction.cpp.
        * kjs/PrototypeFunction.h: Copied from JavaScriptCore/kjs/JSFunction.h.
        * kjs/Shell.cpp:
        * kjs/lexer.cpp:
        * kjs/ustring.cpp:

2008-07-04  Sam Weinig  <sam@webkit.org>

        Really fix the mac build.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-07-04  Sam Weinig  <sam@webkit.org>

        Fix mac build.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-07-04  Sam Weinig  <sam@webkit.org>

        Fix non-AllInOne builds.

        * kjs/Error.cpp:
        * kjs/GetterSetter.cpp:
        * kjs/JSImmediate.cpp:
        * kjs/operations.cpp:

2008-07-04  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Dan Bernstein.

        Split Error and GetterSetter out of JSObject.h.

        * API/JSCallbackObjectFunctions.h:
        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * kjs/AllInOneFile.cpp:
        * kjs/ClassInfo.h: Copied from JavaScriptCore/kjs/JSObject.h.
        * kjs/Error.cpp: Copied from JavaScriptCore/kjs/JSObject.cpp.
        * kjs/Error.h: Copied from JavaScriptCore/kjs/JSObject.h.
        * kjs/GetterSetter.cpp:
        * kjs/GetterSetter.h: Copied from JavaScriptCore/kjs/JSObject.h.
        * kjs/JSObject.cpp:
        * kjs/JSObject.h:
        * kjs/nodes.h:

2008-07-04  Simon Hausmann  <hausmann@webkit.org>

        Fix the Wx build, added TreeProfile.cpp to the build.

        * JavaScriptCoreSources.bkl:

2008-07-03  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        Fix output path of recently-added script phase to reference the correct file.
        This prevents Xcode from running the script phase unnecessarily, which caused
        the generated header to be recreated and lead to AllInOneFile.cpp rebuilding.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-07-03  Mark Rowe  <mrowe@apple.com>

        Follow-up to the 64-bit build fix.  Use intptr_t rather than ssize_t as
        the latter is non-standard and does not exist on Windows.

        * kjs/JSLock.cpp:
        (KJS::JSLock::lockCount):
        (KJS::JSLock::lock):
        (KJS::JSLock::unlock):
        (KJS::JSLock::DropAllLocks::DropAllLocks):
        * kjs/JSLock.h:

2008-07-02  Mark Rowe  <mrowe@apple.com>

        Fix the 64-bit build.  pthread_getspecific works with pointer-sized values,
        so use ssize_t rather than int to track the lock count to avoid warnings about
        truncating the result of pthread_getspecific.

        * kjs/JSLock.cpp:
        (KJS::JSLock::lockCount):
        (KJS::JSLock::lock):
        (KJS::JSLock::unlock):
        (KJS::JSLock::DropAllLocks::DropAllLocks):
        * kjs/JSLock.h:

2008-07-03  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Removed checking for the array get/put fast case from the array code.
        Callers who want the fast case should call getIndex and/or setIndex
        instead. (get_by_val and put_by_val already do this.)
        
        SunSpider reports no change overall, but a 1.4% speedup on fannkuch and
        a 3.6% speedup on nsieve.

2008-07-03  Dan Bernstein  <mitz@apple.com>

        - Windows build fix

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Added TreeProfile.{h,cpp}.

2008-07-03  Dan Bernstein  <mitz@apple.com>

        Reviewed by Anders Carlsson.

        - Windows build fix

        * VM/Machine.cpp:
        (KJS::Machine::Machine):

2008-07-03  Simon Hausmann  <hausmann@webkit.org>

        Reviewed by Alexey Proskuryakov.

        Fix the non-threaded build.

        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::threadInstanceInternal):

2008-07-03  Simon Hausmann  <hausmann@webkit.org>

        Fix the Qt build, added TreeProfile to the build.

        * JavaScriptCore.pri:

2008-07-02  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff.

        Don't create unnecessary JSGlobalData instances.

        * kjs/JSGlobalData.h:
        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::threadInstanceExists):
        (KJS::JSGlobalData::sharedInstanceExists):
        (KJS::JSGlobalData::threadInstance):
        (KJS::JSGlobalData::sharedInstance):
        (KJS::JSGlobalData::threadInstanceInternal):
        (KJS::JSGlobalData::sharedInstanceInternal):
        Added methods to query instance existence.

        * kjs/InitializeThreading.cpp:
        (KJS::initializeThreadingOnce):
        Initialize thread instance static in a new way.

        * API/JSBase.cpp:
        (JSGarbageCollect):
        * kjs/collector.cpp:
        (KJS::Heap::collect):
        Check for instance existence before accessing it.

2008-07-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Cameron Zwarich.
        
        Fixed https://bugs.webkit.org/show_bug.cgi?id=19862
        REGRESSION (r34907): Gmail crashes in JavaScriptCore code while editing drafts
        
        I was never able to reproduce this issue, but Cameron could, and he says
        that this patch fixes it.
        
        The crash seems tied to a timer or event handler callback. In such a case,
        the sole reference to the global object may be in the current call frame,
        so we can't depend on the global object to mark the call frame area in
        the register file.
        
        The new GC marking rule is: the global object is not responsible for
        marking the whole register file -- it's just responsible for the globals
        section it's tied to. The heap is responsible for marking the call frame area.

2008-07-02  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        Add the ability to trace JavaScriptCore garabge collections using dtrace.

        * JavaScriptCore.xcodeproj/project.pbxproj: Generate the dtrace probe header
        file when building on a new enough version of Mac OS X.
        * JavaScriptCorePrefix.h: Add our standard Mac OS X version detection macros.
        * kjs/Tracing.d: Declare three dtrace probes.
        * kjs/Tracing.h: Include the generated dtrace macros if dtrace is available,
        otherwise provide versions that do nothing.
        * kjs/collector.cpp:
        (KJS::Heap::collect): Fire dtrace probes when starting a collection, after the
        mark phase has completed, and when the collection is complete.
        * wtf/Platform.h: Define HAVE_DTRACE when building on a new enough version of Mac OS X.

2008-07-02  Geoffrey Garen  <ggaren@apple.com>

        Rubber stamped by Oliver Hunt.
        
        Reduced the max register file size from 8MB to 2MB.

        We still allow about 20,000 levels of recursion.

2008-07-02  Alp Toker  <alp@nuanti.com>

        Build fix for r34960. Add TreeProfile.cpp to build.

        * GNUmakefile.am:

2008-07-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.

        Optimized a[n] get for cases when a is an array or a string. When a is
        an array, we optimize both get and put. When a is a string, we only
        optimize get, since you can't put to a string.
        
        SunSpider says 3.4% faster.

2008-07-02  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Darin.

        -Small cleanup in preparation for implementing Bottom-up.

        * profiler/CallIdentifier.h: Rename debug function to make it clear of
        its output and intention to be debug only.
        (KJS::CallIdentifier::operator const char* ): Implement in terms of
        c_str.
        (KJS::CallIdentifier::c_str):
        * profiler/ProfileNode.cpp: Impelment findChild() which will be needed
        by the bottom-up implementation.
        (KJS::ProfileNode::findChild):
        * profiler/ProfileNode.h: Added comments to make the collections of
        functions more clear.
        (KJS::ProfileNode::operator==):
        (KJS::ProfileNode::c_str):

2008-07-02  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Darin.

        Bug 19776: Number.toExponential() is incorrect for numbers between 0.1 and 1
        <https://bugs.webkit.org/show_bug.cgi?id=19776>

        Perform the sign check for the exponent on the actual exponent value,
        which is 1 less than the value of decimalPoint, instead of on the value
        of decimalPoint itself.

        * kjs/NumberPrototype.cpp:
        (KJS::exponentialPartToString):

2008-07-02  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Darin.

        <rdar://problem/5951532> JSProfiler: Implement Bottom-Up view (19228)
        - Subclass TreeProfile as I prepare for a HeavyProfile to be comming
        later.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * profiler/Profile.cpp: By default we create a TreeProfile.
        (KJS::Profile::create):
        * profiler/Profile.h: Changes to the Profile class to make it amenable
        to be inherited from.
        (KJS::Profile::~Profile):
        * profiler/TreeProfile.cpp: Added.
        (KJS::TreeProfile::create):
        (KJS::TreeProfile::TreeProfile):
        (KJS::TreeProfile::heavyProfile):
        * profiler/TreeProfile.h: Added.
        (KJS::TreeProfile::treeProfile):

2008-07-02  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Dan.

        Broke CallIdentifier out into its own file. I did this because it's
        going to grow a lot soon and I wanted this to be a separate patch.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * profiler/CallIdentifier.h: Added.
        (KJS::CallIdentifier::CallIdentifier):
        (KJS::CallIdentifier::operator==):
        (KJS::CallIdentifier::operator!=):
        (KJS::CallIdentifier::operator const char* ):
        (KJS::CallIdentifier::toString):
        * profiler/ProfileNode.h:

2008-07-02  Simon Hausmann  <hausmann@webkit.org>

        Build fix. Implemented missing functions for single-threaded build.

        * kjs/JSLock.cpp:
        (KJS::JSLock::JSLock):
        (KJS::JSLock::lock):
        (KJS::JSLock::unlock):
        (KJS::JSLock::DropAllLocks::DropAllLocks):

2008-07-02  Alexey Proskuryakov  <ap@webkit.org>

        Another non-AllInOne build fix.

        * kjs/JSGlobalObject.cpp: Include JSLock.h here, too.

2008-07-02  Alexey Proskuryakov  <ap@webkit.org>

        Non-AllInOne build fix.

        * kjs/interpreter.cpp: Include JSLock.h.

2008-06-30  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Disable JSLock for per-thread contexts.

        No change on SunSpider.

        * kjs/JSGlobalData.h:
        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::JSGlobalData):
        (KJS::JSGlobalData::sharedInstance):
        Added isSharedInstance as a better way to tell whether the instance is shared (legacy).

        * kjs/JSLock.cpp:
        (KJS::createJSLockCount):
        (KJS::JSLock::lockCount):
        (KJS::setLockCount):
        (KJS::JSLock::JSLock):
        (KJS::JSLock::lock):
        (KJS::JSLock::unlock):
        (KJS::JSLock::currentThreadIsHoldingLock):
        (KJS::JSLock::DropAllLocks::DropAllLocks):
        (KJS::JSLock::DropAllLocks::~DropAllLocks):
        * kjs/JSLock.h:
        (KJS::JSLock::JSLock):
        (KJS::JSLock::~JSLock):
        Made JSLock and JSLock::DropAllLocks constructors take a parameter to decide whether to
        actually lock a mutex, or only to increment recursion count. We cannot turn it into no-op
        if we want to keep existing assertions working.
        Made recursion count per-thread, now that locks may not lock.

        * API/JSBase.cpp:
        (JSEvaluateScript): Take JSLock after casting JSContextRef to ExecState* (which doesn't need
        locking in any case), so that a decision whether to actually lock can be made.
        (JSCheckScriptSyntax): Ditto.
        (JSGarbageCollect): Only lock while collecting the shared heap, not the per-thread one.

        * API/JSObjectRef.cpp:
        (JSClassCreate): Don't lock, as there is no reason to.
        (JSClassRetain): Ditto.
        (JSClassRelease): Ditto.
        (JSPropertyNameArrayRetain): Ditto.
        (JSPropertyNameArrayRelease): Only lock while deleting the array, as that may touch
        identifier table.
        (JSPropertyNameAccumulatorAddName): Adding a string also involves an identifier table
        lookup, and possibly modification.

        * API/JSStringRef.cpp:
        (JSStringCreateWithCharacters):
        (JSStringCreateWithUTF8CString):
        (JSStringRetain):
        (JSStringRelease):
        (JSStringGetUTF8CString):
        (JSStringIsEqual):
        * API/JSStringRefCF.cpp:
        (JSStringCreateWithCFString):
        JSStringRef operations other than releasing do not need locking.

        * VM/Machine.cpp: Don't include unused JSLock.h.

        * kjs/CollectorHeapIntrospector.cpp: (KJS::CollectorHeapIntrospector::statistics):
        Don't take the lock for real, as heap introspection pauses the process anyway. It seems that
        the existing code could cause deadlocks.

        * kjs/Shell.cpp:
        (functionGC):
        (main):
        (jscmain):
        The test tool uses a per-thread context, so no real locking is required.

        * kjs/collector.h:
        (KJS::Heap::setGCProtectNeedsLocking): Optionally protect m_protectedValues access with a
        per-heap mutex. This is only needed for WebCore Database code, which violates the "no data
        migration between threads" by using ProtectedPtr on a background thread.
        (KJS::Heap::isShared): Keep a shared flag here, as well.

        * kjs/protect.h:
        (KJS::::ProtectedPtr):
        (KJS::::~ProtectedPtr):
        (KJS::::operator):
        (KJS::operator==):
        (KJS::operator!=):
        ProtectedPtr is ony used from WebCore, so it doesn't need to take JSLock. An assertion in
        Heap::protect/unprotect guards agains possible future unlocked uses of ProtectedPtr in JSC.

        * kjs/collector.cpp:
        (KJS::Heap::Heap): Initialize m_isShared.
        (KJS::Heap::~Heap): No need to lock for real during destruction, but must keep assertions
        in sweep() working.
        (KJS::destroyRegisteredThread): Registered thread list is only accessed for shared heap,
        so locking is always needed here.
        (KJS::Heap::registerThread): Ditto.
        (KJS::Heap::markStackObjectsConservatively): Use m_isShared instead of comparing to a shared
        instance for a small speedup.
        (KJS::Heap::setGCProtectNeedsLocking): Create m_protectedValuesMutex. There is currently no
        way to undo this - and ideally, Database code will be fixed to lo longer require this quirk.
        (KJS::Heap::protect): Take m_protectedValuesMutex (if it exists) while accessing
        m_protectedValues.
        (KJS::Heap::unprotect): Ditto.
        (KJS::Heap::markProtectedObjects): Ditto.
        (KJS::Heap::protectedGlobalObjectCount): Ditto.
        (KJS::Heap::protectedObjectCount): Ditto.
        (KJS::Heap::protectedObjectTypeCounts): Ditto.

        * kjs/ustring.cpp:
        * kjs/ustring.h:
        Don't include JSLock.h, which is no longer used here. As a result, an explicit include had
        to be added to many files in JavaScriptGlue, WebCore and WebKit.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::init):
        * API/JSCallbackConstructor.cpp:
        (KJS::constructJSCallback):
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::call):
        * API/JSCallbackObjectFunctions.h:
        (KJS::::init):
        (KJS::::getOwnPropertySlot):
        (KJS::::put):
        (KJS::::deleteProperty):
        (KJS::::construct):
        (KJS::::hasInstance):
        (KJS::::call):
        (KJS::::getPropertyNames):
        (KJS::::toNumber):
        (KJS::::toString):
        (KJS::::staticValueGetter):
        (KJS::::callbackGetter):
        * API/JSContextRef.cpp:
        (JSGlobalContextCreate):
        (JSGlobalContextRetain):
        (JSGlobalContextRelease):
        * API/JSValueRef.cpp:
        (JSValueIsEqual):
        (JSValueIsStrictEqual):
        (JSValueIsInstanceOfConstructor):
        (JSValueMakeNumber):
        (JSValueMakeString):
        (JSValueToNumber):
        (JSValueToStringCopy):
        (JSValueToObject):
        (JSValueProtect):
        (JSValueUnprotect):
        * JavaScriptCore.exp:
        * kjs/PropertyNameArray.h:
        (KJS::PropertyNameArray::globalData):
        * kjs/interpreter.cpp:
        (KJS::Interpreter::checkSyntax):
        (KJS::Interpreter::evaluate):
        Pass a parameter to JSLock/JSLock::DropAllLocks to decide whether the lock needs to be taken.

2008-07-01  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        https://bugs.webkit.org/show_bug.cgi?id=19834
        Failed assertion in JavaScriptCore/VM/SegmentedVector.h:82

        Creating a global object with a custom prototype resets it twice (wasteful!).
        So, addStaticGlobals() was called twice, but JSGlobalObject::reset() didn't reset
        the register array.        

        * kjs/JSGlobalObject.cpp: (KJS::JSGlobalObject::reset): Call setRegisterArray(0, 0).

        * kjs/JSVariableObject.h: Changed registerArray to OwnArrayPtr. Also, added private copy
        constructor and operator= to ensure that no one attempts to copy this object (for whatever
        reason, I couldn't make Noncopyable work).

        * kjs/JSGlobalObject.h: (KJS::JSGlobalObject::addStaticGlobals): Allocate registerArray
        with new[].

        * kjs/JSVariableObject.cpp:
        (KJS::JSVariableObject::copyRegisterArray): Allocate registerArray with new[].
        (KJS::JSVariableObject::setRegisterArray): Avoid hitting an assertion in OwnArrayPtr when
        "changing" the value from 0 to 0.

2008-07-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Removed and/or reordered exception checks in array-style a[n] access.
        
        SunSpider says 1.4% faster.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): No need to check for exceptions before
        calling toString, toNumber and/or get. If the call ends up being observable
        through toString, valueOf, or a getter, we short-circuit it there, instead.
        In the op_del_by_val case, I removed the incorrect comment without actually
        removing the code, since I didn't want to tempt the GCC fates!

        * kjs/JSObject.cpp:
        (KJS::callDefaultValueFunction): Added exception check to prevent
        toString and valueOf functions from observing execution after an exception
        has been thrown. This removes some of the burden of exception checking
        from the machine.

        (KJS::JSObject::defaultValue): Removed redundant exception check here.

        * kjs/PropertySlot.cpp:
        (KJS::PropertySlot::functionGetter): Added exception check to prevent
        getter functions from observing execution after an exception has been
        thrown. This removes some of the burden of exception checking from the
        machine.

2008-07-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Optimized a[n] get and put for cases where n is an immediate unsigned
        value.
        
        SunSpider says 3.5% faster.

2008-07-01  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Darin.

        Bug 19844: JavaScript Switch statement modifies "this"
        <https://bugs.webkit.org/show_bug.cgi?id=19844>

        Use a temporary when generating code for switch clauses to avoid
        overwriting 'this' or a local variable.

        * kjs/nodes.cpp:
        (KJS::CaseBlockNode::emitCodeForBlock):

2008-07-01  Christian Dywan  <christian@twotoasts.de>

        Gtk+ build fix.

        * kjs/list.cpp: Include "JSCell.h"

2008-07-01  Kevin McCullough  <kmccullough@apple.com>

        Build fix.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-07-01  Dan Bernstein  <mitz@apple.com>

        Reviewed by Anders Carlsson.

        - Mac release build fix

        * JavaScriptCore.exp:

2008-07-01  Sam Weinig  <sam@webkit.org>

        Try and fix mac builds.

        * JavaScriptCore.exp:

2008-07-01  Sam Weinig  <sam@webkit.org>

        Fix non-AllInOne builds.

        * kjs/DateMath.cpp:

2008-07-01  Sam Weinig  <sam@webkit.org>

        Reviewed by Darin Adler.

        Split JSCell and JSNumberCell class declarations out of JSValue.h

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * VM/JSPropertyNameIterator.h:
        * kjs/AllInOneFile.cpp:
        * kjs/JSCell.cpp: Copied from JavaScriptCore/kjs/JSValue.cpp.
        * kjs/JSCell.h: Copied from JavaScriptCore/kjs/JSValue.h.
        (KJS::JSValue::getJSNumber):
        * kjs/JSNumberCell.cpp:
        * kjs/JSNumberCell.h: Copied from JavaScriptCore/kjs/JSValue.h.
        * kjs/JSObject.h:
        * kjs/JSString.cpp:
        (KJS::jsString):
        (KJS::jsOwnedString):
        * kjs/JSString.h:
        (KJS::JSValue::toThisJSString):
        * kjs/JSValue.cpp:
        * kjs/JSValue.h:

2008-07-01  Anders Carlsson  <andersca@apple.com>

        Build fixes.
        
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::addStaticGlobals):

2008-07-01  Simon Hausmann  <hausmann@webkit.org>

        Build fix, include OwnPtr.h.

        * kjs/RegExpConstructor.h:

2008-06-30  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed a global object leak caused by the switch to one register file.
        
        Don't unconditionally mark the register file, since that logically
        makes all global variables GC roots, even when their global object is
        no longer reachable.
        
        Instead, make the global object associated with the register file
        responsible for marking the register file.

2008-06-30  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Removed the "registerBase" abstraction. Since the register file never
        reallocates, we can keep direct pointers into it, instead of
        <registerBase, offset> tuples.
        
        SunSpider says 0.8% faster.
        
2008-06-30  Oliver Hunt  <oliver@apple.com>

        Reviewed by NOBODY (build fix).

        Fix build by adding all (hopefully) the missing includes.

        * kjs/BooleanPrototype.cpp:
        * kjs/DateConstructor.cpp:
        * kjs/ErrorPrototype.cpp:
        * kjs/FunctionPrototype.cpp:
        * kjs/NativeErrorConstructor.cpp:
        * kjs/NumberPrototype.cpp:
        * kjs/ObjectPrototype.cpp:
        * kjs/RegExpConstructor.cpp:
        * kjs/StringConstructor.cpp:
        * kjs/StringPrototype.cpp:

2008-06-30  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 19830: REGRESSION (r34883): Google Reader doesn't show up feed list on sidebar
        <https://bugs.webkit.org/show_bug.cgi?id=19830>

        Ensure that we do not eliminate a write to a local register when doing
        peephole optimizations.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitJumpIfTrue):
        (KJS::CodeGenerator::emitJumpIfFalse):

2008-06-30  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Darin Alder.

        Split InternalFunction into its own header file.

        * API/JSCallbackFunction.h:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/ArrayConstructor.h:
        * kjs/BooleanConstructor.h:
        * kjs/DateConstructor.h:
        * kjs/ErrorConstructor.h:
        * kjs/FunctionConstructor.h:
        * kjs/FunctionPrototype.h:
        * kjs/InternalFunction.h: Copied from kjs/JSFunction.h.
        * kjs/JSFunction.h:
        * kjs/NativeErrorConstructor.h:
        * kjs/NumberConstructor.h:
        * kjs/ObjectConstructor.h:
        * kjs/RegExpConstructor.h:
        * kjs/StringConstructor.h:
        * profiler/Profiler.cpp:

2008-06-30  Sam Weinig  <sam@webkit.org>

        Reviewed by Kevin McCullough.

        Remove empty files Instruction.cpp, LabelID.cpp, Register.cpp and RegisterID.cpp.

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * VM/Instruction.cpp: Removed.
        * VM/LabelID.cpp: Removed.
        * VM/Register.cpp: Removed.
        * VM/RegisterID.cpp: Removed.

2008-06-30  Sam Weinig  <sam@webkit.org>

        Rubber-stamped (reluctantly) by Kevin McCullough.

        Rename date_object.h/cpp to DateInstance.h/cpp

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * kjs/AllInOneFile.cpp:
        * kjs/DateConstructor.cpp:
        * kjs/DateInstance.cpp: Copied from kjs/date_object.cpp.
        * kjs/DateInstance.h: Copied from kjs/date_object.h.
        * kjs/DatePrototype.cpp:
        * kjs/DatePrototype.h:
        * kjs/date_object.cpp: Removed.
        * kjs/date_object.h: Removed.

2008-06-30  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Darin Adler.

        Remove internal.cpp and move its contents to there own .cpp files.

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * kjs/AllInOneFile.cpp:
        * kjs/GetterSetter.cpp: Copied from kjs/internal.cpp.
        * kjs/InternalFunction.cpp: Copied from kjs/internal.cpp.
        * kjs/JSNumberCell.cpp: Copied from kjs/internal.cpp.
        * kjs/JSString.cpp: Copied from kjs/internal.cpp.
        * kjs/JSString.h:
        * kjs/LabelStack.cpp: Copied from kjs/internal.cpp.
        * kjs/NumberConstructor.cpp:
        * kjs/NumberObject.cpp:
        (KJS::constructNumber):
        (KJS::constructNumberFromImmediateNumber):
        * kjs/internal.cpp: Removed.

2008-06-30  Adam Roben  <aroben@apple.com>

        Fix <rdar://5954749> Assertion failure due to HashTable's use of
        operator&

        HashTable was passing &value to constructDeletedValue, which in
        classes like WebCore::COMPtr would cause an assertion. We now pass
        value by reference instead of by address so that the HashTraits
        implementations have more flexibility in constructing the deleted
        value.

        Reviewed by Ada Chan.

        * VM/CodeGenerator.h: Updated for changes to HashTraits.
        * wtf/HashTable.h:
        (WTF::::deleteBucket): Changed to pass bucket by reference instead of
        by address.
        (WTF::::checkKey): Ditto.
        * wtf/HashTraits.h:
        (WTF::): Updated HashTraits for HashTable change.

2008-07-01  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Cameron Zwarich.

        Make RegisterFile really unmap memory on destruction.

        This fixes run-webkit-tests --threaded, which ran out of address space in a few seconds.

        * VM/RegisterFile.cpp: (KJS::RegisterFile::~RegisterFile): Unmap all the memory, not just
        1/4 of it.

        * kjs/JSGlobalObject.h: Don't include RegisterFile.h, so that changes to it don't make
        half of WebCore rebuild.

        * VM/Machine.h: Don't forward declare RegisterFile, as RegisterFile.h is included already.

        * VM/RegisterFile.h: (KJS::RegisterFile::RegisterFile): Assert that the allocation succeeded.

2008-06-30  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Rubber-stamped by Oliver.

        Correct the documentation for op_put_by_index.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-06-29  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 19821: Merge the instruction pair (less, jfalse)
        <https://bugs.webkit.org/show_bug.cgi?id=19821>
        
        This is a 2.4% win on SunSpider. I needed to add an ALWAYS_INLINE
        intrinisc to CodeGenerator::rewindBinaryOp() to avoid a massive
        regression in regexp-dna.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::rewindBinaryOp):
        (KJS::CodeGenerator::emitJumpIfFalse):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.cpp:
        (KJS::):
        * VM/Opcode.h:

2008-06-29  Sam Weinig  <sam@webkit.org>

        Fix non-AllInOne builds.

        * kjs/JSObject.cpp:
        * kjs/JSValue.cpp:

2008-06-29  Sam Weinig  <sam@webkit.org>

        Build fix for Qt.

        * kjs/DateMath.cpp:
        * kjs/DatePrototype.cpp:

2008-06-29  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Cameron Zwarich.

        Splits ErrorConstructor, ErrorPrototype,  NativeErrorConstructor and
        NativeErrorPrototype out of error_object.h/cpp and renames it ErrorInstance.

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * kjs/AllInOneFile.cpp:
        * kjs/ArrayConstructor.cpp:
        * kjs/ArrayPrototype.cpp:
        * kjs/BooleanPrototype.cpp:
        * kjs/DatePrototype.cpp:
        * kjs/ErrorConstructor.cpp: Copied from kjs/error_object.cpp.
        * kjs/ErrorConstructor.h: Copied from kjs/error_object.h.
        * kjs/ErrorInstance.cpp: Copied from kjs/error_object.cpp.
        * kjs/ErrorInstance.h: Copied from kjs/error_object.h.
        * kjs/ErrorPrototype.cpp: Copied from kjs/error_object.cpp.
        * kjs/ErrorPrototype.h: Copied from kjs/error_object.h.
        * kjs/JSGlobalObject.cpp:
        * kjs/JSObject.cpp:
        * kjs/JSValue.cpp:
        * kjs/NativeErrorConstructor.cpp: Copied from kjs/error_object.cpp.
        * kjs/NativeErrorConstructor.h: Copied from kjs/error_object.h.
        * kjs/NativeErrorPrototype.cpp: Copied from kjs/error_object.cpp.
        * kjs/NativeErrorPrototype.h: Copied from kjs/error_object.h.
        * kjs/NumberPrototype.cpp:
        * kjs/RegExpConstructor.cpp:
        * kjs/RegExpObject.cpp:
        * kjs/RegExpPrototype.cpp:
        * kjs/StringPrototype.cpp:
        * kjs/error_object.cpp: Removed.
        * kjs/error_object.h: Removed.
        * kjs/internal.cpp:

2008-06-29  Sam Weinig  <sam@webkit.org>

        Fix non-AllInOne build.

        * kjs/DateConstructor.cpp:
        * kjs/DateMath.cpp:
        * kjs/JSObject.cpp:

2008-06-29  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Oliver Hunt.

        Splits DateConstructor and DatePrototype out of date_object.h/cpp
        Moves shared Date code into DateMath.

        * DerivedSources.make:
        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * kjs/AllInOneFile.cpp:
        * kjs/DateConstructor.cpp: Copied from kjs/date_object.cpp.
        * kjs/DateConstructor.h: Copied from kjs/date_object.h.
        * kjs/DateMath.cpp:
        (KJS::ymdhmsToSeconds):
        (KJS::):
        (KJS::skipSpacesAndComments):
        (KJS::findMonth):
        (KJS::parseDate):
        (KJS::timeClip):
        (KJS::formatDate):
        (KJS::formatDateUTCVariant):
        (KJS::formatTime):
        * kjs/DateMath.h:
        (KJS::gmtoffset):
        * kjs/DatePrototype.cpp: Copied from kjs/date_object.cpp.
        * kjs/DatePrototype.h: Copied from kjs/date_object.h.
        * kjs/JSGlobalObject.cpp:
        * kjs/JSObject.cpp:
        * kjs/date_object.cpp:
        * kjs/date_object.h:
        * kjs/internal.cpp:

2008-06-29  Jan Michael Alonzo  <jmalonzo@webkit.org>

        Rubber-stamped by Cameron Zwarich

        Fix Gtk non-AllInOne build

        * GNUmakefile.am: include JSVariableObject.cpp
        * kjs/RegExpConstructor.cpp: include RegExpObject.h
        * kjs/RegExpObject.h: forward declare RegExpPrototype

2008-06-28  Darin Adler  <darin@apple.com>

        Reviewed by Sam and Cameron.

        - fix https://bugs.webkit.org/show_bug.cgi?id=19805
          Array.concat turns missing array elements into "undefined"

        Test: fast/js/array-holes.html

        * JavaScriptCore.exp: No longer export JSArray::getItem.

        * kjs/ArrayPrototype.cpp:
        (KJS::arrayProtoFuncConcat): Changed to use getProperty instead of
        JSArray::getItem -- need to handle properties from the prototype chain
        instead of ignoring them.

        * kjs/JSArray.cpp: Removed getItem.
        * kjs/JSArray.h: Ditto.

2008-06-28  Darin Adler  <darin@apple.com>

        Reviewed by Cameron.

        - https://bugs.webkit.org/show_bug.cgi?id=19804
          optimize access to arrays without "holes"

        SunSpider says 1.8% faster.

        * kjs/JSArray.cpp:
        (KJS::JSArray::JSArray): Initialize m_fastAccessCutoff when creating
        arrays. Also updated for new location of m_vectorLength.
        (KJS::JSArray::getItem): Updated for new location of m_vectorLength.
        (KJS::JSArray::getSlowCase): Added. Broke out the non-hot parts of
        getOwnPropertySlot to make the hot part faster.
        (KJS::JSArray::getOwnPropertySlot): Added a new faster case for
        indices lower than m_fastAccessCutoff. We can do theese with no
        additional checks or branches.
        (KJS::JSArray::put): Added a new faster case for indices lower than
        m_fastAccessCutoff. We can do theese with no additional checks or
        branches. Moved the maxArrayIndex handling out of this function.
        Added code to set m_fastAccessCutoff when the very last hole in
        an array is filled; this is how the cutoff gets set for most arrays.
        (KJS::JSArray::putSlowCase): Moved the rest of the put function logic
        in here, to make the hot part of the put function faster.
        (KJS::JSArray::deleteProperty): Added code to lower m_fastAccessCutoff
        when a delete makes a new hole in the array.
        (KJS::JSArray::getPropertyNames): Updated for new location of
        m_vectorLength.
        (KJS::JSArray::increaseVectorLength): Ditto.
        (KJS::JSArray::setLength): Added code to lower m_fastAccessCutoff
        when setLength makes the array smaller.
        (KJS::JSArray::mark): Updated for new location of m_vectorLength.
        (KJS::JSArray::sort): Ditto. Set m_fastAccessCutoff after moving
        all the holes to the end of the array.
        (KJS::JSArray::compactForSorting): Ditto.
        (KJS::JSArray::checkConsistency): Added consistency checks fro
        m_fastAccessCutoff and updated for the new location of m_vectorLength.

        * kjs/JSArray.h: Added declarations for slow case functions.
        Replaced m_vectorLength with m_fastAccessCutoff.

2008-06-28  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Sam.

        When executing a native call, check for an exception before writing the
        return value.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-06-28  Mark Rowe  <mrowe@apple.com>

        Build fix.  Flag headers as private or public as is appropriate.
        These settings were accidentally removed during some project file cleanup.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-06-28  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Darin Adler.

        Splits RegExpConstructor and RegExpPrototype out of RegExpObject.h/cpp

        * DerivedSources.make:
        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * VM/Machine.cpp:
        * kjs/AllInOneFile.cpp:
        * kjs/JSGlobalObject.cpp:
        * kjs/RegExpConstructor.cpp: Copied from kjs/RegExpObject.cpp.
        * kjs/RegExpConstructor.h: Copied from kjs/RegExpObject.h.
        * kjs/RegExpObject.cpp:
        * kjs/RegExpObject.h:
        * kjs/RegExpPrototype.cpp: Copied from kjs/RegExpObject.cpp.
        * kjs/RegExpPrototype.h: Copied from kjs/RegExpObject.h.
        * kjs/StringPrototype.cpp:
        * kjs/internal.cpp:

2008-06-28  Sam Weinig  <sam@webkit.org>

        Fix non-AllInOne builds.

        * kjs/StringConstructor.cpp:

2008-06-28  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Darin Adler.

        Rename string_object.h/cpp to StringObject.h/cpp and split out StringObjectThatMasqueradesAsUndefined,
        StringConstructor and StringPrototype.

        * DerivedSources.make:
        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * kjs/AllInOneFile.cpp:
        * kjs/JSGlobalObject.cpp:
        * kjs/StringConstructor.cpp: Copied from JavaScriptCore/kjs/string_object.cpp.
        * kjs/StringConstructor.h: Copied from JavaScriptCore/kjs/string_object.h.
        * kjs/StringObject.cpp: Copied from JavaScriptCore/kjs/string_object.cpp.
        * kjs/StringObject.h: Copied from JavaScriptCore/kjs/string_object.h.
        * kjs/StringObjectThatMasqueradesAsUndefined.h: Copied from JavaScriptCore/kjs/string_object.h.
        * kjs/StringPrototype.cpp: Copied from JavaScriptCore/kjs/string_object.cpp.
        * kjs/StringPrototype.h: Copied from JavaScriptCore/kjs/string_object.h.
        * kjs/internal.cpp:
        * kjs/string_object.cpp: Removed.
        * kjs/string_object.h: Removed.

2008-06-28  Jan Michael Alonzo  <jmalonzo@webkit.org>

        Gtk build fix: JSVariableObject is now part of AllInOne

        * GNUmakefile.am:

2008-06-28  Darin Adler  <darin@apple.com>

        Reviewed by Oliver.

        - https://bugs.webkit.org/show_bug.cgi?id=19801
          add a feature so we can tell what regular expressions are taking time

        * pcre/pcre_compile.cpp:
        (jsRegExpCompile): Compile in the string if REGEXP_HISTOGRAM is on.

        * pcre/pcre_exec.cpp:
        (jsRegExpExecute): Add hook to time execution.
        (Histogram::~Histogram): Print a sorted list of what took time.
        (Histogram::add): Accumulate records of what took time.
        (HistogramTimeLogger::~HistogramTimeLogger): Hook that calls
        Histogram::add at the right moment and creates the global histogram
        object.

        * pcre/pcre_internal.h: Define REGEXP_HISTOGRAM.

        * pcre/pcre_tables.cpp: Added missing include of "config.h". Not needed
        any more, but an omissions an earlier version of this patch detected.
        * pcre/pcre_ucp_searchfuncs.cpp: Ditto.
        * pcre/pcre_xclass.cpp: Ditto.

2008-06-28  Sam Weinig  <sam@webkit.org>

        Try and fix the Windows build again.

        * kjs/RegExpObject.cpp:
        * kjs/date_object.cpp:
        * kjs/error_object.cpp:

2008-06-28  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Darin Adler.

        Remove unused StringConstructorFunction class.

        * kjs/string_object.h:

2008-06-28  Sam Weinig  <sam@webkit.org>

        Fix windows build.

        * kjs/ArrayPrototype.cpp:
        * kjs/BooleanPrototype.cpp:
        * kjs/BooleanPrototype.h:
        * kjs/FunctionPrototype.cpp:
        * kjs/JSImmediate.cpp:
        * kjs/JSObject.cpp:
        * kjs/MathObject.cpp:
        * kjs/NumberPrototype.cpp:
        * kjs/NumberPrototype.h:
        * kjs/ObjectConstructor.cpp:
        * kjs/RegExpObject.h:
        * kjs/error_object.h:
        * kjs/string_object.cpp:

2008-06-28  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Oliver Hunt.

        Splits FunctionConstructor out of FunctionPrototype.h/cpp
        Splits NumberConstructor and NumberPrototype out of NumberObject.h/cpp
        Rename object_object.h/cpp to ObjectPrototype.h/cpp and split out ObjectConstructor.

        * API/JSCallbackConstructor.cpp:
        * API/JSClassRef.cpp:
        * API/JSObjectRef.cpp:
        * DerivedSources.make:
        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * VM/Machine.cpp:
        * kjs/AllInOneFile.cpp:
        * kjs/ArrayConstructor.cpp:
        * kjs/ArrayConstructor.h:
        * kjs/FunctionConstructor.cpp: Copied from JavaScriptCore/kjs/FunctionPrototype.cpp.
        * kjs/FunctionConstructor.h: Copied from JavaScriptCore/kjs/FunctionPrototype.h.
        * kjs/FunctionPrototype.cpp:
        * kjs/FunctionPrototype.h:
        * kjs/JSFunction.cpp:
        * kjs/JSGlobalObject.cpp:
        * kjs/JSImmediate.cpp:
        * kjs/MathObject.h:
        * kjs/NumberConstructor.cpp: Copied from JavaScriptCore/kjs/NumberObject.cpp.
        * kjs/NumberConstructor.h: Copied from JavaScriptCore/kjs/NumberObject.h.
        * kjs/NumberObject.cpp:
        * kjs/NumberObject.h:
        * kjs/NumberPrototype.cpp: Copied from JavaScriptCore/kjs/NumberObject.cpp.
        * kjs/NumberPrototype.h: Copied from JavaScriptCore/kjs/NumberObject.h.
        * kjs/ObjectConstructor.cpp: Copied from JavaScriptCore/kjs/object_object.cpp.
        * kjs/ObjectConstructor.h: Copied from JavaScriptCore/kjs/object_object.h.
        * kjs/ObjectPrototype.cpp: Copied from JavaScriptCore/kjs/object_object.cpp.
        * kjs/ObjectPrototype.h: Copied from JavaScriptCore/kjs/object_object.h.
        * kjs/RegExpObject.h:
        * kjs/Shell.cpp:
        * kjs/error_object.h:
        * kjs/internal.cpp:
        * kjs/nodes.cpp:
        * kjs/object_object.cpp: Removed.
        * kjs/object_object.h: Removed.
        * kjs/string_object.h:

2008-06-28  Darin Adler  <darin@apple.com>

        Reviewed by Oliver.

        - fix https://bugs.webkit.org/show_bug.cgi?id=19796
          optimize expressions with ignored results (especially post-increment)

        SunSpider says 0.9% faster.

        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::tempDestination): Create a new temporary for
        ignoredResult() too, just as we would for 0.
        (KJS::CodeGenerator::finalDestination): Use the temporary if the
        register passed in is ignoredResult() too, just as we would for 0.
        (KJS::CodeGenerator::destinationForAssignResult): Return 0 if the
        passed in register is ignoredResult(), just as we would for 0.
        (KJS::CodeGenerator::moveToDestinationIfNeeded): Return 0 if the
        register passed in is ignoredResult(). What matters is that we
        don't want to emit a move. The return value won't be looked at.
        (KJS::CodeGenerator::emitNode): Allow ignoredResult() and pass it
        through to the node's emitCode function.

        * VM/RegisterID.h:
        (KJS::ignoredResult): Added. Special value to indicate the result of
        a node will be ignored and need not be put in any register.

        * kjs/nodes.cpp:
        (KJS::NullNode::emitCode): Do nothing if dst == ignoredResult().
        (KJS::BooleanNode::emitCode): Ditto.
        (KJS::NumberNode::emitCode): Ditto.
        (KJS::StringNode::emitCode): Ditto.
        (KJS::RegExpNode::emitCode): Ditto.
        (KJS::ThisNode::emitCode): Ditto.
        (KJS::ResolveNode::emitCode): Do nothing if dst == ignoredResult() and
        the identifier resolves to a local variable.
        (KJS::ObjectLiteralNode::emitCode): Do nothing if dst == ignoredResult()
        and the object is empty.
        (KJS::PostIncResolveNode::emitCode): If dst == ignoredResult(), then do
        nothing for the local constant case, and do a pre-increment in all the
        other cases.
        (KJS::PostDecResolveNode::emitCode): Ditto.
        (KJS::PostIncBracketNode::emitCode): Ditto.
        (KJS::PostDecBracketNode::emitCode): Ditto.
        (KJS::PostIncDotNode::emitCode): Ditto.
        (KJS::PostDecDotNode::emitCode): Ditto.
        (KJS::DeleteValueNode::emitCode): Pass ignoredResult() when evaluating
        the expression.
        (KJS::VoidNode::emitCode): Ditto.
        (KJS::TypeOfResolveNode::emitCode): If dst == ignoredResult(), do nothing
        if the identifier resolves to a local variable, and don't bother generating
        a typeof opcode in the other case.
        (KJS::TypeOfValueNode::emitCode): Ditto.
        (KJS::PreIncResolveNode::emitCode): Do nothing if dst == ignoredResult() and
        the identifier resolves to a local constant.
        (KJS::PreDecResolveNode::emitCode): Ditto.
        (KJS::AssignResolveNode::emitCode): Turn ignoredResult() into 0 in a couple
        places, because we need to put the result into a register so we can assign
        it. At other sites this is taken care of by functions like finalDestination.
        (KJS::CommaNode::emitCode): Pass ignoredResult() when evaluating the first
        expression.
        (KJS::ForNode::emitCode): Pass ignoredResult() when evaluating the first and
        third expressions.
        (KJS::ForInNode::emitCode): Pass ignoredResult() when evaluating the first
        expression.

2008-06-28  Darin Adler  <darin@apple.com>

        Reviewed by Oliver.

        - https://bugs.webkit.org/show_bug.cgi?id=19787
          create most arrays from values in registers rather than with multiple put operations

        SunSpider says 0.8% faster.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump): Added argv and argc parameters to new_array.
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Ditto.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitNewArray): Added.
        * VM/CodeGenerator.h: Added ElementNode* argument to emitNewArray.

        * kjs/nodes.cpp:
        (KJS::ArrayNode::emitCode): Pass the ElementNode to emitNewArray so it can be
        initialized with as many elements as possible. If the array doesn't have any
        holes in it, that's all that's needed. If there are holes, then emit some separate
        put operations for the other values in the array and for the length as needed.

        * kjs/nodes.h: Added some accessors to ElementNode so the code generator can
        iterate through elements and generate code to evaluate them. Now ArrayNode does
        not need to be a friend. Also took out some unused PlacementNewAdoptType
        constructors.

2008-06-28  Darin Adler  <darin@apple.com>

        Reviewed by Oliver.

        * kjs/nodes.h: Remove obsolete PlacementNewAdopt constructors.
        We no longer mutate the AST in place.

2008-06-28  Jan Michael Alonzo  <jmalonzo@webkit.org>

        Reviewed by Oliver Hunt.

        Build fix

        * VM/Machine.cpp: include stdio.h for printf

2008-06-27  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver Hunt.

        Fix platforms that don't use AllInOne.cpp

        * kjs/BooleanConstructor.h:
        * kjs/BooleanPrototype.h:
        * kjs/FunctionPrototype.cpp:

2008-06-27  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Oliver Hunt.

        Splits ArrayConstructor out of ArrayPrototype.h/cpp
        Splits BooleanConstructor and BooleanPrototype out of BooleanObject.h/cpp

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * VM/Machine.cpp:
        * kjs/AllInOneFile.cpp:
        * kjs/ArrayConstructor.cpp: Copied from kjs/ArrayPrototype.cpp.
        * kjs/ArrayConstructor.h: Copied from kjs/ArrayPrototype.h.
        * kjs/ArrayPrototype.cpp:
        * kjs/ArrayPrototype.h:
        * kjs/BooleanConstructor.cpp: Copied from kjs/BooleanObject.cpp.
        * kjs/BooleanConstructor.h: Copied from kjs/BooleanObject.h.
        * kjs/BooleanObject.cpp:
        * kjs/BooleanObject.h:
        * kjs/BooleanPrototype.cpp: Copied from kjs/BooleanObject.cpp.
        * kjs/BooleanPrototype.h: Copied from kjs/BooleanObject.h.
        * kjs/CommonIdentifiers.h:
        * kjs/FunctionPrototype.cpp:
        * kjs/JSArray.cpp:
        * kjs/JSGlobalObject.cpp:
        * kjs/JSImmediate.cpp:
        * kjs/Shell.cpp:
        * kjs/internal.cpp:
        * kjs/nodes.cpp:
        * kjs/string_object.cpp:

2008-06-27  Oliver Hunt  <oliver@apple.com>

        Reviewed by Sam.

        Bug 18626: SQUIRRELFISH: support the "slow script" dialog <https://bugs.webkit.org/show_bug.cgi?id=18626>
        <rdar://problem/5973931> Slow script dialog needs to be reimplemented for squirrelfish

        Adds support for the slow script dialog in squirrelfish.  This requires the addition
        of three new op codes, op_loop, op_loop_if_true, and op_loop_if_less which have the
        same behaviour as their simple jump equivalents but have an additional time out check.

        Additional assertions were added to other jump instructions to prevent accidentally
        creating loops with jump types that do not support time out checks.

        Sunspider does not report a regression, however this appears very sensitive to code
        layout and hardware, so i would expect up to a 1% regression on other systems.

        Part of this required moving the old timeout logic from JSGlobalObject and into Machine
        which is the cause of a number of the larger diff blocks.

        * JavaScriptCore.exp:
        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitJumpIfTrue):
        (KJS::CodeGenerator::emitJumpScopes):
        * VM/ExceptionHelpers.cpp:
        (KJS::InterruptedExecutionError::isWatchdogException):
        (KJS::createInterruptedExecutionException):
        * VM/ExceptionHelpers.h:
        * VM/LabelID.h:
        * VM/Machine.cpp:
        (KJS::Machine::Machine):
        (KJS::Machine::throwException):
        (KJS::Machine::resetTimeoutCheck):
        (KJS::getCurrentTime):
        (KJS::Machine::checkTimeout):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        (KJS::Machine::setTimeoutTime):
        (KJS::Machine::startTimeoutCheck):
        (KJS::Machine::stopTimeoutCheck):
        (KJS::Machine::initTimeout):
        * VM/Opcode.cpp:
        (KJS::):
        * VM/Opcode.h:
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::init):
        (KJS::JSGlobalObject::setTimeoutTime):
        (KJS::JSGlobalObject::startTimeoutCheck):
        * kjs/JSGlobalObject.h:
        * kjs/JSObject.h:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):

2008-06-27  Jan Michael Alonzo  <jmalonzo@webkit.org>

        Gtk and Qt build fix: Remove RegisterFileStack from the build
        scripts.

        * GNUmakefile.am:
        * JavaScriptCore.pri:

2008-06-27  Adele Peterson  <adele@apple.com>

        Reviewed by Geoff.

        Build fixes. 

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * VM/RegisterFile.h:
        (KJS::RegisterFile::RegisterFile):
        * kjs/JSGlobalObject.cpp:
        * kjs/collector.cpp:

2008-06-27  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        One RegisterFile to rule them all!
        
        SunSpider reports a 0.2% speedup.

        This patch removes the RegisterFileStack abstraction and replaces it with
        a single register file that
        
        (a) allocates a fixed storage area, including a fixed area for global
        vars, so that no operation may cause the register file to reallocate
        
        and

        (b) swaps between global storage areas when executing code in different 
        global objects.
        
        This patch also changes the layout of the register file so that all call
        frames, including call frames for global code, get a header. This is
        required to support re-entrant global code. It also just makes things simpler.
        
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::addGlobalVar): New function. Differs from addVar in
        that
        
        (a) global vars don't contribute to a CodeBlock's numLocals count, since
        global storage is fixed and allocated at startup
        
        and
        
        (b) references to global vars get shifted to elide intermediate stack
        between "r" and the global storage area.
        
        * VM/Machine.cpp:
        (KJS::Machine::dumpRegisters): Updated this function to match the new
        register file layout, and added the ability to dump exact identifiers
        for the different parts of a call frame.
        
        (KJS::Machine::unwindCallFrame): Updated this function to match the new
        register file layout.
         
        (KJS::Machine::execute): Updated this function to initialize a call frame
        header for global code, and to swap global storage areas when switching
        to execution in a new global object.
        
        (KJS::Machine::privateExecute): Got rid of "safeForReentry" and re-reading
        of registerBase because the register file is always safe for reentry now,
        and registerBase never changes.
        
        * VM/Machine.h: Moved the call frame header enum from Machine to RegisterFile,
        to resolve a header dependency problem (a good sign that the enum belonged
        in RegisterFile all along!)

        * VM/RegisterFile.cpp:
        * VM/RegisterFile.h: Changed RegisterFile to mmap a fixed size register
        area. This allows us to avoid re-allocting the register file later on.
        Instead, we rely on the OS to allocate physical pages to the register
        file as necessary.

        * VM/RegisterFileStack.cpp: Removed. Tada!
        * VM/RegisterFileStack.h: Removed. Tada!

        * kjs/DebuggerCallFrame.cpp: Updated this class to match the new
        register file layout, greatly simplifying it in the process.

        * kjs/JSActivation.h:
        * kjs/JSActivation.cpp: Moved some of this logic up to JSVariableObject,
        since the global object now needs to be able to tear off its registers
        just like the activation object.

        * kjs/JSFunction.cpp: No need to fiddle with the register file anymore.

        * kjs/JSGlobalObject.h:
        * kjs/JSGlobalObject.cpp: Updated JSGlobalObject to support moving its
        global storage area into and out of the register file.

        * kjs/PropertySlot.cpp: No need to fiddle with the register file anymore.

        * kjs/collector.cpp: Renamed markStackObjectConservatively to
        markConservatively, since we don't just mark stack objects this way.
        
        Also, added code to mark the machine's register file.

        * kjs/config.h: Moved some platforms #defines from here...
        * wtf/Platform.h: ...to here, to support mmap/VirtualAlloc detection
        in RegisterFile.h.

2008-06-26  Mark Rowe  <mrowe@apple.com>

        Speculative fix for the Windows build.

        * kjs/JSImmediate.cpp:

2008-06-26  Mark Rowe  <mrowe@apple.com>

        Reviewed by Darin Adler and Geoff Garen.

        Fix the malloc zone introspection functions so that malloc_zone_statistics does not give
        bogus output in an application that uses JavaScriptCore.

        * kjs/CollectorHeapIntrospector.cpp:
        (KJS::CollectorHeapIntrospector::statistics): Return statistics about memory allocated by the collector.
        * kjs/CollectorHeapIntrospector.h:
        * wtf/FastMalloc.cpp: Zero out the statistics.  FastMalloc doesn't track this information at present.
        Returning zero for all values is preferable to returning bogus data.

2008-06-26  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - https://bugs.webkit.org/show_bug.cgi?id=19721
          speed up JavaScriptCore by not wrapping strings in objects just
          to call functions on them

        - optimize UString append and the replace function a bit

        SunSpider says 1.8% faster.

        * JavaScriptCore.exp: Updated.

        * VM/JSPropertyNameIterator.cpp: Added include of JSString.h, now needed
        because jsString returns a JSString*.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Removed the toObject call from native
        function calls. Also removed code to put the this value into a register.

        * kjs/BooleanObject.cpp:
        (KJS::booleanProtoFuncToString): Rewrite to handle false and true
        separately.

        * kjs/FunctionPrototype.cpp:
        (KJS::constructFunction): Use single-character append rather than building
        a string for each character.
        * kjs/JSFunction.cpp:
        (KJS::globalFuncUnescape): Ditto.

        * kjs/JSImmediate.cpp:
        (KJS::JSImmediate::prototype): Added. Gets the appropriate prototype for
        use with an immediate value. To be used instead of toObject when doing a
        get on an immediate value.
        * kjs/JSImmediate.h: Added prototype.

        * kjs/JSObject.cpp:
        (KJS::JSObject::toString): Tweaked formatting.

        * kjs/JSObject.h:
        (KJS::JSValue::get): Use prototype instead of toObject to avoid creating
        an object wrapper just to search for properties. This also saves an
        unnecessary hash table lookup since the object wrappers themselves don't
        have any properties.

        * kjs/JSString.h: Added toThisString and toThisJSString.

        * kjs/JSValue.cpp:
        (KJS::JSCell::toThisString): Added.
        (KJS::JSCell::toThisJSString): Added.
        (KJS::JSCell::getJSNumber): Added.
        (KJS::jsString): Changed return type to JSString*.
        (KJS::jsOwnedString): Ditto.

        * kjs/JSValue.h:
        (KJS::JSValue::toThisString): Added.
        (KJS::JSValue::toThisJSString): Added.
        (KJS::JSValue::getJSNumber): Added.

        * kjs/NumberObject.cpp:
        (KJS::NumberObject::getJSNumber): Added.
        (KJS::integer_part_noexp): Append C string directly rather than first
        turning it into a UString.
        (KJS::numberProtoFuncToString): Use getJSNumber to check if the value
        is a number rather than isObject(&NumberObject::info). This works for
        immediate numbers, number cells, and NumberObject instances.
        (KJS::numberProtoFuncToLocaleString): Ditto.
        (KJS::numberProtoFuncValueOf): Ditto.
        (KJS::numberProtoFuncToFixed): Ditto.
        (KJS::numberProtoFuncToExponential): Ditto.
        (KJS::numberProtoFuncToPrecision): Ditto.
        * kjs/NumberObject.h: Added getJSNumber.

        * kjs/PropertySlot.cpp: Tweaked comment.

        * kjs/internal.cpp:
        (KJS::JSString::toThisString): Added.
        (KJS::JSString::toThisJSString): Added.
        (KJS::JSString::getOwnPropertySlot): Changed code that searches the
        prototype chain to start with the string prototype and not create a
        string object.
        (KJS::JSNumberCell::toThisString): Added.
        (KJS::JSNumberCell::getJSNumber): Added.

        * kjs/lookup.cpp:
        (KJS::staticFunctionGetter): Moved here, because there's no point in
        having a function that's only used for a function pointer be inline.
        (KJS::setUpStaticFunctionSlot): New function for getStaticFunctionSlot.

        * kjs/lookup.h:
        (KJS::staticValueGetter): Don't mark this inline. It doesn't make sense
        to have a function that's only used for a function pointer be inline.
        (KJS::getStaticFunctionSlot): Changed to get properties from the parent
        first before doing any handling of functions. This is the fastest way
        to return the function once the initial setup is done.

        * kjs/string_object.cpp:
        (KJS::StringObject::getPropertyNames): Call value() instead of getString(),
        avoiding an unnecessary virtual function call (the call to the type()
        function in the implementation of the isString() function).
        (KJS::StringObject::toString): Added.
        (KJS::StringObject::toThisString): Added.
        (KJS::StringObject::toThisJSString): Added.
        (KJS::substituteBackreferences): Rewrote to use a appending algorithm
        instead of a the old one that tried to replace in place.
        (KJS::stringProtoFuncReplace): Merged this function and the replace function.
        Replaced the hand-rolled dynamic arrays for source ranges and replacements
        with Vector.
        (KJS::stringProtoFuncToString): Handle JSString as well as StringObject.
        Removed the separate valueOf implementation, since it can just share this.
        (KJS::stringProtoFuncCharAt): Use toThisString, which handles JSString as
        well as StringObject, and is slightly more efficient than the old code too.
        (KJS::stringProtoFuncCharCodeAt): Ditto.
        (KJS::stringProtoFuncConcat): Ditto.
        (KJS::stringProtoFuncIndexOf): Ditto.
        (KJS::stringProtoFuncLastIndexOf): Ditto.
        (KJS::stringProtoFuncMatch): Ditto.
        (KJS::stringProtoFuncSearch): Ditto.
        (KJS::stringProtoFuncSlice): Ditto.
        (KJS::stringProtoFuncSplit): Ditto.
        (KJS::stringProtoFuncSubstr): Ditto.
        (KJS::stringProtoFuncSubstring): Ditto.
        (KJS::stringProtoFuncToLowerCase): Use toThisJSString.
        (KJS::stringProtoFuncToUpperCase): Ditto.
        (KJS::stringProtoFuncToLocaleLowerCase): Ditto.
        (KJS::stringProtoFuncToLocaleUpperCase): Ditto.
        (KJS::stringProtoFuncLocaleCompare): Ditto.
        (KJS::stringProtoFuncBig): Use toThisString.
        (KJS::stringProtoFuncSmall): Ditto.
        (KJS::stringProtoFuncBlink): Ditto.
        (KJS::stringProtoFuncBold): Ditto.
        (KJS::stringProtoFuncFixed): Ditto.
        (KJS::stringProtoFuncItalics): Ditto.
        (KJS::stringProtoFuncStrike): Ditto.
        (KJS::stringProtoFuncSub): Ditto.
        (KJS::stringProtoFuncSup): Ditto.
        (KJS::stringProtoFuncFontcolor): Ditto.
        (KJS::stringProtoFuncFontsize): Ditto.
        (KJS::stringProtoFuncAnchor): Ditto.
        (KJS::stringProtoFuncLink): Ditto.

        * kjs/string_object.h: Added toString, toThisString, and toThisJSString.

        * kjs/ustring.cpp:
        (KJS::UString::append): Added a version that takes a character pointer and
        size, so we don't have to create a UString just to append to another UString.
        * kjs/ustring.h:

2008-06-26  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Maciej.

        Make JSGlobalData per-thread.

        No change on SunSpider total.

        * wtf/ThreadSpecific.h: Re-enabled the actual implementation.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::~JSGlobalObject): Re-added a JSLock-related assertion. We'll probably
        want to preserve these somehow to keep legacy behavior in working condition.
        (KJS::JSGlobalObject::init): Initialize globalData pointer earlier, so that it is ready
        when updating JSGlobalObject linked list.

        * kjs/JSGlobalObject.h: (KJS::JSGlobalObject::head): Changed head() to be non-static, and
        to use JSGlobalData associated with the current object.

        * kjs/InitializeThreading.cpp: (KJS::initializeThreadingOnce): Removed a no longer needed
        Heap::registerAsMainThread() call.

        * kjs/JSGlobalData.h: Removed a lying lie comment - parserObjectExtraRefCounts is not
        transient, and while newParserObjects may conceptually be such, there is still some node
        manipulation going on outside Parser::parse which touches it.

        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::~JSGlobalData): Delete recently added members.
        (KJS::JSGlobalData::sharedInstance): Actually use a separate instance.

        * kjs/collector.cpp:
        (KJS::Heap::Heap):
        (KJS::Heap::~Heap): Added a destructor, which unconditionally deletes everything.
        (KJS::Heap::sweep): Removed code related to "collect on main thread only" logic.
        (KJS::Heap::collect): Ditto.
        (KJS::Heap::globalObjectCount): Explicitly use per-thread instance of JSGlobalObject linked
        list now that JSGlobalObject::head() is not static. Curently, WebCoreStatistics methods only
        work with the main thread currently anyway.
        (KJS::Heap::protectedGlobalObjectCount): Ditto.

        * kjs/collector.h: Removed code related to "collect on main thread only" logic.

        * JavaScriptCore.exp: Removed Heap::collectOnMainThreadOnly.

2008-06-26  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        https://bugs.webkit.org/show_bug.cgi?id=19767
        REGRESSION: Crash in sort() when visiting http://www.onnyturf.com/subway/

        * kjs/JSArray.cpp: (KJS::AVLTreeAbstractorForArrayCompare::set_balance_factor):
        Made changing balance factor from -1 to +1 work correctly.

        * wtf/AVLTree.h: (KJS::AVLTreeDefaultBSet::operator[]): Added an assertion that catches
        this slightly earlier.

2008-06-25  Timothy Hatcher  <timothy@apple.com>

        Fixes an ASSERT in the profiler when starting multiple profiles
        with the same name inside the same function/program.

        Reviewed by Kevin McCullough.

        * profiler/Profile.cpp:
        (KJS::Profile::Profile): Initialize m_stoppedCallDepth to zero.
        (KJS::Profile::stopProfiling): Set the current node to the parent,
        because we are in a call that will not get a didExecute call.
        (KJS::Profile::removeProfile): Increment m_stoppedCallDepth to
        account for didExecute not being called for profile.
        (KJS::Profile::willExecute): Increment m_stoppedCallDepth if stopped.
        (KJS::Profile::didExecute): Decrement m_stoppedCallDepth if stopped and
        greater than zero, and return early.
        * profiler/Profile.h: Added stoppedProfiling().
        * profiler/Profiler.cpp:
        (KJS::Profiler::findProfile): Removed.
        (KJS::Profiler::startProfiling): Don't return early for stopped profiles.
        (KJS::Profiler::stopProfiling): Skipp stopped profiles.
        (KJS::Profiler::didFinishAllExecution): Code clean-up.
        * profiler/Profiler.h: Removed findProfile.

2008-06-25  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Alexey Proskuryakov.

        Attempt to fix Windows debug build. The compiler gives a warning when
        Structured Exception Handling and destructors are used in the same
        function. Using manual locking and unlocking instead of constructors
        and destructors should fix the warning.

        * kjs/Shell.cpp:
        (main):

2008-06-25  Alexey Proskuryakov  <ap@webkit.org>

        Forgot to address a review comment about better names for tracked objects, doing it now.

        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::JSGlobalData):
        * kjs/JSGlobalData.h:
        * kjs/nodes.cpp:
        (KJS::ParserRefCounted::ParserRefCounted):
        (KJS::ParserRefCounted::ref):
        (KJS::ParserRefCounted::deref):
        (KJS::ParserRefCounted::hasOneRef):
        (KJS::ParserRefCounted::deleteNewObjects):

2008-06-25  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff.

        Remove more threadInstance() calls.

        * kjs/JSFunction.cpp:
        (KJS::JSFunction::getParameterName):
        (KJS::IndexToNameMap::unMap):
        (KJS::Arguments::deleteProperty):
        * kjs/JSFunction.h:
        Access nullIdentifier without going to thread specific storage.

        * JavaScriptCore.exp:
        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::JSGlobalData):
        * kjs/JSGlobalData.h:
        * kjs/Parser.cpp:
        (KJS::Parser::parse):
        * kjs/Parser.h:
        (KJS::ParserRefCountedData::ParserRefCountedData):
        (KJS::Parser::parse):
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::ParserRefCounted::ParserRefCounted):
        (KJS::ParserRefCounted::ref):
        (KJS::ParserRefCounted::deref):
        (KJS::ParserRefCounted::hasOneRef):
        (KJS::ParserRefCounted::deleteNewObjects):
        (KJS::Node::Node):
        (KJS::StatementNode::StatementNode):
        (KJS::BreakpointCheckStatement::BreakpointCheckStatement):
        (KJS::ConstDeclNode::ConstDeclNode):
        (KJS::BlockNode::BlockNode):
        (KJS::ForInNode::ForInNode):
        (KJS::ScopeNode::ScopeNode):
        (KJS::ProgramNode::ProgramNode):
        (KJS::ProgramNode::create):
        (KJS::EvalNode::EvalNode):
        (KJS::EvalNode::create):
        (KJS::FunctionBodyNode::FunctionBodyNode):
        (KJS::FunctionBodyNode::create):
        * kjs/nodes.h:
        (KJS::ExpressionNode::):
        (KJS::NullNode::):
        (KJS::BooleanNode::):
        (KJS::NumberNode::):
        (KJS::ImmediateNumberNode::):
        (KJS::StringNode::):
        (KJS::RegExpNode::):
        (KJS::ThisNode::):
        (KJS::ResolveNode::):
        (KJS::ElementNode::):
        (KJS::ArrayNode::):
        (KJS::PropertyNode::):
        (KJS::PropertyListNode::):
        (KJS::ObjectLiteralNode::):
        (KJS::BracketAccessorNode::):
        (KJS::DotAccessorNode::):
        (KJS::ArgumentListNode::):
        (KJS::ArgumentsNode::):
        (KJS::NewExprNode::):
        (KJS::EvalFunctionCallNode::):
        (KJS::FunctionCallValueNode::):
        (KJS::FunctionCallResolveNode::):
        (KJS::FunctionCallBracketNode::):
        (KJS::FunctionCallDotNode::):
        (KJS::PrePostResolveNode::):
        (KJS::PostIncResolveNode::):
        (KJS::PostDecResolveNode::):
        (KJS::PostfixBracketNode::):
        (KJS::PostIncBracketNode::):
        (KJS::PostDecBracketNode::):
        (KJS::PostfixDotNode::):
        (KJS::PostIncDotNode::):
        (KJS::PostDecDotNode::):
        (KJS::PostfixErrorNode::):
        (KJS::DeleteResolveNode::):
        (KJS::DeleteBracketNode::):
        (KJS::DeleteDotNode::):
        (KJS::DeleteValueNode::):
        (KJS::VoidNode::):
        (KJS::TypeOfResolveNode::):
        (KJS::TypeOfValueNode::):
        (KJS::PreIncResolveNode::):
        (KJS::PreDecResolveNode::):
        (KJS::PrefixBracketNode::):
        (KJS::PreIncBracketNode::):
        (KJS::PreDecBracketNode::):
        (KJS::PrefixDotNode::):
        (KJS::PreIncDotNode::):
        (KJS::PreDecDotNode::):
        (KJS::PrefixErrorNode::):
        (KJS::UnaryOpNode::UnaryOpNode):
        (KJS::UnaryPlusNode::):
        (KJS::NegateNode::):
        (KJS::BitwiseNotNode::):
        (KJS::LogicalNotNode::):
        (KJS::BinaryOpNode::BinaryOpNode):
        (KJS::ReverseBinaryOpNode::ReverseBinaryOpNode):
        (KJS::MultNode::):
        (KJS::DivNode::):
        (KJS::ModNode::):
        (KJS::AddNode::):
        (KJS::SubNode::):
        (KJS::LeftShiftNode::):
        (KJS::RightShiftNode::):
        (KJS::UnsignedRightShiftNode::):
        (KJS::LessNode::):
        (KJS::GreaterNode::):
        (KJS::LessEqNode::):
        (KJS::GreaterEqNode::):
        (KJS::InstanceOfNode::):
        (KJS::InNode::):
        (KJS::EqualNode::):
        (KJS::NotEqualNode::):
        (KJS::StrictEqualNode::):
        (KJS::NotStrictEqualNode::):
        (KJS::BitAndNode::):
        (KJS::BitOrNode::):
        (KJS::BitXOrNode::):
        (KJS::LogicalAndNode::):
        (KJS::LogicalOrNode::):
        (KJS::ConditionalNode::):
        (KJS::ReadModifyResolveNode::):
        (KJS::AssignResolveNode::):
        (KJS::ReadModifyBracketNode::):
        (KJS::AssignBracketNode::):
        (KJS::AssignDotNode::):
        (KJS::ReadModifyDotNode::):
        (KJS::AssignErrorNode::):
        (KJS::CommaNode::):
        (KJS::VarDeclCommaNode::):
        (KJS::ConstStatementNode::):
        (KJS::SourceElements::SourceElements):
        (KJS::EmptyStatementNode::):
        (KJS::DebuggerStatementNode::):
        (KJS::ExprStatementNode::):
        (KJS::VarStatementNode::):
        (KJS::IfNode::):
        (KJS::IfElseNode::):
        (KJS::DoWhileNode::):
        (KJS::WhileNode::):
        (KJS::ForNode::):
        (KJS::ContinueNode::):
        (KJS::BreakNode::):
        (KJS::ReturnNode::):
        (KJS::WithNode::):
        (KJS::LabelNode::):
        (KJS::ThrowNode::):
        (KJS::TryNode::):
        (KJS::ParameterNode::):
        (KJS::FuncExprNode::):
        (KJS::FuncDeclNode::):
        (KJS::CaseClauseNode::):
        (KJS::ClauseListNode::):
        (KJS::CaseBlockNode::):
        (KJS::SwitchNode::):
        Changed ParserRefCounted to hold a JSGlobalData pointer, and used it to replace
        threadInstance calls.

2008-06-24  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Alexey Proskuryakov.

        Make the JavaScript shell collect the heap from main() instead of
        jscmain() to suppress leak messages in debug builds.

        * kjs/Shell.cpp:
        (main):
        (jscmain):

2008-06-24  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Make the conversion of the pair (less, jtrue) to jless use register
        reference counting information for safety instead of requiring callers
        to decide whether it is safe.

        No changes on SunSpider codegen.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitJumpIfTrue):
        * VM/CodeGenerator.h:
        * kjs/nodes.cpp:
        (KJS::DoWhileNode::emitCode):
        (KJS::WhileNode::emitCode):
        (KJS::ForNode::emitCode):
        (KJS::CaseBlockNode::emitCodeForBlock):

2008-06-24  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        <rdar://problem/6031594> JSProfiler: Profiler goes into an infinite
        loop sometimes.
        <rdar://problem/6031603> JSProfiler: Profiler asserts in debug and
        give the wrong times in release

        Fixed two issues found by Tim in the same test.

        * profiler/Profile.cpp:
        (KJS::Profile::removeProfileStart): No longer take profile's time from
        all ancestors, but instead attribute it to its parent.  Also add an
        Assert to ensure we only delete the child we mean to.
        (KJS::Profile::removeProfileEnd): Ditto for profileEnd.
        (KJS::Profile::didExecute): Cleaned up the execution order and correctly
        attribute all of the parent's time to the new node.
        * profiler/ProfileNode.cpp: If this node does not have a startTime it
        should not get a giant total time, but instead be 0.
        (KJS::ProfileNode::endAndRecordCall):
        * profiler/ProfileNode.h:
        (KJS::ProfileNode::removeChild): Should reset the sibling pointers since
        one of them has been removed.

2008-06-24  Darin Adler  <darin@apple.com>

        Reviewed by Cameron.

        - fix https://bugs.webkit.org/show_bug.cgi?id=19739
          REGRESSION: fast/js/property-getters-and-setters.html fails

        * kjs/JSObject.cpp:
        (KJS::JSObject::put): Remove an untested optimization I checked in by accident.
        The two loops up the prototype chain both need to start from this; instead the
        second loop was starting where the first loop left off.

2008-06-24  Steve Falkenburg  <sfalken@apple.com>

        Build fix.

        * kjs/nodes.cpp:

2008-06-24  Joerg Bornemann  <joerg.bornemann@trolltech.com>

        Reviewed by Simon.

        For the Qt build on Windows don't depend on the presence of GNU CPP
        but use MSVC's preprocessor instead.
        dftables accepts a --preprocessor option which is set in pcre.pri for MSVC platforms.

        * pcre/dftables: Added support for specifying the preprocessor command
        to use via --preprocessor, similar to
        WebCore/bindings/scripts/generate-bindings.pl.
        * pcre/pcre.pri: Pass --preprocessor='cl /e' to dftables, or more
        generally speaking QMAKE_CC /E for the win32-msvc buildspecs.

2008-06-24  Simon Hausmann  <hausmann@webkit.org>

        Fix the Qt build, added missing include.

        * kjs/PropertySlot.cpp:

2008-06-24  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Cameron Zwarich.

        Make ParserRefCountedCounter actually perform a leak check.

        * kjs/nodes.cpp:
        (KJS::ParserRefCountedCounter::~ParserRefCountedCounter): Check for leaks in destructor,
        not in constructor.
        (KJS::ParserRefCountedCounter::increment):
        (KJS::ParserRefCountedCounter::decrement):
        (KJS::ParserRefCounted::ParserRefCounted):
        (KJS::ParserRefCounted::~ParserRefCounted):
        While at it, also made counting thread-safe.

2008-06-24  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 19730: REGRESSION (r34497): Text in alerts in "Leisure suit Larry" is not wrapped
        <https://bugs.webkit.org/show_bug.cgi?id=19730>

        Do not convert the pair (less, jtrue) to jless when jtrue is a jump
        target. An example of this is when the condition of a while loop is a
        LogicalOrNode.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitLabel):

2008-06-20  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Reviewed by Adam Roben.

        Fix compile with MinGW.

        * kjs/Shell.cpp:
        * wtf/Threading.h:
        (WTF::atomicIncrement):
        (WTF::atomicDecrement):

2008-06-23  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        Prepration for returning memory to the OS on Windows.  Track whether a portion of a span of memory was returned to the OS.
        If it was, ask that it be recommitted before returning it to the application as an allocated region.

        * wtf/FastMalloc.cpp:
        (WTF::TCMalloc_PageHeap::New):  If the span was decommitted, ask that it be recommitted before returning it.
        (WTF::TCMalloc_PageHeap::AllocLarge):  Ditto.
        (WTF::TCMalloc_PageHeap::Carve):  When splitting a span, ensure that the decommitted state propogates to the two new spans.
        (WTF::TCMalloc_PageHeap::Delete):  When merging a span, ensure that the resulting span is marked as decommitted if any of the
        spans being merged were marked as decommitted.
        (WTF::TCMalloc_PageHeap::IncrementalScavenge):  Mark as decommitted after releasing the span.
        (WTF::TCMalloc_Central_FreeList::FetchFromSpans): Add an assertion to catch a decommitted span being returned to the application
        without first being recommitted.
        (WTF::TCMalloc_Central_FreeList::Populate): Ditto.
        * wtf/TCSystemAlloc.cpp: Stub out TCMalloc_SystemCommit.
        * wtf/TCSystemAlloc.h:

2008-06-23  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        Remove the sample member of Span when NO_TCMALLOC_SAMPLES is defined.

        * wtf/FastMalloc.cpp:
        (WTF::TCMalloc_PageHeap::Delete): Only update Span::sample if NO_TCMALLOC_SAMPLES is not defined.
        (WTF::TCMallocStats::do_free):  Ditto.

2008-06-23  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - work toward https://bugs.webkit.org/show_bug.cgi?id=19721

        More preparation toward making functions work on primitive types without
        creating wrapper objects. No speedup this time, but prepares for a future
        speedup without slowing things down.

        SunSpider reports no change.

        - Eliminated the implementsCall, callAsFunction and construct virtual
          functions from JSObject. Instead, the CallData and ConstructData for
          a native function includes a function pointer that the caller can use
          directly. Changed all call sites to use CallData and ConstructData.

        - Changed the "this" argument to native functions to be a JSValue rather
          than a JSObject. This prepares us for passing primitives into these
          functions. The conversion to an object now must be done inside the
          function. Critically, if it's a function that can be called on a DOM
          window object, then we have to be sure to call toThisObject on the
          argument before we use it for anything even if it's already an object.

        - Eliminated the practice of using constructor objects in the global
          object to make objects of the various basic types. Since these
          constructors can't be replaced by script, there's no reason to involve
          a constructor object at all. Added functions to do the construction
          directly.

        - Made some more class members private and protected, including virtual
          function overrides. This can catch code using unnecessarily slow virtual
          function code paths when the type of an object is known statically. If we
          later find a new reason use the members outside the class it's easy to
          make them public again.

        - Moved the declarations of the native implementations for functions out
          of header files. These can have internal linkage and be declared inside
          the source file.

        - Changed PrototypeFunction to take function pointers with the right
          arguments to be put directly into CallData. This eliminates the
          need to have a separate PrototypeReflexiveFunction, and reveals that the
          real purpose of that class included something else specific to eval --
          storage of a cached global object. So renamed PrototypeReflexiveFunction
          to GlobalEvalFunction.

        * API/JSCallbackConstructor.cpp:
        (KJS::constructJSCallback):
        (KJS::JSCallbackConstructor::getConstructData):
        * API/JSCallbackConstructor.h:
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::implementsHasInstance):
        (KJS::JSCallbackFunction::call):
        (KJS::JSCallbackFunction::getCallData):
        * API/JSCallbackFunction.h:
        (KJS::JSCallbackFunction::classInfo):
        * API/JSCallbackObject.h:
        (KJS::JSCallbackObject::classRef):
        (KJS::JSCallbackObject::classInfo):
        * API/JSCallbackObjectFunctions.h:
        (KJS::::getConstructData):
        (KJS::::construct):
        (KJS::::getCallData):
        (KJS::::call):
        * API/JSObjectRef.cpp:
        (JSObjectMakeFunction):
        (JSObjectIsFunction):
        (JSObjectCallAsFunction):
        (JSObjectCallAsConstructor):
        * JavaScriptCore.exp:
        * VM/Machine.cpp:
        (KJS::jsTypeStringForValue):
        (KJS::Machine::privateExecute):
        * kjs/ArrayPrototype.cpp:
        (KJS::arrayProtoFuncToString):
        (KJS::arrayProtoFuncToLocaleString):
        (KJS::arrayProtoFuncJoin):
        (KJS::arrayProtoFuncConcat):
        (KJS::arrayProtoFuncPop):
        (KJS::arrayProtoFuncPush):
        (KJS::arrayProtoFuncReverse):
        (KJS::arrayProtoFuncShift):
        (KJS::arrayProtoFuncSlice):
        (KJS::arrayProtoFuncSort):
        (KJS::arrayProtoFuncSplice):
        (KJS::arrayProtoFuncUnShift):
        (KJS::arrayProtoFuncFilter):
        (KJS::arrayProtoFuncMap):
        (KJS::arrayProtoFuncEvery):
        (KJS::arrayProtoFuncForEach):
        (KJS::arrayProtoFuncSome):
        (KJS::arrayProtoFuncIndexOf):
        (KJS::arrayProtoFuncLastIndexOf):
        (KJS::ArrayConstructor::ArrayConstructor):
        (KJS::constructArrayWithSizeQuirk):
        (KJS::constructWithArrayConstructor):
        (KJS::ArrayConstructor::getConstructData):
        (KJS::callArrayConstructor):
        (KJS::ArrayConstructor::getCallData):
        * kjs/ArrayPrototype.h:
        * kjs/BooleanObject.cpp:
        (KJS::booleanProtoFuncToString):
        (KJS::booleanProtoFuncValueOf):
        (KJS::constructBoolean):
        (KJS::constructWithBooleanConstructor):
        (KJS::BooleanConstructor::getConstructData):
        (KJS::callBooleanConstructor):
        (KJS::BooleanConstructor::getCallData):
        (KJS::constructBooleanFromImmediateBoolean):
        * kjs/BooleanObject.h:
        * kjs/CallData.h:
        (KJS::):
        * kjs/ConstructData.h:
        (KJS::):
        * kjs/FunctionPrototype.cpp:
        (KJS::callFunctionPrototype):
        (KJS::FunctionPrototype::getCallData):
        (KJS::functionProtoFuncToString):
        (KJS::functionProtoFuncApply):
        (KJS::functionProtoFuncCall):
        (KJS::constructWithFunctionConstructor):
        (KJS::FunctionConstructor::getConstructData):
        (KJS::callFunctionConstructor):
        (KJS::FunctionConstructor::getCallData):
        (KJS::constructFunction):
        * kjs/FunctionPrototype.h:
        * kjs/JSArray.cpp:
        (KJS::AVLTreeAbstractorForArrayCompare::compare_key_key):
        (KJS::JSArray::sort):
        (KJS::constructEmptyArray):
        (KJS::constructArray):
        * kjs/JSArray.h:
        (KJS::JSArray::classInfo):
        * kjs/JSFunction.cpp:
        (KJS::JSFunction::call):
        (KJS::globalFuncEval):
        (KJS::globalFuncParseInt):
        (KJS::globalFuncParseFloat):
        (KJS::globalFuncIsNaN):
        (KJS::globalFuncIsFinite):
        (KJS::globalFuncDecodeURI):
        (KJS::globalFuncDecodeURIComponent):
        (KJS::globalFuncEncodeURI):
        (KJS::globalFuncEncodeURIComponent):
        (KJS::globalFuncEscape):
        (KJS::globalFuncUnescape):
        (KJS::globalFuncKJSPrint):
        (KJS::PrototypeFunction::PrototypeFunction):
        (KJS::PrototypeFunction::getCallData):
        (KJS::GlobalEvalFunction::GlobalEvalFunction):
        (KJS::GlobalEvalFunction::mark):
        * kjs/JSFunction.h:
        (KJS::InternalFunction::classInfo):
        (KJS::InternalFunction::functionName):
        (KJS::JSFunction::classInfo):
        (KJS::GlobalEvalFunction::cachedGlobalObject):
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::reset):
        (KJS::JSGlobalObject::mark):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::JSGlobalObject):
        (KJS::JSGlobalObject::evalFunction):
        * kjs/JSImmediate.cpp:
        (KJS::JSImmediate::toObject):
        * kjs/JSNotAnObject.cpp:
        * kjs/JSNotAnObject.h:
        * kjs/JSObject.cpp:
        (KJS::JSObject::put):
        (KJS::callDefaultValueFunction):
        (KJS::JSObject::defaultValue):
        (KJS::JSObject::lookupGetter):
        (KJS::JSObject::lookupSetter):
        (KJS::JSObject::hasInstance):
        (KJS::JSObject::fillGetterPropertySlot):
        (KJS::Error::create):
        (KJS::constructEmptyObject):
        * kjs/JSObject.h:
        (KJS::GetterSetter::GetterSetter):
        (KJS::GetterSetter::getter):
        (KJS::GetterSetter::setGetter):
        (KJS::GetterSetter::setter):
        (KJS::GetterSetter::setSetter):
        * kjs/JSValue.cpp:
        (KJS::JSCell::deleteProperty):
        (KJS::call):
        (KJS::construct):
        * kjs/JSValue.h:
        * kjs/MathObject.cpp:
        (KJS::mathProtoFuncAbs):
        (KJS::mathProtoFuncACos):
        (KJS::mathProtoFuncASin):
        (KJS::mathProtoFuncATan):
        (KJS::mathProtoFuncATan2):
        (KJS::mathProtoFuncCeil):
        (KJS::mathProtoFuncCos):
        (KJS::mathProtoFuncExp):
        (KJS::mathProtoFuncFloor):
        (KJS::mathProtoFuncLog):
        (KJS::mathProtoFuncMax):
        (KJS::mathProtoFuncMin):
        (KJS::mathProtoFuncPow):
        (KJS::mathProtoFuncRandom):
        (KJS::mathProtoFuncRound):
        (KJS::mathProtoFuncSin):
        (KJS::mathProtoFuncSqrt):
        (KJS::mathProtoFuncTan):
        * kjs/MathObject.h:
        * kjs/NumberObject.cpp:
        (KJS::numberProtoFuncToString):
        (KJS::numberProtoFuncToLocaleString):
        (KJS::numberProtoFuncValueOf):
        (KJS::numberProtoFuncToFixed):
        (KJS::numberProtoFuncToExponential):
        (KJS::numberProtoFuncToPrecision):
        (KJS::NumberConstructor::NumberConstructor):
        (KJS::constructWithNumberConstructor):
        (KJS::NumberConstructor::getConstructData):
        (KJS::callNumberConstructor):
        (KJS::NumberConstructor::getCallData):
        (KJS::constructNumber):
        (KJS::constructNumberFromImmediateNumber):
        * kjs/NumberObject.h:
        (KJS::NumberObject::classInfo):
        (KJS::NumberConstructor::classInfo):
        * kjs/PropertySlot.cpp:
        (KJS::PropertySlot::functionGetter):
        * kjs/RegExpObject.cpp:
        (KJS::regExpProtoFuncTest):
        (KJS::regExpProtoFuncExec):
        (KJS::regExpProtoFuncCompile):
        (KJS::regExpProtoFuncToString):
        (KJS::callRegExpObject):
        (KJS::RegExpObject::getCallData):
        (KJS::constructRegExp):
        (KJS::constructWithRegExpConstructor):
        (KJS::RegExpConstructor::getConstructData):
        (KJS::callRegExpConstructor):
        (KJS::RegExpConstructor::getCallData):
        * kjs/RegExpObject.h:
        (KJS::RegExpConstructor::classInfo):
        * kjs/Shell.cpp:
        (GlobalObject::GlobalObject):
        (functionPrint):
        (functionDebug):
        (functionGC):
        (functionVersion):
        (functionRun):
        (functionLoad):
        (functionReadline):
        (functionQuit):
        * kjs/date_object.cpp:
        (KJS::gmtoffset):
        (KJS::formatLocaleDate):
        (KJS::fillStructuresUsingDateArgs):
        (KJS::DateInstance::getTime):
        (KJS::DateInstance::getUTCTime):
        (KJS::DateConstructor::DateConstructor):
        (KJS::constructDate):
        (KJS::DateConstructor::getConstructData):
        (KJS::callDate):
        (KJS::DateConstructor::getCallData):
        (KJS::dateParse):
        (KJS::dateNow):
        (KJS::dateUTC):
        (KJS::dateProtoFuncToString):
        (KJS::dateProtoFuncToUTCString):
        (KJS::dateProtoFuncToDateString):
        (KJS::dateProtoFuncToTimeString):
        (KJS::dateProtoFuncToLocaleString):
        (KJS::dateProtoFuncToLocaleDateString):
        (KJS::dateProtoFuncToLocaleTimeString):
        (KJS::dateProtoFuncValueOf):
        (KJS::dateProtoFuncGetTime):
        (KJS::dateProtoFuncGetFullYear):
        (KJS::dateProtoFuncGetUTCFullYear):
        (KJS::dateProtoFuncToGMTString):
        (KJS::dateProtoFuncGetMonth):
        (KJS::dateProtoFuncGetUTCMonth):
        (KJS::dateProtoFuncGetDate):
        (KJS::dateProtoFuncGetUTCDate):
        (KJS::dateProtoFuncGetDay):
        (KJS::dateProtoFuncGetUTCDay):
        (KJS::dateProtoFuncGetHours):
        (KJS::dateProtoFuncGetUTCHours):
        (KJS::dateProtoFuncGetMinutes):
        (KJS::dateProtoFuncGetUTCMinutes):
        (KJS::dateProtoFuncGetSeconds):
        (KJS::dateProtoFuncGetUTCSeconds):
        (KJS::dateProtoFuncGetMilliSeconds):
        (KJS::dateProtoFuncGetUTCMilliseconds):
        (KJS::dateProtoFuncGetTimezoneOffset):
        (KJS::dateProtoFuncSetTime):
        (KJS::setNewValueFromTimeArgs):
        (KJS::setNewValueFromDateArgs):
        (KJS::dateProtoFuncSetMilliSeconds):
        (KJS::dateProtoFuncSetUTCMilliseconds):
        (KJS::dateProtoFuncSetSeconds):
        (KJS::dateProtoFuncSetUTCSeconds):
        (KJS::dateProtoFuncSetMinutes):
        (KJS::dateProtoFuncSetUTCMinutes):
        (KJS::dateProtoFuncSetHours):
        (KJS::dateProtoFuncSetUTCHours):
        (KJS::dateProtoFuncSetDate):
        (KJS::dateProtoFuncSetUTCDate):
        (KJS::dateProtoFuncSetMonth):
        (KJS::dateProtoFuncSetUTCMonth):
        (KJS::dateProtoFuncSetFullYear):
        (KJS::dateProtoFuncSetUTCFullYear):
        (KJS::dateProtoFuncSetYear):
        (KJS::dateProtoFuncGetYear):
        * kjs/date_object.h:
        (KJS::DateInstance::internalNumber):
        (KJS::DateInstance::classInfo):
        * kjs/error_object.cpp:
        (KJS::errorProtoFuncToString):
        (KJS::constructError):
        (KJS::constructWithErrorConstructor):
        (KJS::ErrorConstructor::getConstructData):
        (KJS::callErrorConstructor):
        (KJS::ErrorConstructor::getCallData):
        (KJS::NativeErrorConstructor::construct):
        (KJS::constructWithNativeErrorConstructor):
        (KJS::NativeErrorConstructor::getConstructData):
        (KJS::callNativeErrorConstructor):
        (KJS::NativeErrorConstructor::getCallData):
        * kjs/error_object.h:
        (KJS::NativeErrorConstructor::classInfo):
        * kjs/internal.cpp:
        (KJS::JSNumberCell::toObject):
        (KJS::JSNumberCell::toThisObject):
        (KJS::GetterSetter::mark):
        (KJS::GetterSetter::toPrimitive):
        (KJS::GetterSetter::toBoolean):
        (KJS::GetterSetter::toNumber):
        (KJS::GetterSetter::toString):
        (KJS::GetterSetter::toObject):
        (KJS::InternalFunction::InternalFunction):
        (KJS::InternalFunction::implementsHasInstance):
        * kjs/lookup.h:
        (KJS::HashEntry::):
        * kjs/nodes.cpp:
        (KJS::FuncDeclNode::makeFunction):
        (KJS::FuncExprNode::makeFunction):
        * kjs/object_object.cpp:
        (KJS::objectProtoFuncValueOf):
        (KJS::objectProtoFuncHasOwnProperty):
        (KJS::objectProtoFuncIsPrototypeOf):
        (KJS::objectProtoFuncDefineGetter):
        (KJS::objectProtoFuncDefineSetter):
        (KJS::objectProtoFuncLookupGetter):
        (KJS::objectProtoFuncLookupSetter):
        (KJS::objectProtoFuncPropertyIsEnumerable):
        (KJS::objectProtoFuncToLocaleString):
        (KJS::objectProtoFuncToString):
        (KJS::ObjectConstructor::ObjectConstructor):
        (KJS::constructObject):
        (KJS::constructWithObjectConstructor):
        (KJS::ObjectConstructor::getConstructData):
        (KJS::callObjectConstructor):
        (KJS::ObjectConstructor::getCallData):
        * kjs/object_object.h:
        * kjs/string_object.cpp:
        (KJS::replace):
        (KJS::stringProtoFuncToString):
        (KJS::stringProtoFuncValueOf):
        (KJS::stringProtoFuncCharAt):
        (KJS::stringProtoFuncCharCodeAt):
        (KJS::stringProtoFuncConcat):
        (KJS::stringProtoFuncIndexOf):
        (KJS::stringProtoFuncLastIndexOf):
        (KJS::stringProtoFuncMatch):
        (KJS::stringProtoFuncSearch):
        (KJS::stringProtoFuncReplace):
        (KJS::stringProtoFuncSlice):
        (KJS::stringProtoFuncSplit):
        (KJS::stringProtoFuncSubstr):
        (KJS::stringProtoFuncSubstring):
        (KJS::stringProtoFuncToLowerCase):
        (KJS::stringProtoFuncToUpperCase):
        (KJS::stringProtoFuncToLocaleLowerCase):
        (KJS::stringProtoFuncToLocaleUpperCase):
        (KJS::stringProtoFuncLocaleCompare):
        (KJS::stringProtoFuncBig):
        (KJS::stringProtoFuncSmall):
        (KJS::stringProtoFuncBlink):
        (KJS::stringProtoFuncBold):
        (KJS::stringProtoFuncFixed):
        (KJS::stringProtoFuncItalics):
        (KJS::stringProtoFuncStrike):
        (KJS::stringProtoFuncSub):
        (KJS::stringProtoFuncSup):
        (KJS::stringProtoFuncFontcolor):
        (KJS::stringProtoFuncFontsize):
        (KJS::stringProtoFuncAnchor):
        (KJS::stringProtoFuncLink):
        (KJS::stringFromCharCode):
        (KJS::StringConstructor::StringConstructor):
        (KJS::constructWithStringConstructor):
        (KJS::StringConstructor::getConstructData):
        (KJS::callStringConstructor):
        (KJS::StringConstructor::getCallData):
        * kjs/string_object.h:

2008-06-23  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 19716: REGRESSION (SquirrelFish): Reproducible crash after entering a username at mint.com
        <https://bugs.webkit.org/show_bug.cgi?id=19716>

        When unwinding callframes for exceptions, check whether the callframe
        was created by a reentrant native call to JavaScript after tearing off
        the local variables instead of before.

        * VM/Machine.cpp:
        (KJS::Machine::unwindCallFrame):

2008-06-23  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        Get testapi passing again in a debug build.

        * API/testapi.c:
        (main): Update the expected output of calling JSValueMakeString on a function object.

2008-06-21  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        Print a blank line when exiting the jsc interactive mode to ensure that the shell
        prompt will start on a new line.

        * kjs/Shell.cpp:
        (runInteractive):

2008-06-21  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Sam Weinig.

        Tweak the paths of the items in the "tests" group to clean things up a little.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-06-21  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Sam Weinig.

        Fix jsc to link against libedit.dylib rather than libedit.2.dylib.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-06-21  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        Copy the JavaScriptCore shell (jsc) into JavaScriptCore.framework so that it will
        be included in nightly builds.
        https://bugs.webkit.org/show_bug.cgi?id=19691

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-06-21  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Mark Rowe.

        Fix the build for non-Mac Darwin platforms by disabling their support
        for readline in the JavaScript shell.

        * kjs/config.h:

2008-06-20  Timothy Hatcher  <timothy@apple.com>

        Use member function pointers for the Profile::forEach function.
        Eliminating a few static functions and simplified things a little.

        Reviewed by Alexey Proskuryakov.

        * JavaScriptCore.exp: Change the symbol for forEach.
        * profiler/Profile.cpp:
        (KJS::Profile::forEach): Use a member function pointer.
        * profiler/Profile.h:
        (KJS::Profile::sortTotalTimeDescending): Pass a function pointer.
        (KJS::Profile::sortTotalTimeAscending): Ditto.
        (KJS::Profile::sortSelfTimeDescending): Ditto.
        (KJS::Profile::sortSelfTimeAscending): Ditto.
        (KJS::Profile::sortCallsDescending): Ditto.
        * profiler/ProfileNode.h:
        (KJS::ProfileNode::sortTotalTimeDescending): No longer static.
        (KJS::ProfileNode::sortTotalTimeAscending): Ditto.
        (KJS::ProfileNode::sortSelfTimeDescending): Ditto.
        (KJS::ProfileNode::sortSelfTimeAscending): Ditto.
        (KJS::ProfileNode::sortCallsDescending): Ditto.

2008-06-20  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Remove unused destructors.

        * kjs/nodes.cpp:
        * kjs/nodes.h:

2008-06-20  Timothy Hatcher  <timothy@apple.com>

        Fixed an ASSERT(m_actualSelfTime <= m_actualTotalTime) when starting
        and stopping a profile from the Develop menu. Also prevents
        inserting an incorrect parent node as the new head after profiling
        is stopped from the Develop menu.

        Reviewed by Dan Bernstein.

        * profiler/Profile.cpp:
        (KJS::Profile::stopProfiling): If the current node is already the head
        then there is no more need to record future nodes in didExecute.
        (KJS::Profile::didExecute): Move the code of setupCurrentNodeAsStopped
        into here since this was the only caller. When setting the total time
        keep any current total time while adding the self time of the head.
        (KJS::Profile::setupCurrentNodeAsStopped): Removed.
        * profiler/Profile.h: Removed setupCurrentNodeAsStopped.

2008-06-20  Kevin Ollivier  <kevino@theolliviers.com>

        !USE(MULTIPLE_THREADS) on Darwin build fix

        * kjs/InitializeThreading.cpp:
        (KJS::initializeThreading):
        * kjs/collector.h:

2008-06-20  Kevin McCullough  <kmccullough@apple.com>

        -Leopard Build Fix.

        * profiler/Profile.cpp:
        (KJS::Profile::removeProfileStart):
        (KJS::Profile::removeProfileEnd):

2008-06-20  Kevin McCullough  <kmccullough@apple.com>

        Just giving credit.

        * ChangeLog:

2008-06-20  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim and Dan.

        <rdar://problem/6024846> JSProfiler: ASSERT hit in Profiler.
        - Because InspectorController can call startProfiling() and
        stopProfiling() we cannot assert that console.profile() and
        console.profileEnd() will be in the profile tree.

        * profiler/Profile.cpp:
        (KJS::Profile::removeProfileStart):
        (KJS::Profile::removeProfileEnd):

2008-06-20  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        <rdar://problem/5958770> JSProfiler: Time incorrectly given to (idle)
        if profiling is started and finished within the same function. (19230)
        - Now we profile one more stack frame up from the last frame to allocate
        the time spent in it, if it exists.

        * JavaScriptCore.exp:
        * VM/Machine.cpp: We need to let the profiler know when the JS program 
        has finished since that is what will actually stop the profiler instead
        of just calling stopProfiling().
        (KJS::Machine::execute):
        * profiler/Profile.cpp:
        (KJS::Profile::create): Moved from Profile.h since it was getting pretty
        long.
        (KJS::Profile::Profile): We now have a client, which is a listener who
        we will return this profile to, once it has actually finished.
        (KJS::Profile::stopProfiling): Instead of fully stopping the profiler
        here, we set the flag and keep it profiling in the background.
        (KJS::Profile::didFinishAllExecution): This is where the profiler
        actually finishes and creates the (idle) node if one should be made.
        (KJS::Profile::removeProfileStart): Don't use m_currentNode since it is
        needed by the profiler as it runs silently in the background.
        (KJS::Profile::removeProfileEnd): Ditto.
        (KJS::Profile::willExecute): Don't profile new functions if we have
        stopped profiling.
        (KJS::Profile::didExecute): Only record one more return as all the
        remaining time will be attributed to that function.
        (KJS::Profile::setupCurrentNodeAsStopped): Sets the current node's time.
        * profiler/Profile.h: Added functions and variables for the above
        changes.
        (KJS::Profile::client):
        * profiler/ProfileNode.h:
        (KJS::CallIdentifier::toString): Debug method.
        * profiler/Profiler.cpp: Added support for the ProfilerClient.
        (KJS::Profiler::startProfiling):
        (KJS::Profiler::stopProfiling): No longer return sthe profile.
        (KJS::Profiler::didFinishAllExecution): Now returns the profile to the
        client instead of stopProfiling.
        * profiler/Profiler.h:
        (KJS::ProfilerClient::~ProfilerClient): Clients will implement this
        interface.

2008-06-19  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Reviewed by Simon.

        Surpress compiler warning (int vs unsigned comparison).

        * wtf/unicode/qt4/UnicodeQt4.h:
        (WTF::Unicode::toLower):

2008-06-19  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Reviewed by Timothy Hatcher.

        Introduce compiler define for MinGW, to have COMPILER(MINGW).

        * wtf/Platform.h:

2008-06-19  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff.

        Make Machine per-JSGlobalData.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitOpcode):
        * VM/Machine.cpp:
        (KJS::callEval):
        (KJS::Machine::unwindCallFrame):
        (KJS::Machine::throwException):
        (KJS::Machine::execute):
        (KJS::Machine::debug):
        * VM/Machine.h:
        * kjs/DebuggerCallFrame.cpp:
        (KJS::DebuggerCallFrame::evaluate):
        * kjs/DebuggerCallFrame.h:
        (KJS::DebuggerCallFrame::DebuggerCallFrame):
        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        * kjs/ExecState.h:
        (KJS::ExecState::machine):
        * kjs/JSFunction.cpp:
        (KJS::JSFunction::callAsFunction):
        (KJS::JSFunction::argumentsGetter):
        (KJS::JSFunction::callerGetter):
        (KJS::JSFunction::construct):
        (KJS::globalFuncEval):
        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::JSGlobalData):
        * kjs/JSGlobalData.h:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):

2008-06-19  Alp Toker  <alp@nuanti.com>

        GTK+/autotools build fix. JSGlobalObject.cpp in now in
        AllInOneFile.cpp and shouldn't be built separately.

        * GNUmakefile.am:

2008-06-19  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Get rid of some threadInstance calls.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::init):
        * kjs/Parser.cpp:
        (KJS::Parser::parse):
        * kjs/Shell.cpp:
        (jscmain):

2008-06-19  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Sam.

        Fix an assertion failure at startup.

        * kjs/JSObject.h: (KJS::JSObject::JSObject): Allow jsNull prototype in an assertion (I had
        it fixed in a wrong copy of the file, so I wasn't getting the failure).

2008-06-19  Alexey Proskuryakov  <ap@webkit.org>

        Build fix.

        * kjs/collector.cpp:
        (KJS::Heap::Heap):
        (KJS::allocateBlock):
        * kjs/collector.h:
        No, #if PLATFORM(UNIX) was not right. I've just moved the unsafe initialization back for now,
        as the platforms that use that code path do not use multiple threads yet.

2008-06-19  Alexey Proskuryakov  <ap@webkit.org>

        Windows and Qt build fixes.

        * kjs/collector.h: 
        * kjs/collector.cpp:
        (KJS::Heap::Heap):
        Wrapped m_pagesize in #if PLATFORM(UNIX), which should better match the sequence of #elifs
        in allocateBlock(). Changed MIN_ARRAY_SIZE to be explicitly size_t, as this type is different
        on different platforms.

2008-06-17  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Prepare JavaScript heap for being per-thread.

        * kjs/ExecState.h: Shuffle includes, making it possible to include ExecState.h in JSValue.h.
        (KJS::ExecState::heap): Added an accessor.

        * API/JSBase.cpp: (JSGarbageCollect): Collect both shared and per-thread heaps.

        * API/JSContextRef.cpp: (JSGlobalContextCreate): When allocating JSGlobalObject, indicate
        that it belongs to a shared heap.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/AllInOneFile.cpp:
        Moved JSGlobalObject.cpp to AllInOneFile, as a build fix for inlineAllocate magic.

        * VM/CodeGenerator.h: (KJS::CodeGenerator::globalExec): Added an accessor (working via
        m_scopeChain).

        * VM/RegisterFile.h:
        (KJS::RegisterFile::mark):
        * VM/RegisterFileStack.h:
        (KJS::RegisterFileStack::mark):
        Made these pseudo-mark functions take Heap*.

        * kjs/InitializeThreading.cpp:
        (KJS::initializeThreading): Initialize heap introspector.

        * kjs/JSGlobalData.h: Added Heap to the structure.

        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::JSGlobalData): Initialize Heap.
        (KJS::JSGlobalData::sharedInstance): Added a method to access shared global data instance
        for legacy clients.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::~JSGlobalObject): Changed to work with per-thread head; fixed list
        maintenance logic.
        (KJS::JSGlobalObject::init): Changed to work with per-thread head.
        (KJS::JSGlobalObject::put): Assert that a cross-heap operation is not being attempted.
        (KJS::JSGlobalObject::reset): Pass ExecState* where now required.
        (KJS::JSGlobalObject::mark): Pass the current heap to RegisterFileStack::mark.
        (KJS::JSGlobalObject::operator new): Overload operator new to use per-thread or shared heap.
        * kjs/JSGlobalObject.h: Removed static s_head member.

        * kjs/PropertyMap.h: (KJS::PropertyMap::PropertyMap): Removed unused SavedProperty.

        * kjs/collector.h: Turned Collector into an actual object with its own data, renamed to Heap.
        (KJS::Heap::initializeHeapIntrospector): Added.
        (KJS::Heap::heap): Added a method to determine which heap a JSValue is in, if any.
        (KJS::Heap::allocate): Made non-static.
        (KJS::Heap::inlineAllocateNumber): Ditto.
        (KJS::Heap::markListSet): Ditto.
        (KJS::Heap::cellBlock): Ditto.
        (KJS::Heap::cellOffset): Ditto.
        (KJS::Heap::isCellMarked): Ditto.
        (KJS::Heap::markCell): Ditto.
        (KJS::Heap::reportExtraMemoryCost): Ditto.
        (KJS::CollectorBlock): Added a back-reference to Heap for Heap::heap() method.
        (KJS::SmallCellCollectorBlock): Ditto.

        * kjs/collector.cpp: Changed MIN_ARRAY_SIZE to a #define to avoid a PIC branch. Removed
        main thread related machinery.
        (KJS::Heap::Heap): Initialize the newly added data members.
        (KJS::allocateBlock): Marked NEVER_INLINE, as this is a rare case that uses a PIC branch.
        Moved static pagesize to the class to make it safely initialized.
        (KJS::Heap::heapAllocate): Initialize heap back reference after a new block is allocated.
        (KJS::Heap::registerThread): Removed introspector initialization, as it is now performed
        in InitializeThreading.cpp.
        (KJS::Heap::markOtherThreadConservatively): Assert that the "other thread" case only occurs
        for legacy clients using a shared heap.
        (KJS::Heap::markStackObjectsConservatively): Moved fastMallocForbid/Allow down here, since
        it doesn't need to be forbidden during other GC phases.

        * kjs/JSImmediate.h:
        (KJS::jsUndefined):
        (KJS::jsNull):
        (KJS::jsBoolean):
        Moved from JSvalue.h, to make these usable in files that cannot include JSValue.h (such
        as list.h).

        * API/JSCallbackObjectFunctions.h:
        (KJS::::staticFunctionGetter):
        * API/JSClassRef.cpp:
        (OpaqueJSClass::prototype):
        * API/JSObjectRef.cpp:
        (JSObjectMake):
        (JSObjectMakeFunctionWithCallback):
        (JSObjectMakeConstructor):
        (JSObjectMakeFunction):
        * API/JSValueRef.cpp:
        (JSValueMakeNumber):
        (JSValueMakeString):
        * JavaScriptCore.exp:
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitLoad):
        * VM/JSPropertyNameIterator.cpp:
        (KJS::JSPropertyNameIterator::create):
        (KJS::JSPropertyNameIterator::next):
        * VM/Machine.cpp:
        (KJS::jsAddSlowCase):
        (KJS::jsAdd):
        (KJS::jsTypeStringForValue):
        (KJS::scopeChainForCall):
        (KJS::Machine::throwException):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        (KJS::Machine::retrieveArguments):
        * kjs/ArrayPrototype.cpp:
        (KJS::arrayProtoFuncToString):
        (KJS::arrayProtoFuncToLocaleString):
        (KJS::arrayProtoFuncJoin):
        (KJS::arrayProtoFuncConcat):
        (KJS::arrayProtoFuncPop):
        (KJS::arrayProtoFuncPush):
        (KJS::arrayProtoFuncShift):
        (KJS::arrayProtoFuncSlice):
        (KJS::arrayProtoFuncSplice):
        (KJS::arrayProtoFuncUnShift):
        (KJS::arrayProtoFuncFilter):
        (KJS::arrayProtoFuncMap):
        (KJS::arrayProtoFuncEvery):
        (KJS::arrayProtoFuncForEach):
        (KJS::arrayProtoFuncSome):
        (KJS::arrayProtoFuncIndexOf):
        (KJS::arrayProtoFuncLastIndexOf):
        (KJS::ArrayConstructor::ArrayConstructor):
        (KJS::ArrayConstructor::construct):
        (KJS::ArrayConstructor::callAsFunction):
        * kjs/BooleanObject.cpp:
        (KJS::BooleanPrototype::BooleanPrototype):
        (KJS::booleanProtoFuncToString):
        (KJS::BooleanConstructor::BooleanConstructor):
        (KJS::BooleanConstructor::construct):
        * kjs/FunctionPrototype.cpp:
        (KJS::FunctionPrototype::FunctionPrototype):
        (KJS::functionProtoFuncToString):
        (KJS::FunctionConstructor::FunctionConstructor):
        (KJS::FunctionConstructor::construct):
        * kjs/JSActivation.cpp:
        (KJS::JSActivation::createArgumentsObject):
        * kjs/JSArray.cpp:
        (KJS::JSArray::JSArray):
        (KJS::JSArray::lengthGetter):
        * kjs/JSFunction.cpp:
        (KJS::JSFunction::lengthGetter):
        (KJS::JSFunction::construct):
        (KJS::Arguments::Arguments):
        (KJS::encode):
        (KJS::decode):
        (KJS::globalFuncParseInt):
        (KJS::globalFuncParseFloat):
        (KJS::globalFuncEscape):
        (KJS::globalFuncUnescape):
        (KJS::PrototypeFunction::PrototypeFunction):
        (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction):
        * kjs/JSImmediate.cpp:
        (KJS::JSImmediate::toObject):
        * kjs/JSLock.cpp:
        (KJS::JSLock::registerThread):
        * kjs/JSObject.cpp:
        (KJS::JSObject::put):
        (KJS::JSObject::defineGetter):
        (KJS::JSObject::defineSetter):
        (KJS::Error::create):
        * kjs/JSObject.h:
        (KJS::JSObject::putDirect):
        * kjs/JSString.h:
        (KJS::JSString::JSString):
        * kjs/JSValue.cpp:
        (KJS::JSCell::operator new):
        (KJS::jsString):
        (KJS::jsOwnedString):
        * kjs/JSValue.h:
        (KJS::JSNumberCell::operator new):
        (KJS::jsNumberCell):
        (KJS::jsNaN):
        (KJS::jsNumber):
        (KJS::JSCell::marked):
        (KJS::JSCell::mark):
        (KJS::JSValue::toJSNumber):
        * kjs/MathObject.cpp:
        (KJS::MathObject::getValueProperty):
        (KJS::mathProtoFuncAbs):
        (KJS::mathProtoFuncACos):
        (KJS::mathProtoFuncASin):
        (KJS::mathProtoFuncATan):
        (KJS::mathProtoFuncATan2):
        (KJS::mathProtoFuncCeil):
        (KJS::mathProtoFuncCos):
        (KJS::mathProtoFuncExp):
        (KJS::mathProtoFuncFloor):
        (KJS::mathProtoFuncLog):
        (KJS::mathProtoFuncMax):
        (KJS::mathProtoFuncMin):
        (KJS::mathProtoFuncPow):
        (KJS::mathProtoFuncRandom):
        (KJS::mathProtoFuncRound):
        (KJS::mathProtoFuncSin):
        (KJS::mathProtoFuncSqrt):
        (KJS::mathProtoFuncTan):
        * kjs/NumberObject.cpp:
        (KJS::NumberPrototype::NumberPrototype):
        (KJS::numberProtoFuncToString):
        (KJS::numberProtoFuncToLocaleString):
        (KJS::numberProtoFuncToFixed):
        (KJS::numberProtoFuncToExponential):
        (KJS::numberProtoFuncToPrecision):
        (KJS::NumberConstructor::NumberConstructor):
        (KJS::NumberConstructor::getValueProperty):
        (KJS::NumberConstructor::construct):
        (KJS::NumberConstructor::callAsFunction):
        * kjs/RegExpObject.cpp:
        (KJS::RegExpPrototype::RegExpPrototype):
        (KJS::regExpProtoFuncToString):
        (KJS::RegExpObject::getValueProperty):
        (KJS::RegExpConstructor::RegExpConstructor):
        (KJS::RegExpMatchesArray::fillArrayInstance):
        (KJS::RegExpConstructor::arrayOfMatches):
        (KJS::RegExpConstructor::getBackref):
        (KJS::RegExpConstructor::getLastParen):
        (KJS::RegExpConstructor::getLeftContext):
        (KJS::RegExpConstructor::getRightContext):
        (KJS::RegExpConstructor::getValueProperty):
        (KJS::RegExpConstructor::construct):
        * kjs/RegExpObject.h:
        * kjs/Shell.cpp:
        (GlobalObject::GlobalObject):
        (functionGC):
        (functionRun):
        (functionReadline):
        (jscmain):
        * kjs/date_object.cpp:
        (KJS::formatLocaleDate):
        (KJS::DatePrototype::DatePrototype):
        (KJS::DateConstructor::DateConstructor):
        (KJS::DateConstructor::construct):
        (KJS::DateConstructor::callAsFunction):
        (KJS::DateFunction::DateFunction):
        (KJS::DateFunction::callAsFunction):
        (KJS::dateProtoFuncToString):
        (KJS::dateProtoFuncToUTCString):
        (KJS::dateProtoFuncToDateString):
        (KJS::dateProtoFuncToTimeString):
        (KJS::dateProtoFuncToLocaleString):
        (KJS::dateProtoFuncToLocaleDateString):
        (KJS::dateProtoFuncToLocaleTimeString):
        (KJS::dateProtoFuncValueOf):
        (KJS::dateProtoFuncGetTime):
        (KJS::dateProtoFuncGetFullYear):
        (KJS::dateProtoFuncGetUTCFullYear):
        (KJS::dateProtoFuncToGMTString):
        (KJS::dateProtoFuncGetMonth):
        (KJS::dateProtoFuncGetUTCMonth):
        (KJS::dateProtoFuncGetDate):
        (KJS::dateProtoFuncGetUTCDate):
        (KJS::dateProtoFuncGetDay):
        (KJS::dateProtoFuncGetUTCDay):
        (KJS::dateProtoFuncGetHours):
        (KJS::dateProtoFuncGetUTCHours):
        (KJS::dateProtoFuncGetMinutes):
        (KJS::dateProtoFuncGetUTCMinutes):
        (KJS::dateProtoFuncGetSeconds):
        (KJS::dateProtoFuncGetUTCSeconds):
        (KJS::dateProtoFuncGetMilliSeconds):
        (KJS::dateProtoFuncGetUTCMilliseconds):
        (KJS::dateProtoFuncGetTimezoneOffset):
        (KJS::dateProtoFuncSetTime):
        (KJS::setNewValueFromTimeArgs):
        (KJS::setNewValueFromDateArgs):
        (KJS::dateProtoFuncSetYear):
        (KJS::dateProtoFuncGetYear):
        * kjs/error_object.cpp:
        (KJS::ErrorPrototype::ErrorPrototype):
        (KJS::errorProtoFuncToString):
        (KJS::ErrorConstructor::ErrorConstructor):
        (KJS::ErrorConstructor::construct):
        (KJS::NativeErrorPrototype::NativeErrorPrototype):
        (KJS::NativeErrorConstructor::NativeErrorConstructor):
        (KJS::NativeErrorConstructor::construct):
        * kjs/identifier.h:
        * kjs/internal.cpp:
        (KJS::StringObject::create):
        (KJS::JSString::lengthGetter):
        (KJS::JSString::indexGetter):
        (KJS::JSString::indexNumericPropertyGetter):
        * kjs/interpreter.cpp:
        * kjs/list.cpp:
        (KJS::ArgList::slowAppend):
        * kjs/list.h:
        * kjs/lookup.h:
        (KJS::staticFunctionGetter):
        (KJS::cacheGlobalObject):
        * kjs/nodes.cpp:
        (KJS::Node::emitThrowError):
        (KJS::StringNode::emitCode):
        (KJS::ArrayNode::emitCode):
        (KJS::FuncDeclNode::makeFunction):
        (KJS::FuncExprNode::makeFunction):
        * kjs/nodes.h:
        * kjs/object_object.cpp:
        (KJS::ObjectPrototype::ObjectPrototype):
        (KJS::objectProtoFuncToLocaleString):
        (KJS::objectProtoFuncToString):
        (KJS::ObjectConstructor::ObjectConstructor):
        (KJS::ObjectConstructor::construct):
        * kjs/protect.h:
        (KJS::gcProtect):
        (KJS::gcUnprotect):
        * kjs/string_object.cpp:
        (KJS::StringObject::StringObject):
        (KJS::StringPrototype::StringPrototype):
        (KJS::replace):
        (KJS::stringProtoFuncCharAt):
        (KJS::stringProtoFuncCharCodeAt):
        (KJS::stringProtoFuncConcat):
        (KJS::stringProtoFuncIndexOf):
        (KJS::stringProtoFuncLastIndexOf):
        (KJS::stringProtoFuncMatch):
        (KJS::stringProtoFuncSearch):
        (KJS::stringProtoFuncReplace):
        (KJS::stringProtoFuncSlice):
        (KJS::stringProtoFuncSplit):
        (KJS::stringProtoFuncSubstr):
        (KJS::stringProtoFuncSubstring):
        (KJS::stringProtoFuncToLowerCase):
        (KJS::stringProtoFuncToUpperCase):
        (KJS::stringProtoFuncToLocaleLowerCase):
        (KJS::stringProtoFuncToLocaleUpperCase):
        (KJS::stringProtoFuncLocaleCompare):
        (KJS::stringProtoFuncBig):
        (KJS::stringProtoFuncSmall):
        (KJS::stringProtoFuncBlink):
        (KJS::stringProtoFuncBold):
        (KJS::stringProtoFuncFixed):
        (KJS::stringProtoFuncItalics):
        (KJS::stringProtoFuncStrike):
        (KJS::stringProtoFuncSub):
        (KJS::stringProtoFuncSup):
        (KJS::stringProtoFuncFontcolor):
        (KJS::stringProtoFuncFontsize):
        (KJS::stringProtoFuncAnchor):
        (KJS::stringProtoFuncLink):
        (KJS::StringConstructor::StringConstructor):
        (KJS::StringConstructor::construct):
        (KJS::StringConstructor::callAsFunction):
        (KJS::StringConstructorFunction::StringConstructorFunction):
        (KJS::StringConstructorFunction::callAsFunction):
        * kjs/string_object.h:
        (KJS::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined):
        * kjs/ustring.h:
        Updated for the above changes.

2008-06-17  Timothy Hatcher  <timothy@apple.com>

        Added a type to DebuggerCallFrame so the under interface can
        distinguish anonymous functions and program call frames.

        https://bugs.webkit.org/show_bug.cgi?id=19585

        Reviewed by Geoff Garen.

        * JavaScriptCore.exp: Export the DebuggerCallFrame::type symbol.
        * kjs/DebuggerCallFrame.cpp:
        (KJS::DebuggerCallFrame::type): Added.
        * kjs/DebuggerCallFrame.h:

2008-06-17  Eric Seidel  <eric@webkit.org>

        Reviewed by Tim H.
        
        Remove bogus ASSERT which tripped every time for those who use PAC files.

        * kjs/Parser.cpp:
        (KJS::Parser::parse):

2008-06-17  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geoff.

        <rdar://problem/5951534> JSProfiler: Don't profile console.profile()
        or console.profileEnd()

        * profiler/Profile.cpp:
        (KJS::Profile::stopProfiling): Moved the creation of the (idle) node to
        the Profile (not ProfileNode).  This makes sense since the Profile
        should be the one to modify the profile tree.  Also each stopProfiling()
        does not need to check if it's the head node anymore.  Also fixed an
        oddity where I was using willExecute to create the node.
        (KJS::Profile::removeProfileStart): Removes the call to console.profile
        that started this profile.
        (KJS::Profile::removeProfileEnd): Removes the call to console.profileEnd
        that ended this profile.
        * profiler/Profile.h:
        * profiler/ProfileNode.cpp: Moved the creation of the (idle) node to
        the Profile object.
        (KJS::ProfileNode::stopProfiling):
        * profiler/ProfileNode.h: Added some helper functions and whitespace to
        facilitate readability and the removal of profile() and profileEnd()
        from the Profile tree.
        (KJS::CallIdentifier::operator const char* ):
        (KJS::ProfileNode::firstChild):
        (KJS::ProfileNode::lastChild):
        (KJS::ProfileNode::removeChild):
        (KJS::ProfileNode::toString):

2008-06-17  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Rubber stamped by Adam Roben.

        Include JSGlobalObject.h to fix the build.

        * kjs/ScopeChain.cpp:

2008-06-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Reduce code duplication in emitReadModifyAssignment().

        * kjs/nodes.cpp:
        (KJS::emitReadModifyAssignment):

2008-06-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Sort includes alphabetically.

        * kjs/nodes.cpp:

2008-06-16  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Bug 19596: LEAK: Gmail leaks SegmentedVector<RegisterID>
        <https://bugs.webkit.org/show_bug.cgi?id=19596>

        When growing SegmentedVector, we start adding segments at the position
        of the last segment, overwriting it. The destructor frees allocated
        segments starting at the segment of index 1, because the segment of
        index 0 is assumed to be the initial inline segment. This causes a leak
        of the segment that is referenced by index 0. Modifying grow() so that
        it starts adding segments at the position after the last segment fixes
        the leak.

        Since the initial segment is a special case in the lookup code, this
        bug never manifested itself via incorrect results.

        * VM/SegmentedVector.h:
        (KJS::SegmentedVector::grow):

2008-06-16  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Alexey.
        
        - removed nearly unused types.h and LocalStorageEntry.h headers

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/ExecState.h:
        * kjs/LocalStorageEntry.h: Removed.
        * kjs/RegExpObject.cpp:
        * kjs/error_object.cpp:
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        * kjs/types.h: Removed.

2008-06-16  Alp Toker  <alp@nuanti.com>

        Rubber-stamped by Geoff.

        Change c++ to c in minidom and testapi emacs mode line comments.

        * API/Node.h:
        * API/NodeList.c:
        * API/NodeList.h:
        * API/testapi.c:

2008-06-16  Alexey Proskuryakov  <ap@webkit.org>

        Trying to fix Windows build.

        * kjs/PropertyNameArray.h:
        * kjs/identifier.cpp:
        Include ExecState.h

2008-06-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Slight cleanup to the SymbolTableEntry class.
        
        Renamed isEmpty to isNull, since we usually use "empty" to mean "holds
        the valid, empty value", and "null" to mean "holds no value".
        
        Changed an "== 0" to a "!", to match our style guidelines.
        
        Added some ASSERTs to verify the (possibly questionable) assumption that
        all register indexes will have their high two bits set. Also clarified a
        comment to make that assumption clear.

2008-06-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Initialize functionQueueMutex in a safe manner.

        * wtf/MainThread.cpp:
        (WTF::functionQueueMutex): Made it an AtomicallyInitializedStatic.

        (WTF::dispatchFunctionsFromMainThread):
        (WTF::setMainThreadCallbacksPaused):
        Assert that the current thread is main, meaning that the callbacksPaused static can be
        accessed.

2008-06-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff Garen.

        Make Identifier construction use an explicitly passed IdentifierTable.

        No change on SunSpider total.

        * API/JSCallbackObjectFunctions.h:
        (KJS::::getOwnPropertySlot):
        (KJS::::put):
        (KJS::::deleteProperty):
        (KJS::::getPropertyNames):
        * API/JSObjectRef.cpp:
        (JSObjectMakeFunctionWithCallback):
        (JSObjectMakeFunction):
        (JSObjectHasProperty):
        (JSObjectGetProperty):
        (JSObjectSetProperty):
        (JSObjectDeleteProperty):
        (OpaqueJSPropertyNameArray::OpaqueJSPropertyNameArray):
        (JSObjectCopyPropertyNames):
        * JavaScriptCore.exp:
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::registerForLocal):
        (KJS::CodeGenerator::isLocal):
        (KJS::CodeGenerator::addConstant):
        (KJS::CodeGenerator::findScopedProperty):
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::globalData):
        (KJS::CodeGenerator::propertyNames):
        * VM/JSPropertyNameIterator.cpp:
        (KJS::JSPropertyNameIterator::create):
        * VM/Machine.cpp:
        (KJS::Machine::throwException):
        (KJS::Machine::privateExecute):
        * kjs/ArrayPrototype.cpp:
        (KJS::ArrayConstructor::ArrayConstructor):
        * kjs/BooleanObject.cpp:
        (KJS::BooleanConstructor::BooleanConstructor):
        * kjs/FunctionPrototype.cpp:
        (KJS::FunctionConstructor::FunctionConstructor):
        (KJS::FunctionConstructor::construct):
        * kjs/JSArray.cpp:
        (KJS::JSArray::inlineGetOwnPropertySlot):
        (KJS::JSArray::put):
        (KJS::JSArray::deleteProperty):
        (KJS::JSArray::getPropertyNames):
        * kjs/JSFunction.cpp:
        (KJS::Arguments::Arguments):
        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::JSGlobalData):
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::reset):
        * kjs/JSObject.cpp:
        (KJS::JSObject::getOwnPropertySlot):
        (KJS::JSObject::put):
        (KJS::JSObject::putWithAttributes):
        (KJS::JSObject::deleteProperty):
        (KJS::JSObject::findPropertyHashEntry):
        (KJS::JSObject::getPropertyNames):
        (KJS::Error::create):
        * kjs/JSVariableObject.cpp:
        (KJS::JSVariableObject::getPropertyNames):
        * kjs/NumberObject.cpp:
        (KJS::NumberConstructor::NumberConstructor):
        * kjs/PropertyNameArray.cpp:
        (KJS::PropertyNameArray::add):
        * kjs/PropertyNameArray.h:
        (KJS::PropertyNameArray::PropertyNameArray):
        (KJS::PropertyNameArray::addKnownUnique):
        * kjs/PropertySlot.h:
        (KJS::PropertySlot::getValue):
        * kjs/RegExpObject.cpp:
        (KJS::RegExpConstructor::RegExpConstructor):
        * kjs/ScopeChain.cpp:
        (KJS::ScopeChainNode::print):
        * kjs/Shell.cpp:
        (GlobalObject::GlobalObject):
        * kjs/date_object.cpp:
        (KJS::DateConstructor::DateConstructor):
        * kjs/error_object.cpp:
        (KJS::ErrorConstructor::ErrorConstructor):
        (KJS::NativeErrorConstructor::NativeErrorConstructor):
        * kjs/grammar.y:
        * kjs/identifier.cpp:
        (KJS::Identifier::add):
        (KJS::Identifier::addSlowCase):
        * kjs/identifier.h:
        (KJS::Identifier::Identifier):
        (KJS::Identifier::from):
        (KJS::Identifier::equal):
        (KJS::Identifier::add):
        (KJS::operator==):
        (KJS::operator!=):
        * kjs/internal.cpp:
        (KJS::JSString::getOwnPropertySlot):
        * kjs/lexer.cpp:
        (KJS::Lexer::Lexer):
        (KJS::Lexer::lex):
        (KJS::Lexer::makeIdentifier):
        * kjs/lexer.h:
        * kjs/lookup.cpp:
        (KJS::HashTable::createTable):
        * kjs/lookup.h:
        (KJS::HashTable::initializeIfNeeded):
        (KJS::HashTable::entry):
        (KJS::getStaticPropertySlot):
        (KJS::getStaticFunctionSlot):
        (KJS::getStaticValueSlot):
        (KJS::lookupPut):
        * kjs/object_object.cpp:
        (KJS::objectProtoFuncHasOwnProperty):
        (KJS::objectProtoFuncDefineGetter):
        (KJS::objectProtoFuncDefineSetter):
        (KJS::objectProtoFuncLookupGetter):
        (KJS::objectProtoFuncLookupSetter):
        (KJS::objectProtoFuncPropertyIsEnumerable):
        (KJS::ObjectConstructor::ObjectConstructor):
        * kjs/string_object.cpp:
        (KJS::StringObject::getOwnPropertySlot):
        (KJS::StringObject::getPropertyNames):
        (KJS::StringConstructor::StringConstructor):
        Just pass ExecState or JSGlobalData everywhere. Identifier construction is now always
        explicit.

        * kjs/nodes.cpp: (KJS::RegExpNode::emitCode): Here, Identifier was created from a non-literal
        char*, which was incorrect, as that uses the pointer value as a key.

2008-06-16  Thiago Macieira  <tjmaciei@trolltech.com>

        Reviewed by Darin.

        https://bugs.webkit.org/show_bug.cgi?id=19577

        Fix compilation in C++ environments where C99 headers are not present

        The stdbool.h header is a C99 feature, defining the "_Bool" type as well as the
        "true" and "false" constants. But it's completely unnecessary in C++ as the
        language already defines the "bool" type and its two values.

        * API/JSBase.h:
        * API/JSContextRef.h:
        * API/JSObjectRef.h:
        * API/JSStringRef.h:
        * API/JSValueRef.h:

2008-06-16  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by John.

        <rdar://problem/6012509> JSProfiler: %s are incorrect if you exclude a
        top level node like (idle)

        * profiler/Profile.cpp:
        (KJS::Profile::focus):
        (KJS::Profile::exclude): Subtract the selfTime from the totalTime of the
        head since its self time will only be non-zero when one of its children
        were excluded. Since the head's totalTime is used to calculate %s when
        its totalTime is the same as the sum of all its visible childrens' times
        their %s will sum to 100%.

2008-06-16  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam Weinig.

        <rdar://problem/5969992> JSProfiler: Remove the recursion limit in the profiler.

        * profiler/Profile.cpp:
        (KJS::Profile::willExecute):

2008-06-16  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam.

        <rdar://problem/5969992> JSProfiler: Remove the recursion limit in the
        profiler.
        - Remove the last of the uses of recursion in the profiler.

        * JavaScriptCore.exp: Export the new function's signature.
        * profiler/Profile.cpp: 
        (KJS::calculateVisibleTotalTime): Added a new static method for
        recalculating the visibleTotalTime of methods after focus has changed
        which are visible.
        (KJS::stopProfiling): 
        (KJS::Profile::focus): Implemented focus without recursion.
        * profiler/Profile.h: Moved implementation into the definition file.
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::traverseNextNodePreOrder): Added an argument for
        whether or not to process the children nodes, this allows focus to skip
        sub trees which have been set as not visible.
        (KJS::ProfileNode::calculateVisibleTotalTime): This function set's a
        node's total visible time to the sum of its self time and its children's
        total times.
        (KJS::ProfileNode::focus): Implemented focus without recursion.
        * profiler/ProfileNode.h:
        (KJS::CallIdentifier::operator!= ):
        (KJS::ProfileNode::setActualTotalTime): Expanded setting the total time
        so that focus could modify only the visible total time.
        (KJS::ProfileNode::setVisibleTotalTime):

2008-06-16  Christian Dywan  <christian@twotoasts.de>

        Reviewed by Sam.

        https://bugs.webkit.org/show_bug.cgi?id=19552
        JavaScriptCore headers use C++ style comments

        Replace all C++ style comments with C style multiline
        comments and remove all "mode" lines.

        * API/JSBase.h:
        * API/JSClassRef.h:
        * API/JSContextRef.h:
        * API/JSObjectRef.h:
        * API/JSStringRef.h:
        * API/JSStringRefBSTR.h:
        * API/JSStringRefCF.h:
        * API/JSValueRef.h:
        * API/JavaScript.h:
        * API/JavaScriptCore.h:

2008-06-16  Christian Dywan  <christian@twotoasts.de>

        Reviewed by Sam.

        https://bugs.webkit.org/show_bug.cgi?id=19557
        (JavaScriptCore) minidom uses C++ style comments

        Use only C style comments in minidom sources

        * API/JSNode.c:
        (JSNode_appendChild):
        (JSNode_removeChild):
        * API/JSNode.h:
        * API/JSNodeList.c:
        (JSNodeList_getProperty):
        * API/JSNodeList.h:
        * API/Node.c:
        * API/Node.h:
        * API/NodeList.c:
        (NodeList_new):
        (NodeList_item):
        * API/NodeList.h:
        * API/minidom.c:
        (createStringWithContentsOfFile):
        * wtf/Assertions.h:
        * wtf/UnusedParam.h:

2008-06-16  Adriaan de Groot  <groot@kde.org>

        Reviewed by Simon.

        Fix compilation on Solaris

        On some systems, munmap takes a char* instead of a void* (contrary to POSIX and
        Single Unix Specification). Since you can always convert from char* to void*
        but not vice-versa, do the casting to char*.

        * kjs/collector.cpp:
        (KJS::allocateBlock):
        (KJS::freeBlock):

2008-06-16  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Make a UnaryOpNode class to reduce boilerplate code for UnaryPlusNode,
        NegateNode, BitwiseNotNode, and LogicalNotNode.

        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::emitToJSNumber):
        * kjs/nodes.cpp:
        (KJS::UnaryOpNode::emitCode):
        * kjs/nodes.h:
        (KJS::UnaryOpNode::UnaryOpNode):
        (KJS::UnaryPlusNode::):
        (KJS::NegateNode::):
        (KJS::NegateNode::precedence):
        (KJS::BitwiseNotNode::):
        (KJS::BitwiseNotNode::precedence):
        (KJS::LogicalNotNode::):
        (KJS::LogicalNotNode::precedence):

2008-06-16  Jan Michael Alonzo  <jmalonzo@webkit.org>

        Gtk build fix

        * GNUmakefile.am:

2008-06-15  Darin Adler  <darin@apple.com>

        - rename KJS::List to KJS::ArgList

        * API/JSCallbackConstructor.cpp:
        (KJS::JSCallbackConstructor::construct):
        * API/JSCallbackConstructor.h:
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::callAsFunction):
        * API/JSCallbackFunction.h:
        * API/JSCallbackObject.h:
        * API/JSCallbackObjectFunctions.h:
        (KJS::::construct):
        (KJS::::callAsFunction):
        * API/JSObjectRef.cpp:
        (JSObjectMakeFunction):
        (JSObjectCallAsFunction):
        (JSObjectCallAsConstructor):
        * JavaScriptCore.exp:
        * VM/Machine.cpp:
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        * kjs/ArrayPrototype.cpp:
        (KJS::arrayProtoFuncToString):
        (KJS::arrayProtoFuncToLocaleString):
        (KJS::arrayProtoFuncJoin):
        (KJS::arrayProtoFuncConcat):
        (KJS::arrayProtoFuncPop):
        (KJS::arrayProtoFuncPush):
        (KJS::arrayProtoFuncReverse):
        (KJS::arrayProtoFuncShift):
        (KJS::arrayProtoFuncSlice):
        (KJS::arrayProtoFuncSort):
        (KJS::arrayProtoFuncSplice):
        (KJS::arrayProtoFuncUnShift):
        (KJS::arrayProtoFuncFilter):
        (KJS::arrayProtoFuncMap):
        (KJS::arrayProtoFuncEvery):
        (KJS::arrayProtoFuncForEach):
        (KJS::arrayProtoFuncSome):
        (KJS::arrayProtoFuncIndexOf):
        (KJS::arrayProtoFuncLastIndexOf):
        (KJS::ArrayConstructor::construct):
        (KJS::ArrayConstructor::callAsFunction):
        * kjs/ArrayPrototype.h:
        * kjs/BooleanObject.cpp:
        (KJS::booleanProtoFuncToString):
        (KJS::booleanProtoFuncValueOf):
        (KJS::BooleanConstructor::construct):
        (KJS::BooleanConstructor::callAsFunction):
        * kjs/BooleanObject.h:
        * kjs/CommonIdentifiers.h:
        * kjs/ExecState.h:
        (KJS::ExecState::emptyList):
        * kjs/FunctionPrototype.cpp:
        (KJS::FunctionPrototype::callAsFunction):
        (KJS::functionProtoFuncToString):
        (KJS::functionProtoFuncApply):
        (KJS::functionProtoFuncCall):
        (KJS::FunctionConstructor::construct):
        (KJS::FunctionConstructor::callAsFunction):
        * kjs/FunctionPrototype.h:
        * kjs/JSActivation.cpp:
        (KJS::JSActivation::createArgumentsObject):
        * kjs/JSArray.cpp:
        (KJS::JSArray::JSArray):
        (KJS::AVLTreeAbstractorForArrayCompare::compare_key_key):
        * kjs/JSArray.h:
        * kjs/JSFunction.cpp:
        (KJS::JSFunction::callAsFunction):
        (KJS::JSFunction::construct):
        (KJS::IndexToNameMap::IndexToNameMap):
        (KJS::Arguments::Arguments):
        (KJS::encode):
        (KJS::decode):
        (KJS::globalFuncEval):
        (KJS::globalFuncParseInt):
        (KJS::globalFuncParseFloat):
        (KJS::globalFuncIsNaN):
        (KJS::globalFuncIsFinite):
        (KJS::globalFuncDecodeURI):
        (KJS::globalFuncDecodeURIComponent):
        (KJS::globalFuncEncodeURI):
        (KJS::globalFuncEncodeURIComponent):
        (KJS::globalFuncEscape):
        (KJS::globalFuncUnescape):
        (KJS::globalFuncKJSPrint):
        (KJS::PrototypeFunction::callAsFunction):
        (KJS::PrototypeReflexiveFunction::callAsFunction):
        * kjs/JSFunction.h:
        * kjs/JSGlobalData.h:
        * kjs/JSImmediate.cpp:
        (KJS::JSImmediate::toObject):
        * kjs/JSNotAnObject.cpp:
        (KJS::JSNotAnObject::construct):
        (KJS::JSNotAnObject::callAsFunction):
        * kjs/JSNotAnObject.h:
        * kjs/JSObject.cpp:
        (KJS::JSObject::put):
        (KJS::JSObject::construct):
        (KJS::JSObject::callAsFunction):
        (KJS::Error::create):
        * kjs/JSObject.h:
        * kjs/MathObject.cpp:
        (KJS::mathProtoFuncAbs):
        (KJS::mathProtoFuncACos):
        (KJS::mathProtoFuncASin):
        (KJS::mathProtoFuncATan):
        (KJS::mathProtoFuncATan2):
        (KJS::mathProtoFuncCeil):
        (KJS::mathProtoFuncCos):
        (KJS::mathProtoFuncExp):
        (KJS::mathProtoFuncFloor):
        (KJS::mathProtoFuncLog):
        (KJS::mathProtoFuncMax):
        (KJS::mathProtoFuncMin):
        (KJS::mathProtoFuncPow):
        (KJS::mathProtoFuncRandom):
        (KJS::mathProtoFuncRound):
        (KJS::mathProtoFuncSin):
        (KJS::mathProtoFuncSqrt):
        (KJS::mathProtoFuncTan):
        * kjs/MathObject.h:
        * kjs/NumberObject.cpp:
        (KJS::numberProtoFuncToString):
        (KJS::numberProtoFuncToLocaleString):
        (KJS::numberProtoFuncValueOf):
        (KJS::numberProtoFuncToFixed):
        (KJS::numberProtoFuncToExponential):
        (KJS::numberProtoFuncToPrecision):
        (KJS::NumberConstructor::construct):
        (KJS::NumberConstructor::callAsFunction):
        * kjs/NumberObject.h:
        * kjs/RegExpObject.cpp:
        (KJS::regExpProtoFuncTest):
        (KJS::regExpProtoFuncExec):
        (KJS::regExpProtoFuncCompile):
        (KJS::regExpProtoFuncToString):
        (KJS::RegExpObject::match):
        (KJS::RegExpObject::test):
        (KJS::RegExpObject::exec):
        (KJS::RegExpObject::callAsFunction):
        (KJS::RegExpConstructor::construct):
        (KJS::RegExpConstructor::callAsFunction):
        * kjs/RegExpObject.h:
        * kjs/Shell.cpp:
        (functionPrint):
        (functionDebug):
        (functionGC):
        (functionVersion):
        (functionRun):
        (functionLoad):
        (functionReadline):
        (functionQuit):
        * kjs/collector.cpp:
        (KJS::Collector::collect):
        * kjs/collector.h:
        (KJS::Collector::markListSet):
        * kjs/date_object.cpp:
        (KJS::formatLocaleDate):
        (KJS::fillStructuresUsingTimeArgs):
        (KJS::fillStructuresUsingDateArgs):
        (KJS::DateConstructor::construct):
        (KJS::DateConstructor::callAsFunction):
        (KJS::DateFunction::callAsFunction):
        (KJS::dateProtoFuncToString):
        (KJS::dateProtoFuncToUTCString):
        (KJS::dateProtoFuncToDateString):
        (KJS::dateProtoFuncToTimeString):
        (KJS::dateProtoFuncToLocaleString):
        (KJS::dateProtoFuncToLocaleDateString):
        (KJS::dateProtoFuncToLocaleTimeString):
        (KJS::dateProtoFuncValueOf):
        (KJS::dateProtoFuncGetTime):
        (KJS::dateProtoFuncGetFullYear):
        (KJS::dateProtoFuncGetUTCFullYear):
        (KJS::dateProtoFuncToGMTString):
        (KJS::dateProtoFuncGetMonth):
        (KJS::dateProtoFuncGetUTCMonth):
        (KJS::dateProtoFuncGetDate):
        (KJS::dateProtoFuncGetUTCDate):
        (KJS::dateProtoFuncGetDay):
        (KJS::dateProtoFuncGetUTCDay):
        (KJS::dateProtoFuncGetHours):
        (KJS::dateProtoFuncGetUTCHours):
        (KJS::dateProtoFuncGetMinutes):
        (KJS::dateProtoFuncGetUTCMinutes):
        (KJS::dateProtoFuncGetSeconds):
        (KJS::dateProtoFuncGetUTCSeconds):
        (KJS::dateProtoFuncGetMilliSeconds):
        (KJS::dateProtoFuncGetUTCMilliseconds):
        (KJS::dateProtoFuncGetTimezoneOffset):
        (KJS::dateProtoFuncSetTime):
        (KJS::setNewValueFromTimeArgs):
        (KJS::setNewValueFromDateArgs):
        (KJS::dateProtoFuncSetMilliSeconds):
        (KJS::dateProtoFuncSetUTCMilliseconds):
        (KJS::dateProtoFuncSetSeconds):
        (KJS::dateProtoFuncSetUTCSeconds):
        (KJS::dateProtoFuncSetMinutes):
        (KJS::dateProtoFuncSetUTCMinutes):
        (KJS::dateProtoFuncSetHours):
        (KJS::dateProtoFuncSetUTCHours):
        (KJS::dateProtoFuncSetDate):
        (KJS::dateProtoFuncSetUTCDate):
        (KJS::dateProtoFuncSetMonth):
        (KJS::dateProtoFuncSetUTCMonth):
        (KJS::dateProtoFuncSetFullYear):
        (KJS::dateProtoFuncSetUTCFullYear):
        (KJS::dateProtoFuncSetYear):
        (KJS::dateProtoFuncGetYear):
        * kjs/date_object.h:
        * kjs/debugger.h:
        * kjs/error_object.cpp:
        (KJS::errorProtoFuncToString):
        (KJS::ErrorConstructor::construct):
        (KJS::ErrorConstructor::callAsFunction):
        (KJS::NativeErrorConstructor::construct):
        (KJS::NativeErrorConstructor::callAsFunction):
        * kjs/error_object.h:
        * kjs/internal.cpp:
        (KJS::JSNumberCell::toObject):
        (KJS::JSNumberCell::toThisObject):
        * kjs/list.cpp:
        (KJS::ArgList::getSlice):
        (KJS::ArgList::markLists):
        (KJS::ArgList::slowAppend):
        * kjs/list.h:
        (KJS::ArgList::ArgList):
        (KJS::ArgList::~ArgList):
        * kjs/object_object.cpp:
        (KJS::objectProtoFuncValueOf):
        (KJS::objectProtoFuncHasOwnProperty):
        (KJS::objectProtoFuncIsPrototypeOf):
        (KJS::objectProtoFuncDefineGetter):
        (KJS::objectProtoFuncDefineSetter):
        (KJS::objectProtoFuncLookupGetter):
        (KJS::objectProtoFuncLookupSetter):
        (KJS::objectProtoFuncPropertyIsEnumerable):
        (KJS::objectProtoFuncToLocaleString):
        (KJS::objectProtoFuncToString):
        (KJS::ObjectConstructor::construct):
        (KJS::ObjectConstructor::callAsFunction):
        * kjs/object_object.h:
        * kjs/string_object.cpp:
        (KJS::replace):
        (KJS::stringProtoFuncToString):
        (KJS::stringProtoFuncValueOf):
        (KJS::stringProtoFuncCharAt):
        (KJS::stringProtoFuncCharCodeAt):
        (KJS::stringProtoFuncConcat):
        (KJS::stringProtoFuncIndexOf):
        (KJS::stringProtoFuncLastIndexOf):
        (KJS::stringProtoFuncMatch):
        (KJS::stringProtoFuncSearch):
        (KJS::stringProtoFuncReplace):
        (KJS::stringProtoFuncSlice):
        (KJS::stringProtoFuncSplit):
        (KJS::stringProtoFuncSubstr):
        (KJS::stringProtoFuncSubstring):
        (KJS::stringProtoFuncToLowerCase):
        (KJS::stringProtoFuncToUpperCase):
        (KJS::stringProtoFuncToLocaleLowerCase):
        (KJS::stringProtoFuncToLocaleUpperCase):
        (KJS::stringProtoFuncLocaleCompare):
        (KJS::stringProtoFuncBig):
        (KJS::stringProtoFuncSmall):
        (KJS::stringProtoFuncBlink):
        (KJS::stringProtoFuncBold):
        (KJS::stringProtoFuncFixed):
        (KJS::stringProtoFuncItalics):
        (KJS::stringProtoFuncStrike):
        (KJS::stringProtoFuncSub):
        (KJS::stringProtoFuncSup):
        (KJS::stringProtoFuncFontcolor):
        (KJS::stringProtoFuncFontsize):
        (KJS::stringProtoFuncAnchor):
        (KJS::stringProtoFuncLink):
        (KJS::StringConstructor::construct):
        (KJS::StringConstructor::callAsFunction):
        (KJS::StringConstructorFunction::callAsFunction):
        * kjs/string_object.h:

2008-06-15  Darin Adler  <darin@apple.com>

        - new names for more JavaScriptCore files

        * API/JSCallbackFunction.cpp:
        * API/JSObjectRef.cpp:
        * DerivedSources.make:
        * GNUmakefile.am:
        * JavaScriptCore.exp:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * VM/Machine.cpp:
        * kjs/AllInOneFile.cpp:
        * kjs/ArrayPrototype.cpp: Copied from JavaScriptCore/kjs/array_object.cpp.
        * kjs/ArrayPrototype.h: Copied from JavaScriptCore/kjs/array_object.h.
        * kjs/BooleanObject.cpp: Copied from JavaScriptCore/kjs/bool_object.cpp.
        * kjs/BooleanObject.h: Copied from JavaScriptCore/kjs/bool_object.h.
        * kjs/ExecState.cpp:
        * kjs/ExecState.h:
        * kjs/FunctionPrototype.cpp: Copied from JavaScriptCore/kjs/function_object.cpp.
        * kjs/FunctionPrototype.h: Copied from JavaScriptCore/kjs/function_object.h.
        * kjs/JSArray.cpp: Copied from JavaScriptCore/kjs/array_instance.cpp.
        * kjs/JSArray.h: Copied from JavaScriptCore/kjs/array_instance.h.
        * kjs/JSFunction.cpp:
        * kjs/JSFunction.h:
        * kjs/JSGlobalObject.cpp:
        * kjs/JSImmediate.cpp:
        * kjs/JSObject.h:
        * kjs/JSString.h:
        * kjs/JSValue.h:
        * kjs/JSVariableObject.cpp:
        * kjs/MathObject.cpp: Copied from JavaScriptCore/kjs/math_object.cpp.
        * kjs/MathObject.h: Copied from JavaScriptCore/kjs/math_object.h.
        * kjs/NumberObject.cpp: Copied from JavaScriptCore/kjs/number_object.cpp.
        * kjs/NumberObject.h: Copied from JavaScriptCore/kjs/number_object.h.
        * kjs/PropertyMap.cpp: Copied from JavaScriptCore/kjs/property_map.cpp.
        * kjs/PropertyMap.h: Copied from JavaScriptCore/kjs/property_map.h.
        * kjs/PropertySlot.cpp: Copied from JavaScriptCore/kjs/property_slot.cpp.
        * kjs/PropertySlot.h: Copied from JavaScriptCore/kjs/property_slot.h.
        * kjs/RegExpObject.cpp: Copied from JavaScriptCore/kjs/regexp_object.cpp.
        * kjs/RegExpObject.h: Copied from JavaScriptCore/kjs/regexp_object.h.
        * kjs/ScopeChain.cpp: Copied from JavaScriptCore/kjs/scope_chain.cpp.
        * kjs/ScopeChain.h: Copied from JavaScriptCore/kjs/scope_chain.h.
        * kjs/ScopeChainMark.h: Copied from JavaScriptCore/kjs/scope_chain_mark.h.
        * kjs/Shell.cpp:
        * kjs/array_instance.cpp: Removed.
        * kjs/array_instance.h: Removed.
        * kjs/array_object.cpp: Removed.
        * kjs/array_object.h: Removed.
        * kjs/bool_object.cpp: Removed.
        * kjs/bool_object.h: Removed.
        * kjs/error_object.h:
        * kjs/function_object.cpp: Removed.
        * kjs/function_object.h: Removed.
        * kjs/internal.cpp:
        * kjs/math_object.cpp: Removed.
        * kjs/math_object.h: Removed.
        * kjs/nodes.cpp:
        * kjs/number_object.cpp: Removed.
        * kjs/number_object.h: Removed.
        * kjs/object_object.cpp:
        * kjs/property_map.cpp: Removed.
        * kjs/property_map.h: Removed.
        * kjs/property_slot.cpp: Removed.
        * kjs/property_slot.h: Removed.
        * kjs/regexp_object.cpp: Removed.
        * kjs/regexp_object.h: Removed.
        * kjs/scope_chain.cpp: Removed.
        * kjs/scope_chain.h: Removed.
        * kjs/scope_chain_mark.h: Removed.
        * kjs/string_object.cpp:
        * kjs/string_object.h:

2008-06-15  Darin Adler  <darin@apple.com>

        - new names for a few key JavaScriptCore files

        * API/JSBase.cpp:
        * API/JSCallbackConstructor.h:
        * API/JSCallbackFunction.cpp:
        * API/JSCallbackFunction.h:
        * API/JSCallbackObject.h:
        * API/JSCallbackObjectFunctions.h:
        * API/JSClassRef.h:
        * API/JSContextRef.cpp:
        * API/JSObjectRef.cpp:
        * API/JSStringRef.cpp:
        * API/JSStringRefCF.cpp:
        * API/JSValueRef.cpp:
        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * VM/CodeBlock.cpp:
        * VM/CodeGenerator.cpp:
        * VM/ExceptionHelpers.cpp:
        * VM/ExceptionHelpers.h:
        * VM/JSPropertyNameIterator.cpp:
        * VM/JSPropertyNameIterator.h:
        * VM/Machine.cpp:
        * kjs/AllInOneFile.cpp:
        * kjs/DateMath.cpp:
        * kjs/DebuggerCallFrame.cpp:
        * kjs/ExecState.cpp:
        * kjs/JSActivation.cpp:
        * kjs/JSFunction.cpp: Copied from JavaScriptCore/kjs/function.cpp.
        * kjs/JSFunction.h: Copied from JavaScriptCore/kjs/function.h.
        * kjs/JSImmediate.cpp:
        * kjs/JSNotAnObject.h:
        * kjs/JSObject.cpp: Copied from JavaScriptCore/kjs/object.cpp.
        * kjs/JSObject.h: Copied from JavaScriptCore/kjs/object.h.
        * kjs/JSString.h: Copied from JavaScriptCore/kjs/internal.h.
        * kjs/JSValue.cpp: Copied from JavaScriptCore/kjs/value.cpp.
        * kjs/JSValue.h: Copied from JavaScriptCore/kjs/value.h.
        * kjs/JSVariableObject.h:
        * kjs/JSWrapperObject.h:
        * kjs/Shell.cpp:
        * kjs/SymbolTable.h:
        * kjs/array_instance.h:
        * kjs/collector.cpp:
        * kjs/date_object.cpp:
        * kjs/date_object.h:
        * kjs/error_object.cpp:
        * kjs/function.cpp: Removed.
        * kjs/function.h: Removed.
        * kjs/function_object.cpp:
        * kjs/function_object.h:
        * kjs/grammar.y:
        * kjs/internal.cpp:
        * kjs/internal.h: Removed.
        * kjs/lexer.cpp:
        * kjs/list.h:
        * kjs/lookup.h:
        * kjs/nodes.h:
        * kjs/object.cpp: Removed.
        * kjs/object.h: Removed.
        * kjs/object_object.h:
        * kjs/operations.cpp:
        * kjs/property_map.cpp:
        * kjs/property_slot.cpp:
        * kjs/property_slot.h:
        * kjs/protect.h:
        * kjs/regexp_object.cpp:
        * kjs/scope_chain.cpp:
        * kjs/string_object.h:
        * kjs/ustring.cpp:
        * kjs/value.cpp: Removed.
        * kjs/value.h: Removed.
        * profiler/Profile.cpp:
        * profiler/Profiler.cpp:

2008-06-15  Darin Adler  <darin@apple.com>

        Rubber stamped by Sam.

        - cut down on confusing uses of "Object" and "Imp" in
          JavaScriptCore class names

        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::JSCallbackFunction):
        * API/JSCallbackFunction.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/ExecState.h:
        (KJS::ExecState::regExpTable):
        (KJS::ExecState::regExpConstructorTable):
        * kjs/JSGlobalData.cpp:
        (KJS::JSGlobalData::JSGlobalData):
        (KJS::JSGlobalData::~JSGlobalData):
        * kjs/JSGlobalData.h:
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::reset):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::objectConstructor):
        (KJS::JSGlobalObject::functionConstructor):
        (KJS::JSGlobalObject::arrayConstructor):
        (KJS::JSGlobalObject::booleanConstructor):
        (KJS::JSGlobalObject::stringConstructor):
        (KJS::JSGlobalObject::numberConstructor):
        (KJS::JSGlobalObject::dateConstructor):
        (KJS::JSGlobalObject::regExpConstructor):
        (KJS::JSGlobalObject::errorConstructor):
        (KJS::JSGlobalObject::evalErrorConstructor):
        (KJS::JSGlobalObject::rangeErrorConstructor):
        (KJS::JSGlobalObject::referenceErrorConstructor):
        (KJS::JSGlobalObject::syntaxErrorConstructor):
        (KJS::JSGlobalObject::typeErrorConstructor):
        (KJS::JSGlobalObject::URIErrorConstructor):
        * kjs/array_object.cpp:
        (KJS::ArrayConstructor::ArrayConstructor):
        (KJS::ArrayConstructor::getConstructData):
        (KJS::ArrayConstructor::construct):
        (KJS::ArrayConstructor::callAsFunction):
        * kjs/array_object.h:
        * kjs/bool_object.cpp:
        (KJS::BooleanObject::BooleanObject):
        (KJS::BooleanPrototype::BooleanPrototype):
        (KJS::booleanProtoFuncToString):
        (KJS::booleanProtoFuncValueOf):
        (KJS::BooleanConstructor::BooleanConstructor):
        (KJS::BooleanConstructor::getConstructData):
        (KJS::BooleanConstructor::construct):
        (KJS::BooleanConstructor::callAsFunction):
        * kjs/bool_object.h:
        * kjs/date_object.cpp:
        (KJS::DatePrototype::DatePrototype):
        (KJS::DateConstructor::DateConstructor):
        (KJS::DateConstructor::getConstructData):
        (KJS::DateConstructor::construct):
        (KJS::DateConstructor::callAsFunction):
        (KJS::DateFunction::DateFunction):
        (KJS::DateFunction::callAsFunction):
        * kjs/date_object.h:
        * kjs/error_object.cpp:
        (KJS::ErrorPrototype::ErrorPrototype):
        (KJS::ErrorConstructor::ErrorConstructor):
        (KJS::ErrorConstructor::getConstructData):
        (KJS::ErrorConstructor::construct):
        (KJS::ErrorConstructor::callAsFunction):
        (KJS::NativeErrorConstructor::NativeErrorConstructor):
        (KJS::NativeErrorConstructor::getConstructData):
        (KJS::NativeErrorConstructor::construct):
        (KJS::NativeErrorConstructor::callAsFunction):
        (KJS::NativeErrorConstructor::mark):
        * kjs/error_object.h:
        * kjs/function.cpp:
        (KJS::JSFunction::JSFunction):
        (KJS::JSFunction::mark):
        (KJS::JSFunction::getOwnPropertySlot):
        (KJS::JSFunction::put):
        (KJS::JSFunction::deleteProperty):
        (KJS::PrototypeFunction::PrototypeFunction):
        (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction):
        (KJS::PrototypeReflexiveFunction::mark):
        * kjs/function.h:
        * kjs/function_object.cpp:
        (KJS::functionProtoFuncToString):
        (KJS::FunctionConstructor::FunctionConstructor):
        (KJS::FunctionConstructor::getConstructData):
        (KJS::FunctionConstructor::construct):
        (KJS::FunctionConstructor::callAsFunction):
        * kjs/function_object.h:
        * kjs/internal.cpp:
        (KJS::StringObject::create):
        (KJS::JSString::toObject):
        (KJS::JSString::toThisObject):
        (KJS::JSString::getOwnPropertySlot):
        (KJS::InternalFunction::InternalFunction):
        (KJS::InternalFunction::getCallData):
        (KJS::InternalFunction::implementsHasInstance):
        * kjs/math_object.cpp:
        (KJS::MathObject::MathObject):
        (KJS::MathObject::getOwnPropertySlot):
        (KJS::MathObject::getValueProperty):
        * kjs/math_object.h:
        * kjs/number_object.cpp:
        (KJS::NumberObject::NumberObject):
        (KJS::NumberPrototype::NumberPrototype):
        (KJS::numberProtoFuncToString):
        (KJS::numberProtoFuncToLocaleString):
        (KJS::numberProtoFuncValueOf):
        (KJS::numberProtoFuncToFixed):
        (KJS::numberProtoFuncToExponential):
        (KJS::numberProtoFuncToPrecision):
        (KJS::NumberConstructor::NumberConstructor):
        (KJS::NumberConstructor::getOwnPropertySlot):
        (KJS::NumberConstructor::getValueProperty):
        (KJS::NumberConstructor::getConstructData):
        (KJS::NumberConstructor::construct):
        (KJS::NumberConstructor::callAsFunction):
        * kjs/number_object.h:
        * kjs/object.cpp:
        (KJS::JSObject::putDirectFunction):
        * kjs/object.h:
        * kjs/object_object.cpp:
        (KJS::ObjectConstructor::ObjectConstructor):
        (KJS::ObjectConstructor::getConstructData):
        (KJS::ObjectConstructor::construct):
        (KJS::ObjectConstructor::callAsFunction):
        * kjs/object_object.h:
        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp):
        * kjs/regexp_object.cpp:
        (KJS::regExpProtoFuncTest):
        (KJS::regExpProtoFuncExec):
        (KJS::regExpProtoFuncCompile):
        (KJS::regExpProtoFuncToString):
        (KJS::RegExpObject::RegExpObject):
        (KJS::RegExpObject::~RegExpObject):
        (KJS::RegExpObject::getOwnPropertySlot):
        (KJS::RegExpObject::getValueProperty):
        (KJS::RegExpObject::put):
        (KJS::RegExpObject::putValueProperty):
        (KJS::RegExpObject::match):
        (KJS::RegExpObject::test):
        (KJS::RegExpObject::exec):
        (KJS::RegExpObject::getCallData):
        (KJS::RegExpObject::callAsFunction):
        (KJS::RegExpConstructorPrivate::RegExpConstructorPrivate):
        (KJS::RegExpConstructor::RegExpConstructor):
        (KJS::RegExpConstructor::performMatch):
        (KJS::RegExpMatchesArray::RegExpMatchesArray):
        (KJS::RegExpMatchesArray::~RegExpMatchesArray):
        (KJS::RegExpMatchesArray::fillArrayInstance):
        (KJS::RegExpConstructor::arrayOfMatches):
        (KJS::RegExpConstructor::getBackref):
        (KJS::RegExpConstructor::getLastParen):
        (KJS::RegExpConstructor::getLeftContext):
        (KJS::RegExpConstructor::getRightContext):
        (KJS::RegExpConstructor::getOwnPropertySlot):
        (KJS::RegExpConstructor::getValueProperty):
        (KJS::RegExpConstructor::put):
        (KJS::RegExpConstructor::putValueProperty):
        (KJS::RegExpConstructor::getConstructData):
        (KJS::RegExpConstructor::construct):
        (KJS::RegExpConstructor::callAsFunction):
        (KJS::RegExpConstructor::input):
        * kjs/regexp_object.h:
        * kjs/string_object.cpp:
        (KJS::StringObject::StringObject):
        (KJS::StringObject::getOwnPropertySlot):
        (KJS::StringObject::put):
        (KJS::StringObject::deleteProperty):
        (KJS::StringObject::getPropertyNames):
        (KJS::StringPrototype::StringPrototype):
        (KJS::StringPrototype::getOwnPropertySlot):
        (KJS::replace):
        (KJS::stringProtoFuncToString):
        (KJS::stringProtoFuncValueOf):
        (KJS::stringProtoFuncCharAt):
        (KJS::stringProtoFuncCharCodeAt):
        (KJS::stringProtoFuncConcat):
        (KJS::stringProtoFuncIndexOf):
        (KJS::stringProtoFuncLastIndexOf):
        (KJS::stringProtoFuncMatch):
        (KJS::stringProtoFuncSearch):
        (KJS::stringProtoFuncReplace):
        (KJS::stringProtoFuncSlice):
        (KJS::stringProtoFuncSplit):
        (KJS::stringProtoFuncSubstr):
        (KJS::stringProtoFuncSubstring):
        (KJS::stringProtoFuncToLowerCase):
        (KJS::stringProtoFuncToUpperCase):
        (KJS::stringProtoFuncToLocaleLowerCase):
        (KJS::stringProtoFuncToLocaleUpperCase):
        (KJS::stringProtoFuncLocaleCompare):
        (KJS::stringProtoFuncBig):
        (KJS::stringProtoFuncSmall):
        (KJS::stringProtoFuncBlink):
        (KJS::stringProtoFuncBold):
        (KJS::stringProtoFuncFixed):
        (KJS::stringProtoFuncItalics):
        (KJS::stringProtoFuncStrike):
        (KJS::stringProtoFuncSub):
        (KJS::stringProtoFuncSup):
        (KJS::stringProtoFuncFontcolor):
        (KJS::stringProtoFuncFontsize):
        (KJS::stringProtoFuncAnchor):
        (KJS::stringProtoFuncLink):
        (KJS::StringConstructor::StringConstructor):
        (KJS::StringConstructor::getConstructData):
        (KJS::StringConstructor::construct):
        (KJS::StringConstructor::callAsFunction):
        (KJS::StringConstructorFunction::StringConstructorFunction):
        (KJS::StringConstructorFunction::callAsFunction):
        * kjs/string_object.h:
        (KJS::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined):
        * profiler/Profiler.cpp:
        (KJS::createCallIdentifier):

2008-06-15  Darin Adler  <darin@apple.com>

        Rubber stamped by Sam.

        - use JS prefix and simpler names for basic JavaScriptCore types,
          to complement JSValue and JSObject

        * JavaScriptCore.exp:
        * VM/Machine.cpp:
        (KJS::jsLess):
        (KJS::jsLessEq):
        (KJS::jsAdd):
        (KJS::callEval):
        (KJS::Machine::execute):
        (KJS::Machine::retrieveArguments):
        (KJS::Machine::retrieveCaller):
        (KJS::Machine::getCallFrame):
        (KJS::Machine::getFunctionAndArguments):
        * VM/Machine.h:
        * VM/Register.h:
        * kjs/DebuggerCallFrame.cpp:
        (KJS::DebuggerCallFrame::functionName):
        * kjs/ExecState.h:
        * kjs/JSActivation.cpp:
        (KJS::JSActivation::createArgumentsObject):
        * kjs/array_instance.cpp:
        (KJS::JSArray::checkConsistency):
        (KJS::JSArray::JSArray):
        (KJS::JSArray::~JSArray):
        (KJS::JSArray::getItem):
        (KJS::JSArray::lengthGetter):
        (KJS::JSArray::inlineGetOwnPropertySlot):
        (KJS::JSArray::getOwnPropertySlot):
        (KJS::JSArray::put):
        (KJS::JSArray::deleteProperty):
        (KJS::JSArray::getPropertyNames):
        (KJS::JSArray::increaseVectorLength):
        (KJS::JSArray::setLength):
        (KJS::JSArray::mark):
        (KJS::JSArray::sort):
        (KJS::JSArray::compactForSorting):
        (KJS::JSArray::lazyCreationData):
        (KJS::JSArray::setLazyCreationData):
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (KJS::ArrayPrototype::ArrayPrototype):
        (KJS::ArrayPrototype::getOwnPropertySlot):
        (KJS::arrayProtoFuncToString):
        (KJS::arrayProtoFuncToLocaleString):
        (KJS::arrayProtoFuncConcat):
        (KJS::arrayProtoFuncSort):
        (KJS::ArrayObjectImp::construct):
        * kjs/array_object.h:
        * kjs/completion.h:
        * kjs/function.cpp:
        (KJS::JSFunction::JSFunction):
        (KJS::JSFunction::mark):
        (KJS::JSFunction::getCallData):
        (KJS::JSFunction::callAsFunction):
        (KJS::JSFunction::argumentsGetter):
        (KJS::JSFunction::callerGetter):
        (KJS::JSFunction::lengthGetter):
        (KJS::JSFunction::getOwnPropertySlot):
        (KJS::JSFunction::put):
        (KJS::JSFunction::deleteProperty):
        (KJS::JSFunction::getParameterName):
        (KJS::JSFunction::getConstructData):
        (KJS::JSFunction::construct):
        (KJS::IndexToNameMap::IndexToNameMap):
        (KJS::Arguments::Arguments):
        * kjs/function.h:
        * kjs/function_object.cpp:
        (KJS::functionProtoFuncToString):
        (KJS::functionProtoFuncApply):
        (KJS::FunctionObjectImp::construct):
        * kjs/internal.cpp:
        (KJS::JSString::toPrimitive):
        (KJS::JSString::getPrimitiveNumber):
        (KJS::JSString::toBoolean):
        (KJS::JSString::toNumber):
        (KJS::JSString::toString):
        (KJS::StringInstance::create):
        (KJS::JSString::toObject):
        (KJS::JSString::toThisObject):
        (KJS::JSString::lengthGetter):
        (KJS::JSString::indexGetter):
        (KJS::JSString::indexNumericPropertyGetter):
        (KJS::JSString::getOwnPropertySlot):
        (KJS::JSNumberCell::type):
        (KJS::JSNumberCell::toPrimitive):
        (KJS::JSNumberCell::getPrimitiveNumber):
        (KJS::JSNumberCell::toBoolean):
        (KJS::JSNumberCell::toNumber):
        (KJS::JSNumberCell::toString):
        (KJS::JSNumberCell::toObject):
        (KJS::JSNumberCell::toThisObject):
        (KJS::JSNumberCell::getUInt32):
        (KJS::JSNumberCell::getTruncatedInt32):
        (KJS::JSNumberCell::getTruncatedUInt32):
        (KJS::GetterSetter::mark):
        (KJS::GetterSetter::toPrimitive):
        (KJS::GetterSetter::getPrimitiveNumber):
        (KJS::GetterSetter::toBoolean):
        (KJS::GetterSetter::toNumber):
        (KJS::GetterSetter::toString):
        (KJS::GetterSetter::toObject):
        (KJS::GetterSetter::getOwnPropertySlot):
        (KJS::GetterSetter::put):
        (KJS::GetterSetter::toThisObject):
        * kjs/internal.h:
        (KJS::JSString::JSString):
        (KJS::JSString::getStringPropertySlot):
        * kjs/nodes.cpp:
        (KJS::FuncDeclNode::makeFunction):
        (KJS::FuncExprNode::makeFunction):
        * kjs/nodes.h:
        * kjs/object.cpp:
        (KJS::JSObject::put):
        (KJS::JSObject::deleteProperty):
        (KJS::JSObject::defineGetter):
        (KJS::JSObject::defineSetter):
        (KJS::JSObject::lookupGetter):
        (KJS::JSObject::lookupSetter):
        (KJS::JSObject::fillGetterPropertySlot):
        * kjs/object.h:
        (KJS::GetterSetter::GetterSetter):
        * kjs/operations.cpp:
        (KJS::equal):
        (KJS::strictEqual):
        * kjs/property_map.cpp:
        (KJS::PropertyMap::containsGettersOrSetters):
        * kjs/regexp_object.cpp:
        (KJS::RegExpMatchesArray::getOwnPropertySlot):
        (KJS::RegExpMatchesArray::put):
        (KJS::RegExpMatchesArray::deleteProperty):
        (KJS::RegExpMatchesArray::getPropertyNames):
        (KJS::RegExpMatchesArray::RegExpMatchesArray):
        (KJS::RegExpMatchesArray::fillArrayInstance):
        * kjs/string_object.cpp:
        (KJS::StringInstance::StringInstance):
        (KJS::replace):
        (KJS::stringProtoFuncReplace):
        (KJS::stringProtoFuncToLowerCase):
        (KJS::stringProtoFuncToUpperCase):
        (KJS::stringProtoFuncToLocaleLowerCase):
        (KJS::stringProtoFuncToLocaleUpperCase):
        * kjs/string_object.h:
        (KJS::StringInstance::internalValue):
        * kjs/value.cpp:
        (KJS::JSCell::getNumber):
        (KJS::JSCell::getString):
        (KJS::JSCell::getObject):
        (KJS::jsString):
        (KJS::jsOwnedString):
        * kjs/value.h:
        (KJS::JSNumberCell::JSNumberCell):
        (KJS::jsNumberCell):
        (KJS::JSValue::uncheckedGetNumber):
        * profiler/Profiler.cpp:
        (KJS::createCallIdentifier):
        (KJS::createCallIdentifierFromFunctionImp):

2008-06-15  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Alexey.
        
        - add emitUnaryOp, emitNullaryOp and emitUnaryOpNoDst; use them
        
        This removes some boilerplate code and also reduces the number of
        places that will need to be changed to do on-demand emit of
        loads (and thus support k operands).

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitUnaryOp):
        (KJS::CodeGenerator::emitNullaryOp):
        (KJS::CodeGenerator::emitUnaryOpNoDst):
        (KJS::CodeGenerator::emitPushScope):
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::emitNewObject):
        (KJS::CodeGenerator::emitNewArray):
        (KJS::CodeGenerator::emitNot):
        (KJS::CodeGenerator::emitBitNot):
        (KJS::CodeGenerator::emitToJSNumber):
        (KJS::CodeGenerator::emitNegate):
        (KJS::CodeGenerator::emitInstanceOf):
        (KJS::CodeGenerator::emitTypeOf):
        (KJS::CodeGenerator::emitIn):
        (KJS::CodeGenerator::emitReturn):
        (KJS::CodeGenerator::emitEnd):
        (KJS::CodeGenerator::emitGetPropertyNames):

2008-06-15  Alp Toker  <alp@nuanti.com>

        Rubber-stamped by Maciej.

        Install 'jsc' application by default.

        * GNUmakefile.am:

2008-06-15  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - rename testkjs to jsc

        * GNUmakefile.am:
        * JavaScriptCore.vcproj/JavaScriptCore.sln:
        * JavaScriptCore.vcproj/jsc: Added.
        * JavaScriptCore.vcproj/jsc/jsc.vcproj: Copied from JavaScriptCore.vcproj/testkjs/testkjs.vcproj.
        * JavaScriptCore.vcproj/testkjs: Removed.
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Removed.
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * jscore.bkl:
        * kjs/Shell.cpp: Copied from kjs/testkjs.cpp.
        (main):
        (printUsageStatement):
        (jscmain):
        * kjs/jsc.pro: Copied from kjs/testkjs.pro.
        * kjs/testkjs.cpp: Removed.
        * kjs/testkjs.pro: Removed.
        * tests/mozilla/expected.html:
        * tests/mozilla/js1_2/Array/tostring_1.js:
        * tests/mozilla/js1_2/Array/tostring_2.js:
        * tests/mozilla/jsDriver.pl:

2008-06-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Mac build fix.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/nodes.h:

2008-06-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Change the spelling of PrecMultiplicitave to PrecMultiplicative.

        * kjs/nodes.h:
        (KJS::MultNode::precedence):
        (KJS::DivNode::precedence):
        (KJS::ModNode::precedence):

2008-06-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Remove unused preprocessor macros related to exceptions in the old
        interpreter.

        * kjs/nodes.cpp:

2008-06-15  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Bug 19484: More instructions needs to use temporary registers
        <https://bugs.webkit.org/show_bug.cgi?id=19484>

        Fix codegen for all binary operations so that temporaries are used if
        necessary. This was done by making BinaryOpNode and ReverseBinaryOpNode
        subclasses of ExpressionNode, and eliminating the custom emitCode()
        methods for the individual node classes.

        This only adds 3 new instructions to SunSpider code, and there is no
        difference in SunSpider execution time.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitBitNot):
        (KJS::CodeGenerator::emitBinaryOp):
        * VM/CodeGenerator.h:
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::PreIncResolveNode::emitCode):
        (KJS::PreDecResolveNode::emitCode):
        (KJS::BinaryOpNode::emitCode):
        (KJS::ReverseBinaryOpNode::emitCode):
        (KJS::emitReadModifyAssignment):
        (KJS::CaseBlockNode::emitCodeForBlock):
        * kjs/nodes.h:
        (KJS::BinaryOpNode::BinaryOpNode):
        (KJS::ReverseBinaryOpNode::ReverseBinaryOpNode):
        (KJS::MultNode::):
        (KJS::DivNode::):
        (KJS::DivNode::precedence):
        (KJS::ModNode::):
        (KJS::ModNode::precedence):
        (KJS::AddNode::):
        (KJS::AddNode::precedence):
        (KJS::SubNode::):
        (KJS::SubNode::precedence):
        (KJS::LeftShiftNode::):
        (KJS::LeftShiftNode::precedence):
        (KJS::RightShiftNode::):
        (KJS::RightShiftNode::precedence):
        (KJS::UnsignedRightShiftNode::):
        (KJS::UnsignedRightShiftNode::precedence):
        (KJS::LessNode::):
        (KJS::LessNode::precedence):
        (KJS::GreaterNode::):
        (KJS::GreaterNode::precedence):
        (KJS::LessEqNode::):
        (KJS::LessEqNode::precedence):
        (KJS::GreaterEqNode::):
        (KJS::GreaterEqNode::precedence):
        (KJS::InstanceOfNode::):
        (KJS::InstanceOfNode::precedence):
        (KJS::InNode::):
        (KJS::InNode::precedence):
        (KJS::EqualNode::):
        (KJS::EqualNode::precedence):
        (KJS::NotEqualNode::):
        (KJS::NotEqualNode::precedence):
        (KJS::StrictEqualNode::):
        (KJS::StrictEqualNode::precedence):
        (KJS::NotStrictEqualNode::):
        (KJS::NotStrictEqualNode::precedence):
        (KJS::BitAndNode::):
        (KJS::BitAndNode::precedence):
        (KJS::BitOrNode::):
        (KJS::BitOrNode::precedence):
        (KJS::BitXOrNode::):
        (KJS::BitXOrNode::precedence):
        * kjs/nodes2string.cpp:
        (KJS::LessNode::streamTo):
        (KJS::GreaterNode::streamTo):
        (KJS::LessEqNode::streamTo):
        (KJS::GreaterEqNode::streamTo):
        (KJS::InstanceOfNode::streamTo):
        (KJS::InNode::streamTo):
        (KJS::EqualNode::streamTo):
        (KJS::NotEqualNode::streamTo):
        (KJS::StrictEqualNode::streamTo):
        (KJS::NotStrictEqualNode::streamTo):
        (KJS::BitAndNode::streamTo):
        (KJS::BitXOrNode::streamTo):
        (KJS::BitOrNode::streamTo):

2008-06-14  Darin Adler  <darin@apple.com>

        Rubber stamped by Sam.

        - rename a bunch of local symbols within the regular expression code to
          follow our usual coding style, and do a few other name tweaks

        * pcre/pcre_compile.cpp:
        (CompileData::CompileData):
        (checkEscape):
        (readRepeatCounts):
        (compileBranch):
        (compileBracket):
        (calculateCompiledPatternLength):
        (returnError):
        (jsRegExpCompile):
        * pcre/pcre_exec.cpp:
        (MatchStack::MatchStack):
        (MatchStack::canUseStackBufferForNextFrame):
        (MatchStack::popCurrentFrame):
        (match):
        (tryFirstByteOptimization):
        (tryRequiredByteOptimization):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:

2008-06-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Darin.

        Remove redundant uses of get().

        * kjs/nodes.cpp:
        (KJS::BracketAccessorNode::emitCode):
        (KJS::AddNode::emitCode):
        (KJS::SubNode::emitCode):
        (KJS::ReadModifyResolveNode::emitCode):
        (KJS::AssignDotNode::emitCode):
        (KJS::ReadModifyDotNode::emitCode):
        (KJS::AssignBracketNode::emitCode):
        (KJS::ReadModifyBracketNode::emitCode):

2008-06-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Make code generation not use a temporary for the left-hand side of an
        expression if the right-hand side is a local variable.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::isLocal):
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::leftHandSideNeedsCopy):
        (KJS::CodeGenerator::emitNodeForLeftHandSide):
        * kjs/nodes.cpp:
        (KJS::ResolveNode::isPure):
        (KJS::BracketAccessorNode::emitCode):
        (KJS::AddNode::emitCode):
        (KJS::SubNode::emitCode):
        (KJS::ReadModifyResolveNode::emitCode):
        (KJS::AssignDotNode::emitCode):
        (KJS::ReadModifyDotNode::emitCode):
        (KJS::AssignBracketNode::emitCode):
        (KJS::ReadModifyBracketNode::emitCode):
        * kjs/nodes.h:
        (KJS::ExpressionNode::):
        (KJS::BooleanNode::):
        (KJS::NumberNode::):
        (KJS::StringNode::):

2008-06-14  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        - more of https://bugs.webkit.org/show_bug.cgi?id=17257
          start ref counts at 1 instead of 0 for speed

        * kjs/nodes.cpp:
        (KJS::ParserRefCounted::hasOneRef): Added. Replaces refcount.
        * kjs/nodes.h: Replaced refcount with hasOneRef.

        * wtf/ListRefPtr.h:
        (WTF::ListRefPtr::~ListRefPtr): Changed to use hasOneRef instead of
        refcount, so this class can be used with the RefCounted template.

        * wtf/RefCounted.h:
        (WTF::RefCounted::hasOneRef): Made const, since there's no reason for
        it to be non-const.

2008-06-14  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - initialize local vars as side effect of call instead of in bytecode
        1.004x speedup on SunSpider.

        This removes just the dispatch overhead for these loads - in the
        future, dead store elimination might be able to eliminate them
        entirely.
        
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator): For function blocks, don't
        emit loads of undefined for var initialization.
        * VM/Machine.cpp:
        (KJS::slideRegisterWindowForCall): Instead, initialize locals
        as part of the call.

2008-06-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Remove helper functions in the parser that are no longer needed.

        * kjs/grammar.y:

2008-06-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 19484: More instructions needs to use temporary registers
        <https://bugs.webkit.org/show_bug.cgi?id=19484>

        Make code generation for AddNode and SubNode use temporaries when
        necessary.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::AddNode::emitCode):
        (KJS::SubNode::emitCode):
        * kjs/nodes.h:
        (KJS::AddNode::):
        (KJS::SubNode::):

2008-06-13  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Combine TrueNode and FalseNode to make BooleanNode, and remove the
        unused class PlaceholderTrueNode.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::BooleanNode::emitCode):
        * kjs/nodes.h:
        (KJS::BooleanNode::):
        (KJS::BooleanNode::precedence):
        * kjs/nodes2string.cpp:
        (KJS::BooleanNode::streamTo):

2008-06-13  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Eliminate the use of temporaries to store the left hand side of an
        expression when the right hand side is a constant. This slightly
        improves the generated bytecode for a few SunSpider tests, but it is
        mostly in preparation for fixing

        Bug 19484: More instructions needs to use temporary registers
        <https://bugs.webkit.org/show_bug.cgi?id=19484>

        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::leftHandSideNeedsCopy):
        (KJS::CodeGenerator::emitNodeForLeftHandSide):
        * kjs/nodes.cpp:
        (KJS::BracketAccessorNode::emitCode):
        (KJS::ReadModifyResolveNode::emitCode):
        (KJS::AssignDotNode::emitCode):
        (KJS::ReadModifyDotNode::emitCode):
        (KJS::AssignBracketNode::emitCode):
        (KJS::ReadModifyBracketNode::emitCode):
        * kjs/nodes.h:
        (KJS::ExpressionNode::):
        (KJS::FalseNode::):
        (KJS::TrueNode::):
        (KJS::NumberNode::):
        (KJS::StringNode::):

2008-06-13  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - prettify opcode stats output
        
        I changed things to be a bit more aligned, also there is a new
        section listing most common opcodes and most common sequences that
        include them.

        * VM/Opcode.cpp:
        (KJS::OpcodeStats::~OpcodeStats):
        * VM/Opcode.h:

2008-06-13  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geoff.

        <rdar://problem/5969992> JSProfiler: Remove the recursion limit in the
        profiler.
        - Remove recursion from exclude().  This leaves only focus() to fix.

        * JavaScriptCore.exp: Change the signatures of the exported functions.
        * profiler/Profile.cpp:
        (KJS::Profile::forEach): I added a traverseNextNodePreOrder() function
        and so needed to distinguish the other function by labeling it
        traverseNextNodePostOrder().
        (KJS::Profile::exclude): All new exclude that iteratively walks the tree
        * profiler/Profile.h:
        (KJS::Profile::focus): Add a null check for m_head.
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::traverseNextNodePostOrder): Renamed
        (KJS::ProfileNode::traverseNextNodePreOrder): Walks the tree in pre-
        order, where the parent is processed before the children.
        (KJS::ProfileNode::setTreeVisible): Iterate over the sub-tree and set
        all of the nodes visible value.  This changes another function that used
        recursion.
        (KJS::ProfileNode::exclude): Remove recursion from this function.
        Because we now check for m_visible and we are walking the tree in pre-
        order we do not need to check if an excluded node is in an excluded
        sub-tree.
        * profiler/ProfileNode.h: Added specific selfTime functions to
        facilitate exclude().
        (KJS::ProfileNode::setSelfTime):
        (KJS::ProfileNode::setActualSelfTime):
        (KJS::ProfileNode::setVisibleSelfTime):

2008-06-12  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - https://bugs.webkit.org/show_bug.cgi?id=19434
          speed up SunSpider by avoiding some string boxing

        Speeds up SunSpider by 1.1%.

        Optimized code path for getting built-in properties from strings -- avoid
        boxing with a string object in that case. We can make further changes to avoid
        even more boxing, but this change alone is a win.

        * API/JSCallbackObjectFunctions.h:
        (KJS::JSCallbackObject::staticValueGetter): Use isObject instead of inherits
        in asssert, since the type of slotBase() is now JSValue, not JSObject.
        (KJS::JSCallbackObject::staticFunctionGetter): Ditto.
        (KJS::JSCallbackObject::callbackGetter): Ditto.

        * kjs/internal.cpp:
        (KJS::StringImp::getPrimitiveNumber): Updated for change of data member name.
        (KJS::StringImp::toBoolean): Ditto.
        (KJS::StringImp::toNumber): Ditto.
        (KJS::StringImp::toString): Ditto.
        (KJS::StringInstance::create): Added; avoids a bit of cut and paste code.
        (KJS::StringImp::toObject): Use StringInstance::create.
        (KJS::StringImp::toThisObject): Ditto.
        (KJS::StringImp::lengthGetter): Added. Replaces the getter that used to live in
        the StringInstance class.
        (KJS::StringImp::indexGetter): Ditto.
        (KJS::StringImp::indexNumericPropertyGetter): Ditto.
        (KJS::StringImp::getOwnPropertySlot): Added. Deals with built in properties of
        the string class without creating a StringInstance.

        * kjs/internal.h:
        (KJS::StringImp::getStringPropertySlot): Added. To be used by both the string
        and string object getOwnPropertySlot function.

        * kjs/lookup.h:
        (KJS::staticFunctionGetter): Updated since slotBase() is now a JSValue rather
        than a JSObject.

        * kjs/object.h: Removed PropertySlot::slotBase() function, which can now move
        back into property_slot.h where it belongs since it doesn't have to cast to
        JSObject*.

        * kjs/property_slot.cpp:
        (KJS::PropertySlot::functionGetter): Updated since slot.slotBase() is now a JSValue*
        instead of JSObject*. setGetterSlot still guarantees the base is a JSObject*.
        * kjs/property_slot.h:
        (KJS::PropertySlot::PropertySlot): Changed base to JSValue* intead of JSCell*.
        (KJS::PropertySlot::setStaticEntry): Ditto.
        (KJS::PropertySlot::setCustom): Ditto.
        (KJS::PropertySlot::setCustomIndex): Ditto.
        (KJS::PropertySlot::setCustomNumeric): Ditto.
        (KJS::PropertySlot::slotBase): Moved inline here since it no longer involves a
        downcast to JSObject*.
        (KJS::PropertySlot::setBase): Changed to JSValue*.

        * kjs/string_object.cpp:
        (KJS::StringInstance::getOwnPropertySlot): Changed to use getStringPropertySlot
        instead of coding the properties here. This allows sharing the code with StringImp.

        * kjs/string_object.h: Removed inlineGetOwnPropertySlot, lengthGetter, and indexGetter.
        Made one of the constructors protected.

        * kjs/value.h: Made getOwnPropertySlot private in the JSCell class -- this is better
        since it's not the real JSObject getOwnPropertySlot semantic and most callers shouldn't
        use it.

2008-06-12  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Maciej.

        Preparation to making JavaScript heap per-thread.

        * kjs/collector.cpp:
        (KJS::Collector::collect):
        * kjs/collector.h:
        (KJS::Collector::markListSet):
        The collector now holds the list of protected lists itself, to be made per-instance.

        * kjs/list.h: Changed to hold a pointer to a mark set this list is in, if any.
        (KJS::List::List): Explicitly initialize m_size with zero, as m_vector.size() is
        guaranteed to be such anyway.
        (KJS::List::append): Changed the fast case to only be executed as long as inline buffer
        is used, because otherwise, we now do more expensive checks.

        * kjs/list.cpp:
        (KJS::List::markLists): Renamed from markProtectedListsSlowCase, made it take the list set
        as a parameter.
        (KJS::List::slowAppend): If a non-immediate value is appended, the list needs to be added
        to an appropriate Heap's protected list. For now, a static Collector::markListSet() is
        used, but the code is layed out in preparation to making the switch to multiple heaps.

        * JavaScriptCore.exp: Updated export list.

2008-06-12  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Bug 19510: CodeBlock::needsFullScopeChain not always set for global code
        <https://bugs.webkit.org/show_bug.cgi?id=19510>

        This fixes the symptoms by using CodeGenerator::m_codeType to determine
        when to use temporaries instead of CodeBlock::needsFullScopeChain, but
        it does not fix the problem itself.

        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::leftHandSideNeedsCopy):

2008-06-11  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Bug 19498: REGRESSION (r34497): crash while loading GMail
        <https://bugs.webkit.org/show_bug.cgi?id=19498>

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitJumpIfTrueMayCombine):
        (KJS::CodeGenerator::emitJumpIfTrue):
        * VM/CodeGenerator.h:
        * kjs/nodes.cpp:
        (KJS::DoWhileNode::emitCode):
        (KJS::WhileNode::emitCode):
        (KJS::ForNode::emitCode):
        (KJS::CaseBlockNode::emitCodeForBlock):

2008-06-11  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - a little bit of cleanup and prep for some upcoming optimizations

        * JavaScriptCore.exp: Re-sorted this file (with sort command line tool).
        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump): Fixed printf to avoid warnings -- to use %lu we
        need to make sure the type is unsigned long.
        * kjs/object.cpp:
        (KJS::Error::create): Eliminated unused error names array, and also put
        the strings into the code since there was already a switch statment.
        This also avoids having to contemplate a hypothetical access past the
        end of the array.
        * kjs/object.h: Got rid of errorNames.
        * kjs/property_slot.cpp: Deleted unused ungettableGetter.
        * kjs/property_slot.h: Ditto.
        * wtf/AlwaysInline.h: Added LIKELY alongside UNLIKELY.

2008-06-11  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Darin.

        Bug 19457: Create fused opcodes for tests and conditional jumps
        <https://bugs.webkit.org/show_bug.cgi?id=19457>

        Add a new jless instruction, and modify the code generator to emit it
        instead of the pair (less, jtrue).

        Gives a 3.6% improvement on SunSpider.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::emitOpcode):
        (KJS::CodeGenerator::retrieveLastBinaryOp):
        (KJS::CodeGenerator::rewindBinaryOp):
        (KJS::CodeGenerator::emitJump):
        (KJS::CodeGenerator::emitJumpIfTrue):
        (KJS::CodeGenerator::emitJumpIfFalse):
        (KJS::CodeGenerator::emitMove):
        (KJS::CodeGenerator::emitNot):
        (KJS::CodeGenerator::emitEqual):
        (KJS::CodeGenerator::emitNotEqual):
        (KJS::CodeGenerator::emitStrictEqual):
        (KJS::CodeGenerator::emitNotStrictEqual):
        (KJS::CodeGenerator::emitLess):
        (KJS::CodeGenerator::emitLessEq):
        (KJS::CodeGenerator::emitPreInc):
        (KJS::CodeGenerator::emitPreDec):
        (KJS::CodeGenerator::emitPostInc):
        (KJS::CodeGenerator::emitPostDec):
        (KJS::CodeGenerator::emitToJSNumber):
        (KJS::CodeGenerator::emitNegate):
        (KJS::CodeGenerator::emitAdd):
        (KJS::CodeGenerator::emitMul):
        (KJS::CodeGenerator::emitDiv):
        (KJS::CodeGenerator::emitMod):
        (KJS::CodeGenerator::emitSub):
        (KJS::CodeGenerator::emitLeftShift):
        (KJS::CodeGenerator::emitRightShift):
        (KJS::CodeGenerator::emitUnsignedRightShift):
        (KJS::CodeGenerator::emitBitAnd):
        (KJS::CodeGenerator::emitBitXOr):
        (KJS::CodeGenerator::emitBitOr):
        (KJS::CodeGenerator::emitBitNot):
        (KJS::CodeGenerator::emitInstanceOf):
        (KJS::CodeGenerator::emitTypeOf):
        (KJS::CodeGenerator::emitIn):
        (KJS::CodeGenerator::emitLoad):
        (KJS::CodeGenerator::emitNewObject):
        (KJS::CodeGenerator::emitNewArray):
        (KJS::CodeGenerator::emitResolve):
        (KJS::CodeGenerator::emitGetScopedVar):
        (KJS::CodeGenerator::emitPutScopedVar):
        (KJS::CodeGenerator::emitResolveBase):
        (KJS::CodeGenerator::emitResolveWithBase):
        (KJS::CodeGenerator::emitResolveFunction):
        (KJS::CodeGenerator::emitGetById):
        (KJS::CodeGenerator::emitPutById):
        (KJS::CodeGenerator::emitPutGetter):
        (KJS::CodeGenerator::emitPutSetter):
        (KJS::CodeGenerator::emitDeleteById):
        (KJS::CodeGenerator::emitGetByVal):
        (KJS::CodeGenerator::emitPutByVal):
        (KJS::CodeGenerator::emitDeleteByVal):
        (KJS::CodeGenerator::emitPutByIndex):
        (KJS::CodeGenerator::emitNewFunction):
        (KJS::CodeGenerator::emitNewRegExp):
        (KJS::CodeGenerator::emitNewFunctionExpression):
        (KJS::CodeGenerator::emitCall):
        (KJS::CodeGenerator::emitReturn):
        (KJS::CodeGenerator::emitEnd):
        (KJS::CodeGenerator::emitConstruct):
        (KJS::CodeGenerator::emitPushScope):
        (KJS::CodeGenerator::emitPopScope):
        (KJS::CodeGenerator::emitDebugHook):
        (KJS::CodeGenerator::emitComplexJumpScopes):
        (KJS::CodeGenerator::emitJumpScopes):
        (KJS::CodeGenerator::emitNextPropertyName):
        (KJS::CodeGenerator::emitGetPropertyNames):
        (KJS::CodeGenerator::emitCatch):
        (KJS::CodeGenerator::emitThrow):
        (KJS::CodeGenerator::emitNewError):
        (KJS::CodeGenerator::emitJumpSubroutine):
        (KJS::CodeGenerator::emitSubroutineReturn):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.cpp:
        * VM/Opcode.h:

2008-06-11  Darin Adler  <darin@apple.com>

        Reviewed by Alexey.

        - fix https://bugs.webkit.org/show_bug.cgi?id=19442
          JavaScript array implementation doesn't maintain m_numValuesInVector when sorting

        * kjs/array_instance.cpp:
        (KJS::ArrayInstance::checkConsistency): Added. Empty inline version for when
        consistency checks are turned off.
        (KJS::ArrayInstance::ArrayInstance): Check consistency after construction.
        (KJS::ArrayInstance::~ArrayInstance): Check consistency before destruction.
        (KJS::ArrayInstance::put): Check consistency before and after.
        (KJS::ArrayInstance::deleteProperty): Ditto.
        (KJS::ArrayInstance::setLength): Ditto.
        (KJS::compareByStringPairForQSort): Use typedef for clarity.
        (KJS::ArrayInstance::sort): Check consistency before and after. Also broke the loop
        to set up sorting into two separate passes. Added FIXMEs about various exception
        safety issues. Added code to set m_numValuesInVector after sorting.
        (KJS::ArrayInstance::compactForSorting): Ditto.

        * kjs/array_instance.h: Added a definition of an enum for the types of consistency
        check and a declaration of the consistency checking function.

2008-06-10  Kevin Ollivier  <kevino@theolliviers.com>

        wx build fix. Link against libedit on Mac since HAVE(READLINE) is defined there.

        * jscore.bkl:

2008-06-10  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        https://bugs.webkit.org/show_bug.cgi?id=16503
        match limit takes at least 13% of the time on the SunSpider regexp-dna test

        Make the limit test slightly more efficient. It is not clear how much of a win it is,
        as the improvement on regexp-dna varies from 2.3% to 0.6% depending on what revision I
        apply the patch to. Today, the win on regexp-dna was minimal, but the total win was whopping
        0.5%, due to random code generation changes.

        * pcre/pcre_exec.cpp: (match): Avoid loading a constant on each iteration.

2008-06-09  Alp Toker  <alp@nuanti.com>

        gcc3/autotools build fix. Add explicit -O2 -fno-strict-aliasing to
        each of the tools since these are no longer set globally.

        * GNUmakefile.am:

2008-06-09  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Sam.

        Add an include for readline/history.h to fix the build for Darwin users
        with the GNU readline library installed. Also, clean up the style of
        the HAVE(READLINE) check.

        * kjs/testkjs.cpp:
        (runInteractive):

2008-06-09  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Darin.

        Bug 17531: Add interactive mode to testkjs
        <https://bugs.webkit.org/show_bug.cgi?id=17531>

        This is a cleaned up version of Sam's earlier patch to add an
        interactive mode to testkjs.

        Readline support is only enabled on Darwin platforms for now, but
        other ports can enable it by defining HAVE_READLINE in kjs/config.h.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/config.h:
        * kjs/testkjs.cpp:
        (Options::Options):
        (runWithScripts):
        (runInteractive):
        (printUsageStatement):
        (parseArguments):
        (kjsmain):

2008-06-08  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Darin.

        Bug 19346: REGRESSION: Mootools 1.2 Class inheritance broken in post-SquirrelFish merge
        <https://bugs.webkit.org/show_bug.cgi?id=19346>

        A check for whether a function's caller is eval code accidentally included
        the case where the caller's caller is native code. Add a CodeType field to
        CodeBlock and use this for the eval caller test instead.

        * VM/CodeBlock.h:
        (KJS::CodeBlock::CodeBlock):
        (KJS::ProgramCodeBlock::ProgramCodeBlock):
        (KJS::EvalCodeBlock::EvalCodeBlock):
        * VM/Machine.cpp:
        (KJS::getCallerFunctionOffset):
        * kjs/nodes.cpp:
        (KJS::FunctionBodyNode::generateCode):
        (KJS::ProgramNode::generateCode):

2008-06-07  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Dan Bernstein.

        Bug 17928: testkjs shouldn't require "-f"
        <https://bugs.webkit.org/show_bug.cgi?id=17928>

        * kjs/testkjs.cpp:
        (printUsageStatement):
        (parseArguments):

2008-06-07  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Eric.

        Bug 17548: JavaScriptCore print(a, b) differs from Spidermonkey Behavior
        <https://bugs.webkit.org/show_bug.cgi?id=17548>

        * kjs/testkjs.cpp:
        (functionPrint):

2008-06-07  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Sam.

        Bug 17547: JavaScriptCore print() differs from Spidermonkey Behavior
        <https://bugs.webkit.org/show_bug.cgi?id=17547>

        * kjs/testkjs.cpp:
        (functionPrint):

2008-06-07  Alexey Proskuryakov  <ap@webkit.org>

        More build fixes.

        * kjs/JSGlobalData.cpp: Fixed an included file name for case-sensitive file systems, fixed
        JSGlobalData::threadInstance() for non-multithreaded builds.

2008-06-07  Alexey Proskuryakov  <ap@webkit.org>

        Build fix - actually adding JSGlobalData.cpp to non-Mac builds!

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCoreSources.bkl:

2008-06-07  Alexey Proskuryakov  <ap@webkit.org>

        Try to fix Gtk/gcc 4.3 build.

        * kjs/JSGlobalData.h: Include ustring.h instead of forward-declaring UString::Rep.

2008-06-06  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Combine per-thread objects into one, to make it easier to support legacy clients (for
        which they shouldn't be really per-thread).

        No change on SunSpider total.

        * JavaScriptCore.xcodeproj/project.pbxproj: Added JSGlobalData.{h,cpp}

        * kjs/JSGlobalData.cpp: Added.
        (KJS::JSGlobalData::JSGlobalData):
        (KJS::JSGlobalData::~JSGlobalData):
        (KJS::JSGlobalData::threadInstance):
        * kjs/JSGlobalData.h: Added.
        This class encapsulates all data that should be per-thread (or shared between legacy clients).
        It will also keep a Heap pointer, but right now, Heap (Collector) methods are all static.

        * kjs/identifier.h:
        (KJS::Identifier::Identifier):
        Added a constructor explicitly taking JSGlobalData to access IdentifierTable. Actually,
        all of them should, but this will be a separate patch.

        * kjs/identifier.cpp:
        (KJS::IdentifierTable::literalTable):
        (KJS::createIdentifierTable):
        (KJS::deleteIdentifierTable):
        (KJS::Identifier::add):
        (KJS::Identifier::addSlowCase):
        Combined IdentifierTable and LiteralIdentifierTable into a single class for simplicity.

        * kjs/grammar.y: kjsyyparse now takes JSGlobalData, not just a Lexer.

        * kjs/nodes.cpp:
        (KJS::Node::Node):
        (KJS::EvalFunctionCallNode::emitCode):
        (KJS::ScopeNode::ScopeNode):
        Changed to access Lexer and Parser via JSGlobalData::threadInstance(). This is also a
        temporary measure, they will need to use JSGlobalData explicitly.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::callEval):
        * kjs/CommonIdentifiers.cpp:
        (KJS::CommonIdentifiers::CommonIdentifiers):
        * kjs/CommonIdentifiers.h:
        * kjs/DebuggerCallFrame.cpp:
        (KJS::DebuggerCallFrame::evaluate):
        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        * kjs/ExecState.h:
        (KJS::ExecState::globalData):
        (KJS::ExecState::identifierTable):
        (KJS::ExecState::propertyNames):
        (KJS::ExecState::emptyList):
        (KJS::ExecState::lexer):
        (KJS::ExecState::parser):
        (KJS::ExecState::arrayTable):
        (KJS::ExecState::dateTable):
        (KJS::ExecState::mathTable):
        (KJS::ExecState::numberTable):
        (KJS::ExecState::RegExpImpTable):
        (KJS::ExecState::RegExpObjectImpTable):
        (KJS::ExecState::stringTable):
        * kjs/InitializeThreading.cpp:
        (KJS::initializeThreadingOnce):
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::init):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData):
        (KJS::JSGlobalObject::head):
        (KJS::JSGlobalObject::globalData):
        * kjs/Parser.cpp:
        (KJS::Parser::parse):
        * kjs/Parser.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::getParameterName):
        (KJS::IndexToNameMap::unMap):
        (KJS::globalFuncEval):
        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::construct):
        * kjs/interpreter.cpp:
        (KJS::Interpreter::checkSyntax):
        (KJS::Interpreter::evaluate):
        * kjs/lexer.cpp:
        (kjsyylex):
        * kjs/lexer.h:
        * kjs/testkjs.cpp:
        (prettyPrintScript):
        Updated for the above changes. Most of threadInstance uses here will need to be replaced with
        explicitly passed pointers to support legacy JSC clients.

        * JavaScriptCore.exp: Removed KJS::parser().

2008-06-06  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 19424: Add support for logging opcode pair counts
        <https://bugs.webkit.org/show_bug.cgi?id=19424>

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.cpp:
        (KJS::OpcodeStats::OpcodeStats):
        (KJS::compareOpcodeIndices):
        (KJS::compareOpcodePairIndices):
        (KJS::OpcodeStats::~OpcodeStats):
        (KJS::OpcodeStats::recordInstruction):
        (KJS::OpcodeStats::resetLastInstruction):
        * VM/Opcode.h:

2008-06-06  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Adam.

        <rdar://problem/5969992> JSProfiler: Remove the recursion limit in the
        profiler.
        - Change the remaining functions that do not take arguments, from using
        recursion to using iteration.

        * JavaScriptCore.exp:
        * profiler/Profile.cpp:
        (KJS::stopProfiling):
        (KJS::restoreAll):
        (KJS::Profile::stopProfiling): Use foreach instead of recursion.
        (KJS::Profile::restoreAll): Ditto.
        * profiler/Profile.h:
        * profiler/ProfileNode.cpp: Remove recursion.
        (KJS::ProfileNode::stopProfiling):
        (KJS::ProfileNode::restore):
        * profiler/ProfileNode.h:

2008-06-05  Oliver Hunt  <oliver@apple.com>

        Reviewed by Alexey.

        Fix Greater and GreaterEq nodes to emit code for the left
        and right sub-expressions in the correct order.

        * kjs/nodes.cpp:
        (KJS::GreaterNode::emitCode):
        (KJS::GreaterEqNode::emitCode):

2008-06-05  Antti Koivisto  <antti@apple.com>

        Reviewed by Alp Toker.
        
        Fix whitespaces.

        * kjs/collector.cpp:
        (KJS::getPlatformThreadRegisters):

2008-06-05  Antti Koivisto  <antti@apple.com>

        Reviewed by Darin.
        
        Support compiling JavaScriptCore for ARM.

        * kjs/collector.cpp:
        (KJS::getPlatformThreadRegisters):
        (KJS::otherThreadStackPointer):

2008-06-05  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Jon.

        - Name changes.

        * JavaScriptCore.exp:
        * profiler/Profile.cpp:
        (KJS::Profile::Profile):
        (KJS::Profile::stopProfiling):
        (KJS::Profile::didExecute):
        (KJS::Profile::forEach):
        (KJS::Profile::debugPrintData):
        (KJS::Profile::debugPrintDataSampleStyle):
        * profiler/Profile.h:
        (KJS::Profile::callTree):
        (KJS::Profile::totalTime):
        (KJS::Profile::sortTotalTimeDescending):
        (KJS::Profile::sortTotalTimeAscending):
        (KJS::Profile::sortSelfTimeDescending):
        (KJS::Profile::sortSelfTimeAscending):
        (KJS::Profile::sortCallsDescending):
        (KJS::Profile::sortCallsAscending):
        (KJS::Profile::sortFunctionNameDescending):
        (KJS::Profile::sortFunctionNameAscending):
        (KJS::Profile::focus):
        (KJS::Profile::exclude):
        (KJS::Profile::restoreAll):

2008-06-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Stephanie Lewis.

        Added the -fno-move-loop-invariants flag to the pcre_exec.cpp build, to
        tell GCC not to perform loop invariant motion, since GCC's loop
        invariant motion doesn't do very well with computed goto code.
        
        SunSpider reports no change.

2008-06-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Stephanie Lewis.
        
        Added the -fno-tree-pre flag to the Machine.cpp build, to tell GCC not
        to perform Partial Redundancy Elimination (PRE) on trees in Machine.cpp,
        since GCC's PRE doesn't do very well with computed goto code.
        
        SunSpider reports a .7% speedup.
        
2008-06-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Stephanie Lewis (or maybe the other way around).
        
        Minor change to PCRE to help out certain compilers.
        
        SunSpider reports no change, maybe a small speedup.

        * pcre/pcre_exec.cpp:
        (match): Use instructionPtr++ a little less, to avoid confusing the
        optimizer.

2008-06-05  Alexey Proskuryakov  <ap@webkit.org>

        Re-landing an independent part of a previously rolled out threading patch.

        * wtf/ThreadSpecific.h: Make sure to initialize POD thread-specific varaibles, too
        (replaced "new T" with "new T()").

2008-06-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Hyatt.
        
        - force inlining of a template function that only has one call site per specialization
        1.3% speedup on SunSpider

        * kjs/collector.cpp:
        (KJS::Collector::heapAllocate): This template function is only
        called from allocate() and allocateNumber() (once per
        specialization) and the extra call overhead for GC allocation
        shows up, so force inlining.

2008-06-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Alexey and Oliver.
        
        - remove profiler fetch hack
        I measure an 0.5% progression from this, others show a wash. It seems not needed any more.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-06-05  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Bug 19400: subscript operator does not protect base when necessary
        <https://bugs.webkit.org/show_bug.cgi?id=19400>

        Use a temporary for the base in BracketAccessorNode if the subscript
        might possibly modify it.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::BracketAccessorNode::emitCode):
        * kjs/nodes.h:
        (KJS::BracketAccessorNode::):

2008-06-04  Sam Weinig  <sam@webkit.org>

        Reviewed by Maciej Stachowiak.

        Big cleanup of formatting and whitespace.

2008-06-04  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Add an option to dump statistics on executed instructions.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.cpp:
        (KJS::OpcodeStats::~OpcodeStats):
        (KJS::OpcodeStats::recordInstruction):
        * VM/Opcode.h:

2008-06-04  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geoff.

        <rdar://problem/5969992> JSProfiler: Remove the recursion limit in the
        profiler.
        - This patch removes the use of recursion for the sort functions.

        * JavaScriptCore.exp: Change the signatures of the functions being
        exported.
        * profiler/Profile.cpp:
        (KJS::Profile::sort): This generic function will accept any of the
        static sort functions and apply them to the whole tree.
        * profiler/Profile.h: All of the sorting functions now call the new
        sort() function.
        (KJS::Profile::sortTotalTimeDescending):
        (KJS::Profile::sortTotalTimeAscending):
        (KJS::Profile::sortSelfTimeDescending):
        (KJS::Profile::sortSelfTimeAscending):
        (KJS::Profile::sortCallsDescending):
        (KJS::Profile::sortCallsAscending):
        (KJS::Profile::sortFunctionNameDescending):
        (KJS::Profile::sortFunctionNameAscending):
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::ProfileNode): m_head used to point to the head node
        if this was the head node.  It now points to null to make iteration easy
        (KJS::ProfileNode::willExecute): Now must check if m_head is null, this
        check used to happend in the constructor.
        (KJS::ProfileNode::stopProfiling): Again the check is slightly different
        to determine if this is the head.
        (KJS::ProfileNode::traverseNextNode): This function returns the next
        node in post order.
        (KJS::ProfileNode::sort): This generic function will sort according to
        the comparator passed in, then reset the children pointers to macth the
        new order.
        * profiler/ProfileNode.h: The sorting function were removed from the
        definition file and instead use the new generic sort() function
        (KJS::ProfileNode::totalPercent): because the head can now be empty we
        need to check here too for the head node.
        (KJS::ProfileNode::selfPercent): Ditto
        (KJS::ProfileNode::firstChild): This function is necessary for the 
        iterative algorithm in Profile.cpp.
        (KJS::ProfileNode::sortTotalTimeDescending):
        (KJS::ProfileNode::sortTotalTimeAscending):
        (KJS::ProfileNode::sortSelfTimeDescending):
        (KJS::ProfileNode::sortSelfTimeAscending):
        (KJS::ProfileNode::sortCallsDescending):
        (KJS::ProfileNode::sortCallsAscending):
        (KJS::ProfileNode::sortFunctionNameDescending):
        (KJS::ProfileNode::sortFunctionNameAscending):
        (KJS::ProfileNode::childrenBegin):
        (KJS::ProfileNode::childrenEnd):
        (KJS::ProfileNode::totalTimeDescendingComparator):
        (KJS::ProfileNode::totalTimeAscendingComparator):
        (KJS::ProfileNode::selfTimeDescendingComparator):
        (KJS::ProfileNode::selfTimeAscendingComparator):
        (KJS::ProfileNode::callsDescendingComparator):
        (KJS::ProfileNode::callsAscendingComparator):
        (KJS::ProfileNode::functionNameDescendingComparator):
        (KJS::ProfileNode::functionNameAscendingComparator):

2008-06-04  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Fix JSClassCreate to work with old JSCore API threading model.

        No change on SunSpider.

        * API/JSClassRef.cpp: (OpaqueJSClass::OpaqueJSClass): Since JSClass is constructed without
        a context, there is no way for it to create Identifiers.
        Also, added initializeThreading(), just for good measure.

        * API/JSCallbackObjectFunctions.h: (KJS::::getPropertyNames): Make an Identifier out of the
        string here, because propertyNames.add() needs that.

        * kjs/identifier.cpp:
        * kjs/identifier.h:
        (KJS::Identifier::equal):
        * kjs/ustring.cpp:
        (KJS::equal):
        Moved equal() from identifier.h to ustring.h, because it's not really about Identifiers,
        and to make it possible to use it from StrHash.
        Include StrHash.h from ustring.h to avoid having the behavior depend on headers that happen
        to be included.

        * wtf/StrHash.h: Removed.
        * kjs/ustring.h: Made RefPtr<UString::Rep> use the same default hash as UString::Rep* (it
        used to default to pointer equality). Moved the whole StrHash header into ustring.h.

        * JavaScriptCore.exp: Export equal() for WebCore use (this StrHash is used in c_class.cpp,
        jni_class.cpp, and npruntime.cpp).

2008-06-04  Alexey Proskuryakov  <ap@webkit.org>

        Rubber-stamped by Darin.

        Fix spacing in collector.{h,cpp}.

        * kjs/collector.cpp:
        * kjs/collector.h:

2008-06-03  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Build fix. The cleanup in r34355 missed a method.

        * kjs/nodes.cpp:
        * kjs/nodes.h:

2008-06-03  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - https://bugs.webkit.org/show_bug.cgi?id=19269
          speed up SunSpider by eliminating the toObject call for most get/put/delete

        Makes standalone SunSpider 1.025x as fast as before.

        The getOwnPropertySlot virtual function now takes care of the toObject call
        for get. Similarly, the put function (and later deleteProperty) does the
        same for those operations. To do this, the virtual functions were moved from
        the JSObject class to the JSCell class. Also, since the caller no longer knows
        the identity of the "original object", which is used by JavaScript-function
        based getters, changed the PropertySlot class so the original object is
        already stored in the slot when getOwnPropertySlot is called, if the caller
        intends to call getValue.

        This affected the old interpreter code enough that the easiest thing for me
        was to just delete it. While I am not certain the mysterious slowdown is not
        still occurring, the net change is definitely a significant speedup.

        * JavaScriptCore.exp: Updated.

        * VM/Machine.cpp: Moved the UNLIKELY macro into AlwaysInline.h.
        (KJS::resolve): Set up the originalObject in the PropertySlot before
        calling getPropertySlot. Also removed the originalObject argument from
        getValue.
        (KJS::resolve_skip): Ditto.
        (KJS::resolveBaseAndProperty): Ditto.
        (KJS::resolveBaseAndFunc): Ditto.
        (KJS::Machine::privateExecute): Removed the toObject calls from the get and
        put functions where possible, instead calling directly with JSValue and letting
        the JSValue and JSCell calls handle toObject. Same for toThisObject.

        * kjs/ExecState.h: Removed OldInterpreterExecState.

        * API/JSBase.cpp: Updated includes.

        * kjs/LocalStorageEntry.h: Removed contents. Later we can remove the file too.

        * kjs/array_instance.cpp:
        (KJS::ArrayInstance::lengthGetter): Removed originalObject argumet.
        (KJS::ArrayInstance::inlineGetOwnPropertySlot): Don't pass a base value to
        setValueSlot. Also use UNLIKELY around the "getting elements past the end of
        the array" code path; less common than successfully getting an element.

        * kjs/array_object.cpp:
        (KJS::getProperty): Initialize the PropertySlot with the original object.
        Don't pass the original object to the get function.
        (KJS::arrayProtoFuncFilter): Ditto.
        (KJS::arrayProtoFuncMap): Ditto.
        (KJS::arrayProtoFuncEvery): Ditto.
        (KJS::arrayProtoFuncForEach): Ditto.
        (KJS::arrayProtoFuncSome): Ditto.

        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::construct): Removed an obsolete comment.

        * kjs/grammar.y: Eliminated support for some of the node types that were
        used to optimize executing from the syntax tree.

        * kjs/internal.cpp:
        (KJS::StringImp::toThisObject): Added. Same as toObject.
        (KJS::NumberImp::toThisObject): Ditto.
        (KJS::GetterSetterImp::getOwnPropertySlot): Added. Not reached.
        (KJS::GetterSetterImp::put): Ditto.
        (KJS::GetterSetterImp::toThisObject): Ditto.

        * kjs/internal.h: Added toThisObject to NumberImp for speed.

        * kjs/lexer.cpp:
        (KJS::Lexer::shift): Changed shift to just do a single character, to unroll
        the loop and especially to make the one character case faster.
        (KJS::Lexer::setCode): Call shift multiple times instead of passing a number.
        (KJS::Lexer::lex): Ditto.
        (KJS::Lexer::matchPunctuator): Ditto. Also removed unneeded elses after returns.
        (KJS::Lexer::scanRegExp): Ditto.
        * kjs/lexer.h: Removed the count argument from shift.

        * kjs/math_object.cpp:
        (KJS::mathProtoFuncPow): Call jsNaN instead of jsNumber(NaN).

        * kjs/nodes.cpp: Removed some of the things needed only for the pre-SquirrelFish
        execution model.
        (KJS::ForNode::emitCode): Handle cases where some expressions are missing by
        not emitting any code at all. The old way was to emit code for "true", but
        this is an unnecessary remnant of the old way of doing things.

        * kjs/nodes.h: Removed some of the things needed only for the pre-SquirrelFish
        execution model.

        * kjs/object.cpp:
        (KJS::JSObject::fillGetterPropertySlot): Changed to only pass in the getter
        function. The old code passed in a base, but it was never used when
        actually getting the property; the toThisObject call was pointless. Also
        changed to not pass a base for setUndefined.

        * kjs/object.h: Added the new JSCell operations to GetterSetterImp.
        Never called.
        (KJS::JSObject::get): Initialize the object in the PropertySlot and don't
        pass it in getValue.
        (KJS::JSObject::getOwnPropertySlotForWrite): Removed the base argument
        in calls to setValueSlot.
        (KJS::JSObject::getOwnPropertySlot): Ditto.
        (KJS::JSValue::get): Added. Here because it calls through to JSObject.
        A version of JSObject::get that also handles the other types of JSValue
        by creating the appropriate wrapper. Saves the virtual call to toObject.
        (KJS::JSValue::put): Ditto.
        (KJS::JSValue::deleteProperty): Ditto.

        * kjs/property_slot.cpp:
        (KJS::PropertySlot::undefinedGetter): Removed the originalObject argument.
        (KJS::PropertySlot::ungettableGetter): Ditto.
        (KJS::PropertySlot::functionGetter): Ditto. Use the value in the base
        as the "this" object, which will be set to the original object by the new
        PropertySlot initialization code. Also call toThisObject. The old code did
        not do this, but needed to so we can properly handle the activation object
        like the other similar code paths.

        * kjs/property_slot.h:
        (KJS::PropertySlot::PropertySlot): Added a constructor that takes a base
        object. In debug builds, set the base to 0 if you don't pass one.
        (KJS::PropertySlot::getValue): Don't take or pass the originalObject.
        (KJS::PropertySlot::setValueSlot): Don't take a base object, and clear the
        base object in debug builds.
        (KJS::PropertySlot::setGetterSlot): Ditto.
        (KJS::PropertySlot::setUndefined): Ditto.
        (KJS::PropertySlot::setUngettable): Ditto.
        (KJS::PropertySlot::slotBase): Assert that a base object is present.
        This will fire if someone actually calls the get function without having
        passed in a base object and the getter needs it.
        (KJS::PropertySlot::setBase): Added. Used by the code that implements
        toObject so it can supply the original object after the fact.
        (KJS::PropertySlot::clearBase): Added. Clears the base, but is debug-only
        code because it's an error to fetch the base if you don't have a guarantee
        it was set.

        * API/JSCallbackObject.h:
        * API/JSCallbackObjectFunctions.h:
        (KJS::JSCallbackObject::cachedValueGetter):
        (KJS::JSCallbackObject::staticValueGetter):
        (KJS::JSCallbackObject::staticFunctionGetter):
        (KJS::JSCallbackObject::callbackGetter):
        * kjs/JSActivation.cpp:
        (KJS::JSActivation::getOwnPropertySlot):
        (KJS::JSActivation::argumentsGetter):
        * kjs/JSActivation.h:
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTableGet):
        * kjs/array_instance.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::argumentsGetter):
        (KJS::FunctionImp::callerGetter):
        (KJS::FunctionImp::lengthGetter):
        (KJS::Arguments::mappedIndexGetter):
        * kjs/function.h:
        * kjs/lookup.h:
        (KJS::staticFunctionGetter):
        (KJS::staticValueGetter):
        * kjs/string_object.cpp:
        (KJS::StringInstance::lengthGetter):
        (KJS::StringInstance::indexGetter):
        (KJS::stringInstanceNumericPropertyGetter):
        * kjs/string_object.h:
        Removed originalObject arguments from getters. Don't pass base values to
        the various PropertySlot functions that no longer take them.

        * kjs/value.cpp:
        (KJS::JSCell::getOwnPropertySlot): Added. Calls toObject and then sets the slot.
        This function has to always return true, because the caller can't walk the prototype
        chain. Because of that, we do a getPropertySlot, not getOwnPropertySlot, which works
        for the caller. This is private, only called by getOwnPropertySlotInternal.
        (KJS::JSCell::put): Added. Calls toObject and then put.
        (KJS::JSCell::toThisObject): Added. Calls toObject.

        * kjs/value.h: Added get, put, and toThisObject to both JSValue
        and JSCell. These take care of the toObject operation without an additional virtual
        function call, and so make the common "already an object" case faster.

        * wtf/AlwaysInline.h: Moved the UNLIKELY macro here for now. Maybe we can find a
        better place later, or rename this header.

2008-06-03  Oliver Hunt  <oliver@apple.com>

        Reviewed by Tim.

        Bug 12983: Web Inspector break on the debugger keyword
        <https://bugs.webkit.org/show_bug.cgi?id=12983>

        Added a DebuggerStatementNode to handle codegen, and added a new
        DidReachBreakPoint debug event (which will hopefully be useful
        if we ever move breakpoint management into JSC proper).  Also
        added didReachBreakpoint to Debugger to allow us to actually respond
        to this event.

        * VM/CodeBlock.cpp:
        (KJS::debugHookName):
        * VM/Machine.cpp:
        (KJS::Machine::debug):
        * VM/Machine.h:
        * kjs/debugger.h:
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::DebuggerStatementNode::emitCode):
        (KJS::DebuggerStatementNode::execute):
        * kjs/nodes.h:
        (KJS::DebuggerStatementNode::):
        * kjs/nodes2string.cpp:
        (KJS::DebuggerStatementNode::streamTo):

2008-06-03  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - document remaining opcodes.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Document call, call_eval,
        construct, ret and end opcodes.

2008-06-03  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Document throw and catch opcodes.

2008-06-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Alexey Proskuryakov.

        Removed JSObject::call, since it just called JSObject::callAsFunction.

        SunSpider reports no change.

2008-06-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        A little cleanup in the CodeGenerator.

        * VM/CodeGenerator.cpp: A few changes here.

        (1) Removed remaining cases of the old hack of putting "this" into the
        symbol table; replaced with explicit tracking of m_thisRegister.

        (2) Made m_thisRegister behave the same for function, eval, and program
        code, removing the static programCodeThis() function.

        (3) Added a feature to nix a ScopeNode's declaration stacks when done
        compiling, to save memory.

        (4) Removed code that copied eval declarations into special vectors: we
        just use the originals in the ScopeNode now.
        
        * VM/CodeGenerator.h: Removed unneded parameters from the CodeGenerator
        constructor: we just use get that data from the ScopeNode now.

        * VM/Machine.cpp:
        (KJS::Machine::execute): When executing an eval node, don't iterate a
        special copy of its declarations; iterate the originals, instead.

        * kjs/nodes.cpp: Moved responsibility for knowing what AST data to throw
        away into the CodeGenerator. Nodes no longer call shrinkCapacity on
        their data directly.
        
        * kjs/nodes.h: Changed FunctionStack to ref its contents, so declaration
        data stays around even after we've thrown away the AST, unless we explicitly
        throw away the declaration data, too. This is useful for eval code, which
        needs to reference its declaration data at execution time. (Soon, it will
        be useful for program code, too, since program code should do the same.)

2008-06-02  Adam Roben  <aroben@apple.com>

        Build fix for non-AllInOne builds

        * kjs/array_object.cpp: Added a missing #include.

2008-06-02  Kevin McCullough  <kmccullough@apple.com>

        Took out accidental confilct lines I checked in.

        * ChangeLog:

2008-06-02  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Darin.

        <rdar://problem/5969992> JSProfiler: Remove the recursion limit in the
        profiler
        Implement Next Sibling pointers as groundwork for removing the recursion
        limit in the profiler.

        * profiler/ProfileNode.cpp: Also I renamed parentNode and headNode since
        'node' is redundant.
        (KJS::ProfileNode::ProfileNode): Initialize the nextSibling.
        (KJS::ProfileNode::willExecute): If there are already children then the
        new child needs to be the nextSibling of the last child.
        (KJS::ProfileNode::didExecute):
        (KJS::ProfileNode::addChild): Ditto.
        (KJS::ProfileNode::stopProfiling):
        (KJS::ProfileNode::sortTotalTimeDescending): For all of the sorting
        algorithms once the children are sorted their nextSibling pointers need
        to be reset to reflect the new order.
        (KJS::ProfileNode::sortTotalTimeAscending):
        (KJS::ProfileNode::sortSelfTimeDescending):
        (KJS::ProfileNode::sortSelfTimeAscending):
        (KJS::ProfileNode::sortCallsDescending):
        (KJS::ProfileNode::sortCallsAscending):
        (KJS::ProfileNode::sortFunctionNameDescending):
        (KJS::ProfileNode::sortFunctionNameAscending):
        (KJS::ProfileNode::resetChildrensSiblings): This new function simply
        loops over all of the children and sets their nextSibling pointers to
        the next child in the Vector
        (KJS::ProfileNode::debugPrintData):
        * profiler/ProfileNode.h:
        (KJS::ProfileNode::parent):
        (KJS::ProfileNode::setParent):
        (KJS::ProfileNode::nextSibling):
        (KJS::ProfileNode::setNextSibling):
        (KJS::ProfileNode::totalPercent):
        (KJS::ProfileNode::selfPercent):

2008-06-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.

        Removed the recursion limit from JSObject::call, since the VM does
        recursion checking now.

        This should allow us to remove JSObject::call entirely, netting a small
        speedup.

        * kjs/object.cpp:
        (KJS::JSObject::call):

2008-06-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Adele Peterson.

        Added a specific affordance for avoiding stack overflow when converting
        recursive arrays to string, in preparation for removing generic stack
        overflow checking from JSObject::call.
        
        Tested by fast/js/toString-stack-overflow.html.

2008-06-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Alice Liu.
        
        Refactored some hand-rolled code to call ScopeChain::globalObject instead.

2008-06-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Fixed ASSERT due to execution continuing after an exception is thrown
        during array sort.

        * kjs/array_instance.cpp:
        (KJS::AVLTreeAbstractorForArrayCompare::compare_key_key): Don't call the
        custom comparator function if an exception has been thrown. Just return
        1 for everything, so the sort completes quickly. (The result will be
        thrown away.)

2008-05-30  Timothy Hatcher  <timothy@apple.com>

        Made the starting line number of scripts be 1-based throughout the engine.
        This cleans up script line numbers so they are all consistent now and fixes
        some cases where script execution was shown as off by one line in the debugger.

        No change in SunSpider.

        Reviewed by Oliver Hunt.

        * API/minidom.c:
        (main): Pass a line number of 1 instead of 0 to parser().parse().
        * API/testapi.c:
        (main): Ditto. And removes a FIXME and changed an assertEqualsAsNumber
        to use 1 instead of 2 for the line number.
        * VM/Machine.cpp:
        (KJS::callEval): Pass a line number of 1 instead of 0.
        (KJS::Machine::debug): Use firstLine for WillExecuteProgram instead of
        lastLine. Use lastLine for DidExecuteProgram instead of firstLine.
        * kjs/DebuggerCallFrame.cpp:
        (KJS::DebuggerCallFrame::evaluate): Pass a line number of 1 instead of
        0 to parser().parse().
        * kjs/Parser.cpp:
        (KJS::Parser::parse): ASSERT startingLineNumber is greatter than 0. Change
        the startingLineNumber to be 1 if it was less than or equal to 0. This is needed
        for release builds to maintain compatibility with the JavaScriptCore API.
        * kjs/function.cpp:
        (KJS::globalFuncEval): Pass a line number of 1 instead of 0 to parser().parse().
        * kjs/function_object.cpp:
        (FunctionObjectImp::construct): Pass a line number of 1 instead of 0 to construct().
        * kjs/lexer.cpp:
        (Lexer::setCode): Made yylineno = startingLineNumber instead of adding 1.
        * kjs/testkjs.cpp:
        (functionRun): Pass a line number of 1 instead of 0 to Interpreter::evaluate().
        (functionLoad): Ditto.
        (prettyPrintScript): Ditto.
        (runWithScripts): Ditto.
        * profiler/Profiler.cpp:
        (WebCore::createCallIdentifier): Removed a plus 1 of startingLineNumber.

2008-05-30  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        https://bugs.webkit.org/show_bug.cgi?id=19180
        speed up SunSpider by optimizing immediate number cases

        Also fixed a JavaScriptCore regression seen on PowerPC - we didn't clip left shift
        parameter to 0...31.

        0.5% improvement on SunSpider overall, although a 8.5 regression on bitops-3bit-bits-in-byte.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::toTruncatedUInt32): Added. Same as getTruncatedInt32, but casts the result
        to unsigned.

2008-05-30  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Oliver Hunt.

        https://bugs.webkit.org/show_bug.cgi?id=19180
        speed up SunSpider by optimizing immediate number cases

        Also fixed two JavaScriptCore regressions seen on PowerPC - we didn't clip right shift
        parameter to 0...31.

        1.6% improvement on SunSpider, without significant regressions on any tests.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        Added fast paths for >>, ==, ===, !=, !==. Changed order of memory accesses in many
        cases, making them less dependent on gcc's ability to properly assign registers. With this,
        I could move exception checks back into slow code paths, and saw less randomness in general.

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::rightShiftImmediateNumbers):
        Added.

2008-05-29  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.

        - fixed <rdar://problem/5972943> REGRESSION(r33979): Flash clips do not play on cnn.com
        
        Finally blocks could clobber registers that had to remain live
        until they returned. This patch takes a conservative approach and
        makes sure that finally blocks do not reuse any registers that
        were previously allocated for the function. In the future this
        could probably be tightened up to be less profligate with the
        register allocation.
        
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::highestUsedRegister):
        * VM/CodeGenerator.h:
        * kjs/nodes.cpp:
        (KJS::TryNode::emitCode):

2008-05-29  Steve Falkenburg  <sfalken@apple.com>

        Build fix.

        * kjs/array_instance.cpp:

2008-05-29  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        https://bugs.webkit.org/show_bug.cgi?id=19294
        <rdar://problem/5969062> A crash when iterating over a sparse array backwards.

        * kjs/array_instance.cpp: Turned sparseArrayCutoff into a macro, so that using max() on it
        doesn't cause a PIC branch.
        (KJS::ArrayInstance::increaseVectorLength): Added a comment about this function not
        preserving class invariants.
        (KJS::ArrayInstance::put): Update m_storage after reallocation. Move values that fit to
        the vector from the map in all code paths.

2008-05-29  Thiago Macieira  <tjmaciei@trolltech.com>

        Reviewed by Simon.

        Fix compilation in Solaris with Sun CC

        Lots of WebKit code uses C99 functions that, strict as it
        is, the Solaris system doesn't provide in C++. So we must define them
        for both GCC and the Sun CC.

        * wtf/MathExtras.h:

2008-05-28  Oliver Hunt  <oliver@apple.com>

        Reviewed by Anders.

        Fix codegen for assignment being used as a function.

        FunctionCallValueNode::emitCode failed to account for the
        potential of the function expression to allocate arbitrary
        registers.

        * kjs/nodes.cpp:
        (KJS::FunctionCallValueNode::emitCode):

2008-05-27  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Tim Hatcher.

        Fixed https://bugs.webkit.org/show_bug.cgi?id=19183
        REGRESSION (r33979): Crash in DebuggerCallFrame::functionName when
        clicking button in returnEvent-crash.html

        Added two new debugger hooks, willExecuteProgram and didExecuteProgram,
        along with code to generate them, code to invoke them when unwinding
        due to an exception, and code to dump them.
        
        SunSpider reports no change.

        * VM/CodeBlock.cpp:
        (KJS::debugHookName): I had to mark this function NEVER_INLINE to avoid
        a .4% performance regression. The mind boggles.

2008-05-28  Adam Roben  <aroben@apple.com>

        Fix JavaScriptCore tests on OS X

        We were quoting the path to testkjs too late, after it had already
        been combined with spaces and other options.

        * tests/mozilla/jsDriver.pl:
        (top level): Move path quoting from here...
        (sub get_kjs_engine_command): ...to here.

2008-05-28  Anders Carlsson  <andersca@apple.com>

        Reviewed by Oliver.

        <rdar://problem/5968071> "const f" crashes in JavaScriptCore
        
        Make sure to null check the initializer.
        
        * kjs/nodes.cpp:
        (KJS::ConstDeclNode::emitCodeSingle):

2008-05-28  Adam Roben  <aroben@apple.com>

        Make run-javascriptcore-tests work with a space in the path to testkjs

        Reviewed by Alexey Proskuryakov.

        * tests/mozilla/jsDriver.pl: Quote the path to the engine so that
        spaces will be interpreted correctly.

2008-05-28  Alexey Proskuryakov  <ap@webkit.org>

        Fixed a misguiding comment - my measurement for negative numbers only included cases
        where both operands were negative, which is not very interesting.

        * VM/Machine.cpp:

2008-05-28  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Maciej.

        Based on a patch by Oliver Hunt.

        https://bugs.webkit.org/show_bug.cgi?id=19180
        speed up SunSpider by optimizing immediate number cases

        1.4% speedup on SunSpider.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/JSImmediate.h:
        (KJS::JSImmediate::incImmediateNumber):
        (KJS::JSImmediate::decImmediateNumber):
        Added fast paths for ++ and --.

        (KJS::JSImmediate::canDoFastAdditiveOperations): Corrected a comment.

2008-05-28  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        https://bugs.webkit.org/show_bug.cgi?id=19180
        speed up SunSpider by optimizing immediate number cases

        2% speedup overall, maximum 10% on controlflow-recursive and bitops-3bit-bits-in-byte,
        but a 4% regression on bitops-bits-in-byte and bitops-bitwise-and.

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::canDoFastAdditiveOperations):
        (KJS::JSImmediate::addImmediateNumbers):
        (KJS::JSImmediate::subImmediateNumbers):
        Added fast cases that work with positive values less than 2^30.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Use the above operations. Also updated SunSpider frequencies
        with my results (looks like tag values have changed, not sure what caused the minor variation
        in actual frequencies).

2008-05-27  Adam Roben  <aroben@apple.com>

        Windows build fix

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make:
        Remove code that appended Cygwin's /bin directory to PATH.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj:
        Prepend Cygwin's /bin directory to PATH. We prepend instead of append
        so that Cygwin's utilities will win out over Win32 versions of the
        same utilities (particularly perl). We do the prepend here instead of
        in the Makefile because nmake doesn't seem to like prepending to PATH
        inside the Makefile. This also matches the way WebCoreGenerated works.

2008-05-27  Adam Roben  <aroben@apple.com>

        Roll out r34163

        A better fix is on the way.

        * DerivedSources.make:
        * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh:

2008-05-27  Adam Roben  <aroben@apple.com>

        Windows build fix

        * DerivedSources.make: Don't generate the bytecode docs if
        OMIT_BYTECODE_DOCS is set to 1.
        * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh: Set
        OMIT_BYTECODE_DOCS for production builds.

2008-05-27  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff and Maciej.

        <rdar://problem/5806428> 
        https://bugs.webkit.org/show_bug.cgi?id=17925
        Crash in KJS::JSObject::put after setting this.__proto__

        Set slotIsWriteable to false for __proto__, we want setting __proto__ to go through JSObject::put instead.
        
        * kjs/object.h:
        (KJS::JSObject::getOwnPropertySlotForWrite):

2008-05-27  Kevin Ollivier  <kevino@theolliviers.com>

        wx build fixes to catch up with SquirrelFish, etc.

        * JavaScriptCoreSources.bkl:
        * jscore.bkl:
        * wtf/Platform.h:

2008-05-27  Darin Adler  <darin@apple.com>

        Reviewed by Tim Hatcher.

        - https://bugs.webkit.org/show_bug.cgi?id=19180
          speed up SunSpider by optimizing immediate number cases

        Add immediate number cases for the &, |, and ^ operators.
        Makes standalone SunSpider 1.010x faster.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Add areBothImmediateNumbers special cases
        for the &, |, and ^ operators.

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::xorImmediateNumbers): Added.
        (KJS::JSImmediate::orImmediateNumbers): Added.

2008-05-26  Stephanie Lewis  <slewis@apple.com>

        Windows build fix. 

        * kjs/testkjs.cpp:

2008-05-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Anders.
        
        - make addStaticGlobals protected instead of private so subclasses can use it

        * JavaScriptCore.exp:
        * kjs/JSGlobalObject.h:

2008-05-26  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Fixed <rdar://problem/5960859> After an eval of a non-string or a syntax
        error, all profile stack frames are incorrect
        
        SunSpider reports a .3% speedup, possibly because eval of a string is a
        little more efficient now.

        * VM/Machine.cpp:
        (KJS::callEval): Make sure to call didExecute when returning early. I
        simplified this function to remove one early return, making the job
        of adding special code to early returns easier.

        (KJS::Machine::execute): Use the new function ExecState when notifying
        the profiler. (This doesn't change behavior now, but it might prevent
        subtle errors in the future.)

2008-05-23  Tor Arne Vestbø  <tavestbo@trolltech.com>

        Reviewed by Simon.

        Fixed toLower and toUpper implementations to allow being called
        with a null result pointer and resultLength, to determine the
        number of characters needed for the case conversion.

        * wtf/unicode/qt4/UnicodeQt4.h:
        (WTF::Unicode::toLower):
        (WTF::Unicode::toUpper):

2008-05-25  Alexey Proskuryakov  <ap@webkit.org>

        Fixing a typo in the previous commit made as a last minute change.

        * kjs/regexp_object.cpp:

2008-05-24  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Changed regular expression matching result array to be lazily filled, because many callers
        only care about it being non-null.

        2% improvement on Acid3 test 26.

        * kjs/array_instance.cpp: Added a void* member to ArrayStorage for ArrayInstance subclasses
        to use.
        * kjs/array_instance.h:
        (KJS::ArrayInstance::lazyCreationData):
        (KJS::ArrayInstance::setLazyCreationData):
        Added methods to access it from subclasses.

        * kjs/regexp_object.cpp:
        (KJS::RegExpMatchesArray::RegExpMatchesArray):
        (KJS::RegExpMatchesArray::getOwnPropertySlot):
        (KJS::RegExpMatchesArray::put):
        (KJS::RegExpMatchesArray::deleteProperty):
        (KJS::RegExpMatchesArray::getPropertyNames):
        (KJS::RegExpMatchesArray::fillArrayInstanceIfNeeded):
        (KJS::RegExpMatchesArray::~RegExpMatchesArray):
        (KJS::RegExpObjectImp::arrayOfMatches):
        RegExpMatchesArray is a subclass of ArrayInstance that isn't filled until
        accessed for the first time.

2008-05-24  Alp Toker  <alp@nuanti.com>

        Win32/gcc build fix. Remove MSVC assumption.

        * wtf/TCSpinLock.h:
        (TCMalloc_SlowLock):

2008-05-24  Oleg Finkelshteyn <olegfink@gmail.com>

        Rubber-stamped, tweaked and landed by Alexey.

        Build fix for gcc 4.3.

        * JavaScriptCore/kjs/testkjs.cpp:
        * JavaScriptCore/VM/CodeBlock.cpp:
        Add missing standard includes.

2008-05-23  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff.

        <rdar://problem/5959886> REGRESSION: Assertion failure in JSImmediate::toString when loading GMail (19217)
        
        Change List to store a JSValue*** pointer + an offset instead of a JSValue** pointer to protect against the case where 
        a register file changes while a list object points to its buffer.
        
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/JSActivation.cpp:
        (KJS::JSActivation::createArgumentsObject):
        * kjs/list.cpp:
        (KJS::List::getSlice):
        * kjs/list.h:
        (KJS::List::List):
        (KJS::List::at):
        (KJS::List::append):
        (KJS::List::begin):
        (KJS::List::end):
        (KJS::List::buffer):

2008-05-23  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam.

        <rdar://problem/5960012> JSProfiler: Stack overflow if recursion is
        too deep.
        -Use a simple depth limit to restrict too deep of recursion.

        * profiler/Profile.cpp:
        (KJS::Profile::willExecute):
        (KJS::Profile::didExecute):
        * profiler/Profile.h:

2008-05-23  Geoffrey Garen  <ggaren@apple.com>

        Rolling back in r34085, with performance resolved.
        
        Apparently, passing the eval function to callEval gave GCC a hernia.

        Reviewed by Darin Adler, Kevin McCullough, and Oliver Hunt.
        
        Fixed <rdar://problem/5959447> Crashes and incorrect reporting in the
        JavaScript profiler

        * VM/Machine.cpp:
        (KJS::Machine::unwindCallFrame): Fixed incorrect reporting / a crash
        when unwinding from inside eval and/or program code: detect the
        difference, and do the right thing. Also, be sure to notify the profiler
        *before* deref'ing the scope chain, since the profiler uses the scope chain.

        (KJS::Machine::execute): Fixed incorrect reporting / crash when calling
        a JS function re-entrently: Machine::execute(FunctionBodyNode*...)
        should not invoke the didExecute hook, because op_ret already does that.
        Also, use the new function's ExecState when calling out to the profiler.
        (Not important now, but could have become a subtle bug later.)

        (KJS::Machine::privateExecute): Fixed a hard to reproduce crash when
        profiling JS functions: notify the profiler *before* deref'ing the scope
        chain, since the profiler uses the scope chain.

        * kjs/object.cpp:
        (KJS::JSObject::call): Removed these hooks, because they are now unnecessary.

        * profiler/Profile.cpp: Added a comment to explain a subtlety that only
        Kevin and I understood previously. (Now, the whole world can understand!)

        * profiler/Profiler.cpp:
        (KJS::shouldExcludeFunction): Don't exclude .call and .apply. That was
        a hack to fix bugs that no longer exist.

        Finally, sped things up a little bit by changing the "Is the profiler
        running?" check into an ASSERT, since we only call into the profiler
        when it's running:

        (KJS::Profiler::willExecute):
        (KJS::Profiler::didExecute):

2008-05-23  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.

        - fixed <rdar://problem/5957662> REGRESSION(r33943-r33980): Can't send email , attach file or save as draft from hotmail.com
        
        SunSpider reports no change.
        
        This is a reworking of r34073, which I rolled out because it caused
        lots of crashes.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator): Use removeDirect to nix old
        properties whose names collide with new functions. (Don't use putWithAttributes
        because that tries to write to the register file, which hasn't grown to
        fit this program yet.)

2008-05-23  Darin Adler  <darin@apple.com>

        Reviewed by Mark Rowe.

        As allocateNumber is used via jsNumberCell outside of JavaScriptCore,
        we need to provide a non-inlined version of it to avoid creating a
        weak external symbol.

        * JavaScriptCore.exp:
        * kjs/AllInOneFile.cpp:
        * kjs/collector.cpp:
        (KJS::Collector::allocate):
        (KJS::Collector::allocateNumber):
        * kjs/collector.h:
        (KJS::Collector::allocate):
        (KJS::Collector::inlineAllocateNumber):
        * kjs/value.h:
        (KJS::NumberImp::operator new):

2008-05-23  Geoffrey Garen  <ggaren@apple.com>

        Rolled out r34073 because it caused lots of layout test crashes.

2008-05-23  Geoffrey Garen  <ggaren@apple.com>

        Rolled out r34085 because it measured as a 7.6% performance regression.

2008-05-23  Adam Roben  <aroben@apple.com>

        Windows build fix

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add the
        profiler directory to the include path.

2008-05-23  Oliver Hunt  <oliver@apple.com>

        Reviewed by Anders.

        SQUIRRELFISH: JavaScript error messages are missing informative text

        Partial fix.
        Tidy up error messages, makes a couple of them provide slightly more info.
        Inexplicably leads to a 1% SunSpider Progression.

        * VM/ExceptionHelpers.cpp:
        (KJS::createError):
        (KJS::createInvalidParamError):
        (KJS::createNotAConstructorError):
        (KJS::createNotAFunctionError):
        * VM/ExceptionHelpers.h:
        * VM/Machine.cpp:
        (KJS::isNotObject):

2008-05-23  Oliver Hunt  <oliver@apple.com>

        Reviewed by Tim H.

        Fix call stack reported by profiler when entering event handlers.

        JSObject::call was arbitrarily notifying the profiler when it was
        called, even if it was JS code, which notifies the profile on entry
        in any case.

        * kjs/object.cpp:
        (KJS::JSObject::call):

2008-05-16  Alp Toker  <alp@nuanti.com>

        Build fix for gcc 3. Default constructor required in ExecState,
        used by OldInterpreterExecState.

        * kjs/ExecState.h:
        (KJS::ExecState::ExecState):

2008-05-23  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        Fix <rdar://problem/5954997> global-recursion-on-full-stack.html crashes under guardmalloc.

        Growing the register file with uncheckedGrow from within Machine::execute is not safe as the
        register file may be too close to its maximum size to grow successfully.  By using grow,
        checking the result and throwing a stack overflow error we can avoid crashing.

        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * VM/RegisterFile.h: Remove the now-unused uncheckedGrow.

2008-05-23  Oliver Hunt  <oliver@apple.com>

        RS=Kevin McCullough

        Remove JAVASCRIPT_PROFILER define

        * VM/Machine.cpp:
        (KJS::callEval):
        (KJS::Machine::unwindCallFrame):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * kjs/config.h:
        * kjs/object.cpp:
        (KJS::JSObject::call):

2008-05-23  Oliver Hunt  <oliver@apple.com>

       <rdar://problem/5951561> Turn on JavaScript Profiler

        Reviewed by Kevin McCullough.

        Flipped the switch on the profiler, rearranged how we
        signal the the profiler is active so that calls aren't
        needed in the general case.
        
        Also fixed the entry point for Machine::execute(FunctionBodyNode..)
        to correctly indicate function exit.

        Results in a 0.7-1.0% regression in SunSpider :-(

        * VM/Machine.cpp:
        (KJS::callEval):
        (KJS::Machine::unwindCallFrame):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * kjs/config.h:
        * profiler/Profiler.cpp:
        (KJS::Profiler::profiler):
        (KJS::Profiler::startProfiling):
        (KJS::Profiler::stopProfiling):
        * profiler/Profiler.h:
        (KJS::Profiler::enabledProfilerReference):

2008-05-23  Simon Hausmann  <hausmann@webkit.org>

        Fix the Qt build by adding profiler/ to the include search path.

        * JavaScriptCore.pri:

2008-05-22  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Adam.

        Fix a bug in the profiler where time in the current function is given to
        (idle).

        * profiler/Profile.cpp:
        (KJS::Profile::didExecute): Set the start time and then call didExecute
        to calculate the time spent in this function.
        * profiler/ProfileNode.cpp: Remove confusing calculations that are no
        longer necessary.
        (KJS::ProfileNode::insertNode):
        * profiler/ProfileNode.h: Expose access to the start time to allow the
        simpler time calculations above.
        (KJS::ProfileNode::startTime):
        (KJS::ProfileNode::setStartTime):

2008-05-22  Adam Roben  <aroben@apple.com>

        Show "(Function object)" instead of "(JSInpectorCallbackWrapper
        object)" in profiles

        Reviewed by Kevin McCullough.

        * profiler/Profiler.cpp:
        (KJS::createCallIdentifier): Use JSObject::className instead of
        getting the class name from the ClassInfo directly. JSObject
        subclasses can override className to provide a custom class name, and
        it seems like we should honor that.

2008-05-22  Timothy Hatcher  <timothy@apple.com>

        Added Profile::restoreAll and added ProfileNode::restoreAll
        to the export file.

        Reviewed by Adam Roben.

        * JavaScriptCore.exp:
        * profiler/Profile.h:

2008-05-22  Alp Toker  <alp@nuanti.com>

        GTK+ build fix. Add JavaScriptCore/profiler to include path.

        * GNUmakefile.am:

2008-05-22  Adam Roben  <aroben@apple.com>

        Implement sub-millisecond profiling on Windows

        Reviewed by Kevin McCullough.

        * profiler/ProfileNode.cpp:
        (KJS::getCount): Added. On Windows, we use QueryPerformanceCounter. On
        other platforms, we use getCurrentUTCTimeWithMicroseconds.
        (KJS::ProfileNode::endAndRecordCall): Use getCount instead of
        getCurrentUTCTimeWithMicroseconds.
        (KJS::ProfileNode::startTimer): Ditto.

2008-05-22  Adam Roben  <aroben@apple.com>

        Fix a profiler assertion when calling a NodeList as a function

        Reviewed by Kevin McCullough.

        * profiler/Profiler.cpp:
        (KJS::createCallIdentifier): Don't assert when a non-function object
        is called as a function. Instead, build up a CallIdentifier using the
        object's class name.

2008-05-22  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Darin.

        <rdar://problem/5951529> JSProfiler: Allow the profiler to "Exclude" a
        profile node.
        -Implement 'exclude'; where the excluded node attributes its time to its
        parent's self time.

        * JavaScriptCore.exp: Export the exclude function.
        * profiler/Profile.h: 
        (KJS::Profile::exclude):
        * profiler/ProfileNode.cpp: 
        (KJS::ProfileNode::setTreeVisible): New function that allows a change in
        visiblitiy to be propogated to all the children of a node.
        (KJS::ProfileNode::exclude): If the node matches the callIdentifier then
        set the visiblity of this node and all of its children to false and
        attribute it's total time to it's caller's self time.
        * profiler/ProfileNode.h:

2008-05-22  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        Fix access to static global variables in Windows release builds.

        * kjs/JSGlobalObject.h: Don't store a reference to an Identifier
        in GlobalPropertyInfo as the Identifier is likely to be a temporary
        and therefore may be destroyed before the GlobalPropertyInfo.

2008-05-22  Kevin McCullough  <kmccullough@apple.com>

        Build fix.

        * VM/Machine.cpp:
        (KJS::callEval):

2008-05-22  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam.

        <rdar://problem/5951561> Turn on JavaScript Profiler
        Get basic JS profiling working.
        Even with this patch the profiler will not be compiled in because we do
        not know the extend, if any, of the performance regression it would cause
        when it is not in use. However with these changes, if the profiler were
        on, it would not crash and show good profiling data.

        * VM/Machine.cpp: Instrument the calls sites that are needed for profiling.
        (KJS::callEval):
        (KJS::Machine::unwindCallFrame):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * kjs/function.cpp: Ditto.
        (KJS::globalFuncEval):
        * kjs/interpreter.cpp: Ditto.
        (KJS::Interpreter::evaluate):
        * profiler/Profile.cpp: 
        (KJS::Profile::willExecute):
        (KJS::Profile::didExecute): Because we do not get a good context when
        startProfiling is called it is possible that m_currentNode will be at the
        top of the known stack when a didExecute() is called.  What we then do is
        create a new node that represents the function being exited and insert
        it between the head and the currently known children, since they should
        be children of this new node.
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::ProfileNode):
        (KJS::ProfileNode::willExecute): Rename the add function for consistency.
        (KJS::ProfileNode::addChild): Appends the child to this node but also
        sets the parent pointer of the children to this node.
        (KJS::ProfileNode::insertNode): Insert a node between this node and its
        children.  Also set the time for the new node since it is now exiting
        and we don't really know when it started.
        (KJS::ProfileNode::stopProfiling):
        (KJS::ProfileNode::startTimer):
        * profiler/ProfileNode.h:
        (KJS::CallIdentifier::toString): Added for debugging.
        (KJS::ProfileNode::setParent):
        (KJS::ProfileNode::setSelfTime): Fixed an old bug where we set the
        visibleTotalTime not the visibleSelfTime.
        (KJS::ProfileNode::children):
        (KJS::ProfileNode::toString): Added for debugging.
        * profiler/Profiler.cpp: remove unecessary calls.
        (KJS::Profiler::startProfiling):

2008-05-22  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver Hunt.

        Rename register arguments for op_call, op_call_eval, op_end, and op_construct 
        to document what they are for.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitCall):
        (KJS::CodeGenerator::emitCallEval):
        (KJS::CodeGenerator::emitEnd):
        (KJS::CodeGenerator::emitConstruct):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-05-22  Oliver Hunt  <oliver@apple.com>

        Reviewed by Darin.

        Bug 19116: SquirrelFish shouldn't regress on variable lookups
        <https://bugs.webkit.org/show_bug.cgi?id=19116>

        Last of the multiscope look up optimisations.  This is a wash overall on SunSpider
        but is a factor of 5-10 improvement in multiscope read/write/modify (eg. ++, --, +=,
        ... applied to any non-local var).

        * kjs/nodes.cpp:
        (KJS::PostIncResolveNode::emitCode):
        (KJS::PostDecResolveNode::emitCode):
        (KJS::PreIncResolveNode::emitCode):
        (KJS::PreDecResolveNode::emitCode):
        (KJS::ReadModifyResolveNode::emitCode):

2008-05-22  David Kilzer  <ddkilzer@apple.com>

        <rdar://problem/5954233> Add method to release free memory from FastMalloc

        Patch suggested by Mark Rowe.  Rubber-stamped by Maciej.

        * JavaScriptCore.exp: Export _releaseFastMallocFreeMemory.
        * wtf/FastMalloc.cpp:
        (WTF::TCMallocStats::): Added releaseFastMallocFreeMemory() for both
        system malloc and FastMalloc code paths.
        * wtf/FastMalloc.h: Define releaseFastMallocFreeMemory().

2008-05-22  Oliver Hunt  <oliver@apple.com>

        RS=Maciej.

        Roll out r34020 as it causes recursion tests to fail.

        * kjs/object.cpp:
        (KJS::JSObject::call):

2008-05-22  Oliver Hunt  <oliver@apple.com>

        Reviewed by Mark.

        Don't leak the SymbolTable when compiling eval code.

        * kjs/nodes.cpp:
        (KJS::EvalNode::generateCode):

2008-05-22  Simon Hausmann  <hausmann@webkit.org>

        Reviewed by Oliver.

        Qt build fix.

        * JavaScriptCore.pri: Added DebuggerCallFrame to the build.
        * VM/LabelID.h: Include limits.h for UINT_MAX.
        * wtf/VectorTraits.h: Include memory for std::auto_ptr.

2008-05-22  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Adam Roben.
        
        Removed the old recursion guard mechanism, since squirrelfish has its
        own mechanism. Also removed some old JS call tracing code, since we
        have other ways to do that, too.
        
        SunSpider reports no change.

        * kjs/object.cpp:
        (KJS::JSObject::call):

2008-05-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fixed <rdar://problem/5954979> crash on celtic kane JS benchmark

        * kjs/nodes.cpp:
        (KJS::WithNode::emitCode):
        (KJS::TryNode::emitCode):

2008-05-21  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Maciej and Geoff.

        <rdar://problem/5951561> Turn on JavaScript Profiler
        -As part of the effort to turn on the profiler it would be helpful if it
        did not need ExecStates to represent the stack location of the currently
        executing statement.
        -We now create each node as necessary with a reference to the current
        node and each node knows its parent so that the tree can be made without
        the entire stack.

        * profiler/Profile.cpp:
        (KJS::Profile::Profile): The current node starts at the head.
        (KJS::Profile::stopProfiling): The current node is cleared when profiling
        stops.
        (KJS::Profile::willExecute): The current node either adds a new child or
        starts and returns a reference to an already existing child if the call
        ID that is requested already exists.
        (KJS::Profile::didExecute): The current node finishes and returns its
        parent.
        * profiler/Profile.h: Use a single callIdentifier instead of a vector
        since we no longer use the whole stack.
        * profiler/ProfileNode.cpp: Now profile nodes keep a reference to their
        parent.
        (KJS::ProfileNode::ProfileNode): Initialize the parent.
        (KJS::ProfileNode::didExecute): Record the time and return the parent.
        (KJS::ProfileNode::addOrStartChild): If the given callIdentifier is
        already a child, start it and return it, otherwise create a new one and
        return that.
        (KJS::ProfileNode::stopProfiling): Same logic, just use the new function.
        * profiler/ProfileNode.h: Utilize the parent.
        (KJS::ProfileNode::create):
        (KJS::ProfileNode::parent):
        * profiler/Profiler.cpp: 
        (KJS::Profiler::startProfiling): Here is the only place where the
        ExecState is used to figure out where in the stack the profiler is
        currently profiling.
        (KJS::dispatchFunctionToProfiles): Only send one CallIdentifier instead
        of a vector of them.
        (KJS::Profiler::willExecute): Ditto.
        (KJS::Profiler::didExecute): Ditto.
        (KJS::createCallIdentifier): Create only one CallIdentifier.
        (KJS::createCallIdentifierFromFunctionImp): Ditto.
        * profiler/Profiler.h:

2008-05-21  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - https://bugs.webkit.org/show_bug.cgi?id=19180
          speed up the < operator for the case when both values are integers

        Makes standalone SunSpider 1.022x faster.

        * VM/Machine.cpp:
        (KJS::jsLess): Add a special case for when both are numbers that fit in a JSImmediate.

2008-05-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver and Sam.
        
        - fixed <rdar://problem/5815631> REGRESSION (r31239): Multiscope optimisation of function calls results in incorrect this value (breaks tvtv.de)
        
        Track global this value in the scope chain so we can retrieve it
        efficiently but it follows lexical scope properly.

        * kjs/ExecState.h:
        (KJS::ExecState::globalThisValue):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData):
        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::construct):
        * kjs/scope_chain.h:
        (KJS::ScopeChainNode::ScopeChainNode):
        (KJS::ScopeChainNode::globalThisObject):
        (KJS::ScopeChainNode::push):
        (KJS::ScopeChain::ScopeChain):

2008-05-21  Kevin McCullough  <kmccullough@apple.com>

        Sadness :(

        * kjs/config.h:

2008-05-21  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Maciej.

        <rdar://problem/5950867> JSProfiler: Allow the profiler to "Focus" a
        profile node.
        - This patch updatest the times of the visible nodes correctly, but to do
        so, some of the design of the ProfileNode changed.

        * JavaScriptCore.exp: export focus' symbol.
        * profiler/Profile.cpp: ProfileNodes now take a reference to the head of
        the profile tree to get up-to-date accurate total profile time.
        (KJS::Profile::Profile): Pass 0 for the head node.
        (KJS::Profile::stopProfiling): stopProfiling no longer needs the time
        passed into it, since it can get it from the head and it does not need to
        be told it is the head because it can figure it out on it's own.
        (KJS::Profile::willExecute): Set the head node for each created node.
        * profiler/Profile.h:
        (KJS::Profile::focus): Instead of taking a CallIdentifier that the caller
        would have to create, now focus() takes a ProfileNode that they should
        already have a reference to and focus() can extract the CallIdentifier
        from it.
        * profiler/ProfileNode.cpp: Create actual and visible versions fo the
        total and self times for focus and exclude.  Also add a head node
        reference so that nodes can get information from their head.
        (KJS::ProfileNode::ProfileNode):
        (KJS::ProfileNode::stopProfiling): Rename the total and self time
        variables and set the visual ones to the actual ones, so that without any
        changes to the visual versions of these variables, their times will match
        the actual times.
        (KJS::ProfileNode::focus): Now focus() has a bool to force it's children
        to be visible if this node is visible.  If this node does not match the
        CallIdentifier being focused then the visibleTotalTime is only updated if
        one or more of it's children is the CallIdentifier being focused. 
        (KJS::ProfileNode::restoreAll): Restores all variables with respect to
        the visible data in the ProfileNode.
        (KJS::ProfileNode::endAndRecordCall): Name change.
        (KJS::ProfileNode::debugPrintData): Dump the new variables.
        (KJS::ProfileNode::debugPrintDataSampleStyle): Name change.
        * profiler/ProfileNode.h: Use the new variables and reference to the head
        node.
        (KJS::ProfileNode::create):
        (KJS::ProfileNode::totalTime):
        (KJS::ProfileNode::setTotalTime):
        (KJS::ProfileNode::selfTime):
        (KJS::ProfileNode::setSelfTime):
        (KJS::ProfileNode::totalPercent):
        (KJS::ProfileNode::selfPercent):
        (KJS::ProfileNode::setVisible):

2008-05-21  Alp Toker  <alp@nuanti.com>

        GTK+/UNIX testkjs build fix. Include signal.h.

        * kjs/testkjs.cpp:

2008-05-21  Oliver Hunt  <oliver@apple.com>

        Yet more windows build fixes

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2008-05-21  Oliver Hunt  <oliver@apple.com>

        Yet more windows build fixes

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2008-05-21  Alp Toker  <alp@nuanti.com>

        GTK+ build fix. Add DebuggerCallFrame.cpp and take AllInOneFile.cpp
        changes into account.

        * GNUmakefile.am:

2008-05-21  Oliver Hunt  <oliver@apple.com>

        Add DebuggerCallFrame.{h,cpp} to the project file

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2008-05-21  Alp Toker  <alp@nuanti.com>

        GTK+ port build fixes following squirrelfish merge r33979.

        * GNUmakefile.am:

2008-05-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - save a hash lookup wne writing to global properties
        0.3% speedup on SunSpider, 7% on bitops-bitwise-and

        * VM/Machine.cpp:
        (KJS::resolveBase): Check for being a the end of the scope chain
        before hash lookup.

2008-05-21  Alp Toker  <alp@nuanti.com>

        Rubber-stamped by Maciej.

        Replace non-standard #pragma marks with comments to avoid compiler
        warnings.

        * profiler/ProfileNode.cpp:

2008-05-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Mark Rowe.

        Fix layout test failure in fast/dom/getter-on-window-object2 introduced in r33961.

        * JavaScriptCore.exp:
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::defineGetter):
        (KJS::JSGlobalObject::defineSetter):
        * kjs/JSGlobalObject.h:

=== End merge of squirrelfish ===

2008-05-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Tim Hatcher.
        
        Merged with trunk WebCore's new debugger.

        * kjs/DebuggerCallFrame.cpp:
        (KJS::DebuggerCallFrame::evaluate): Changed this function to separate
        the exception value from the return value. The WebKit debugger treats
        them as one, but the WebCore debugger doesn't.

        * kjs/DebuggerCallFrame.h:
        (KJS::DebuggerCallFrame::dynamicGlobalObject): Added a new accessor for
        the dynamic global object, since the debugger doesn't want the lexical
        global object.

2008-05-21  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 19116: SquirrelFish shouldn't regress on variable lookups
        <https://bugs.webkit.org/show_bug.cgi?id=19116>

        Optimise cross scope assignment, 0.4% progression in sunspider.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitPutScopedVar):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::AssignResolveNode::emitCode):

2008-05-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - check property map before symbol table in JSGlobalObject::getOwnPropertySlot
        0.5% speedup on SunSpider

        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::getOwnPropertySlot): Check property map before symbol table
        because symbol table access is likely to have been optimized.

2008-05-21  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 19116: SquirrelFish shouldn't regress on variable lookups
        <https://bugs.webkit.org/show_bug.cgi?id=19116>

        Optimise multiscope lookup of statically resolvable function calls.
        SunSpider reports a 1.5% improvement, including 37% on 
        controlflow-recursive for some reason :D

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitResolve):
        * VM/CodeGenerator.h:
        * kjs/nodes.cpp:
        (KJS::FunctionCallResolveNode::emitCode):

2008-05-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - give JSGlobalObject a special version of getOwnPropertySlot that tells you if the slot is directly writable
        (WebCore change using this is a 2.6% speedup on in-browser SunSpider).

        * JavaScriptCore.exp:
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::getOwnPropertySlot):
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTableGet):
        * kjs/object.h:
        (KJS::JSObject::getDirectLocation):
        (KJS::JSObject::getOwnPropertySlotForWrite):
        * kjs/property_map.cpp:
        (KJS::PropertyMap::getLocation):
        * kjs/property_map.h:
        * kjs/property_slot.h:
        (KJS::PropertySlot::putValue):

2008-05-20  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 19116: SquirrelFish shouldn't regress on variable lookups
        <https://bugs.webkit.org/show_bug.cgi?id=19116>

        This restores multiscope optimisation to simple resolve, producing
        a 2.6% progression in SunSpider.  Have verified that none of the
        sites broken by the multiscope optimisation in trunk were effected
        by this change.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeBlock.h:
        (KJS::CodeBlock::CodeBlock):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::findScopedProperty):
        (KJS::CodeGenerator::emitResolve):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::resolve_n):
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/JSVariableObject.h:

2008-05-20  Oliver Hunt  <oliver@apple.com>

        Fixerate the windows build.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * VM/CodeGenerator.cpp:
        * VM/RegisterFile.h:
        * kjs/JSGlobalObject.h:
        * kjs/Parser.cpp:
        * kjs/interpreter.h:

2008-05-20  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 19110: SquirrelFish: Google Maps - no maps
        <https://bugs.webkit.org/show_bug.cgi?id=19110>

        Correct a comedy of errors present in my original patch to "fix"
        exceptions occurring midway through pre and post increment. This
        solution is cleaner than the original, doesn't need the additional
        opcodes, and as an added benefit does not break Google Maps.

        Sunspider reports a 0.4% progression.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::PreIncResolveNode::emitCode):
        (KJS::PreDecResolveNode::emitCode):
        (KJS::PreIncBracketNode::emitCode):
        (KJS::PreDecBracketNode::emitCode):
        (KJS::PreIncDotNode::emitCode):
        (KJS::PreDecDotNode::emitCode):

2008-05-20  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - inline JSGlobalObject::getOwnPropertySlot
        1% improvement on in-browser SunSpider (a wash command-line)

        * kjs/JSGlobalObject.cpp:
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::getOwnPropertySlot):

2008-05-18  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18752: SQUIRRELFISH: exceptions are not always handled by the vm
        <https://bugs.webkit.org/show_bug.cgi?id=18752>

        Handle exceptions thrown by toString conversion in subscript operators,
        this should basically complete exception handling in SquirrelFish.

        Sunspider reports no regression.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-05-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.

        [Reapplying patch with previously missing files from r33553 -- Oliver]

        Behold: debugging.
        
        SunSpider reports no change.

        * JavaScriptCore.xcodeproj/project.pbxproj: Added DebuggerCallFrame.h/.cpp,
        and created a debugger folder.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::generate): If the debugger is attached, always
        generate full scope chains for its sake.

        * VM/Machine.cpp:
        (KJS::Machine::unwindCallFrame): Notify the debugger when unwinding
        due to an exception, so it doesn't keep stale call frames around.

        (KJS::Machine::execute): Set Callee to 0 in eval frames, so the
        debugger can distinguish them from function call frames.

        (KJS::Machine::debug): Simplified this function, since the debugger
        doesn't actually need all the information we used to provide.

        (KJS::Machine::privateExecute): Treat debugging hooks like other function
        calls, so the code we hook into (the debugger UI) can be optimized.

        * kjs/debugger.cpp: Nixed these default callback implementations and
        made the callbacks pure virtual instead, so the compiler could tell me
        if I made a mistake in one of the subclasses.

        * kjs/debugger.h: Removed a bunch of irrelevent data from the debugger
        callbacks. Changed from passing an ExecState* to passing a
        DebuggerCallFrame*, since an ExecState* doesn't contain sufficient
        information anymore.

        * kjs/function.cpp:
        (KJS::globalFuncEval): Easiest bug fix evar!

        [Previously missing files from r33553]
        * kjs/DebuggerCallFrame.cpp: Copied from JavaScriptCore/profiler/FunctionCallProfile.h.
        (KJS::DebuggerCallFrame::functionName):
        (KJS::DebuggerCallFrame::thisObject):
        (KJS::DebuggerCallFrame::evaluateScript):
        * kjs/DebuggerCallFrame.h: Copied from JavaScriptCore/VM/Register.h.
        (KJS::DebuggerCallFrame::DebuggerCallFrame):
        (KJS::DebuggerCallFrame::scopeChain):
        (KJS::DebuggerCallFrame::exception):

2008-05-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 18991: SquirrelFish: Major codegen issue in a.b=expr, a[b]=expr
        <https://bugs.webkit.org/show_bug.cgi?id=18991>

        Fix the last remaining blocking cases of this bug.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::ReadModifyResolveNode::emitCode):

2008-05-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Partial fix for:

        Bug 18991: SquirrelFish: Major codegen issue in a.b=expr, a[b]=expr
        <https://bugs.webkit.org/show_bug.cgi?id=18991>

        Ensure that the code generated for assignments uses temporaries whenever
        necessary. This patch covers the vast majority of situations, but there
        are still a few left.

        This patch also adds some missing cases to CodeBlock::dump().

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::destinationForAssignResult):
        (KJS::CodeGenerator::leftHandSideNeedsCopy):
        (KJS::CodeGenerator::emitNodeForLeftHandSide):
        * kjs/NodeInfo.h:
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::AssignDotNode::emitCode):
        (KJS::ReadModifyDotNode::emitCode):
        (KJS::AssignBracketNode::emitCode):
        (KJS::ReadModifyBracketNode::emitCode):
        (KJS::ForInNode::ForInNode):
        * kjs/nodes.h:
        (KJS::ReadModifyResolveNode::):
        (KJS::AssignResolveNode::):
        (KJS::ReadModifyBracketNode::):
        (KJS::AssignBracketNode::):
        (KJS::AssignDotNode::):
        (KJS::ReadModifyDotNode::):

2008-05-17  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 19106: SquirrelFish: Activation is not marked correctly
        <https://bugs.webkit.org/show_bug.cgi?id=19106>

        We can't rely on the symbol table for a count of the number of globals
        we need to mark as that misses duplicate parameters and 'this'.  Now we
        use the actual local register count from the codeBlock.

        * kjs/JSActivation.cpp:
        (KJS::JSActivation::mark):

2008-05-16  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 19076: SquirrelFish: RegisterFile can be corrupted if implictly reenter global scope with no declared vars
        <https://bugs.webkit.org/show_bug.cgi?id=19076>

        Don't delay allocation of initial global RegisterFile, as we can't guarantee we will be able
        to allocate the global 'this' register safely at any point after initialisation of the Global
        Object.

        Unfortunately this initial allocation caused a regression of 0.2-0.3%, however this patch adds
        support for the static slot optimisation for the global Math object which brings it to a 0.3%
        progression.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::programCodeThis):
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::addParameter):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * kjs/ExecState.h:
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::reset):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::GlobalPropertyInfo::GlobalPropertyInfo):
        (KJS::JSGlobalObject::addStaticGlobals):
        * kjs/nodes.cpp:

2008-05-16  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver Hunt.

        Bug 19098: SquirrelFish: Ref'd temporaries can be clobbered
        <https://bugs.webkit.org/show_bug.cgi?id=19098>

        When doing code generation for a statement list, increase the reference
        count on a register that might eventually be returned, so that it doesn't
        get clobbered by a request for a new temporary.

        * kjs/nodes.cpp:
        (KJS::statementListEmitCode):

2008-05-16  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fixed Bug 19044: SquirrelFish: Bogus values enter evaluation when closing over scope with parameter and var with same name
        https://bugs.webkit.org/show_bug.cgi?id=19044

        * kjs/JSActivation.cpp:
        (KJS::JSActivation::copyRegisters): Use numLocals from the code
        block rather than the size of the symbol table for the number of
        registers to copy, to account for duplicate parameters and vars
        with the same name as parameters (we still have potentially
        suboptimal codegen in that we allocate a local register for the
        var in the latter case but it is never used).
        
2008-05-15  Geoffrey Garen  <ggaren@apple.com>

        Not reviewed.
        
        We regret to inform you that your program is crashing because you were
        stupid.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Math is hard.

2008-05-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.

        A little more debugger action: filled in op_debug. All debugger control
        flow works now, but variable inspection and backtraces still don't.
        
        SunSpider reports no change.

        * VM/CodeGenerator.cpp: Changed op_debug to accept line number parameters.

        * VM/Machine.cpp:
        (KJS::Machine::getFunctionAndArguments): Moved op_debug into a
        NEVER_INLINE function to avoid a stunning 10% performance regression.
        Also factored out a common function for retrieving the function and 
        arguments from a  call frame. 

        * kjs/JSActivation.cpp:
        (KJS::JSActivation::createArgumentsObject): Use the new factored out
        function mentioned above.

        * kjs/Parser.cpp:
        (KJS::Parser::parse): Increment m_sourceId before assigning it, so the
        sourceId we send to the debugger matches the sourceId recorded in the
        node.

        * kjs/nodes.cpp: Emit debugging hooks.

2008-05-14  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 19024: SQUIRRELFISH: ASSERTION FAILED: activation->isActivationObject() in Machine::unwindCallFrame
        <https://bugs.webkit.org/show_bug.cgi?id=19024>

        This fixes a number of issues.  The most important is that we now check every register
        file for tainting rather than just looking for function register files as that was
        insufficient. Additionally guarded against implicit re-entry into Eval code.

        Also added a few additional assertions to reduce the amout of time between something
        going wrong and us seeing the error.

        * VM/Machine.cpp:
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * VM/RegisterFile.cpp:
        (KJS::RegisterFile::growBuffer):
        (KJS::RegisterFile::addGlobalSlots):
        * VM/RegisterFileStack.cpp:
        (KJS::RegisterFileStack::pushGlobalRegisterFile):
        (KJS::RegisterFileStack::pushFunctionRegisterFile):
        * VM/RegisterFileStack.h:
        (KJS::RegisterFileStack::inImplicitCall):

2008-05-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        A little more debugger action: emit opcodes for debugger hooks. Right
        now, the opcode implementation is just a stub.
        
        SunSpider reports no change.
        
        Some example codegen for "function f() { 1; }":

            [   0] dbg         DidEnterCallFrame
            [   2] dbg         WillExecuteStatement
            [   4] load        tr0, 1(@k0)
            [   7] load        tr0, undefined(@k1)
            [  10] dbg         WillLeaveCallFrame
            [  12] ret         tr0

2008-05-14  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 19025: SQUIRRELFISH: malformed syntax in onload handler causes crash
        <https://bugs.webkit.org/show_bug.cgi?id=19025>

        Simple fix -- move the use of functionBodyNode to after the null check.

        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::construct):

2008-05-13  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed a codegen crash with run-time parse errors.
        
        SunSpider reports no change.
        
        emitThrowError needs to return the temporary holding the error, not dst,
        since dst may be NULL. In fact, emitThrowError shouldn't take a dst
        parameter at all, since exceptions should not modify the destination
        register.

2008-05-13  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 19027: SquirrelFish: Incorrect codegen for pre-increment
        <https://bugs.webkit.org/show_bug.cgi?id=19027>

        This fixes the codegen issues for the pre-inc/decrement operators
        to prevent incorrectly clobbering the destination in the event of
        an exception.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitPreInc):
        (KJS::CodeGenerator::emitPreDec):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::PreIncResolveNode::emitCode):
        (KJS::PreDecResolveNode::emitCode):
        (KJS::PreIncBracketNode::emitCode):
        (KJS::PreDecBracketNode::emitCode):
        (KJS::PreIncDotNode::emitCode):
        (KJS::PreDecDotNode::emitCode):

2008-05-13  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        A little more debugger action: supply a real line number, sourceId,
        and sourceURL in op_new_error.
        
        SunSpider reports a .2% speedup. Not sure what that's about.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Use the new good stuff in op_new_error.

        * kjs/nodes.cpp:
        (KJS::RegExpNode::emitCode): Use the shared emitThrowError instead of
        rolling our own.

2008-05-13  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        A little more debugger action: implemented the exception callback.
        
        SunSpider reports a .2% speedup. Not sure what that's about.

        * VM/CodeBlock.h: A little refactoring here. Store a pointer to our
        owner ScopeNode so we can retrieve data from it. This allows us to
        stop storing copies of the data ourselves. Also, store a "this" register
        instead of a code type, since we were only using the code type to
        calculate the "this" register.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::generate): Calculate the "this" register mentioned
        above. Also, take care of removing "this" from the symbol table after
        codegen is done, since relying on the timing of a destructor for correct
        behavior is not so good.

        * VM/Machine.cpp:
        (KJS::Machine::throwException): Invoke the debugger's exception callback.
        (KJS::Machine::privateExecute): Use the "this" register mentioned above.

2008-05-13  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Removed some unused exception machinery.
        
        SunSpider reports a .3% speedup.

        * API/JSCallbackObject.h:
        * API/JSCallbackObjectFunctions.h:
        * JavaScriptCore.exp:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/internal.cpp:
        * kjs/object.cpp:
        * kjs/object.h:
        * kjs/value.h:

2008-05-13  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        A little more debugger action.

        * kjs/debugger.cpp:
        * kjs/debugger.h: Removed debuggersPresent because it was unused.
        Replaced AttachedGlobalObject linked list with a HashSet because HashSet
        is faster and simpler. Changed all functions to return void instead of
        bool, because no clients ever return false, and we don't want to support
        it.

        * kjs/nodes.cpp: Did some up-keep to avoid build bustage.
        (KJS::Node::handleException):
        (KJS::BreakpointCheckStatement::execute):
        (KJS::FunctionBodyNodeWithDebuggerHooks::execute):

2008-05-13  Oliver Hunt  <oliver@apple.com>

        Reviewed by Darin.

        Bug 18752: SQUIRRELFISH: exceptions are not always handled by the vm
        <https://bugs.webkit.org/show_bug.cgi?id=18752>

        Replace old attempt at "branchless" exceptions as the extra information
        being passed made gcc an unhappy compiler, replacing these custom toNumber
        calls with ordinary toNumber logic (by relying on toNumber now preventing
        side effects after an exception has been thrown) provided sufficient leeway
        to add the additional checks for the remaining unchecked cases.

        This leaves only toString conversions in certain contexts as possibly
        misbehaving.

        * VM/Machine.cpp:
        (KJS::jsAdd):
        (KJS::resolve):
        (KJS::resolveBaseAndProperty):
        (KJS::resolveBaseAndFunc):
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/value.h:
        (KJS::JSValue::safeGetNumber):

2008-05-13  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        First steps toward supporting the debugger API: support the sourceParsed
        callback; plus some minor fixups.

        SunSpider reports no regression.

        * VM/CodeGenerator.h: Removed a misleading comment.

        * kjs/Parser.h: Changed the parser to take an ExecState*, so it can
        implement the sourceParsed callback -- that way, we only have to
        implement the callback in one place.

        * kjs/debugger.cpp: Nixed DebuggerImp, because its sole purpose in life
        was to demonstrate the misapplication of design patterns.

        * kjs/debugger.h: Changed sourceParsed to take a SourceProvider, to
        reduce copying, and not to return a value, because pausing execution
        after parsing is complicated, and no clients needed that ability, anyway.

        * kjs/grammar.y: Make sure never to pass a NULL SourceElements* to
        didFinishParsing -- that simplifies some code down the road.
        
        * kjs/nodes.cpp: Don't generate special AST nodes just because the
        debugger is attached -- that's a relic of the old AST execution model,
        and those nodes haven't been maintained.

2008-05-13  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 18752: SQUIRRELFISH: exceptions are not always handled by the vm
        <https://bugs.webkit.org/show_bug.cgi?id=18752>

        First step: prevent incorrect evaluation of valueOf/toString conversion
        in right hand side of expression after earlier conversion throws.

        * API/JSCallbackObjectFunctions.h:
        (KJS::::toNumber):
        * kjs/object.cpp:
        (KJS::JSObject::defaultValue):

2008-05-12  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 18934: SQUIRRELFISH: ASSERT @ nytimes.com due to RegisterFile being clobbered
        <https://bugs.webkit.org/show_bug.cgi?id=18934>

        Unfortunately we cannot create new statically optimised globals if there are any
        tainted RegisterFiles on the RegisterFileStack.  To handle this we re-introduce
        (in a slightly cleaner form) the inImplicitCall concept to the RegisterFileStack.

        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * VM/RegisterFileStack.cpp:
        (KJS::RegisterFileStack::pushFunctionRegisterFile):
        * VM/RegisterFileStack.h:

2008-05-12  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Introduced support for function.caller.
        
        Improved support for walking interesting scopes for function introspection.
        
        This fixes all remaining layout tests not blocked by rebasing to trunk.
        
        SunSpider reports no change.

        * VM/Machine.cpp:
        (KJS::Machine::dumpRegisters): Fixed a spacing issue.

2008-05-11  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 18961: SQUIRRELFISH: Gmail doesn't load
        <https://bugs.webkit.org/show_bug.cgi?id=18961>

        Fix codegen for logical nodes so that they don't use their destination
        as a temporary.

        * kjs/nodes.cpp:
        (KJS::LogicalAndNode::emitCode):
        (KJS::LogicalOrNode::emitCode):

2008-05-10  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.

        - JavaScriptCore part of fix for: "SQUIRRELFISH: function toString broken after calling"
        https://bugs.webkit.org/show_bug.cgi?id=18869
       
        Three layout tests are fixed:
          fast/js/toString-elision-trailing-comma.html
          fast/js/toString-prefix-postfix-preserve-parens.html
          fast/js/kde/lval-exceptions.html
        
        Functions now save a shared subrange of the original source used
        to make them (so in the common case this adds no storage above the
        memory cache).
        
        * kjs/SourceProvider.h: Added.
        (KJS::SourceProvider): New abstract base class for classes that provide on-demand access
        to the source for a JavaScript program. This allows function objects to have access to their
        original source without copying.
        (KJS::UStringSourceProvider): SourceProvider subclass backed by a KJS::UString.
        (KJS::UStringSourceProvider::create):
        (KJS::UStringSourceProvider::getRange):
        (KJS::UStringSourceProvider::data):
        (KJS::UStringSourceProvider::length):
        (KJS::UStringSourceProvider::UStringSourceProvider):
        * kjs/SourceRange.h: Added.
        (KJS::SourceRange::SourceRange): Class that holds a SourceProvider and a character range into
        the source, to encapsulate on-demand access to the source of a function.
        (KJS::SourceRange::toString):
        * VM/Machine.cpp:
        (KJS::eval): Pass a UStringSourceProvider to the parser.
        * kjs/Parser.cpp:
        (KJS::Parser::parse): Take a SourceProvider and pass it on to the lexer.
        * kjs/Parser.h:
        (KJS::Parser::parse): Take a SourceProvider.
        * kjs/lexer.cpp:
        (KJS::Lexer::setCode): Take a SourceProvider; keep it around, and
        use it to get the raw buffer and length.
        * kjs/lexer.h:
        (KJS::Lexer::sourceRange): Convenience function to get a source
        range based on the lexer's source provieder, and char offsets
        right before and after the desired range.
        * kjs/function.cpp:
        (KJS::globalFuncEval): Pass a UStringSourceProvider to the parser.
        * kjs/function_object.cpp:
        (KJS::functionProtoFuncToString): Use toSourceString to get the source.
        (KJS::FunctionObjectImp::construct): Give the parser a UStringSourceProvider.
        * kjs/grammar.y: When parsing a function declaration, function
        expression, or getter or setter, tell the function body about its
        SourceRange.
        * kjs/interpreter.cpp:
        (KJS::Interpreter::checkSyntax): Pass a SourceProvider to the parser.
        (KJS::Interpreter::evaluate): Pass a SourceProvider to the parser.
        * kjs/interpreter.h:
        * kjs/nodes.h:
        (KJS::FunctionBodyNode::setSource): Establish a SourceRange for this function.
        (KJS::FunctionBodyNode::toSourceString): Get the source string out
        of the SourceRange.
        (KJS::FuncExprNode::): Take a SourceRange and set it on the body.
        (KJS::FuncDeclNode::): ditto
        * kjs/testkjs.cpp:
        (prettyPrintScript): Use a SourceProvider appropriately.
        * JavaScriptCore.exp: Export new symbols.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add new files.
        * JavaScriptCore.xcodeproj/project.pbxproj: Add new files.

2008-05-09  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bring back RegisterFile tainting in order to correctly handle
        natively implemented getters and setters that re-enter JavaScript

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/RegisterFile.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        * kjs/object.cpp:
        (KJS::JSObject::put):
        (KJS::tryGetAndCallProperty):
        * kjs/property_slot.cpp:
        (KJS::PropertySlot::functionGetter):

2008-05-09  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - track character offsets of open and close braces, in preparation for saving function source
        
        I verified that there is no performance regression from this change.

        * kjs/grammar.y:
        * kjs/lexer.cpp:
        (KJS::Lexer::lex):
        (KJS::Lexer::matchPunctuator):
        * kjs/lexer.h:

2008-05-09  Oliver Hunt  <oliver@apple.com>

        Debug build fix

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::restoreLocalStorage):

2008-05-09  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Build fixes for SquirrelFish on windows.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:
        * VM/Register.h:
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::restoreLocalStorage):
        * kjs/collector.cpp:
        (KJS::Collector::allocate):
        (KJS::Collector::allocateNumber):
        * kjs/collector.h:
        (KJS::Collector::allocate):
        (KJS::Collector::allocateNumber):
        * kjs/property_slot.cpp:

2008-05-08  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - fix activation tearoff in the case where functions are called with too many arguments
        
        Fixes:
        fast/canvas/patternfill-repeat.html
        fast/dom/SelectorAPI/bug-17313.html

        * VM/Machine.cpp:
        (KJS::slideRegisterWindowForCall):
        (KJS::scopeChainForCall):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):

2008-05-08  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed failure in fast/canvas/canvas-pattern-behaviour.html.
        
        SunSpider reports a small speedup. Not sure what that's about.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump): Fixed op_call_eval to dump as "op_call_eval".
        This helped me while debugging.

        * VM/Machine.cpp:
        (KJS::Machine::unwindCallFrame): When looking for an activation to tear
        off, don't use the scope chain. Inside eval, the scope chain doesn't
        belong to us; it belongs to our calling function.
        
        Also, don't use the needsFullScopeChain flag to decide whether to tear
        off the activation. "function.arguments" can create an activation
        for a function whose needsFullScopeChain flag is set to false.

2008-05-08  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fix function.call for calls of more than 8 arguments
        
        Fixes svg/carto.net/button.svg

        * kjs/list.cpp:
        (KJS::List::getSlice): properly set up the m_buffer of the target list.

2008-05-08  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - don't return a null RegisterID from RegExpNode in the exception case, since the caller may need a real register

        Fixes:
        - fast/regex/early-acid3-86.html
        - http/tests/misc/acid3.html
        
        * kjs/nodes.cpp:
        (KJS::RegExpNode::emitCode):

2008-05-07  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Fix a performance regression caused by the introduction of property
        attributes to SymbolTable in r32859 by encoding the attributes and the
        register index into a single field of SymbolTableEntry.

        This leaves Node::optimizeVariableAccess() definitely broken, although
        it was probably not entirely correct in SquirrelFish before this change.

        * VM/CodeBlock.h:
        (KJS::missingThisObjectMarker):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::addVar):
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::registerForLocal):
        (KJS::CodeGenerator::registerForLocalConstInit):
        (KJS::CodeGenerator::isLocalConstant):
        (KJS::CodeGenerator::addConstant):
        (KJS::CodeGenerator::emitCall):
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::IdentifierMapIndexHashTraits::emptyValue):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::saveLocalStorage):
        * kjs/JSVariableObject.cpp:
        (KJS::JSVariableObject::getPropertyNames):
        (KJS::JSVariableObject::getPropertyAttributes):
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTableGet):
        (KJS::JSVariableObject::symbolTablePut):
        (KJS::JSVariableObject::symbolTablePutWithAttributes):
        * kjs/SymbolTable.h:
        (KJS::SymbolTableEntry::SymbolTableEntry):
        (KJS::SymbolTableEntry::isEmpty):
        (KJS::SymbolTableEntry::getIndex):
        (KJS::SymbolTableEntry::getAttributes):
        (KJS::SymbolTableEntry::setAttributes):
        (KJS::SymbolTableEntry::isReadOnly):
        * kjs/nodes.cpp:
        (KJS::getSymbolTableEntry):
        (KJS::PostIncResolveNode::optimizeVariableAccess):
        (KJS::PostDecResolveNode::optimizeVariableAccess):
        (KJS::DeleteResolveNode::optimizeVariableAccess):
        (KJS::TypeOfResolveNode::optimizeVariableAccess):
        (KJS::PreIncResolveNode::optimizeVariableAccess):
        (KJS::PreDecResolveNode::optimizeVariableAccess):
        (KJS::ReadModifyResolveNode::optimizeVariableAccess):
        (KJS::AssignResolveNode::optimizeVariableAccess):
        (KJS::ProgramNode::initializeSymbolTable):

2008-05-06  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Oliver.
        
        - add missing ! in an assert that I failed to reverse

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator):

2008-05-06  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fixed "SQUIRRELFISH: window.this shows up as a property, but it shouldn't"
        https://bugs.webkit.org/show_bug.cgi?id=18868
        
        The basic approach is to have "this" only be present in the symbol
        table at compile time, not runtime.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::~CodeGenerator): Remove "this" from symbol table.
        (KJS::CodeGenerator::CodeGenerator): Add "this" back when re-using
        a symbol table.
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::execute): Don't assert that "this" is in the symbol table.

2008-05-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Trivial support for function.arguments: Currently, we only support
        function.arguments from within the scope of function.
        
        This fixes the remaining Mozilla JS test failures.
        
        SunSpider reports no change.

        * JavaScriptCore.exp:

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Separated scope chain deref from
        activation register copying: since it is now possible for client code
        to create an activation on behalf of a function that otherwise wouldn't
        need one, having an activation no longer necessarily means that you need
        to deref the scope chain.
        
        (KJS::Machine::getCallFrame): For now, this function only examines the
        current scope. Walking parent scopes requires some refactoring in the
        way we track execution stacks.

        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState): We use a negative call frame offset to
        indicate that a given scope is not a function call scope.
        
2008-05-05  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Fix call frame set up for native -> JS function calls.

        * VM/Machine.cpp:
        (KJS::Machine::execute):

2008-05-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed ecma_3/Object/8.6.2.6-001.js, and similar bugs.
        
        SunSpider reports a .4% speedup. Not sure what that's about.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Check for exception return from equal,
        since toPrimitive can throw.

        * kjs/operations.cpp:
        (KJS::strictEqual): In response to an error I made in an earlier version
        of this patch, I changed strictEqual to make clear the fact that it
        performs no conversions and can't throw, making it slightly more efficient
        in the process.

2008-05-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fix some dumb mistakes in my last patch

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitPushScope):
        (KJS::CodeGenerator::emitGetPropertyNames):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-05-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - document opcodes relating to jumps, scopes, and property name iteration
        
        Documented jmp, jtrue, false, push_scope, pop_scope, get_pnames,
        next_pname and jmp_scopes.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitJump):
        (KJS::CodeGenerator::emitJumpIfTrue):
        (KJS::CodeGenerator::emitJumpIfFalse):
        (KJS::CodeGenerator::emitPushScope):
        (KJS::CodeGenerator::emitNextPropertyName):
        (KJS::CodeGenerator::emitGetPropertyNames):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/nodes.cpp:
        (KJS::LogicalAndNode::emitCode):
        (KJS::LogicalOrNode::emitCode):
        (KJS::ConditionalNode::emitCode):
        (KJS::IfNode::emitCode):
        (KJS::IfElseNode::emitCode):
        (KJS::DoWhileNode::emitCode):
        (KJS::WhileNode::emitCode):
        (KJS::ForNode::emitCode):
        (KJS::ForInNode::emitCode):
        (KJS::WithNode::emitCode):

2008-05-05  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 18749: SQUIRRELFISH: const support is broken
        <https://bugs.webkit.org/show_bug.cgi?id=18749>

        Adds support for const during code generation.

        Fixes 2 layout tests.

        * ChangeLog:
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::addVar):
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::isLocalConstant):
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::addVar):
        * kjs/nodes.cpp:
        (KJS::PostIncResolveNode::emitCode):
        (KJS::PostDecResolveNode::emitCode):
        (KJS::PreIncResolveNode::emitCode):
        (KJS::PreDecResolveNode::emitCode):
        (KJS::ReadModifyResolveNode::emitCode):
        (KJS::AssignResolveNode::emitCode):

2008-05-04  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - document some more opcodes (and fix argument names)
        
        Added docs for eq, neq, stricteq, nstriceq, less and lesseq.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitEqual):
        (KJS::CodeGenerator::emitNotEqual):
        (KJS::CodeGenerator::emitStrictEqual):
        (KJS::CodeGenerator::emitNotStrictEqual):
        (KJS::CodeGenerator::emitLess):
        (KJS::CodeGenerator::emitLessEq):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/nodes.cpp:
        (KJS::LessNode::emitCode):
        (KJS::GreaterNode::emitCode):
        (KJS::LessEqNode::emitCode):
        (KJS::GreaterEqNode::emitCode):
        (KJS::EqualNode::emitCode):
        (KJS::NotEqualNode::emitCode):
        (KJS::StrictEqualNode::emitCode):
        (KJS::NotStrictEqualNode::emitCode):
        (KJS::CaseBlockNode::emitCodeForBlock):

2008-05-04  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.

        More scaffolding for f.arguments.
        
        Track the offset of the last call frame in the ExecState, so we can
        produce a backtrace at any time.
        
        Also, record numLocals, the sum of numVars + numParameters, in each code
        block, to make updates to the ExecState a little cheaper than they
        would be otherwise.
        
        We now use numLocals in a bunch of places where we used to calculate
        numVars + numParameters or -numVars - numParameters.
        
        Reports are mixed, but all in all, this seems to be a wash on SunSpider.

2008-05-04  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Whoops, correctly handle properties that don't exist in the 
        symbol table.

        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTablePutWithAttributes):

2008-05-04  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Add attribute information to SymbolTable as ground work for
        various DontEnum and ReadOnly issues.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::addVar):
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::registerForLocal):
        (KJS::CodeGenerator::registerForLocalConstInit):
        (KJS::CodeGenerator::addConstant):
        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::saveLocalStorage):
        * kjs/JSVariableObject.cpp:
        (KJS::JSVariableObject::getPropertyNames):
        (KJS::JSVariableObject::getPropertyAttributes):
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTablePut):
        (KJS::JSVariableObject::symbolTablePutWithAttributes):
        * kjs/SymbolTable.h:
        (KJS::SymbolTableEntry::SymbolTableEntry):
        (KJS::SymbolTableIndexHashTraits::emptyValue):
        * kjs/nodes.cpp:
        (KJS::getSymbolTableEntry):
        (KJS::ReadModifyResolveNode::optimizeVariableAccess):
        (KJS::AssignResolveNode::optimizeVariableAccess):
        (KJS::ProgramNode::initializeSymbolTable):

2008-05-04  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        More scaffolding for f.arguments.
        
        Store the register file associated with an ExecState in the ExecState.
        
        SunSpider reports no change.

        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): Moved
        registerFileStack above globalExec, so it gets initialized first.
        Removed remnants of old activation scheme.

2008-05-04  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Oliver.
        
        - renamed a few opcodes and fixed assembly formatting to accomodate the longest opcode
        
        equal --> eq
        nequal --> neq
        resolve_base_and_property --> resolve_with_base
        resolve_base_and_func --> resolve_func
        get_prop_id --> get_by_id
        put_prop_id --> put_by_id
        delete_prop_id --> del_by_id
        get_prop_val --> get_by_val
        put_prop_val --> put_by_val
        delete_prop_val --> del_by_val
        put_prop_index --> put_by_index
        
        * VM/CodeBlock.cpp:
        (KJS::printUnaryOp):
        (KJS::printBinaryOp):
        (KJS::printConditionalJump):
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitEqual):
        (KJS::CodeGenerator::emitNotEqual):
        (KJS::CodeGenerator::emitResolveWithBase):
        (KJS::CodeGenerator::emitResolveFunction):
        (KJS::CodeGenerator::emitGetById):
        (KJS::CodeGenerator::emitPutById):
        (KJS::CodeGenerator::emitDeleteById):
        (KJS::CodeGenerator::emitGetByVal):
        (KJS::CodeGenerator::emitPutByVal):
        (KJS::CodeGenerator::emitDeleteByVal):
        (KJS::CodeGenerator::emitPutByIndex):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::ArrayNode::emitCode):
        (KJS::PropertyListNode::emitCode):
        (KJS::BracketAccessorNode::emitCode):
        (KJS::DotAccessorNode::emitCode):
        (KJS::EvalFunctionCallNode::emitCode):
        (KJS::FunctionCallResolveNode::emitCode):
        (KJS::FunctionCallBracketNode::emitCode):
        (KJS::FunctionCallDotNode::emitCode):
        (KJS::PostIncResolveNode::emitCode):
        (KJS::PostDecResolveNode::emitCode):
        (KJS::PostIncBracketNode::emitCode):
        (KJS::PostDecBracketNode::emitCode):
        (KJS::PostIncDotNode::emitCode):
        (KJS::PostDecDotNode::emitCode):
        (KJS::DeleteResolveNode::emitCode):
        (KJS::DeleteBracketNode::emitCode):
        (KJS::DeleteDotNode::emitCode):
        (KJS::TypeOfResolveNode::emitCode):
        (KJS::PreIncResolveNode::emitCode):
        (KJS::PreDecResolveNode::emitCode):
        (KJS::PreIncBracketNode::emitCode):
        (KJS::PreDecBracketNode::emitCode):
        (KJS::PreIncDotNode::emitCode):
        (KJS::PreDecDotNode::emitCode):
        (KJS::ReadModifyResolveNode::emitCode):
        (KJS::AssignResolveNode::emitCode):
        (KJS::AssignDotNode::emitCode):
        (KJS::ReadModifyDotNode::emitCode):
        (KJS::AssignBracketNode::emitCode):
        (KJS::ReadModifyBracketNode::emitCode):
        (KJS::ConstDeclNode::emitCodeSingle):
        (KJS::ForInNode::emitCode):
        (KJS::TryNode::emitCode):

2008-05-04  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Fix assertion when accessing arguments object with too many arguments provided

        The arguments constructor was assuming that the register offset given for argv
        was an absolute offset into the registerfile, rather than the offset from the
        frame.  This patches corrects that issue.

        * kjs/JSActivation.cpp:
        (KJS::JSActivation::createArgumentsObject):

2008-05-04  Geoffrey Garen  <ggaren@apple.com>

        Rubber stamped by Sam Weinig.
        
        Cleaned up Machine.cpp according to our style guidelines: moved static
        data to the top of the file; moved stand-alone functions below that;
        moved the Machine constructor above other Machine member functions.

2008-05-03  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Sam.
        
        - fix accidental breakage from last patch

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-05-03  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - a bunch more opcode documentation and corresponding parameter name fixes

        I renamed a few opcodes:
        
        type_of --> typeof (that's what the JS operator is named)
        instance_of --> instanceof (ditto)
        create_error --> new_error (for consistency with other new_* opcodes)
        
        I documented the following opcodes:
        
        - load
        - new_object
        - new_array
        - new_regexp
        - mov
        - pre_inc
        - pre_dec
        - post_inc
        - post_dec
        - to_jsnumber
        - negate
        - bitnot
        - not
        - instanceof
        - typeof
        - in
        - new_func
        - new_funcexp
        - new_error

        I also fixed formatting on some existing opcode docs.
        
        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitMove):
        (KJS::CodeGenerator::emitNot):
        (KJS::CodeGenerator::emitPreInc):
        (KJS::CodeGenerator::emitPreDec):
        (KJS::CodeGenerator::emitPostInc):
        (KJS::CodeGenerator::emitPostDec):
        (KJS::CodeGenerator::emitToJSNumber):
        (KJS::CodeGenerator::emitNegate):
        (KJS::CodeGenerator::emitBitNot):
        (KJS::CodeGenerator::emitInstanceOf):
        (KJS::CodeGenerator::emitTypeOf):
        (KJS::CodeGenerator::emitIn):
        (KJS::CodeGenerator::emitLoad):
        (KJS::CodeGenerator::emitNewObject):
        (KJS::CodeGenerator::emitNewArray):
        (KJS::CodeGenerator::emitNewRegExp):
        (KJS::CodeGenerator::emitNewError):
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::scopeDepth):
        (KJS::CodeGenerator::addVar):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::Node::emitThrowError):
        (KJS::RegExpNode::emitCode):
        (KJS::TypeOfValueNode::emitCode):
        (KJS::UnaryPlusNode::emitCode):
        (KJS::NegateNode::emitCode):
        (KJS::BitwiseNotNode::emitCode):
        (KJS::LogicalNotNode::emitCode):
        (KJS::InstanceOfNode::emitCode):
        (KJS::InNode::emitCode):

2008-05-03  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff and Sam.
        
        - generate HTML bytecode docs at build time

        * DerivedSources.make:
        * docs: Added.
        * docs/make-bytecode-docs.pl: Added.

2008-05-03  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Update ExecState::m_scopeChain when switching scope chains inside the
        machine.
        
        This fixes uses of lexicalGlobalObject, such as, in a subframe

            alert(top.makeArray() instanceof Array ? "FAIL" : "PASS");
        
        and a bunch of the security failures listed in
        https://bugs.webkit.org/show_bug.cgi?id=18870. (Those tests still fail,
        seemingly because of regressions in exception messages).
        
        SunSpider reports no change.

        * VM/Machine.cpp: Factored out scope chain updating into a common
        function that takes care to update ExecState::m_scopeChain, too.

        * kjs/ExecState.h: I made Machine a friend of ExecState so that Machine
        could update ExecState::m_scopeChain, even though that value is
        read-only for everyone else.

        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): Changed
        this client to be a little friendlier to ExecState's internal
        storage type for scope chain data.

2008-05-03  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Fixed https://bugs.webkit.org/show_bug.cgi?id=18876
        Squirrelfish: ScopeChainNode leak in op_jmp_scopes.
        
        SunSpider reports no change.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Don't construct a ScopeChain object,
        since the direct threaded interpreter will goto across its destructor.

2008-05-03  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        A bit more efficient fix than r32832: Don't copy globals into function
        register files; instead, have the RegisterFileStack track only the base
        of the last *global* register file, so the global object's register
        references stay good.
        
        SunSpider reports a .3% speedup. Not sure what that's about.

2008-05-03  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18864: SquirrelFish: Support getter and setter definition in object literals
        <https://bugs.webkit.org/show_bug.cgi?id=18864>

        Add new opcodes to allow us to add getters and setters to an object.  These are
        only used by the codegen for object literals.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitPutGetter):
        (KJS::CodeGenerator::emitPutSetter):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::PropertyListNode::emitCode):

2008-05-02  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - properly copy globals into and out of implicit call register
        files, otherwise they will fail at global lookup

        Fixes fast/js/array-tostring-and-join.html layout test.
        
        * VM/RegisterFileStack.cpp:
        (KJS::RegisterFileStack::pushGlobalRegisterFile):
        (KJS::RegisterFileStack::popGlobalRegisterFile):
        (KJS::RegisterFileStack::pushFunctionRegisterFile):
        (KJS::RegisterFileStack::popFunctionRegisterFile):

2008-05-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed https://bugs.webkit.org/show_bug.cgi?id=18822
        SQUIRRELFISH: incorrect eval used in some cases
        
        Changed all code inside the machine to fetch the lexical global object
        directly from the scope chain, instead of from the ExecState.
        
        Clients who fetch the lexical global object through the ExecState
        still don't work.
        
        SunSpider reports no change.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Fetch the lexical global object from
        the scope chain.
        
        * kjs/ExecState.h:
        (KJS::ExecState::ExecState::lexicalGlobalObject): Moved the logic for
        this function into ScopeChainNode, but kept this function around to
        support existing clients.

2008-05-02  Geoffrey Garen  <ggaren@apple.com>

        Rubber stamped by Oliver Hunt.
        
        Removed ExecState.cpp from AllInOneFile.cpp, for a .2% speedup.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/AllInOneFile.cpp:

2008-05-01  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff and Maciej.

        Bug 18827: SquirrelFish: Prevent getters and setters from destroying the current RegisterFile
        <https://bugs.webkit.org/show_bug.cgi?id=18827>

        Remove safe/unsafe RegisterFile concept, and instead just add additional
        logic to ensure we always push/pop RegisterFiles when executing getters
        and setters, similar to the logic for valueOf and toString.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/RegisterFile.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        * kjs/object.cpp:
        (KJS::JSObject::put):
        * kjs/property_slot.cpp:
        (KJS::PropertySlot::functionGetter):

2008-05-01  Oliver Hunt  <oliver@apple.com>

        RS=Geoff

        Rename unsafeForReentry to safeForReentry to avoid double negatives.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/RegisterFile.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):

2008-05-01  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18827: SquirrelFish: Prevent getters and setters from destroying the current RegisterFile
        <https://bugs.webkit.org/show_bug.cgi?id=18827>
        
        This patch makes getters and setters work.  It does this by
        tracking whether the RegisterFile is "safe", that is whether
        the interpreter is in a state that in which it can handle
        the RegisterFile being reallocated.

        * VM/Machine.cpp:
        (KJS::resolve):
        (KJS::Machine::privateExecute):
        * VM/RegisterFile.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):

2008-04-30  Geoffrey Garen  <ggaren@apple.com>

        Release build fix: Always compile in "isGlobalObject", since it's
        listed in our .exp file.

        * kjs/ExecState.cpp:
        (KJS::ExecState::isGlobalObject):
        * kjs/ExecState.h:

2008-04-30  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Minor code restructuring to prepare for getters and setters, 
        also helps exception semantics a bit.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-30  Geoffrey Garen  <ggaren@apple.com>

        Fixed tyop.

        * kjs/ExecState.h:

2008-04-30  Geoffrey Garen  <ggaren@apple.com>

        Debug build fix: export a missing symbol.

        * JavaScriptCore.exp:

2008-04-30  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        A little more ExecState refactoring: Now, only the global object creates
        an ExecState.
        
        Also inlined ExecState::lexicalGlobalObject().
        
        SunSpider reports no change.

2008-04-30  Geoffrey Garen  <ggaren@apple.com>

        WebCore build fix: forward-declare ScopeChain.

        * kjs/interpreter.h:

2008-04-30  Geoffrey Garen  <ggaren@apple.com>

        Build fix for JavaScriptGlue: export a missing symbol.

        * JavaScriptCore.exp:

2008-04-30  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Removed a lot of unused bits from ExecState, moving them into
        OldInterpreterExecState, the fake scaffolding class.
        
        The clutter was making it hard to see the forest from the trees.
        
        .4% SunSpider speedup, probably because ExecState::lexicalGlobalObject()
        is faster now.

2008-04-29  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18643: SQUIRRELFISH: need to support implicit function calls (valueOf, toString, getters/setters)
        <https://bugs.webkit.org/show_bug.cgi?id=18643>

        Prevent static slot optimisation for new variables and functions in
        globally re-entrant code called from an an implicit function call.

        This is necessary to prevent us from needing to resize the global
        slot portion of the root RegisterFile during an implicit (and hence
        unguarded) function call.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * VM/RegisterFile.h:
        * VM/RegisterFileStack.cpp:
        (KJS::RegisterFileStack::pushGlobalRegisterFile):
        (KJS::RegisterFileStack::popGlobalRegisterFile):
        (KJS::RegisterFileStack::pushFunctionRegisterFile):
        (KJS::RegisterFileStack::popFunctionRegisterFile):
        * VM/RegisterFileStack.h:
        (KJS::RegisterFileStack::inImplicitFunctionCall):
        (KJS::RegisterFileStack::lastGlobal):
        * kjs/nodes.cpp:
        (KJS::ProgramNode::generateCode):
        * kjs/nodes.h:
        (KJS::ProgramNode::):

2008-04-29  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        In nested program code, don't propogate "this" back to the parent
        register file. ("this" should remain constant in the parent register
        file, regardless of the scripts it invokes.)

        * VM/RegisterFile.cpp:
        (KJS::RegisterFile::copyGlobals):

2008-04-28  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Restore base pointer when popping a global RegisterFile

        * VM/RegisterFileStack.cpp:
        (KJS::RegisterFileStack::popGlobalRegisterFile):

2008-04-28  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 18643: SQUIRRELFISH: need to support implicit function calls (valueOf, toString, getters/setters)
        <https://bugs.webkit.org/show_bug.cgi?id=18643>

        Partial fix.  This results in all implicit calls to toString or valueOf
        executing in a separate RegisterFile, so ensuring that the the pointers
        in the triggering interpreter don't get trashed.  This still leaves the
        task of preventing new global re-entry from toString and valueOf from
        clobbering the RegisterFile.

        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * VM/RegisterFileStack.cpp:
        (KJS::RegisterFileStack::pushFunctionRegisterFile):
        (KJS::RegisterFileStack::popFunctionRegisterFile):
        * VM/RegisterFileStack.h:
        * kjs/object.cpp:
        (KJS::tryGetAndCallProperty):

2008-04-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Simplified activation object a bit: No need to store the callee
        in the activation object -- we can pull it out of the call frame
        when needed, instead.
        
        SunSpider reports no change.

2008-04-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        RS by Oliver Hunt on moving JSArguments.cpp out of AllInOneFile.cpp.

        Substantially more handling of "arguments": "arguments" works fully
        now, but "f.arguments" still doesn't work.

        Fixes 10 regression tests.
        
        SunSpider reports no regression.

        * kjs/JSActivation.cpp:
        (KJS::JSActivation::createArgumentsObject): Reconstruct an arguments
        List to pass to the arguments object constructor.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/AllInOneFile.cpp: Removed JSActivation.cpp from AllInOneFile.cpp
        because that seems to make GCC happy. (Previously, I had added
        JSActivation.cpp to AllInOneFile.cpp because *that* seemed to make GCC
        happy. So it goes.)

2008-04-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Groundwork for more handling of "arguments". I'm not checking in the
        actual handling of "arguments" yet, because it still needs a little
        fiddling to avoid a performance regression.
        
        SunSpider reports no change.

        * VM/Machine.cpp:
        (KJS::initializeCallFrame): Put argc in the register file, so the
        arguments object can find it later, to determine arguments.length.

        * kjs/nodes.h:
        (KJS::FunctionBodyNode::): Added a special code accessor for when you
        know the code has already been generated, and you don't have a scopeChain
        to supply for potential code generation. (This is the case when the
        activation object creates the arguments object.)

2008-04-28  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Replace unsafe use of auto_ptr in Vector with manual memory
        management.

        * VM/RegisterFileStack.cpp:
        (KJS::RegisterFileStack::~RegisterFileStack):
        (KJS::RegisterFileStack::popRegisterFile):
        * VM/RegisterFileStack.h:

2008-04-27  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Bug 18746: SQUIRRELFISH: indirect eval used when direct eval should be used
        <https://bugs.webkit.org/show_bug.cgi?id=18746>

        Change the base to the correct value of the 'this' object after the direct
        eval test instead of before.

        Fixes 5 layout tests.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/nodes.cpp:
        (KJS::EvalFunctionCallNode::emitCode):

2008-04-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - document all property getting, setting and deleting opcodes
        
        (And fix function parameter names to match corresponding opcode parameter names.)

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitResolve):
        (KJS::CodeGenerator::emitResolveBase):
        (KJS::CodeGenerator::emitResolveBaseAndProperty):
        (KJS::CodeGenerator::emitResolveBaseAndFunc):
        (KJS::CodeGenerator::emitGetPropId):
        (KJS::CodeGenerator::emitPutPropId):
        (KJS::CodeGenerator::emitDeletePropId):
        (KJS::CodeGenerator::emitPutPropVal):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::resolve):
        (KJS::resolveBase):
        (KJS::resolveBaseAndProperty):
        (KJS::resolveBaseAndFunc):
        (KJS::Machine::privateExecute):
        * kjs/nodes.cpp:
        (KJS::ResolveNode::emitCode):
        (KJS::ArrayNode::emitCode):
        (KJS::PropertyListNode::emitCode):
        (KJS::BracketAccessorNode::emitCode):
        (KJS::EvalFunctionCallNode::emitCode):
        (KJS::FunctionCallResolveNode::emitCode):
        (KJS::FunctionCallBracketNode::emitCode):
        (KJS::PostIncResolveNode::emitCode):
        (KJS::PostDecResolveNode::emitCode):
        (KJS::PostIncBracketNode::emitCode):
        (KJS::PostDecBracketNode::emitCode):
        (KJS::PostIncDotNode::emitCode):
        (KJS::PostDecDotNode::emitCode):
        (KJS::DeleteResolveNode::emitCode):
        (KJS::TypeOfResolveNode::emitCode):
        (KJS::PreIncResolveNode::emitCode):
        (KJS::PreDecResolveNode::emitCode):
        (KJS::PreIncBracketNode::emitCode):
        (KJS::PreDecBracketNode::emitCode):
        (KJS::AssignResolveNode::emitCode):
        (KJS::AssignDotNode::emitCode):
        (KJS::ReadModifyDotNode::emitCode):
        (KJS::AssignBracketNode::emitCode):
        (KJS::ReadModifyBracketNode::emitCode):
        (KJS::ConstDeclNode::emitCodeSingle):

2008-04-26  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18628: SQUIRRELFISH: need to support recursion limit
        <https://bugs.webkit.org/show_bug.cgi?id=18628>

        Basically completes recursion limiting.  There is still some
        tuning we may want to do to make things better in the face of
        very bad code, but certainly nothing worse than anything already
        possible in trunk.

        Also fixes a WebKit test by fixing the exception text :D

        * JavaScriptCore.exp:
        * VM/ExceptionHelpers.cpp:
        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * VM/RegisterFile.cpp:
        (KJS::RegisterFile::growBuffer):
        (KJS::RegisterFile::addGlobalSlots):
        * VM/RegisterFile.h:
        (KJS::RegisterFile::grow):
        (KJS::RegisterFile::uncheckedGrow):
        * VM/RegisterFileStack.cpp:
        (KJS::RegisterFileStack::pushRegisterFile):
        * VM/RegisterFileStack.h:

2008-04-25  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 18628: SQUIRRELFISH: need to support recursion limit
        <https://bugs.webkit.org/show_bug.cgi?id=18628>

        Put a limit on the level of reentry recursion.  128 levels of re-entrant recursion
        seems reasonable as it is greater than the old eval limit, and a long way short of
        the reentry depth needed to overflow the stack.

        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * VM/Machine.h:

2008-04-25  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        A tiny bit of cleanup to the regexp code.
        
        Removed some static_cast.
        
        Removed createRegExpImp because it's no longer used.

2008-04-25  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18736: SQUIRRELFISH: switch statements with no default have incorrect codegen
        <https://bugs.webkit.org/show_bug.cgi?id=18736>

        Ensure the "default" target is correct in the absence of an explicit default handler.

        * kjs/nodes.cpp:
        (KJS::CaseBlockNode::emitCodeForBlock):

2008-04-25  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18628: SQUIRRELFISH: need to support recursion limit
        <https://bugs.webkit.org/show_bug.cgi?id=18628>

        More bounds checking.

        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * VM/RegisterFile.cpp:
        (KJS::RegisterFile::growBuffer):
        * VM/RegisterFile.h:

2008-04-25  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fix signal catching magic
        
        The signal handlers are restored to _exit but are only set when
        running under run-javascriptcore-tests. fprintf from a signal
        handler is not safe.

        * kjs/testkjs.cpp:
        (main):
        (parseArguments):
        * tests/mozilla/jsDriver.pl:

2008-04-25  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Bug 18732: SQUIRRELFISH: exceptions thrown by native constructors are ignored
        <https://bugs.webkit.org/show_bug.cgi?id=18732>

        Fixes another regression test.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-25  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Bug 18728: SQUIRRELFISH: invalid regular expression constants should throw exceptions
        <https://bugs.webkit.org/show_bug.cgi?id=18728>

        Fixes another regression test.

        * kjs/nodes.cpp:
        (KJS::RegExpNode::emitCode):

2008-04-24  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Geoffrey Garen.

        Bug 18735: SQUIRRELFISH: closures are sometimes given an incorrect 'this' value when called
        <https://bugs.webkit.org/show_bug.cgi?id=18735>

        The overloaded toThisObject method was not copied over to JSActivation.

        Fixes two regression tests.

        * kjs/JSActivation.cpp:
        (KJS::JSActivation::toThisObject):
        * kjs/JSActivation.h:

2008-04-24  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Added support for arguments.callee.

2008-04-24  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18628: SQUIRRELFISH: need to support recursion limit
        <https://bugs.webkit.org/show_bug.cgi?id=18628>

        Partial fix -- this gets us some of the required bounds checking, but not
        complete coverage.  But it does manage to do them without regressing :D

        * VM/ExceptionHelpers.cpp:
        (KJS::createError):
        (KJS::createStackOverflowError):
        * VM/ExceptionHelpers.h:
        * VM/Machine.cpp:
        (KJS::slideRegisterWindowForCall):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * VM/RegisterFile.cpp:
        * VM/RegisterFile.h:
        (KJS::RegisterFile::):
        (KJS::RegisterFile::RegisterFile):
        (KJS::RegisterFile::grow):

2008-04-24  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        A tiny bit more handling of "arguments": create a real, but mostly
        hollow, arguments object.
        
        Fixes 2 regression tests.

2008-04-24  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 18717: SQUIRRELFISH: eval returns the wrong value for a variable declaration statement
        <https://bugs.webkit.org/show_bug.cgi?id=18717>

        Fixes a regression test, but exposes the failure of another due to the
        lack of getters and setters.

        * kjs/nodes.cpp:
        (KJS::ConstDeclNode::emitCodeSingle):
        (KJS::ConstDeclNode::emitCode):
        (KJS::ConstStatementNode::emitCode):
        (KJS::VarStatementNode::emitCode):
        * kjs/nodes.h:

2008-04-24  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Print a CRASH statement when crashing, so test failures are not a
        mystery.

        * kjs/testkjs.cpp:
        (handleCrash):
        (main):

2008-04-24  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Geoffrey Garen.

        Bug 18716: SQUIRRELFISH: typeof should return undefined for an undefined variable reference
        <https://bugs.webkit.org/show_bug.cgi?id=18716>

        This fixes 2 more regression tests.

        * kjs/nodes.cpp:
        (KJS::TypeOfResolveNode::emitCode):

2008-04-24  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Put the callee in the call frame.
        
        Necessary in order to support "arguments" and "arguments.callee".

        Also fixes a latent GC bug, where an executing function could be
        subject to GC if the register holding it were overwritten. Here's
        an example that would have caused problems:
        
        function f()
        {
            // Flood the machine stack to eliminate any old pointers to f.
            g.call({});
            
            // Overwrite f in the register file.
            f = 1;

            // Force a GC.
            for (var i = 0; i < 5000; ++i) {
                ({});
            }
            
            // Welcome to crash-ville.
        }

        function g()
        {
        }

        f();

        * VM/Machine.h: Changed the order of arguments to
        execute(FunctionBodyNode*...) to match the other execute functions.
        * kjs/function.cpp: Updated to match new argument requirements from
        execute(FunctionBodyNode*...). Renamed newObj to thisObj to match the
        rest of JavaScriptCore.

        SunSpider reports no change.

2008-04-23  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Bug 18707: SQUIRRELFISH: eval always performs toString() on its argument
        <https://bugs.webkit.org/show_bug.cgi?id=18707>

        This fixes 4 more regression tests.

        * VM/Machine.cpp:
        (KJS::eval):

2008-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fix logic bug in SegmentedVector::grow which would sometimes fail to resize a segment when needed
        
        Fixes 3 JSC tests.

        * VM/SegmentedVector.h:
        (KJS::SegmentedVector::grow):

2008-04-23  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Degenerate handling of "arguments" as a property of the activation
        object. Currently, we just return a vanilla object.
        
        SunSpider reports no change.

        Fixes:

        ecma_3/Function/regress-94506.js.
        
        Reveals to have been secretly broken:

        ecma_3/Function/15.3.4.3-1.js
        ecma_3/Function/15.3.4.4-1.js
        
        These tests were passing incorrectly. testkjs creates a global array
        named "arguments" to hold command-line arguments. That array was
        tricking these tests into thinking that an arguments object with length
        0 had been created. Since our new vanilla object shadows the global
        property named arguments, that object no longer fools these tests into
        passing.
        
        Net change: +1 failing test.

        * kjs/AllInOneFile.cpp: Had to put JSActivation.cpp into AllInOneFile.cpp
        to solve a surprising 8.6% regression in bitops-3bit-bits-in-byte.

2008-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - save and restore callFrame

        * VM/Machine.cpp:
        (KJS::slideRegisterWindowForCall):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * kjs/testkjs.cpp:
        (main):

2008-04-23  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed scopes for named function expressions.
        
        Fixes one regression test.
        
        Two changes here:
        
        (1) The function's name is supposed to have attributes DontDelete,
        ReadOnly, regardless of the type of code executing.
        
        (2) Push the name object on the function's scope chain, rather than
        the ExecState's scope chain because, well, that's where it belongs.

2008-04-23  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Inlined JSObject::putDirect, for a .4% SunSpider speedup.
        
        I did this as a first step toward removing nodes.cpp from
        AllInOneFile.cpp, but I'm putting that larger project aside for now.

2008-04-23  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Geoff.
        
        - add OldInterpreterExecState class and use it in dead code
        
        This will allow removing things from the real ExecState class
        without having to figure out how to remove all this code without
        getting a perf regression.

        * kjs/nodes.cpp:
        (KJS::ExpressionNode::evaluateToNumber):
        (KJS::ExpressionNode::evaluateToBoolean):
        (KJS::ExpressionNode::evaluateToInt32):
        (KJS::ExpressionNode::evaluateToUInt32):
        (KJS::Node::setErrorCompletion):
        (KJS::Node::throwError):
        (KJS::Node::throwUndefinedVariableError):
        (KJS::Node::handleException):
        (KJS::Node::rethrowException):
        (KJS::BreakpointCheckStatement::execute):
        (KJS::BreakpointCheckStatement::optimizeVariableAccess):
        (KJS::NullNode::evaluate):
        (KJS::FalseNode::evaluate):
        (KJS::TrueNode::evaluate):
        (KJS::NumberNode::evaluate):
        (KJS::NumberNode::evaluateToNumber):
        (KJS::NumberNode::evaluateToBoolean):
        (KJS::NumberNode::evaluateToInt32):
        (KJS::NumberNode::evaluateToUInt32):
        (KJS::ImmediateNumberNode::evaluate):
        (KJS::ImmediateNumberNode::evaluateToInt32):
        (KJS::ImmediateNumberNode::evaluateToUInt32):
        (KJS::StringNode::evaluate):
        (KJS::StringNode::evaluateToNumber):
        (KJS::StringNode::evaluateToBoolean):
        (KJS::RegExpNode::evaluate):
        (KJS::ThisNode::evaluate):
        (KJS::ResolveNode::inlineEvaluate):
        (KJS::ResolveNode::evaluate):
        (KJS::ResolveNode::evaluateToNumber):
        (KJS::ResolveNode::evaluateToBoolean):
        (KJS::ResolveNode::evaluateToInt32):
        (KJS::ResolveNode::evaluateToUInt32):
        (KJS::getSymbolTableEntry):
        (KJS::ResolveNode::optimizeVariableAccess):
        (KJS::LocalVarAccessNode::inlineEvaluate):
        (KJS::LocalVarAccessNode::evaluate):
        (KJS::LocalVarAccessNode::evaluateToNumber):
        (KJS::LocalVarAccessNode::evaluateToBoolean):
        (KJS::LocalVarAccessNode::evaluateToInt32):
        (KJS::LocalVarAccessNode::evaluateToUInt32):
        (KJS::getNonLocalSymbol):
        (KJS::ScopedVarAccessNode::inlineEvaluate):
        (KJS::ScopedVarAccessNode::evaluate):
        (KJS::ScopedVarAccessNode::evaluateToNumber):
        (KJS::ScopedVarAccessNode::evaluateToBoolean):
        (KJS::ScopedVarAccessNode::evaluateToInt32):
        (KJS::ScopedVarAccessNode::evaluateToUInt32):
        (KJS::NonLocalVarAccessNode::inlineEvaluate):
        (KJS::NonLocalVarAccessNode::evaluate):
        (KJS::NonLocalVarAccessNode::evaluateToNumber):
        (KJS::NonLocalVarAccessNode::evaluateToBoolean):
        (KJS::NonLocalVarAccessNode::evaluateToInt32):
        (KJS::NonLocalVarAccessNode::evaluateToUInt32):
        (KJS::ElementNode::optimizeVariableAccess):
        (KJS::ElementNode::evaluate):
        (KJS::ArrayNode::optimizeVariableAccess):
        (KJS::ArrayNode::evaluate):
        (KJS::ObjectLiteralNode::optimizeVariableAccess):
        (KJS::ObjectLiteralNode::evaluate):
        (KJS::PropertyListNode::optimizeVariableAccess):
        (KJS::PropertyListNode::evaluate):
        (KJS::PropertyNode::optimizeVariableAccess):
        (KJS::PropertyNode::evaluate):
        (KJS::BracketAccessorNode::optimizeVariableAccess):
        (KJS::BracketAccessorNode::inlineEvaluate):
        (KJS::BracketAccessorNode::evaluate):
        (KJS::BracketAccessorNode::evaluateToNumber):
        (KJS::BracketAccessorNode::evaluateToBoolean):
        (KJS::BracketAccessorNode::evaluateToInt32):
        (KJS::BracketAccessorNode::evaluateToUInt32):
        (KJS::DotAccessorNode::optimizeVariableAccess):
        (KJS::DotAccessorNode::inlineEvaluate):
        (KJS::DotAccessorNode::evaluate):
        (KJS::DotAccessorNode::evaluateToNumber):
        (KJS::DotAccessorNode::evaluateToBoolean):
        (KJS::DotAccessorNode::evaluateToInt32):
        (KJS::DotAccessorNode::evaluateToUInt32):
        (KJS::ArgumentListNode::optimizeVariableAccess):
        (KJS::ArgumentListNode::evaluateList):
        (KJS::ArgumentsNode::optimizeVariableAccess):
        (KJS::NewExprNode::optimizeVariableAccess):
        (KJS::NewExprNode::inlineEvaluate):
        (KJS::NewExprNode::evaluate):
        (KJS::NewExprNode::evaluateToNumber):
        (KJS::NewExprNode::evaluateToBoolean):
        (KJS::NewExprNode::evaluateToInt32):
        (KJS::NewExprNode::evaluateToUInt32):
        (KJS::ExpressionNode::resolveAndCall):
        (KJS::EvalFunctionCallNode::optimizeVariableAccess):
        (KJS::EvalFunctionCallNode::evaluate):
        (KJS::FunctionCallValueNode::optimizeVariableAccess):
        (KJS::FunctionCallValueNode::evaluate):
        (KJS::FunctionCallResolveNode::optimizeVariableAccess):
        (KJS::FunctionCallResolveNode::inlineEvaluate):
        (KJS::FunctionCallResolveNode::evaluate):
        (KJS::FunctionCallResolveNode::evaluateToNumber):
        (KJS::FunctionCallResolveNode::evaluateToBoolean):
        (KJS::FunctionCallResolveNode::evaluateToInt32):
        (KJS::FunctionCallResolveNode::evaluateToUInt32):
        (KJS::LocalVarFunctionCallNode::inlineEvaluate):
        (KJS::LocalVarFunctionCallNode::evaluate):
        (KJS::LocalVarFunctionCallNode::evaluateToNumber):
        (KJS::LocalVarFunctionCallNode::evaluateToBoolean):
        (KJS::LocalVarFunctionCallNode::evaluateToInt32):
        (KJS::LocalVarFunctionCallNode::evaluateToUInt32):
        (KJS::ScopedVarFunctionCallNode::inlineEvaluate):
        (KJS::ScopedVarFunctionCallNode::evaluate):
        (KJS::ScopedVarFunctionCallNode::evaluateToNumber):
        (KJS::ScopedVarFunctionCallNode::evaluateToBoolean):
        (KJS::ScopedVarFunctionCallNode::evaluateToInt32):
        (KJS::ScopedVarFunctionCallNode::evaluateToUInt32):
        (KJS::NonLocalVarFunctionCallNode::inlineEvaluate):
        (KJS::NonLocalVarFunctionCallNode::evaluate):
        (KJS::NonLocalVarFunctionCallNode::evaluateToNumber):
        (KJS::NonLocalVarFunctionCallNode::evaluateToBoolean):
        (KJS::NonLocalVarFunctionCallNode::evaluateToInt32):
        (KJS::NonLocalVarFunctionCallNode::evaluateToUInt32):
        (KJS::FunctionCallBracketNode::optimizeVariableAccess):
        (KJS::FunctionCallBracketNode::evaluate):
        (KJS::FunctionCallDotNode::optimizeVariableAccess):
        (KJS::FunctionCallDotNode::inlineEvaluate):
        (KJS::FunctionCallDotNode::evaluate):
        (KJS::FunctionCallDotNode::evaluateToNumber):
        (KJS::FunctionCallDotNode::evaluateToBoolean):
        (KJS::FunctionCallDotNode::evaluateToInt32):
        (KJS::FunctionCallDotNode::evaluateToUInt32):
        (KJS::PostIncResolveNode::optimizeVariableAccess):
        (KJS::PostIncResolveNode::evaluate):
        (KJS::PostIncLocalVarNode::evaluate):
        (KJS::PostDecResolveNode::optimizeVariableAccess):
        (KJS::PostDecResolveNode::evaluate):
        (KJS::PostDecLocalVarNode::evaluate):
        (KJS::PostDecLocalVarNode::inlineEvaluateToNumber):
        (KJS::PostDecLocalVarNode::evaluateToNumber):
        (KJS::PostDecLocalVarNode::evaluateToBoolean):
        (KJS::PostDecLocalVarNode::evaluateToInt32):
        (KJS::PostDecLocalVarNode::evaluateToUInt32):
        (KJS::PostfixBracketNode::optimizeVariableAccess):
        (KJS::PostIncBracketNode::evaluate):
        (KJS::PostDecBracketNode::evaluate):
        (KJS::PostfixDotNode::optimizeVariableAccess):
        (KJS::PostIncDotNode::evaluate):
        (KJS::PostDecDotNode::evaluate):
        (KJS::PostfixErrorNode::evaluate):
        (KJS::DeleteResolveNode::optimizeVariableAccess):
        (KJS::DeleteResolveNode::evaluate):
        (KJS::LocalVarDeleteNode::evaluate):
        (KJS::DeleteBracketNode::optimizeVariableAccess):
        (KJS::DeleteBracketNode::evaluate):
        (KJS::DeleteDotNode::optimizeVariableAccess):
        (KJS::DeleteDotNode::evaluate):
        (KJS::DeleteValueNode::optimizeVariableAccess):
        (KJS::DeleteValueNode::evaluate):
        (KJS::VoidNode::optimizeVariableAccess):
        (KJS::VoidNode::evaluate):
        (KJS::TypeOfValueNode::optimizeVariableAccess):
        (KJS::TypeOfResolveNode::optimizeVariableAccess):
        (KJS::LocalVarTypeOfNode::evaluate):
        (KJS::TypeOfResolveNode::evaluate):
        (KJS::TypeOfValueNode::evaluate):
        (KJS::PreIncResolveNode::optimizeVariableAccess):
        (KJS::PreIncLocalVarNode::evaluate):
        (KJS::PreIncResolveNode::evaluate):
        (KJS::PreDecResolveNode::optimizeVariableAccess):
        (KJS::PreDecLocalVarNode::evaluate):
        (KJS::PreDecResolveNode::evaluate):
        (KJS::PreIncConstNode::evaluate):
        (KJS::PreDecConstNode::evaluate):
        (KJS::PostIncConstNode::evaluate):
        (KJS::PostDecConstNode::evaluate):
        (KJS::PrefixBracketNode::optimizeVariableAccess):
        (KJS::PreIncBracketNode::evaluate):
        (KJS::PreDecBracketNode::evaluate):
        (KJS::PrefixDotNode::optimizeVariableAccess):
        (KJS::PreIncDotNode::evaluate):
        (KJS::PreDecDotNode::evaluate):
        (KJS::PrefixErrorNode::evaluate):
        (KJS::UnaryPlusNode::optimizeVariableAccess):
        (KJS::UnaryPlusNode::evaluate):
        (KJS::UnaryPlusNode::evaluateToBoolean):
        (KJS::UnaryPlusNode::evaluateToNumber):
        (KJS::UnaryPlusNode::evaluateToInt32):
        (KJS::UnaryPlusNode::evaluateToUInt32):
        (KJS::NegateNode::optimizeVariableAccess):
        (KJS::NegateNode::evaluate):
        (KJS::NegateNode::evaluateToNumber):
        (KJS::BitwiseNotNode::optimizeVariableAccess):
        (KJS::BitwiseNotNode::inlineEvaluateToInt32):
        (KJS::BitwiseNotNode::evaluate):
        (KJS::BitwiseNotNode::evaluateToNumber):
        (KJS::BitwiseNotNode::evaluateToBoolean):
        (KJS::BitwiseNotNode::evaluateToInt32):
        (KJS::BitwiseNotNode::evaluateToUInt32):
        (KJS::LogicalNotNode::optimizeVariableAccess):
        (KJS::LogicalNotNode::evaluate):
        (KJS::LogicalNotNode::evaluateToBoolean):
        (KJS::MultNode::optimizeVariableAccess):
        (KJS::MultNode::inlineEvaluateToNumber):
        (KJS::MultNode::evaluate):
        (KJS::MultNode::evaluateToNumber):
        (KJS::MultNode::evaluateToBoolean):
        (KJS::MultNode::evaluateToInt32):
        (KJS::MultNode::evaluateToUInt32):
        (KJS::DivNode::optimizeVariableAccess):
        (KJS::DivNode::inlineEvaluateToNumber):
        (KJS::DivNode::evaluate):
        (KJS::DivNode::evaluateToNumber):
        (KJS::DivNode::evaluateToInt32):
        (KJS::DivNode::evaluateToUInt32):
        (KJS::ModNode::optimizeVariableAccess):
        (KJS::ModNode::inlineEvaluateToNumber):
        (KJS::ModNode::evaluate):
        (KJS::ModNode::evaluateToNumber):
        (KJS::ModNode::evaluateToBoolean):
        (KJS::ModNode::evaluateToInt32):
        (KJS::ModNode::evaluateToUInt32):
        (KJS::throwOutOfMemoryErrorToNumber):
        (KJS::addSlowCase):
        (KJS::addSlowCaseToNumber):
        (KJS::add):
        (KJS::addToNumber):
        (KJS::AddNode::optimizeVariableAccess):
        (KJS::AddNode::evaluate):
        (KJS::AddNode::inlineEvaluateToNumber):
        (KJS::AddNode::evaluateToNumber):
        (KJS::AddNode::evaluateToInt32):
        (KJS::AddNode::evaluateToUInt32):
        (KJS::AddNumbersNode::inlineEvaluateToNumber):
        (KJS::AddNumbersNode::evaluate):
        (KJS::AddNumbersNode::evaluateToNumber):
        (KJS::AddNumbersNode::evaluateToInt32):
        (KJS::AddNumbersNode::evaluateToUInt32):
        (KJS::AddStringsNode::evaluate):
        (KJS::AddStringLeftNode::evaluate):
        (KJS::AddStringRightNode::evaluate):
        (KJS::SubNode::optimizeVariableAccess):
        (KJS::SubNode::inlineEvaluateToNumber):
        (KJS::SubNode::evaluate):
        (KJS::SubNode::evaluateToNumber):
        (KJS::SubNode::evaluateToInt32):
        (KJS::SubNode::evaluateToUInt32):
        (KJS::LeftShiftNode::optimizeVariableAccess):
        (KJS::LeftShiftNode::inlineEvaluateToInt32):
        (KJS::LeftShiftNode::evaluate):
        (KJS::LeftShiftNode::evaluateToNumber):
        (KJS::LeftShiftNode::evaluateToInt32):
        (KJS::LeftShiftNode::evaluateToUInt32):
        (KJS::RightShiftNode::optimizeVariableAccess):
        (KJS::RightShiftNode::inlineEvaluateToInt32):
        (KJS::RightShiftNode::evaluate):
        (KJS::RightShiftNode::evaluateToNumber):
        (KJS::RightShiftNode::evaluateToInt32):
        (KJS::RightShiftNode::evaluateToUInt32):
        (KJS::UnsignedRightShiftNode::optimizeVariableAccess):
        (KJS::UnsignedRightShiftNode::inlineEvaluateToUInt32):
        (KJS::UnsignedRightShiftNode::evaluate):
        (KJS::UnsignedRightShiftNode::evaluateToNumber):
        (KJS::UnsignedRightShiftNode::evaluateToInt32):
        (KJS::UnsignedRightShiftNode::evaluateToUInt32):
        (KJS::lessThan):
        (KJS::lessThanEq):
        (KJS::LessNode::optimizeVariableAccess):
        (KJS::LessNode::inlineEvaluateToBoolean):
        (KJS::LessNode::evaluate):
        (KJS::LessNode::evaluateToBoolean):
        (KJS::LessNumbersNode::inlineEvaluateToBoolean):
        (KJS::LessNumbersNode::evaluate):
        (KJS::LessNumbersNode::evaluateToBoolean):
        (KJS::LessStringsNode::inlineEvaluateToBoolean):
        (KJS::LessStringsNode::evaluate):
        (KJS::LessStringsNode::evaluateToBoolean):
        (KJS::GreaterNode::optimizeVariableAccess):
        (KJS::GreaterNode::inlineEvaluateToBoolean):
        (KJS::GreaterNode::evaluate):
        (KJS::GreaterNode::evaluateToBoolean):
        (KJS::LessEqNode::optimizeVariableAccess):
        (KJS::LessEqNode::inlineEvaluateToBoolean):
        (KJS::LessEqNode::evaluate):
        (KJS::LessEqNode::evaluateToBoolean):
        (KJS::GreaterEqNode::optimizeVariableAccess):
        (KJS::GreaterEqNode::inlineEvaluateToBoolean):
        (KJS::GreaterEqNode::evaluate):
        (KJS::GreaterEqNode::evaluateToBoolean):
        (KJS::InstanceOfNode::optimizeVariableAccess):
        (KJS::InstanceOfNode::evaluate):
        (KJS::InstanceOfNode::evaluateToBoolean):
        (KJS::InNode::optimizeVariableAccess):
        (KJS::InNode::evaluate):
        (KJS::InNode::evaluateToBoolean):
        (KJS::EqualNode::optimizeVariableAccess):
        (KJS::EqualNode::inlineEvaluateToBoolean):
        (KJS::EqualNode::evaluate):
        (KJS::EqualNode::evaluateToBoolean):
        (KJS::NotEqualNode::optimizeVariableAccess):
        (KJS::NotEqualNode::inlineEvaluateToBoolean):
        (KJS::NotEqualNode::evaluate):
        (KJS::NotEqualNode::evaluateToBoolean):
        (KJS::StrictEqualNode::optimizeVariableAccess):
        (KJS::StrictEqualNode::inlineEvaluateToBoolean):
        (KJS::StrictEqualNode::evaluate):
        (KJS::StrictEqualNode::evaluateToBoolean):
        (KJS::NotStrictEqualNode::optimizeVariableAccess):
        (KJS::NotStrictEqualNode::inlineEvaluateToBoolean):
        (KJS::NotStrictEqualNode::evaluate):
        (KJS::NotStrictEqualNode::evaluateToBoolean):
        (KJS::BitAndNode::optimizeVariableAccess):
        (KJS::BitAndNode::evaluate):
        (KJS::BitAndNode::inlineEvaluateToInt32):
        (KJS::BitAndNode::evaluateToNumber):
        (KJS::BitAndNode::evaluateToBoolean):
        (KJS::BitAndNode::evaluateToInt32):
        (KJS::BitAndNode::evaluateToUInt32):
        (KJS::BitXOrNode::optimizeVariableAccess):
        (KJS::BitXOrNode::inlineEvaluateToInt32):
        (KJS::BitXOrNode::evaluate):
        (KJS::BitXOrNode::evaluateToNumber):
        (KJS::BitXOrNode::evaluateToBoolean):
        (KJS::BitXOrNode::evaluateToInt32):
        (KJS::BitXOrNode::evaluateToUInt32):
        (KJS::BitOrNode::optimizeVariableAccess):
        (KJS::BitOrNode::inlineEvaluateToInt32):
        (KJS::BitOrNode::evaluate):
        (KJS::BitOrNode::evaluateToNumber):
        (KJS::BitOrNode::evaluateToBoolean):
        (KJS::BitOrNode::evaluateToInt32):
        (KJS::BitOrNode::evaluateToUInt32):
        (KJS::LogicalAndNode::optimizeVariableAccess):
        (KJS::LogicalAndNode::evaluate):
        (KJS::LogicalAndNode::evaluateToBoolean):
        (KJS::LogicalOrNode::optimizeVariableAccess):
        (KJS::LogicalOrNode::evaluate):
        (KJS::LogicalOrNode::evaluateToBoolean):
        (KJS::ConditionalNode::optimizeVariableAccess):
        (KJS::ConditionalNode::evaluate):
        (KJS::ConditionalNode::evaluateToBoolean):
        (KJS::ConditionalNode::evaluateToNumber):
        (KJS::ConditionalNode::evaluateToInt32):
        (KJS::ConditionalNode::evaluateToUInt32):
        (KJS::valueForReadModifyAssignment):
        (KJS::ReadModifyResolveNode::optimizeVariableAccess):
        (KJS::AssignResolveNode::optimizeVariableAccess):
        (KJS::ReadModifyLocalVarNode::evaluate):
        (KJS::AssignLocalVarNode::evaluate):
        (KJS::ReadModifyConstNode::evaluate):
        (KJS::AssignConstNode::evaluate):
        (KJS::ReadModifyResolveNode::evaluate):
        (KJS::AssignResolveNode::evaluate):
        (KJS::AssignDotNode::optimizeVariableAccess):
        (KJS::AssignDotNode::evaluate):
        (KJS::ReadModifyDotNode::optimizeVariableAccess):
        (KJS::ReadModifyDotNode::evaluate):
        (KJS::AssignErrorNode::evaluate):
        (KJS::AssignBracketNode::optimizeVariableAccess):
        (KJS::AssignBracketNode::evaluate):
        (KJS::ReadModifyBracketNode::optimizeVariableAccess):
        (KJS::ReadModifyBracketNode::evaluate):
        (KJS::CommaNode::optimizeVariableAccess):
        (KJS::CommaNode::evaluate):
        (KJS::ConstDeclNode::optimizeVariableAccess):
        (KJS::ConstDeclNode::handleSlowCase):
        (KJS::ConstDeclNode::evaluateSingle):
        (KJS::ConstDeclNode::evaluate):
        (KJS::ConstStatementNode::optimizeVariableAccess):
        (KJS::ConstStatementNode::execute):
        (KJS::statementListExecute):
        (KJS::BlockNode::optimizeVariableAccess):
        (KJS::BlockNode::execute):
        (KJS::EmptyStatementNode::execute):
        (KJS::ExprStatementNode::optimizeVariableAccess):
        (KJS::ExprStatementNode::execute):
        (KJS::VarStatementNode::optimizeVariableAccess):
        (KJS::VarStatementNode::execute):
        (KJS::IfNode::optimizeVariableAccess):
        (KJS::IfNode::execute):
        (KJS::IfElseNode::optimizeVariableAccess):
        (KJS::IfElseNode::execute):
        (KJS::DoWhileNode::optimizeVariableAccess):
        (KJS::DoWhileNode::execute):
        (KJS::WhileNode::optimizeVariableAccess):
        (KJS::WhileNode::execute):
        (KJS::ForNode::optimizeVariableAccess):
        (KJS::ForNode::execute):
        (KJS::ForInNode::optimizeVariableAccess):
        (KJS::ForInNode::execute):
        (KJS::ContinueNode::execute):
        (KJS::BreakNode::execute):
        (KJS::ReturnNode::optimizeVariableAccess):
        (KJS::ReturnNode::execute):
        (KJS::WithNode::optimizeVariableAccess):
        (KJS::WithNode::execute):
        (KJS::CaseClauseNode::optimizeVariableAccess):
        (KJS::CaseClauseNode::evaluate):
        (KJS::CaseClauseNode::executeStatements):
        (KJS::ClauseListNode::optimizeVariableAccess):
        (KJS::CaseBlockNode::optimizeVariableAccess):
        (KJS::CaseBlockNode::executeBlock):
        (KJS::SwitchNode::optimizeVariableAccess):
        (KJS::SwitchNode::execute):
        (KJS::LabelNode::optimizeVariableAccess):
        (KJS::LabelNode::execute):
        (KJS::ThrowNode::optimizeVariableAccess):
        (KJS::ThrowNode::execute):
        (KJS::TryNode::optimizeVariableAccess):
        (KJS::TryNode::execute):
        (KJS::ProgramNode::initializeSymbolTable):
        (KJS::ScopeNode::optimizeVariableAccess):
        (KJS::ProgramNode::processDeclarations):
        (KJS::EvalNode::processDeclarations):
        (KJS::ProgramNode::execute):
        (KJS::EvalNode::execute):
        (KJS::FunctionBodyNodeWithDebuggerHooks::execute):
        (KJS::FuncDeclNode::execute):
        (KJS::FuncExprNode::evaluate):
        * kjs/nodes.h:
        (KJS::Node::):
        (KJS::FalseNode::):
        (KJS::TrueNode::):
        (KJS::ArgumentsNode::):

2008-04-23  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 18672: SQUIRRELFISH: codegen fails with a large number of temporaries
        <https://bugs.webkit.org/show_bug.cgi?id=18672>

        Add a SegmentedVector type, which provides a Vector<T> which maintains
        existing memory locations during resize.  This allows dynamically sizing
        local, temporary and label "vectors" in CodeGenerator.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::addVar):
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::newTemporary):
        (KJS::CodeGenerator::newLabel):
        * VM/CodeGenerator.h:
        * VM/SegmentedVector.h: Added.
        (KJS::SegmentedVector::SegmentedVector):
        (KJS::SegmentedVector::~SegmentedVector):
        (KJS::SegmentedVector::last):
        (KJS::SegmentedVector::append):
        (KJS::SegmentedVector::removeLast):
        (KJS::SegmentedVector::size):
        (KJS::SegmentedVector::operator[]):
        (KJS::SegmentedVector::resize):
        (KJS::SegmentedVector::shrink):
        (KJS::SegmentedVector::grow):

2008-04-23  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        A little refactoring in preparation for supporting 'arguments'.
        
        Fixes 2 regression tests.

        SunSpider reports no change.        

        We now check the activation register, instead of the codeBlock, to
        determine whether we need to tear off the activation. This is to support
        "f.arguments", which will create an activation/arguments pair for f,
        even though the needsFullScopeChain flag is false for f's codeBlock.
        
        The test fixes resulted from calling initializeCallFrame for re-entrant
        function code, instead of initializing (not enough) parts of the call
        frame by hand.

2008-04-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Sam.
        
        - propagate the "this" value properly to local eval
        
        (fixes a measly one regression test)

        * VM/CodeBlock.h:
        (KJS::CodeBlock::CodeBlock):
        (KJS::ProgramCodeBlock::ProgramCodeBlock):
        (KJS::EvalCodeBlock::EvalCodeBlock):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-22  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Add support for function declarations in eval code.

        (this fixes 12 more regression tests)
        
        * VM/CodeBlock.h:
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * kjs/nodes.cpp:
        (KJS::EvalNode::generateCode):

2008-04-22  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Implement LabelNode.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::pushJumpContext):
        (KJS::CodeGenerator::jumpContextForContinue):
        (KJS::CodeGenerator::jumpContextForBreak):
        * VM/CodeGenerator.h:
        * kjs/nodes.cpp:
        (KJS::DoWhileNode::emitCode):
        (KJS::WhileNode::emitCode):
        (KJS::ForNode::emitCode):
        (KJS::ForInNode::emitCode):
        (KJS::ContinueNode::emitCode):
        (KJS::BreakNode::emitCode):
        (KJS::SwitchNode::emitCode):
        (KJS::LabelNode::emitCode):

2008-04-22  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed crash when unwinding from exceptions inside eval.

        * VM/Machine.cpp:
        (KJS::Machine::unwindCallFrame): Don't assume that the top of the
        current call frame's scope chain is an activation: it can be the global
        object, instead.

2008-04-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.

        * kjs/testkjs.cpp:
        (main): Convert signals to exit codes, so that crashing tests are
        detected as regression test failures.

2008-04-22  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt and Maciej Stachowiak.
        
        Renamed "needsActivation" to "needsFullScopeChain" because lying will
        make hair grow on the backs of your hands.

2008-04-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed ScopeChainNode lifetime problems:
        
        (1) In "with" and "catch" scopes, we would construct a ScopeChain
        object and then jump across its destructor, leaking the ScopeChainNode
        we had pushed.

        (2) In global and eval scopes, we would fail to initially ref
        "scopeChain", causing us to overrelease it later. Now that we ref
        "scopeChain" properly, we also need to deref it when the script
        terminates.

        SunSpider reports a .2% regression, but an earlier round of ScopeChain
        refactoring was a .4% speedup, so there.

2008-04-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Alexey.
        
        - use global object instead of null for "this" on unqualified calls
        
        This fixes 10 more JSC test regressions.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - throw proper exceptions for objects that don't implement call or construct
        
        This fixes 21 more JSC test regressions. It is also seemingly an
        0.5% progression.

        * VM/ExceptionHelpers.cpp:
        (KJS::createNotAnObjectError):
        (KJS::createNotAConstructorError):
        (KJS::createNotAFunctionError):
        * VM/ExceptionHelpers.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-21  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Implement emitCode for ConstDeclNode.

        This fixes the crash (assertion) in js1_5/Scope/scope-001.js

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::registerForLocalConstInit):
        * VM/CodeGenerator.h:
        * kjs/nodes.cpp:
        (KJS::AssignResolveNode::emitCode):
        (KJS::ConstDeclNode::emitCodeSingle):
        (KJS::ConstDeclNode::emitCode):
        (KJS::ConstStatementNode::emitCode):
        * kjs/nodes.h:

2008-04-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Sam.
        
        - add some support for the split window object

        This fixes many layout tests.
        
        * VM/Machine.cpp:
        (KJS::resolveBaseAndFunc): Use toThisObject() to ensure we get the
        wrapper global, if one exists, as the "this" object.
        * kjs/function.cpp:
        (KJS::globalFuncEval): Use toGlobalObject() to handle the wrapper
        case properly.

2008-04-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - restore ScopeChain::operator= to avoid crash on many layout tests
        
        Otherwise, FunctionImp::setScope would cause a reference
        underflow. I implemented using the copy construct and swap idiom.

        * kjs/scope_chain.h:
        (KJS::ScopeChain::swap):
        (KJS::ScopeChain::operator=):

2008-04-21  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 18649: SQUIRRELFISH: correctly handle exceptions in eval code
        <https://bugs.webkit.org/show_bug.cgi?id=18649>

        Allocate a callframe for eval() and initialise with a null codeBlock to
        indicate native code.  This prevents the unwinder from clobbering the
        register stack.

        * VM/Machine.cpp:
        (KJS::Machine::execute):

2008-04-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Removed ScopeChain::push(ScopeChain&) because it was unused. Moved
        ScopeChain::print to ScopeChainNode.
        
        ScopeChain is now nothing more than a resource-handling wrapper around
        ScopeChainNode.

2008-04-21  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Bug 18671: SquirrelFish: continue inside switch fails
        <https://bugs.webkit.org/show_bug.cgi?id=18671>

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::jumpContextForLabel):
        * VM/CodeGenerator.h:
        * kjs/nodes.cpp:
        (KJS::ContinueNode::emitCode):

2008-04-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Moved push(JSObject*) and pop() from ScopeChain to ScopeChainNode,
        rearranging scope_chain.h a bit.

        SunSpider reports no change.

2008-04-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Moved bottom() from ScopeChain to ScopeChainNode, simplifying it based
        on the knowledge that the ScopeChain is never empty.

        SunSpider reports no change.

2008-04-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Moved begin() and end() from ScopeChain to ScopeChainNode. 
        
        Also marked a few methods "const".

        SunSpider reports no change.
        
2008-04-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Turned ScopeChain::depth into a stand-alone function, and simplified it
        a bit. 
        
        I also moved ScopeChain::depth to Machine.cpp because it doesn't report
        the true depth of the ScopeChain -- just the Machine's perspective of
        its depth within a given call frame.

        SunSpider reports no change.
        
2008-04-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Removed indirection in ScopeChain::ref / ScopeChain::deref.
        
        SunSpider reports no change.
        
        * kjs/scope_chain.h:
        (KJS::ScopeChain::ScopeChain):
        (KJS::ScopeChain::~ScopeChain):
        (KJS::ScopeChain::clear):

2008-04-21  Oliver Hunt  <oliver@apple.com>

        Fix debug build

        * kjs/nodes.cpp:
        (KJS::ConstDeclNode::evaluateSingle):

2008-04-21  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 18664: SQUIRRELFISH: correctly throw a SyntaxError when parsing of eval code fails
        <https://bugs.webkit.org/show_bug.cgi?id=18664>

        Correctly throw a SyntaxError when parsing of eval code fails.

        * VM/Machine.cpp:
        (KJS::eval):

2008-04-21  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Partial fix for Bug 18649: SQUIRRELFISH: correctly handle exceptions in eval code

        Make sure we correct the register state before jumping to vm_throw.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Simplified ScopeChain ref/deref.
        
        SunSpider reports a .4% speedup.
        
        * kjs/scope_chain.h:
        (KJS::ScopeChainNode::ref): Removed this function because it was nonsense.
        ScopeChainNodes are initialized with a refCount of 1, so the loop was
        guaranteed to iterate exactly once.

2008-04-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Removed support for empty ScopeChains.

        SunSpider reports no change.

2008-04-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Removed some completely unused ScopeChain member functions.

        SunSpider reports no change.

2008-04-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Avoid creating unnecessary ScopeChain objects, to reduce refcount churn.

        SunSpider reports no change.

2008-04-21  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Alexey.
        
        Add some braces.x

        * kjs/testkjs.cpp:
        (runWithScripts):

2008-04-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - only print "End:" output when -d flag is passed.
        
        This fixes half of our failing JSC regression tests.

        * kjs/testkjs.cpp:
        (runWithScripts):

2008-04-21  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Add support for variable declarations in eval code.

        * VM/CodeBlock.h:
        (KJS::EvalCodeBlock::EvalCodeBlock):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * VM/Machine.h:
        * kjs/function.cpp:
        (KJS::globalFuncEval):
        * kjs/nodes.cpp:
        (KJS::EvalNode::generateCode):
        * kjs/nodes.h:
        (KJS::EvalNode::):

2008-04-20  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Throw exceptions for invalid continue, break, and return statements.

        Simple refactoring and extension of Cameron's AssignErrorNode, etc patch

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::pushJumpContext):
        (KJS::CodeGenerator::popJumpContext):
        (KJS::CodeGenerator::jumpContextForLabel):
        * VM/CodeGenerator.h:
        * kjs/nodes.cpp:
        (KJS::Node::emitThrowError):
        (KJS::ContinueNode::emitCode):
        (KJS::BreakNode::emitCode):
        (KJS::ReturnNode::emitCode):
        * kjs/nodes.h:

2008-04-20  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Removed Machine.cpp from AllInOneFile.cpp, and manually inlined a few
        things that used to be inlined automatically.
        
        1.9% speedup on SunSpider.
        
        My hope is that we'll face fewer surprises in Machine.cpp codegen, now
        that GCC is making fewer decisions. The speedup seems to confirm that.

2008-04-20  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18642: Iterator context may get placed into the return register, leading to much badness
        <https://bugs.webkit.org/show_bug.cgi?id=18642>

        To prevent incorrectly reusing what will become the result register for
        eval and global code execution, we need to request and ref the destination
        in advance of codegen.  Unfortunately this may lead to unnecessary copying,
        although in future we can probably limit this.  Curiously SunSpider shows
        a progression in a number of tests, although it comes out as a wash overall.

        * kjs/nodes.cpp:
        (KJS::EvalNode::emitCode):
        (KJS::ProgramNode::emitCode):

2008-04-20  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Add support for AssignErrorNode, PrefixErrorNode, and PostfixErrorNode.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitCreateError):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::PostfixErrorNode::emitCode):
        (KJS::PrefixErrorNode::emitCode):
        (KJS::AssignErrorNode::emitCode):
        * kjs/nodes.h:

2008-04-20  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff and Mark.

        Provide line number information in exceptions

        Simple patch, adds line number information metadata to CodeBlock
        and a simple method to get the line number responsible for a given
        Instruction*.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::lineNumberForVPC):
        * VM/CodeBlock.h:
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::emitNode):
        * VM/Machine.cpp:
        (KJS::Machine::throwException):

2008-04-20  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Provide "sourceURL" in exceptions

        * VM/CodeBlock.h:
        * VM/Machine.cpp:
        (KJS::Machine::throwException):
        * kjs/nodes.cpp:
        (KJS::EvalNode::generateCode):
        (KJS::ProgramNode::generateCode):

2008-04-19  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Don't call emitCode directly on subnodes, instead use CodeGenerator::emitNode

        This patch just a preparation for tracking line numbers.

        * kjs/nodes.cpp:
        (KJS::ObjectLiteralNode::emitCode):
        (KJS::PropertyListNode::emitCode):
        (KJS::ArgumentListNode::emitCode):
        (KJS::TryNode::emitCode):

2008-04-19  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18619: Support continue, break, and return in try .. finally blocks
        <https://bugs.webkit.org/show_bug.cgi?id=18619>

        This patch replaces the current partial finally support (which uses code
        duplication to achieve what it does) with a subroutine based approach.
        This has a number of advantages over code duplication:
          * Reduced code size
          * Simplified exception handling as the finaliser code only exists in 
            one place, so no "magic" is needed to get the correct handler for a 
            finaliser.
          * When we support instruction to line number mapping we won't need to
            worry about the dramatic code movement caused by duplication

        On the downside it is necessary to add two new opcodes, op_jsr and op_sret
        to enter and exit the finaliser subroutines, happily SunSpider reports
        a performance progression (gcc amazes me) and ubench reports a wash.

        While jsr and sret provide a mechanism that allows us to enter and exit
        any arbitrary finaliser we need to, it was still necessary to increase
        the amount of information tracked when entering and exiting both finaliser
        scopes and dynamic scopes ("with").  This means "scopeDepth" is now
        the combination of "finaliserDepth" and "dynamicScopeDepth".  We also
        now use a scopeContextStack to ensure that we pop scopes and execute
        finalisers in the correct order.  This increases the cost of "with" nodes
        during codegen, but it should not be significant enough to effect real
        world performance and greatly simplifies codegen for return, break and
        continue when interacting with finalisers.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
          Pretty printing of jsr/sret opcodes

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::emitPushScope):
        (KJS::CodeGenerator::emitPopScope):
          Dynamic scopes need to be tracked on the scopeContextStack now

        (KJS::CodeGenerator::pushFinallyContext):
        (KJS::CodeGenerator::popFinallyContext):
          Handle entry and exit from code regions with finalisers.  This is
          needed solely to support return, continue and break inside finaliser
          regions.

        (KJS::CodeGenerator::emitComplexJumpScopes):
          Helper function for emitJumpScopes to handle the complex codegen
          needed to handle return, continue and break inside a finaliser region

        (KJS::CodeGenerator::emitJumpScopes):
          Updated to be aware of finalisers, if a cross-scope jump occurs inside
          a finaliser we hand off codegen to emitComplexJumpScopes, otherwise
          we can handle the normal (trivial) case with a single instruction.

        (KJS::CodeGenerator::emitJumpSubroutine):
        (KJS::CodeGenerator::emitSubroutineReturn):
          Trivial opcode emitter functions.

        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::scopeDepth):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
          Implement op_jsr and op_sret.

        * VM/Opcode.h:
          Ad op_jsr and op_sret

        * kjs/nodes.cpp:
        (KJS::TryNode::emitCode):
          Fix codegen for new finaliser model.

2008-04-17  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Oliver Hunt.

        Remove unnecessary files from testkjs, testapi and minidom targets.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-04-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed ASSERT seen during run-sunspider of a debug build.

        * VM/CodeGenerator.h: Made the default codegen buffers bigger. SunSpider
        runs all tests in one global environment, so you end up with more than
        128 locals. This is just a stop-gap until we code up a real
        solution to arbitrary symbol and label limits.

2008-04-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed a bug in exception unwinding, where we wouldn't deref the scope
        chain in global scope, so we would leak ScopeChainNodes when exceptions
        were thrown inside "with" and "catch" scopes.
        
        Also did some cleanup of the unwinding code along the way.
        
        Scope chain reference counting is still wrong in a few ways. I thought
        I would fix this portion of it first.
        
        run-sunspider shows no change.

        * VM/Machine.cpp:
        (KJS::Machine::unwindCallFrame):
        (KJS::Machine::throwException):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:

2008-04-17  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Add more exception checking to toNumber conversions

        This corrects op_pre_dec, op_negate, op_mod and op_sub.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-17  Geoffrey Garen  <ggaren@apple.com> and Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver Hunt.
        
        Behold: eval.
        
        Introduced a new opcode: op_call_eval. In the normal case, it performs
        an eval. In the case where eval has been overridden in some way, it
        performs a function call.

        * VM/CodeGenerator.h: Added a feature so the code generator knows not
        to optimized locals in eval code.
        
2008-04-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Added some ASSERTs to document codegen failures in
        run-javascriptcore-tests.
        
        For all tests, program-level codegen now either succeeds, or fails with
        an ASSERT.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::addVar):
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::newTemporary):
        (KJS::CodeGenerator::newLabel):

2008-04-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed another case of a dst register being an unreferenced temporary
        (caused an ASSERT when running the full sunspider suite).

        * kjs/nodes.cpp:
        (KJS::CaseBlockNode::emitCodeForBlock):

2008-04-16  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - add documentation (and meaningful parameter names) for arithmetic and bitwise binary ops

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitMul):
        (KJS::CodeGenerator::emitDiv):
        (KJS::CodeGenerator::emitMod):
        (KJS::CodeGenerator::emitSub):
        (KJS::CodeGenerator::emitLeftShift):
        (KJS::CodeGenerator::emitRightShift):
        (KJS::CodeGenerator::emitUnsignedRightShift):
        (KJS::CodeGenerator::emitBitAnd):
        (KJS::CodeGenerator::emitBitXOr):
        (KJS::CodeGenerator::emitBitOr):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::MultNode::emitCode):
        (KJS::DivNode::emitCode):
        (KJS::ModNode::emitCode):
        (KJS::SubNode::emitCode):
        (KJS::LeftShiftNode::emitCode):
        (KJS::RightShiftNode::emitCode):
        (KJS::UnsignedRightShiftNode::emitCode):
        (KJS::BitAndNode::emitCode):
        (KJS::BitXOrNode::emitCode):
        (KJS::BitOrNode::emitCode):
        (KJS::emitReadModifyAssignment):
        (KJS::ReadModifyResolveNode::emitCode):

2008-04-16  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Exception checks for toNumber in op_pre_inc

        This is somewhat more convoluted than the simple hadException checks
        we currently use.  Instead we use special toNumber conversions that
        select between the exception and ordinary vPC.  This allows us to 
        remove any branches in the common case (incrementing a number).

        * API/JSCallbackObject.h:
        * API/JSCallbackObjectFunctions.h:
        (KJS::::toNumber):
        * ChangeLog:
        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * VM/JSPropertyNameIterator.cpp:
        (KJS::JSPropertyNameIterator::toNumber):
        * VM/JSPropertyNameIterator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        * kjs/ExecState.h:
        * kjs/JSNotAnObject.cpp:
        (KJS::JSNotAnObject::toNumber):
        * kjs/JSNotAnObject.h:
        * kjs/internal.cpp:
        (KJS::StringImp::toNumber):
        (KJS::NumberImp::toNumber):
        (KJS::GetterSetterImp::toNumber):
        * kjs/internal.h:
        * kjs/object.cpp:
        (KJS::JSObject::toNumber):
        * kjs/object.h:
        * kjs/value.h:
        (KJS::JSValue::toNumber):

2008-04-16  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - ensure that activations are kept in a register to protect them from GC
        
        Also renamed OptionalCalleeScopeChain constant to OptionalCalleeActivation, since
        that is what is now kept there, and there is no more need to keep the scope chain in
        the register file.

        * VM/Machine.cpp:
        (KJS::initializeCallFrame):
        (KJS::scopeChainForCall):
        * VM/Machine.h:
        (KJS::Machine::):

2008-04-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Made "this" work in program code / global scope.
        
        The machine can initialize "this" prior to execution because it knows
        that, for program code, "this" is always stored in lr1. 

        * VM/Machine.cpp:
        (KJS::Machine::execute):
        * VM/Machine.h:
        (KJS::Machine::):
        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):

2008-04-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed a codegen bug when returning from inside a dynamic scope (a with
        or catch block): we need to pop any dynamic scope(s) that have been
        added so op_ret can find the activation object at the top of the scope
        chain.

        * kjs/nodes.cpp:
        (KJS::ReturnNode::emitCode): If we're returning from inside a dynamic
        scope, emit a jmp_scopes to take care of popping any dynamic scope(s)
        and then branching to the return instruction.

2008-04-16  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - document the add and get_prop_id opcodes
        
        In addition to adding documentation in comments, I changed
        references to register IDs or indices relating to these opcodes to
        have meaningful names instead of r0 r1 r2.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitAdd):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/nodes.cpp:
        (KJS::DotAccessorNode::emitCode):
        (KJS::FunctionCallDotNode::emitCode):
        (KJS::PostIncDotNode::emitCode):
        (KJS::PostDecDotNode::emitCode):
        (KJS::PreIncDotNode::emitCode):
        (KJS::PreDecDotNode::emitCode):
        (KJS::AddNode::emitCode):
        (KJS::ReadModifyDotNode::emitCode):

2008-04-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt and Maciej Stachowiak.
        
        Fixed a codegen bug in with and switch, and added an ASSERT to
        make sure it doesn't happen again.
        
        emitCode() assumes that dst, if non-zero, is either referenced or
        non-temporary (i.e., it assumes that newTemporary() will return a
        register not equal to dst). Certain callers to emitCode() weren't
        guaranteeing that to be so, so temporary register values were being
        overwritten.

        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::emitNode): ASSERT that dst is referenced or non-temporary.

        * kjs/nodes.cpp:
        (KJS::CommaNode::emitCode): Reference the dst we pass.

        (KJS::WithNode::emitCode): No need to pass an explicit dst register.
        
        (KJS::CaseBlockNode::emitCodeForBlock): No need to pass an explicit dst register.
        (KJS::SwitchNode::emitCode): No need to pass an explicit dst register.

        * kjs/nodes.h: Made dst the last parameter to emitCodeForBlock, to match
        emitCode.

2008-04-15  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18526: Throw exceptions when resolve fails for op_resolve_base_and_func.
        <https://bugs.webkit.org/show_bug.cgi?id=18526>

        Very simple fix, sunspider shows a 0.7% progression, ubench shows a 0.4% regression.

        * VM/Machine.cpp:
        (KJS::resolveBaseAndFunc):
        (KJS::Machine::privateExecute):

2008-04-15  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fix incorrect result on 3d-raytrace test
        
        Oliver found and tracked down this bug, I just typed in the fix.

        * VM/Machine.cpp:
        (KJS::slideRegisterWindowForCall): When setting omitted parameters to undefined,
        account for the space for local variables.

2008-04-15  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fix codegen handling of dst registers
        
        1.006x speedup (not sure why).
        
        Most emitCode functions take an optional "dst" parameter that says
        where the output of the instruction should be written. I made some
        functions for convenient handling of the dst register:

        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::tempDestination): Takes the dst register. Returns it if
        it is not null and is a temporary, otherwise allocates a new temporary. This is
        intended for cases where an intermediate value might be written into the dst

        (KJS::CodeGenerator::finalDestination): Takes the dst register and an optional
        register that was used as a temp destination. Picks the right thing for the final
        output. Intended to be used as the output register for the instruction that generates
        the final value of a particular node.
        
        (KJS::CodeGenerator::moveToDestinationIfNeeded): Takes dst and a
        RegisterID; moves from the register to dst if dst is defined and
        different from the register. This is intended for cases where the
        result of a node is already in a specific register (likely a
        local), and so no code needs to be generated unless a specific
        destination has been requested, in which case a move is needed.
        
        I also applied these methods throughout emitCode functions. In
        some cases this was just cleanup, in other cases I fixed actual
        codegen bugs. Below I have given specific comments for the cases
        where I believe I fixed a codegen bug, or improved quality of codegen.
        
        * kjs/nodes.cpp:
        (KJS::NullNode::emitCode):
        (KJS::FalseNode::emitCode):
        (KJS::TrueNode::emitCode):
        (KJS::NumberNode::emitCode):
        (KJS::StringNode::emitCode):
        (KJS::RegExpNode::emitCode):
        (KJS::ThisNode::emitCode): Now avoids emitting a mov when dst is
        the same as the this register (the unlikely case of "this = this");
        (KJS::ResolveNode::emitCode): Now avoids emitting a mov when dst
        is the same as the local regiester, in the local var case (the
        unlikely case of "x = x");
        (KJS::ArrayNode::emitCode): Fixed a codegen bug where array
        literal element expressions may have observed an intermediate
        value of constructing the array.
        (KJS::ObjectLiteralNode::emitCode): 
        (KJS::PropertyListNode::emitCode): Fixed a codegen bug where object literal
        property definition expressions may have obesrved an intermediate value of
        constructing the object.
        (KJS::BracketAccessorNode::emitCode):
        (KJS::DotAccessorNode::emitCode):
        (KJS::NewExprNode::emitCode):
        (KJS::FunctionCallValueNode::emitCode):
        (KJS::FunctionCallBracketNode::emitCode):
        (KJS::FunctionCallDotNode::emitCode):
        (KJS::PostIncResolveNode::emitCode):
        (KJS::PostDecResolveNode::emitCode):
        (KJS::PostIncBracketNode::emitCode):
        (KJS::PostDecBracketNode::emitCode):
        (KJS::PostIncDotNode::emitCode):
        (KJS::PostDecDotNode::emitCode):
        (KJS::DeleteResolveNode::emitCode):
        (KJS::DeleteBracketNode::emitCode):
        (KJS::DeleteDotNode::emitCode):
        (KJS::DeleteValueNode::emitCode):
        (KJS::VoidNode::emitCode):
        (KJS::TypeOfResolveNode::emitCode):
        (KJS::TypeOfValueNode::emitCode):
        (KJS::PreIncResolveNode::emitCode): Fixed a codegen bug where the final
        value would not be output to the dst register in the local var case.
        (KJS::PreDecResolveNode::emitCode): Fixed a codegen bug where the final
        value would not be output to the dst register in the local var case.
        (KJS::PreIncBracketNode::emitCode):
        (KJS::PreDecBracketNode::emitCode):
        (KJS::PreIncDotNode::emitCode):
        (KJS::PreDecDotNode::emitCode):
        (KJS::UnaryPlusNode::emitCode):
        (KJS::NegateNode::emitCode):
        (KJS::BitwiseNotNode::emitCode):
        (KJS::LogicalNotNode::emitCode):
        (KJS::MultNode::emitCode):
        (KJS::DivNode::emitCode):
        (KJS::ModNode::emitCode):
        (KJS::AddNode::emitCode):
        (KJS::SubNode::emitCode):
        (KJS::LeftShiftNode::emitCode):
        (KJS::RightShiftNode::emitCode):
        (KJS::UnsignedRightShiftNode::emitCode):
        (KJS::LessNode::emitCode):
        (KJS::GreaterNode::emitCode):
        (KJS::LessEqNode::emitCode):
        (KJS::GreaterEqNode::emitCode):
        (KJS::InstanceOfNode::emitCode):
        (KJS::InNode::emitCode):
        (KJS::EqualNode::emitCode):
        (KJS::NotEqualNode::emitCode):
        (KJS::StrictEqualNode::emitCode):
        (KJS::NotStrictEqualNode::emitCode):
        (KJS::BitAndNode::emitCode):
        (KJS::BitXOrNode::emitCode):
        (KJS::BitOrNode::emitCode):
        (KJS::LogicalAndNode::emitCode):
        (KJS::LogicalOrNode::emitCode):
        (KJS::ConditionalNode::emitCode):
        (KJS::emitReadModifyAssignment): Allow an out argument separate from the operands,
        needed for fixes below.
        (KJS::ReadModifyResolveNode::emitCode): Fixed a codegen bug where the right side of
        the expression may observe an intermediate value.
        (KJS::AssignResolveNode::emitCode): Fixed a codegen bug where the right side of the
        expression may observe an intermediate value.
        (KJS::ReadModifyDotNode::emitCode): Fixed a codegen bug where the right side of the
        expression may observe an intermediate value.
        (KJS::ReadModifyBracketNode::emitCode): Fixed a codegen bug where the right side of the
        expression may observe an intermediate value.
        (KJS::CommaNode::emitCode): Avoid writing temporary value to dst register.
        (KJS::ReturnNode::emitCode): Void return should return undefined, not null.
        (KJS::FuncExprNode::emitCode):

2008-04-15  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.

        - fix huge performance regression (from trunk) in string-unpack-code
        
        This restores string-unpack-code performance to parity with
        trunk (2.27x speedup relative to previous SquirrelFish)
        
        * VM/Machine.cpp:
        (KJS::Machine::execute): Shrink register file after call to avoid
        growing repeatedly.

2008-04-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Fixed dumpCallFrame to match our new convention of passing around a
        ScopeChainNode* instead of a ScopeChain*.

        * JavaScriptCore.exp:
        * VM/Machine.cpp:
        (KJS::Machine::dumpCallFrame):
        * VM/Machine.h:

2008-04-15  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18436: Need to throw exception on read/modify/write or similar resolve for nonexistent property
        <https://bugs.webkit.org/show_bug.cgi?id=18436>

        Add op_resolve_base_and_property for read/modify/write operations,
        this adds a "superinstruction" to resolve the base and value of a
        property simultaneously.  Just using resolveBase and resolve results 
        in an 5% regression in ubench, 30% in loop-empty-resolve (which is 
        expected).  1.3% progression in sunspider, 2.1% in ubench, with a 
        21% gain in loop-empty-resolve.  The only outlier is function-missing-args
        which gets a 3% regression that I could never resolve.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitResolveBaseAndProperty):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::resolveBaseAndProperty):
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::PostIncResolveNode::emitCode):
        (KJS::PostDecResolveNode::emitCode):
        (KJS::PreIncResolveNode::emitCode):
        (KJS::PreDecResolveNode::emitCode):
        (KJS::ReadModifyResolveNode::emitCode):

2008-04-15  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fixed "SquirrelFish crashes due to bad scope chain on some SunSpider tests"
        https://bugs.webkit.org/show_bug.cgi?id=18508

        3d-raytrace and string-unpack-code now run.
        
        The basic approach is to pass around ScopeChainNode* instead of
        ScopeChain*, which in addition to not becoming suddenly an invalid
        pointer also saves an indirection.
        
        This is an 0.4% speedup on SunSpider --squirrelfish (1.8% on --ubench)
        
        * VM/Machine.cpp:
        (KJS::resolve):
        (KJS::resolveBase):
        (KJS::resolveBaseAndFunc):
        (KJS::initializeCallFrame):
        (KJS::scopeChainForCall):
        (KJS::Machine::unwindCallFrame):
        (KJS::Machine::throwException):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        * VM/Register.h:
        (KJS::Register::):
        * kjs/nodes.cpp:
        (KJS::EvalNode::generateCode):
        (KJS::FunctionBodyNode::generateCode):
        (KJS::ProgramNode::generateCode):
        (KJS::ProgramNode::processDeclarations):
        (KJS::EvalNode::processDeclarations):
        (KJS::FuncDeclNode::makeFunction):
        (KJS::FuncExprNode::makeFunction):
        * kjs/nodes.h:
        (KJS::ProgramNode::):
        (KJS::EvalNode::):
        (KJS::FunctionBodyNode::):
        * kjs/object.h:
        * kjs/scope_chain.h:
        (KJS::ScopeChainNode::ScopeChainNode):
        (KJS::ScopeChainNode::deref):
        (KJS::ScopeChainIterator::ScopeChainIterator):
        (KJS::ScopeChainIterator::operator*):
        (KJS::ScopeChainIterator::operator->):
        (KJS::ScopeChain::ScopeChain):
        (KJS::ScopeChain::node):
        (KJS::ScopeChain::deref):
        (KJS::ScopeChain::ref):
        (KJS::ScopeChainNode::ref):
        (KJS::ScopeChainNode::release):
        (KJS::ScopeChainNode::begin):
        (KJS::ScopeChainNode::end):

2008-04-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed crash when accessing registers in a torn-off activation object.

        * kjs/JSActivation.cpp:
        (KJS::JSActivation::copyRegisters): Update our registerOffset after
        copying our registers, since our offset should now be relative to
        our private register array, not the shared register file.

2008-04-14  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fix a codegen flaw that makes some tests run way too fast or way too slow
        
        The basic problem was that FunctionCallResolveNode results in
        codegen which can incorrectly write an intermediate value into the
        dst register even when that is a local. I added convenience
        functions to CodeGenerator for getting this right, but for now I
        only fixed FunctionCallResolve.

        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::tempDestination):
        (KJS::CodeGenerator::):
        * kjs/nodes.cpp:
        (KJS::FunctionCallResolveNode::emitCode):

2008-04-14  Gabor Loki  <loki@inf.u-szeged.hu>

        Reviewed and slightly tweaked by Geoffrey Garen.

        Bug 18489: Squirrelfish doesn't build on linux
        <https://bugs.webkit.org/show_bug.cgi?id=18489>

        * JavaScriptCore.pri: Add VM into include path and its files into
        source set
        * VM/JSPropertyNameIterator.cpp: Fix include name
        * VM/Machine.cpp: Add UNLIKELY macro for GCC
        * VM/Machine.h: Add missing includes
        * VM/RegisterFile.cpp: Add missing include
        * kjs/testkjs.pro: Add VM into include path

2008-04-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Restored OwnPtr in some places where I had removed it previously. We
        can have an OwnPtr to an undefined class in a header as long as the
        class's destructor isn't in the header.
        
2008-04-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Fixed access to "this" inside dynamic scopes.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::registerForLocal): Always return a register for
        "this", even if we're not optimizing access to other locals. Because
        "this" is a keyword, it's always in a register and always accessible.

        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::shouldOptimizeLocals): Factored out a function
        for determining whether we should optimize access to locals, since
        eval will need to make this test a little more complicated.

2008-04-14  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Adam.
        
        - fix crash when running SunSpider full harness
        
        When growing the register file's buffer to make space for new globals,
        make sure to copy accounting for the fact that the new space is logically
        at the beginning of the buffer in this case, instead of at the end as when
        growing for a new call frame.

        * VM/RegisterFile.cpp:
        (KJS::RegisterFile::newBuffer):
        (KJS::RegisterFile::growBuffer):
        (KJS::RegisterFile::addGlobalSlots):
        * VM/RegisterFile.h:

2008-04-11  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Mark constant pools for global and eval code (collectively known as
        "program code"). (Constant pools for function code are already marked by
        their functions.)
        
        The global object is responsible for marking program code constant
        pools. Code blocks add themselves to the mark set at creation time, and
        remove themselves from the mark set at destruction time.
        
        sunspider --squirrelfish reports a 1% speedup, perhaps because
        generateCode() is now non-virtual.

        * kjs/nodes.cpp: I had to use manual init and delete in this file
        because putting an OwnPtr into the header would have created a circular
        header dependency.

2008-04-10  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Bug 18231: Improve support for function call nodes in SquirrelFish
        <https://bugs.webkit.org/show_bug.cgi?id=18231>

        Use correct value of 'this' for function calls.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitResolveBaseAndFunc):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::resolveBaseAndFunc):
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::FunctionCallResolveNode::emitCode):

2008-04-10  Geoffrey Garen  <ggaren@apple.com>

        This time for sure.

        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):

2008-04-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Fixed Interpreter::execute to honor the new model for returning non-NULL
        values when an exception is thrown.

        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):

2008-04-10  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Fix SquirrelFish interpreter to pass internal exceptions back to 
        native code correctly.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-10  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        Replace the use of getCallData in op_construct with the new
        getConstructData function that replaces implementsConstruct.

        * API/JSCallbackConstructor.cpp:
        (KJS::JSCallbackConstructor::getConstructData):
        * API/JSCallbackConstructor.h:
        * API/JSCallbackObject.h:
        * API/JSCallbackObjectFunctions.h:
        (KJS::::getConstructData):
        (KJS::::construct):
        * API/JSObjectRef.cpp:
        (JSObjectIsConstructor):
        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/CallData.h:
        * kjs/ConstructData.h: Copied from JavaScriptCore/kjs/CallData.h.
        * kjs/array_object.cpp:
        (KJS::ArrayObjectImp::getConstructData):
        * kjs/array_object.h:
        * kjs/bool_object.cpp:
        (KJS::BooleanObjectImp::getConstructData):
        * kjs/bool_object.h:
        * kjs/date_object.cpp:
        (KJS::DateObjectImp::getConstructData):
        * kjs/date_object.h:
        * kjs/error_object.cpp:
        (KJS::ErrorObjectImp::getConstructData):
        (KJS::NativeErrorImp::getConstructData):
        * kjs/error_object.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::getCallData):
        (KJS::FunctionImp::getConstructData):
        (KJS::FunctionImp::construct):
        * kjs/function.h:
        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::getConstructData):
        * kjs/function_object.h:
        * kjs/nodes.cpp:
        (KJS::NewExprNode::inlineEvaluate):
        * kjs/number_object.cpp:
        (KJS::NumberObjectImp::getConstructData):
        * kjs/number_object.h:
        * kjs/object.cpp:
        * kjs/object.h:
        * kjs/object_object.cpp:
        (KJS::ObjectObjectImp::getConstructData):
        * kjs/object_object.h:
        * kjs/regexp_object.cpp:
        (KJS::RegExpObjectImp::getConstructData):
        * kjs/regexp_object.h:
        * kjs/string_object.cpp:
        (KJS::StringObjectImp::getConstructData):
        * kjs/string_object.h:
        * kjs/value.cpp:
        (KJS::JSCell::getConstructData):
        * kjs/value.h:
        (KJS::JSValue::getConstructData):

2008-04-10  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 18420: SquirrelFish: need to throw Reference and Type errors 
        when attempting invalid operations on JSValues

        Add validation and exception checks to SquirrelFish so that the
        correct exceptions are thrown for undefined variables, type errors
        and toObject failure.  Also handle exceptions thrown by native
        function calls.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * VM/ExceptionHelpers.cpp: Added.
        (KJS::substitute):
        (KJS::createError):
        (KJS::createUndefinedVariableError):
        * VM/ExceptionHelpers.h: Added.
          Helper functions
        * VM/Machine.cpp:
        (KJS::resolve):
           Modified to signal failure
        (KJS::isNotObject):
           Wrapper for JSValue::isObject and exception creation (these need
           to be merged, lest GCC go off the deep end)
        (KJS::Machine::privateExecute):
           Adding the many exception and validity checks.

        * kjs/JSNotAnObject.cpp: Added.
          Stub object used to reduce the need for multiple exception checks
          when toObject fails.
        (KJS::JSNotAnObject::toPrimitive):
        (KJS::JSNotAnObject::getPrimitiveNumber):
        (KJS::JSNotAnObject::toBoolean):
        (KJS::JSNotAnObject::toNumber):
        (KJS::JSNotAnObject::toString):
        (KJS::JSNotAnObject::toObject):
        (KJS::JSNotAnObject::mark):
        (KJS::JSNotAnObject::getOwnPropertySlot):
        (KJS::JSNotAnObject::put):
        (KJS::JSNotAnObject::deleteProperty):
        (KJS::JSNotAnObject::defaultValue):
        (KJS::JSNotAnObject::construct):
        (KJS::JSNotAnObject::callAsFunction):
        (KJS::JSNotAnObject::getPropertyNames):
        * kjs/JSNotAnObject.h: Added.
        (KJS::JSNotAnObject::JSNotAnObject):
        * kjs/JSImmediate.cpp:
        (KJS::JSImmediate::toObject):
          modified to create an JSNotAnObject rather than throwing an exception
          directly.

2008-04-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Pass a function body node its function's scope chain, rather than the
        current execution context's scope chain, when compiling it.
        
        This doesn't matter yet, but it will once we start using the scope
        chain during compilation.

        sunspider --squirrelfish notes a tiny speedup.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fix two bugs when throwing exceptions from re-entrant JS calls:
        
        (1) Don't shrink the register file to 0, since our caller may still
        be using it.
        
        (2) In case of exception, return jsNull() instead of 0 because,
        surprisingly, some JavaScriptCore clients rely on a function's return
        value being safe to operate on even if the function threw an exception.
        
        Also:
        
        - Changed FunctionImp::callAsFunction to honor the new semantics of
        exceptions not returning 0.
        
        - Renamed "handlerPC" to "handlerVPC" to match other uses of "VPC".
        
        - Renamed "exceptionData" to "exceptionValue", because "data" seemed to
        imply something more than just a JSValue.
        
        - Merged prepareException into throwException, since throwException was
        its only caller, and it seemed weird that throwException didn't take
        an exception as an argument.

        sunspider --squirrelfish does not seem to complain on my machine, but it
        complains a little (.6%) on Oliver's.

2008-04-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed op_construct for CallTypeNative to reacquire "r" before setting
        its return value, since registerBase can theoretically change during the
        execution of arbitrary code. (Not sure if any native constructors
        actually make this possible.)

        sunspider --squirrelfish does not seem to complain.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt and Sam Weinig.
        
        Re-entrant execution of function code (global code -> built-in function
        -> JS function):
        
        Miraculously, sunspider --squirrelfish does not seem to complain.

        A re-entrant function call is the same as a normal function call with
        one exception: the re-entrant call leaves everything except for
        CallerCodeBlock in the call frame header uninitialized, since the call
        doesn't need to return to JS code. (It sets CallerCodeBlock to 0, to
        indicate that the call shouldn't return to JS code.)
        
        Also fixed a few issues along the way:
        
        - Fixed two bugs in the read-write List implementation that caused
        m_size and m_buffer to go stale.
        
        - Changed native call code to update "r" *before* setting the return
        value, since the call may in turn call JS code, which changes the value
        of "r".
        
        - Migrated initialization of "r" outside of Machine::privateExecute,
        because global code and function code initialize "r" differently.
        
        - Migrated a codegen warning from Machine::privateExecute to the wiki.
        
        - Removed unnecessary "r" parameter from slideRegisterWindowForCall

        * VM/Machine.cpp:
        (KJS::slideRegisterWindowForCall):
        (KJS::scopeChainForCall):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        * kjs/list.cpp:
        (KJS::List::getSlice):
        * kjs/list.h:
        (KJS::List::clear):

2008-04-10  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fix problem with code generation for return with no argument
        
        3d-cube now runs

        * kjs/nodes.cpp:
        (KJS::ReturnNode::emitCode):

2008-04-10  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - Implement support for JS constructors
        
        access-binary-trees and access-nbody now run.
        
        Inexplicably a 1% speedup.

        * VM/Machine.cpp:
        (KJS::initializeCallFrame):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        (KJS::Machine::):

2008-04-10  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.

        - More code cleanup in preparation for JS constructors

        Factor the remaining interesting parts of JS function calls into
        slideRegisterWindowForCall and scopeChainForCall.
        
        * VM/Machine.cpp:
        (KJS::slideRegisterWindowForCall):
        (KJS::scopeChainForCall):
        (KJS::Machine::privateExecute):

2008-04-10  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - Code cleanup in preparation for JS constructors

        - Renamed returnInfo to callFrame. 
        - Made an enum which defines what goes where in the call frame.
        - Factored out initializeCallFrame function from op_call
        
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitCall):
        (KJS::CodeGenerator::emitConstruct):
        * VM/Machine.cpp:
        (KJS::Machine::dumpRegisters):
        (KJS::initializeCallFrame):
        (KJS::Machine::unwindCallFrame):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        (KJS::Machine::):

2008-04-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed two bugs in register allocation for function calls:
        
        (1) op_call used to allocate codeBlock->numVars too many registers for
        each call frame, due to duplicated math. Fixing this revealed...
        
        (2) By unconditionally calling resize(), op_call used to truncate the
        register file when calling a function whose registers fit wholly within
        the register file already allocated by its caller.
        
        sunspider --squirrelfish reports no regression.
        
        I also threw in a little extra formatting to dumpCallFrame, because it
        helped me debug these issues.

        * VM/Machine.cpp:
        (KJS::Machine::dumpRegisters):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * VM/RegisterFile.h:
        (KJS::RegisterFile::shrink):
        (KJS::RegisterFile::grow):
        * VM/RegisterFileStack.cpp:
        (KJS::RegisterFileStack::popRegisterFile):

2008-04-09  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.

        Next step toward re-entrant execution of function code (global code ->
        built-in function -> JS function):
        
        Made op_ret return from Machine::privateExecute if its calling codeBlock
        is NULL.
        
        I'm checking this in by itself to demonstrate that a more clever
        mechanism is not necessary for performance.
        
        sunspider --squirrelfish reports no regression.

        * ChangeLog:
        * VM/Machine.cpp:
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):

2008-04-09  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.

        Next step toward re-entrant execution of function code (global code ->
        built-in function -> JS function):
        
        Made Machine::execute return a value.
        
        Sketched out some code for Machine::execute for functions -- still
        doesn't work yet, though.

        sunspider --squirrelfish reports no regression.

        * VM/Machine.cpp:
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):
        * kjs/testkjs.cpp:
        (runWithScripts):

2008-04-09  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        First step toward re-entrant execution of function code (global code ->
        built-in function -> JS function):
        
        Tiny bit of refactoring in the Machine class.

        sunspider --squirrelfish reports no regression.

        * VM/Machine.cpp:
        (KJS::Machine::dumpRegisters):
        (KJS::Machine::unwindCallFrame):
        (KJS::Machine::execute):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        (KJS::Machine::isGlobalCallFrame):
        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):

2008-04-08  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Support for re-entrant execution of global code (global code -> built-in
        function -> global code).
        
        Keep a stack of register files instead of just one. Globals propogate
        between register files as the register files enter and exit the stack.
        
        An activation still uses its own register file's base as its
        registerBase, but the global object uses the register file *stack*'s
        registerBase, which updates dynamically to match the register file at
        the top of the stack.
        
        sunspider --squirrelfish reports no regression.

2008-04-08  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - initial preparatory work for JS constructors
        
        1) Allocate registers for the returnInfo block and "this" value when generating code for
        op_construct. These are not used yet, but the JS branch of op_construct will use them.
        
        2) Adjust argc and argv appropriately for native constructor calls.
        
        3) Assign return value in a more straightforward way in op_ret since this is actually
        a bit faster (and makes up for the allocation of extra registers above).

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitConstruct):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed crashing SunSpider tests.
        
        Let's just pretend this never happened, bokay?

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::CodeGenerator):
        * VM/CodeGenerator.h:
        * VM/RegisterFile.cpp:
        (KJS::RegisterFile::addGlobals):

2008-04-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Restored dumping of generated code as a command-line switch:
        run-testkjs -d will do it.

2008-04-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Next step toward supporting re-entrant evaluation: Moved register file
        maintenance code into a proper "RegisterFile" class.
        
        There's a subtle change to the register file's internal layout: for
        global code / the global object, registerOffset is always 0 now. In
        other words, all register counting starts at 0, not 0 + (number of
        global variables). The helps simplify accounting when the number of
        global variables changes.

2008-04-07  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 18338: Support exceptions in SquirrelFish <http://bugs.webkit.org/show_bug.cgi?id=18338>
        
        Initial support for exceptions in SquirrelFish, only supports finalisers in the
        simple cases (eg. exceptions and non-goto/return across finaliser boundaries).
        This doesn't add the required exception checks to existing code, it merely adds
        support for throw, catch, and the required stack unwinding.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        (KJS::CodeBlock::getHandlerForVPC):
        * VM/CodeBlock.h:
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitCatch):
        (KJS::CodeGenerator::emitThrow):
        * VM/CodeGenerator.h:
        * VM/JSPropertyNameIterator.cpp:
        (KJS::JSPropertyNameIterator::create):
        * VM/Machine.cpp:
        (KJS::prepareException):
        (KJS::Machine::unwindCallFrame):
        (KJS::Machine::throwException):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::ThrowNode::emitCode):
        (KJS::TryNode::emitCode):
        * kjs/nodes.h:
        * kjs/scope_chain.cpp:
        (KJS::ScopeChain::depth):
        * kjs/scope_chain.h:

2008-04-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        First step toward supporting re-entrant evaluation: Switch register
        clients from using "registers", a pointer to a register vector, to
        "registerBase", an indirect pointer to the logical first entry in the
        register file. (The logical first entry is the first entry that is not
        a global variable).
        
        With a vector, offsets into the register file remain good when the
        underlying buffer reallocates, but they go bad when the logical
        first entry moves. (The logical first entry moves when new global
        variables get added to the beginning of the register file.) With an
        indirect pointer to the logical first entry, offsets will remain good
        regardless.

        1.4% speedup on sunspider --squirrelfish. I suspect this is due to
        reduced allocation when creating closures, and reduced indirection
        through the register vector.

        * wtf/Vector.h: Added an accessor for an indirect pointer to the vector's
        buffer, which we currently use (incorrectly) for registerBase. This is
        temporary scaffolding to allow us to change client code without
        changing behavior.

2008-04-06  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver Hunt.

        Implement codegen for ReadModifyDotNode.

        * kjs/nodes.cpp:
        (KJS::ReadModifyDotNode::emitCode):
        * kjs/nodes.h:

2008-04-06  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver Hunt.

        Fix codegen for PostIncDotNode and implement codegen for PostIncBracketNode,
        PostDecBracketNode and PostDecDotNode.

        * kjs/nodes.cpp:
        (KJS::PostIncBracketNode::emitCode):
        (KJS::PostDecBracketNode::emitCode):
        (KJS::PostIncDotNode::emitCode):
        (KJS::PostDecDotNode::emitCode):
        * kjs/nodes.h:

2008-04-06  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        Implement codegen for PreDecResolveNode, PreIncBracketNode, PreDecBracketNode,
        PreIncDotNode and PreDecDotNode.  This required adding one new op code, op_pre_dec.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitPreDec):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::PreDecResolveNode::emitCode):
        (KJS::PreIncBracketNode::emitCode):
        (KJS::PreDecBracketNode::emitCode):
        (KJS::PreIncDotNode::emitCode):
        (KJS::PreDecDotNode::emitCode):
        * kjs/nodes.h:

2008-04-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Improved register dumping, plus a liberal smattering of "const". Here's
        what the new format looks like:

        (gdb) call (void)dumpCallFrame(codeBlock, scopeChain, registers->begin(), r)
        4 instructions; 48 bytes at 0x509210; 3 locals (2 parameters); 1 temporaries

        [   0] load             lr1, undefined(@k0)
        [   3] load             lr1, 2(@k1)
        [   6] add              tr0, lr2, lr1
        [  10] ret              tr0

        Constants:
          k0 = undefined
          k1 = 2

        Register frame: 

        ----------------------------------------
             use      |   address  |    value   
        ----------------------------------------
        [return info] |   0x80ac08 |   0x5081c0 
        [return info] |   0x80ac0c |   0x508e90 
        [return info] |   0x80ac10 |   0x504acc 
        [return info] |   0x80ac14 |        0x2 
        [return info] |   0x80ac18 |        0x0 
        [return info] |   0x80ac1c |        0x7 
        [return info] |   0x80ac20 |        0x0 
        ----------------------------------------
        [param]       |   0x80ac24 |        0x1 
        [param]       |   0x80ac28 |        0x7 
        [var]         |   0x80ac2c |        0xb 
        [temp]        |   0x80ac30 |        0xf 

2008-04-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.

        Support for evaluating multiple scripts in the same global environment.
        (Still don't support re-entrant evaluation yet.)

        The main changes here are:

        (1) Obey the ECMA 10.1.3 rules regarding how to resolve collisions when
        a given symbol is declared more than once. (This patch fixes the same
        issue for function code, too.)
        
        (2) In the case of var and/or function collisions, reuse the existing
        storage slot. For global code, this is required for previously
        generated instructions to continue to work. For function code, it's
        more of a "nice to have": it makes register layout in the case of
        collisions easier to understand, and has the added benefit of saving
        memory.
        
        (3) Allocate slots in the CodeGenerator's m_locals vector in parallel
        to register indexes in the symbol table. This ensures that, given an
        index in the symbol table, we can find the corresponding RegisterID
        without hashing, which speeds up codegen. 
        
        I moved responsibility for emitting var and function initialization
        instructions into the CodeGenerator, because bookkeeping in cases where
        var, function, and/or parameter names collide requires a lot of
        internal knowledge about the CodeGenerator.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::addVar): Removed responsibility for checking whether
        a var declaration overwrites "arguments", because the check is
        inappropriate for global code, which may not have a pre-existing
        "arguments" symbol in scope. Also changed this function to return a
        boolean indicating whether addVar actually created a new RegisterID,
        or just reused an old one.
        
        (KJS::CodeGenerator::CodeGenerator): Split out the constructors for
        function code and global code, since they're quite different now.
        
        (KJS::CodeGenerator::registerForLocal): This function does its job
        without any hashing now.
        
        * VM/Machine.cpp: Move old globals and update "r" before executing a
        new script. That way, old globals stay at a constant offset from "r",
        and previously optimized code still works.
        
        * VM/RegisterID.h: Added the ability to allocate a RegisterID before
        initializing its index field. We use this for parameters now.

        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTableGet): Changed the ungettable getter
        ASSERT to account for the fact that symbol indexes are all negative.

2008-04-05  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        Implement codegen for InNode.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitIn):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::InNode::emitCode):
        * kjs/nodes.h:

2008-04-05  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver Hunt.

        - Implement codegen for DeleteResolveNode, DeleteBracketNode, DeleteDotNode and DeleteValueNode.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitGetPropId):
        (KJS::CodeGenerator::emitPutPropId):
        (KJS::CodeGenerator::emitDeletePropId):
        (KJS::CodeGenerator::emitDeletePropVal):
        (KJS::CodeGenerator::emitPutPropIndex):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::DeleteResolveNode::emitCode):
        (KJS::DeleteBracketNode::emitCode):
        (KJS::DeleteDotNode::emitCode):
        (KJS::DeleteValueNode::emitCode):
        * kjs/nodes.h:

2008-04-04  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver Hunt.

        - Implement codegen for Switch statements.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::pushJumpContext):
        (KJS::CodeGenerator::popJumpContext):
        (KJS::CodeGenerator::jumpContextForLabel):
        * VM/CodeGenerator.h:
        Rename LoopContext to JumpContext now that it used of Switch statements in addition
        to loops.

        * kjs/nodes.cpp:
        (KJS::DoWhileNode::emitCode):
        (KJS::WhileNode::emitCode):
        (KJS::ForNode::emitCode):
        (KJS::ForInNode::emitCode):
        (KJS::ContinueNode::emitCode):
        (KJS::BreakNode::emitCode):
        (KJS::CaseBlockNode::emitCodeForBlock):
        (KJS::SwitchNode::emitCode):
        * kjs/nodes.h:
        (KJS::CaseClauseNode::expr):
        (KJS::CaseClauseNode::children):
        (KJS::CaseBlockNode::):

2008-04-03  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Sam.
        
        - fix crash in codegen from new nodes

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitConstruct):
        * kjs/nodes.h:

2008-04-03  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.

        * kjs/nodes.cpp:
        (KJS::ReadModifyResolveNode::emitCode):
        (KJS::ReadModifyBracketNode::emitCode):
        * kjs/nodes.h:

2008-04-02  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - take a shot at marking constant pools for global and eval code
        
        Geoff says this won't really work in all cases but is an ok stopgap.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::mark):

2008-04-02  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - fix 2x perf regression in 3d-morph
        
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): If we subbed in null for the global object,
        don't toObject it, since that will throw an exception (very slowly).

2008-04-02  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Geoff
        
        - fix Release build

        * kjs/nodes.cpp:
        (KJS::getNonLocalSymbol):

2008-04-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Removed the last vestiges of LocalStorage from JSVariableObject and
        JSGlobalObject.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::saveLocalStorage): Save and restore from/to
        registers. Use stub isReadOnly and isDontEnum methods for now, until
        we really implement attributes in the symbol table.
        (KJS::JSGlobalObject::restoreLocalStorage):
        (KJS::JSGlobalObject::reset):

        * kjs/JSVariableObject.cpp:
        (KJS::JSVariableObject::getPropertyNames): Use stub isDontEnum method
        for now, as above.
        (KJS::JSVariableObject::getPropertyAttributes): ditto

        * kjs/JSVariableObject.h: Removed LocalStorage from JSVariableObjectData.
        Removed mark method, because subclasses implement different strategies for
        marking registers.
        (KJS::JSVariableObject::isReadOnly): Stub method
        (KJS::JSVariableObject::isDontEnum): ditto

        Changed the code below to ASSERT_NOT_REACHED() and return 0, since it
        can no longer retrieve LocalStorage from the ExecState. (Eventually,
        we'll just remove this code and all its friends, but that's a task for
        later.)
        
        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        * kjs/function.cpp:
        (KJS::ActivationImp::markChildren):
        * kjs/function.h:
        * kjs/nodes.cpp:
        (KJS::getNonLocalSymbol):
        (KJS::ScopeNode::optimizeVariableAccess):
        (KJS::ProgramNode::processDeclarations):

2008-04-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Got globals?
        
        To get things working, I had to roll out
        http://trac.webkit.org/projects/webkit/changeset/31226 for the time
        being.

        * VM/CodeBlock.h: Removed obsolete function.
        
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): For the sake of re-entrancy, we track
        and restore the global object's old rOffset value. (No way to test this
        yet, but I think it will work.)

2008-04-01  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - mark the constant pool (at least for function code blocks)

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::mark):
        * VM/CodeBlock.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::mark):
        * kjs/nodes.cpp:
        (KJS::ScopeNode::mark):
        * kjs/nodes.h:
        (KJS::FuncExprNode::body):
        (KJS::FuncDeclNode::body):

2008-04-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth Dakin.
        
        Cleaned up a few loose ends.

        * JavaScriptCore.exp: Export dumpRegisters, so it's visible to gdb even
        if we don't explicitly call it in the source text.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): No need to call dumpRegisters anymore,
        since that was just a hack for gdb's sake.

        * kjs/JSActivation.h: Removed obsolete comment.

        * VM/CodeGenerator.cpp: Added ASSERTs to verify that the localCount
        we're given matches the number of locals actually allocated.

        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::CodeGenerator): Changed "localCount" to include
        the parameter count, since we're using the word "local" to mean
        parameter, var, function, or "this". Renamed "m_nextLocal" to
        "m_nextVar", since "m_nextLocal" doesn't contrast well with
        "m_nextParameter".
        
        Also moved tracking of implicit "this" parameter from here...

        * kjs/nodes.cpp:
        (KJS::FunctionBodyNode::generateCode): ... to here
        (KJS::ProgramNode::generateCode): ... and here

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump): Added missing "\n".

2008-04-01  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver.

        Bug 18274: ResolveNode::emitCode() doesn't make a new temporary when dst
                   is 0, leading to incorrect codegen
        <http://bugs.webkit.org/show_bug.cgi?id=18274>

        * kjs/nodes.cpp:
        (KJS::FunctionCallBracketNode::emitCode):
        (KJS::FunctionCallDotNode::emitCode):

2008-04-01  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fix bug in for..in codegen (gotta use ident, not m_ident)

        * kjs/nodes.cpp:
        (KJS::ForInNode::emitCode):

2008-04-01  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - Add suport for regexp literals

        * VM/CodeBlock.cpp:
        (KJS::regexpToSourceString):
        (KJS::regexpName):
        (KJS::CodeBlock::dump):
        * VM/CodeBlock.h:
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::addRegExp):
        (KJS::CodeGenerator::emitNewRegExp):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::RegExpNode::emitCode):
        * kjs/nodes.h:

2008-04-01  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff

        Add support for for..in nodes
        
        Added two new opcodes to get_pnames and next_pname to handle iterating
        over the set of properties on an object.  This iterator is explicitly
        invalidated and the property name array is released on standard exit
        from the loop, otherwise we rely on GC to do the clean up for us.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitNextPropertyName):
        (KJS::CodeGenerator::emitGetPropertyNames):
        * VM/CodeGenerator.h:
        * VM/JSPropertyNameIterator.cpp: Added.
        (KJS::JSPropertyNameIterator::JSPropertyNameIterator):
        (KJS::JSPropertyNameIterator::type):
        (KJS::JSPropertyNameIterator::toPrimitive):
        (KJS::JSPropertyNameIterator::getPrimitiveNumber):
        (KJS::JSPropertyNameIterator::toBoolean):
        (KJS::JSPropertyNameIterator::toNumber):
        (KJS::JSPropertyNameIterator::toString):
        (KJS::JSPropertyNameIterator::toObject):
        (KJS::JSPropertyNameIterator::mark):
        (KJS::JSPropertyNameIterator::next):
        (KJS::JSPropertyNameIterator::invalidate):
        (KJS::JSPropertyNameIterator::~JSPropertyNameIterator):
        (KJS::JSPropertyNameIterator::create):
        * VM/JSPropertyNameIterator.h: Added.
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * VM/Register.h:
        (KJS::Register::):
        * kjs/PropertyNameArray.h:
        * kjs/nodes.cpp:
        (KJS::ForInNode::emitCode):
        * kjs/nodes.h:
        * kjs/value.h:

2008-04-01  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Change CodeGenerator::emitCall() so it increments the reference count of
        registers passed to it, and change its callers so they don't needlessly
        increment the reference count of the registers they are passing.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitCall):
        * kjs/nodes.cpp:
        (KJS::FunctionCallResolveNode::emitCode):
        (KJS::FunctionCallDotNode::emitCode):

2008-04-01  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - generate call for PostIncDotNode

        * kjs/nodes.cpp:
        (KJS::PostIncDotNode::emitCode):
        * kjs/nodes.h:

2008-04-01  Maciej Stachowiak  <mjs@apple.com>

        Build fix.
        
        - fix build (not sure how this ever worked?)

        * kjs/nodes.cpp:
        (KJS::FunctionCallBracketNode::emitCode):

2008-04-01  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - generate code for FunctionCallBracketNode

        * kjs/nodes.cpp:
        (KJS::FunctionCallBracketNode::emitCode):
        * kjs/nodes.h:

2008-04-01  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - Fix two crashing SunSpider tests

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): set up 'this' properly for native calls.
        * kjs/list.h:
        (KJS::List::List): Fix intialization of buffer and size from
        vector, the initialization order was wrong.

2008-04-01  Geoffrey Garen  <ggaren@apple.com>

        Build fix: marked ASSERT-only variables as UNUSED_PARAMs.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTableInitializeVariable):

2008-04-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Next step toward global code: Moved get, put, and initializeVariable
        functionality up into JSVariableObject, and changed JSActivation to
        rely on it. 

        * kjs/JSActivation.cpp:
        (KJS::JSActivation::JSActivation):
        (KJS::JSActivation::getOwnPropertySlot):
        (KJS::JSActivation::put):
        (KJS::JSActivation::initializeVariable):
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::valueAt):
        (KJS::JSVariableObject::isReadOnly):
        (KJS::JSVariableObject::symbolTableGet):
        (KJS::JSVariableObject::symbolTablePut):
        (KJS::JSVariableObject::symbolTableInitializeVariable):

2008-04-01  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Sam.
        
        - fix HashTable assertion on some SunSpider tests
        
        Don't use -1 as the deleted value for JSValue*-keyed hashtables,
        since it is a valid value (it's the immediate for -1).

        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::JSValueHashTraits::emptyValue):
        (KJS::CodeGenerator::JSValueHashTraits::deletedValue):
        * kjs/JSImmediate.h:
        (KJS::JSImmediate::impossibleValue):

2008-04-01  Sam Weinig  <sam@webkit.org>

        Reviewed by Maciej Stachowiak.

        Add support for calling Native constructors like new Array(). 

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitConstruct):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::NewExprNode::emitCode):
        * kjs/nodes.h:

2008-04-01  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Sam.
        
        - add some missing toOpbject calls to avoid crashing when calling methods on primitives

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-04-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Changed Machine::dumpRegisters to take a pointer instead of a reference,
        so gdb understands how to call it.

        * VM/Machine.cpp:
        (KJS::Machine::dumpRegisters):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:

2008-03-31  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Fix CodeGenerator::addConstant() so it uses the functionExpressions
        counter for function expressions, not the functions counter.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::addConstant):

2008-03-31  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        Add emitCode support for TypeOfResolveNode and TypeOfValueNode.
        Added new opcode op_type_of to handle them.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitNot):
        (KJS::CodeGenerator::emitInstanceOf):
        (KJS::CodeGenerator::emitTypeOf):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::jsTypeStringForValue):
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::TypeOfResolveNode::emitCode):
        (KJS::TypeOfValueNode::emitCode):
        * kjs/nodes.h:

2008-03-31  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver Hunt.

        Fix non-computed goto version of isOpcode. op_end is a valid opcode.

        * VM/Machine.cpp:
        (KJS::Machine::isOpcode):

2008-03-31  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Added op_post_dec.

2008-03-31  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Geoffrey Garen.

        Add support for FunctionCallDotNode.

        * kjs/nodes.cpp:
        (KJS::FunctionCallDotNode::emitCode):
        * kjs/nodes.h:

2008-03-31  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth Dakin.

        Next step toward global code: Removed more obsolete API, moved
        saveLocalStorage and restoreLocalStorage to JSGlobalObject subclass,
        since it's only intended for use there.
        
        * ChangeLog:
        * JavaScriptCore.exp:
        * kjs/Activation.h:
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::saveLocalStorage):
        (KJS::JSGlobalObject::restoreLocalStorage):
        * kjs/JSGlobalObject.h:
        * kjs/JSVariableObject.cpp:
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::JSVariableObjectData::JSVariableObjectData):
        * kjs/function.cpp:
        (KJS::ActivationImp::ActivationImp):

2008-03-31  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth Dakin.

        Next step toward global code: subclass JSActivation + JSActivationData
        from JSVariableObject + JSVariableObjectData.
        
        JSActivation now relies on JSVariableObject for access to registers and
        symbol table, and for some delete functionality, but not for anything
        else yet.

        (KJS::JSActivation::mark): Cleaned up the style here a little bit.

2008-03-31  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth Dakin.
        
        Next step toward global code: store "rOffset" in JSVariableObjectData.

        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData):
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::JSVariableObjectData::JSVariableObjectData):

2008-03-31  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Next steps toward global code:
        
        * Moved access to the register file into JSVariableObject.
        
        * Added more ASSERTs to indicate obsolete APIs there are just hanging
        around to stave off build failures.

        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData):
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::registers):
        (KJS::JSVariableObject::JSVariableObjectData::JSVariableObjectData):
        (KJS::JSVariableObject::JSVariableObject):

2008-03-31  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver. Tweaked somewhat by Maciej.
        
        - implement codegen for ReadModifyResolveNode

        * kjs/nodes.cpp:
        (KJS::emitReadModifyAssignment):
        (KJS::ReadModifyResolveNode::emitCode):
        * kjs/nodes.h:

2008-03-31  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Geoff.

        Fix the build -- r31492 removed activation tear-off, but r31493 used it.

        * kjs/nodes.cpp:
        (KJS::FuncExprNode::makeFunction):

2008-03-31  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Add support for FuncExprNode to SquirrelFish.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeBlock.h:
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::addConstant):
        (KJS::CodeGenerator::emitNewFunctionExpression):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::FuncExprNode::emitCode):
        (KJS::FuncExprNode::makeFunction):
        * kjs/nodes.h:

2008-03-31  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        First step toward global code: removed some obsolete JSGlobalObject
        APIs, changing clients to ASSERT_NOT_REACHED.
        
        Activation tear-off and scope chain pushing is obsolete because we
        statically detect whether an activation + scope node is required.
        
        The variableObject() and activationObject() accessors are obsolete
        because they haven't been maintained, and they're mostly used by
        node evaluation code, anyway.
        
        The localStorage() accessor is obsolete because everything is in
        registers now, and it's mostly used by node evaluation code, anyway.

2008-03-31  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - implement codegen for bracket accessor and bracket assign

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitGetPropVal):
        (KJS::CodeGenerator::emitPutPropVal):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::BracketAccessorNode::emitCode):
        (KJS::AssignBracketNode::emitCode):
        * kjs/nodes.h:

2008-03-31  Geoffrey Garen  <ggaren@apple.com>

        Not reviewed.
        
        Removed FIXME that I just fixed.
        
        Added ASSERT to cover an error previously only covered by a FIXME.

        * kjs/JSActivation.cpp:
        (KJS::JSActivation::getOwnPropertySlot):

2008-03-31  Geoffrey Garen  <ggaren@apple.com>

        Not reviewed.

        Fixed indentation inside op_call. (I had left this code badly indented
        to make the behavior-changing diff clearer.)

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-03-31  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Fixed up logging of jump instructions to follow the following style:
        
        jump    offset(->absoluteTarget)

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):

2008-03-31  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Changed the SymbolTable API to use int instead of size_t. It has been
        using int internally for a while now (since squirrelfish symbols can
        have negative indices).

2008-03-31  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Add support for FunctionCallValueNode.

        * kjs/nodes.cpp:
        (KJS::FunctionCallValueNode::emitCode):
        * kjs/nodes.h:

2008-03-31  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        1) Implemented array literals
        
        2) Renamed op_object_get and op_object_put to op_get_prop_id and
        op_put_prop_id in preparation for new variants.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitNewArray):
        (KJS::CodeGenerator::emitGetPropId):
        (KJS::CodeGenerator::emitPutPropId):
        (KJS::CodeGenerator::emitPutPropIndex):
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::CodeGenerator):
        (KJS::CodeGenerator::propertyNames):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::ArrayNode::emitCode):
        (KJS::PropertyListNode::emitCode):
        (KJS::DotAccessorNode::emitCode):
        (KJS::PostIncResolveNode::emitCode):
        (KJS::PreIncResolveNode::emitCode):
        (KJS::AssignResolveNode::emitCode):
        (KJS::AssignDotNode::emitCode):
        * kjs/nodes.h:

2008-03-30  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Implemented native function calls. (Re-entering from native code back
        to JS doesn't work yet, though.)

        0.2% speedup overall, due to some inlining tweaks. 3.6% regression on
        function-empty.js, since we're making a new virtual call and taking a
        new branch inside every op_call.
        
        I adjusted the JavaScriptCore calling convention to minimize overhead,
        like so:
        
        The machine calls a single virtual function, "getCallData", to get all
        the data it needs for a function call. Native code still uses the old
        "isObject()" check followed by an "implementsCall()" check, which
        aliases to "getCallData". (We can optimize native code to use getCallData
        at our leisure.)
        
        To supply a list of arguments, the machine calls a new List constructor
        that just takes a pointer and a length, without copying. Native code
        still appends to the list one argument at a time. (We can optimize
        native code to use the new List constructor at our leisure.)

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Changed resize() call to grow() call,
        to encourage the compiler to inline the Vector code.

        * kjs/CallData.h: Added.
        (KJS::): CallData is a union because eventually native calls will stuff
        a function pointer into it, to eliminate the callAsFunction virtual call.

        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction): Changed this to an ASSERT since
        it's not implemented yet.
        
        * kjs/list.h: Made the List class two-faced, to support the old way and
        the new way during this transition phase: lists can be made read-only
        with just a pointer and a legnth, or you can append to them one item
        at a time.

        * kjs/value.h:
        (KJS::jsUndefined): Marked this function ALWAYS_INLINE for the benefit
        of a certain compiler that doesn't know what's best for it.

2008-03-30  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.

        Dump code that codegen can't handle yet, so it's easier to prioritize missing nodes.
        
        * kjs/nodes.h:
        (KJS::Node::emitCode):

2008-03-30  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.

        Improve dumping of bytecode and fix coding style accordingly.
        
        Registers are printed as lr1 for locals, tr1 for temp registers. Identifiers print as
        foobar(@id0) and constants print as "foo"(@k1) or 312.4(@k2) or the like. Constant and
        identifier tables are dumped for reference.
        
        * VM/CodeBlock.cpp:
        (KJS::escapeQuotes):
        (KJS::valueToSourceString):
        (KJS::registerName):
        (KJS::constantName):
        (KJS::idName):
        (KJS::printUnaryOp):
        (KJS::printBinaryOp):
        (KJS::CodeBlock::dump):
        * VM/Machine.cpp:
        (KJS::resolve):
        (KJS::resolveBase):
        (KJS::Machine::privateExecute):

2008-03-30  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        Implement StringNode and VoidNode (both pretty trivial).

        * kjs/nodes.cpp:
        (KJS::StringNode::emitCode):
        (KJS::VoidNode::emitCode):
        * kjs/nodes.h:

2008-03-30  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Sam.

        Implement CommaNode.
        
        * kjs/nodes.cpp:
        (KJS::CommaNode::emitCode):
        * kjs/nodes.h:

2008-03-30  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Adds support for dot notation and object literals.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitNewObject):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::ObjectLiteralNode::emitCode):
        (KJS::PropertyListNode::emitCode):
        (KJS::DotAccessorNode::emitCode):
        (KJS::AssignDotNode::emitCode):
        * kjs/nodes.h:

2008-03-29  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Mark the register file. 
        
        It's a conservative mark for now, but once registers are typed, we can
        do an exact mark.
        
        1.4% regression regardless of whether we actually do the marking.
        GCC is is worth every penny.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Most of the changes here are just for
        the fact that "registers" is a pointer now.

        * kjs/JSGlobalObject.cpp: The global object owns the register file now.

2008-03-28  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18204: SquirrelFish: continue/break do not correctly handle scope popping
        <http://bugs.webkit.org/show_bug.cgi?id=18204>

        We now track the scope depth as part of a loop context, and add an
        extra instruction op_jump_scopes that is used to perform a jump across
        dynamic scope boundaries.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitJumpScopes):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::ContinueNode::emitCode):
        (KJS::BreakNode::emitCode):

2008-03-28  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        Add emitCode support for ConditionalNode.

        * kjs/nodes.cpp:
        (KJS::ConditionalNode::emitCode):
        * kjs/nodes.h:

2008-03-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Responding to feedback, added some comments, fixed up a few names, and
        clarified that "locals" always means all local variables, functions,
        and parameters.

2008-03-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.

        Added support for "this".
        
        Supply an implicit "this" value as the first argument to every function.
        Alias the "this" keyword to that argument.
        
        1% regression overall, 2.5% regression on empty function calls. Seems
        like a reasonable cost for now, since we're doing more work.
        (Eventually, we might decide to create a version of op_call specialized
        for a known null "this" value.)

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitCall):
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::CodeGenerator):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * kjs/CommonIdentifiers.cpp:
        (KJS::CommonIdentifiers::CommonIdentifiers):
        * kjs/CommonIdentifiers.h:
        * kjs/nodes.cpp:
        (KJS::ThisNode::emitCode):
        (KJS::FunctionCallResolveNode::emitCode):
        * kjs/nodes.h:

2008-03-28  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 18192: Squirrelfish needs support for break and continue
        <http://bugs.webkit.org/show_bug.cgi?id=18192>

        Added a loop context stack to the code generator to provide the
        correct jump labels for continue and goto.  Added logic to the
        currently implemented loop constructs to manage entry and exit
        from the loop contexts.  Finally, implemented codegen for break
        and continue (and a pass through for LabelNode)

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::pushLoopContext):
        (KJS::CodeGenerator::popLoopContext):
        (KJS::CodeGenerator::loopContextForIdentifier):
        (KJS::CodeGenerator::labelForContinue):
        (KJS::CodeGenerator::labelForBreak):
        * VM/CodeGenerator.h:
        * kjs/nodes.cpp:
        (KJS::DoWhileNode::emitCode):
        (KJS::WhileNode::emitCode):
        (KJS::ForNode::emitCode):
        (KJS::ContinueNode::emitCode):
        (KJS::BreakNode::emitCode):
        (KJS::LabelNode::emitCode):
        * kjs/nodes.h:

2008-03-27  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        Add emitCode support for UnaryPlusNode, NegateNode, BitwiseNotNode and LogicalNotNode.

        * VM/CodeBlock.cpp:
        (KJS::printUnaryOp):
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitToJSNumber):
        (KJS::CodeGenerator::emitNegate):
        (KJS::CodeGenerator::emitBitNot):
        (KJS::CodeGenerator::emitNot):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::UnaryPlusNode::emitCode):
        (KJS::NegateNode::emitCode):
        (KJS::BitwiseNotNode::emitCode):
        (KJS::LogicalNotNode::emitCode):
        * kjs/nodes.h:

2008-03-27  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej Stachowiak.

        Add support for LogicalAndNode and LogicalOrNode.

        * kjs/nodes.cpp:
        (KJS::LogicalAndNode::emitCode):
        (KJS::LogicalOrNode::emitCode):
        * kjs/nodes.h:

2008-03-27  Sam Weinig  <sam@webkit.org>

        Clean up code and debug output.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-03-27  Geoffrey Garen  <ggaren@apple.com>

        Moved an ASSERT to a more logical place.

        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-03-27  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver Hunt.

        Add emitCode support for InstanceOfNode.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitInstanceOf):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::InstanceOfNode::emitCode):
        * kjs/nodes.h:

2008-03-27  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Bug 18142: squirrelfish needs to support dynamic scoping/with
        <http://bugs.webkit.org/show_bug.cgi?id=18142>

        Add support for dynamic scoping and add code to handle 'with'
        statements.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeBlock.h:
        (KJS::CodeBlock::CodeBlock):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::getRegister):
        (KJS::CodeGenerator::emitPushScope):
        (KJS::CodeGenerator::emitPopScope):
        * VM/CodeGenerator.h:
        (KJS::CodeGenerator::CodeGenerator):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::WithNode::emitCode):
        * kjs/nodes.h:

2008-03-27  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        Add emitCode support for NullNode, FalseNode, TrueNode, IfNode, IfElseNode, DoWhileNode and WhileNode

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump): Dump op_jfalse opcode.
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitJumpIfFalse): Identical to emitJumpIfTrue except it emits the op_jfalse opcode.
        (KJS::CodeGenerator::emitLoad): Add and emitLoad override for booleans.
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute): Adds execution of op_jfalse. It is identical to op_jtrue, except the
        the condition is reversed.
        * VM/Opcode.h: Add op_jfalse.
        * kjs/nodes.cpp:
        (KJS::NullNode::emitCode): Added.
        (KJS::FalseNode::emitCode): Added.
        (KJS::TrueNode::emitCode): Added.
        (KJS::IfNode::emitCode): Added.
        (KJS::IfElseNode::emitCode): Added.
        (KJS::DoWhileNode::emitCode): Added.
        (KJS::WhileNode::emitCode): Added.
        * kjs/nodes.h:

2008-03-26  Geoffrey Garen  <ggaren@apple.com>

        Nixed an unused List.
        
        The calm before my stormy war against the List class.

        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::construct):

2008-03-26  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Geoffrey Garen.

        Adds support for EqualNode, NotEqualNode, StrictEqualNode, NotStrictEqualNode,
        LessEqNode, GreaterNode, GreaterEqNode, MultNode, DivNode, ModNode, SubNode,
        LeftShiftNode, RightShiftNode, UnsignedRightShiftNode, BitAndNode, BitXOrNode,
        and BitOrNode.

        * VM/CodeBlock.cpp:
        (KJS::CodeBlock::dump):
        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::emitEqual):
        (KJS::CodeGenerator::emitNotEqual):
        (KJS::CodeGenerator::emitStrictEqual):
        (KJS::CodeGenerator::emitNotStrictEqual):
        (KJS::CodeGenerator::emitLessEq):
        (KJS::CodeGenerator::emitMult):
        (KJS::CodeGenerator::emitDiv):
        (KJS::CodeGenerator::emitMod):
        (KJS::CodeGenerator::emitSub):
        (KJS::CodeGenerator::emitLeftShift):
        (KJS::CodeGenerator::emitRightShift):
        (KJS::CodeGenerator::emitUnsignedRightShift):
        (KJS::CodeGenerator::emitBitAnd):
        (KJS::CodeGenerator::emitBitXOr):
        (KJS::CodeGenerator::emitBitOr):
        * VM/CodeGenerator.h:
        * VM/Machine.cpp:
        (KJS::jsLessEq):
        (KJS::Machine::privateExecute):
        * VM/Opcode.h:
        * kjs/nodes.cpp:
        (KJS::MultNode::emitCode):
        (KJS::DivNode::emitCode):
        (KJS::ModNode::emitCode):
        (KJS::SubNode::emitCode):
        (KJS::LeftShiftNode::emitCode):
        (KJS::RightShiftNode::emitCode):
        (KJS::UnsignedRightShiftNode::emitCode):
        (KJS::GreaterNode::emitCode):
        (KJS::LessEqNode::emitCode):
        (KJS::GreaterEqNode::emitCode):
        (KJS::EqualNode::emitCode):
        (KJS::NotEqualNode::emitCode):
        (KJS::StrictEqualNode::emitCode):
        (KJS::NotStrictEqualNode::emitCode):
        (KJS::BitAndNode::emitCode):
        (KJS::BitXOrNode::emitCode):
        (KJS::BitOrNode::emitCode):
        * kjs/nodes.h:

2008-03-26  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Only print debug dumps in debug builds.

        * VM/CodeGenerator.cpp:
        (KJS::CodeGenerator::generate):
        * VM/Machine.cpp:
        (KJS::Machine::privateExecute):

2008-03-26  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Moved a few files around in the XCode project.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-03-26  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Made closures work.
        
        An activation object aliases to the register file until its associated
        function returns, at which point it copies the registers for locals and
        parameters into an independent storage buffer.

2008-03-24  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed recent 25% regression on simple for loop test. GCC seems to be
        very finicky about the code that gets inlined into
        Machine::privateExecute.

        Everything in this patch is simply the result of experiment.
        
        The resolve and resolve_base opcodes do not seem to have gotten slower
        from this change.

        * VM/Machine.cpp:
        (KJS::resolve):
        (KJS::resolveBase):
        (KJS::Machine::privateExecute):
        * kjs/nodes.h:

2008-03-24  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff Garen.

        Bug 18059: squirrelfish needs to compile on platforms without computed goto
        <http://bugs.webkit.org/show_bug.cgi?id=18059>

        "Standard" macro style support for conditionalising the use of computed goto.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * VM/Machine.cpp:
        (KJS::Machine::isOpcode):
        (KJS::Machine::privateExecute):
        * VM/Machine.h:
        (KJS::Machine::getOpcode):
        (KJS::Machine::getOpcodeID):
        * VM/Opcode.h:
        * wtf/Platform.h:

2008-03-24  Geoffrey Garen  <ggaren@apple.com>

        Moved my notes from nodes.h to the wiki.

        * kjs/nodes.h:

2008-03-24  Geoffrey Garen  <ggaren@apple.com>

        SquirrelFish lives.
        
        Initial check-in of the code I've been carrying around. Lots of stuff
        doesn't work. Plus a bunch of empty files.

=== Start merge of squirrelfish ===

2008-05-21  Darin Adler  <darin@apple.com>

        - try to fix the Windows build

        * profiler/Profiler.cpp:
        (KJS::Profiler::stopProfiling): Use ptrdiff_t instead of the less-common but incredibly
        similar ssize_t type.
        * wtf/AVLTree.h:
        (KJS::AVLTree::search): Added a typename for a dependent name that's a type.

2008-05-21  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - fix <rdar://problem/5952721> bug in JavaScript arguments object property lookup

        Test: fast/js/arguments-bad-index.html

        * kjs/function.cpp:
        (KJS::IndexToNameMap::IndexToNameMap): Use unsigned instead of int.
        (KJS::IndexToNameMap::isMapped): Use unsigned instead of int, and also use the
        strict version of the numeric conversion function, since we don't want to allow
        trailing junk.
        (KJS::IndexToNameMap::unMap): Ditto.
        (KJS::IndexToNameMap::operator[]): Ditto.
        * kjs/function.h: Changed IndexToNameMap::size type from int to unsigned.

2008-05-21  Timothy Hatcher  <timothy@apple.com>

        Change the Profiler to allow multiple profiles to be running at
        the same time. This can happen when you have nested console.profile()
        calls. This required two changes. First, the Profiler needed to keep a
        Vector of current profiles, instead of one. Second, a Profile needs
        to keep track of the global ExecState it started in and the page group
        identifier it is tracking.

        The stopProfiling call now takes the same arguments as startProfiling.
        This makes sure the correct profile is stopped. Passing a null UString
        as the title will stop the last profile for the matching ExecState.

        <rdar://problem/5951559> Multiple pages profiling can interfere with each other

        Reviewed by Kevin McCullough.

        * JavaScriptCore.exp: Added new exports. Removed old symbols.
        * profiler/Profile.cpp:
        (KJS::Profile::Profile): New constructor arguments for the
        originatingGlobalExec and pageGroupIdentifier.
        (KJS::Profile::stopProfiling): Set the m_originatingGlobalExec to null.
        * profiler/Profile.h:
        (KJS::Profile::create): Additional arguments.
        (KJS::Profile::originatingGlobalExec): Return m_originatingGlobalExec.
        (KJS::Profile::pageGroupIdentifier): Return m_pageGroupIdentifier.
        * profiler/Profiler.cpp:
        (KJS::Profiler::findProfile): Added. Finds a Profile that matches
        the ExecState and title.
        (KJS::Profiler::startProfiling): Return early if there is already
        a Profile with the ExecState and title. If not, create a new profile
        and append it to m_currentProfiles.
        (KJS::Profiler::stopProfiling): Loops through m_currentProfiles
        and find the one matching the ExecState and title. If one is found
        call stopProfiling and return the Profile after removing it
        from m_currentProfiles.
        (KJS::dispatchFunctionToProfiles): Helper inline function to loop through
        m_currentProfiles and call a Profile function.
        (KJS::Profiler::willExecute): Call dispatchFunctionToProfiles.
        (KJS::Profiler::didExecute): Ditto.
        * profiler/Profiler.h:

2008-05-21  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        <rdar://problem/5908520> REGRESSION (3.1.1-r33033): Crash in WebKit when opening or
        refreshing page on people.com

        The problem was that STL algorithms do not work with non-conformant comparators, and the
        site used sort(function() { return 0.5 - Math.random(); } to randomly shuffle an array.

        https://bugs.webkit.org/show_bug.cgi?id=18687
        REGRESSION(r32220): ecma/Array/15.4.4.5-3.js test now fails in GMT(BST)

        Besides relying on sort stability, this test was just broken, and kept failing with the
        new stable sort.

        Tests: fast/js/sort-randomly.html
               fast/js/sort-stability.html
               fast/js/comparefn-sort-stability.html

        * kjs/avl_tree.h: Added an AVL tree implementation.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * wtf/AVLTree.h: Added.
        Added an AVL tree implementation.

        * kjs/array_instance.cpp:
        (KJS::ArrayInstance::increaseVectorLength):
        (KJS::ArrayInstance::sort):
        (KJS::AVLTreeAbstractorForArrayCompare::get_less):
        (KJS::AVLTreeAbstractorForArrayCompare::set_less):
        (KJS::AVLTreeAbstractorForArrayCompare::get_greater):
        (KJS::AVLTreeAbstractorForArrayCompare::set_greater):
        (KJS::AVLTreeAbstractorForArrayCompare::get_balance_factor):
        (KJS::AVLTreeAbstractorForArrayCompare::set_balance_factor):
        (KJS::AVLTreeAbstractorForArrayCompare::compare_key_key):
        (KJS::AVLTreeAbstractorForArrayCompare::compare_key_node):
        (KJS::AVLTreeAbstractorForArrayCompare::compare_node_node):
        (KJS::AVLTreeAbstractorForArrayCompare::null):
        (KJS::ArrayInstance::compactForSorting):
        
        * kjs/array_instance.h: increaseVectorLength() now returns a bool to indicate whether it was
        successful.

        * wtf/Vector.h:
        (WTF::Vector::Vector):
        (WTF::::operator=):
        (WTF::::fill):
        Make these methods fail instead of crash when allocation fails, matching resize() and
        reserveCapacity(), which already had this behavior. Callers need to check for null buffer
        after making any Vector call that can try to allocate.

        * tests/mozilla/ecma/Array/15.4.4.5-3.js: Fixed the test to use a consistent sort function,
        as suggested in comments to a Mozilla bug filed about it (I'll keep tracking the bug to see
        what the final resolution is).

2008-05-20  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        <rdar://problem/5950867> JSProfiler: Allow the profiler to "Focus" a
        profile node.
        - Implements focus by adding the idea of a profileNode being visible and
        adding the ability to reset all of the visible flags.

        * profiler/Profile.h: 
        (KJS::Profile::focus):
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::ProfileNode): Initialize the visible flag.
        (KJS::ProfileNode::setTreeVisible): Set the visibility of this node and
        all of its descendents.
        (KJS::ProfileNode::focus): Determine if this node should be visible when
        focusing, if the functionName matches this node's function name or if any
        of this node's children are visible.
        (KJS::ProfileNode::restoreAll): Restore all nodes' visible flag.
        (KJS::ProfileNode::debugPrintData):
        * profiler/ProfileNode.h:
        (KJS::ProfileNode::visible):
        (KJS::ProfileNode::setVisible):

2008-05-20  Timothy Hatcher  <timothy@apple.com>

        Fixes a couple performance issues with the profiler. Also fixes
        a regression where some nodes wouldn't be added to the tree.

        Reviewed by Kevin McCullough.

        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::addChild): Compare callIdentifier instead
        of functionName.
        * profiler/ProfileNode.h: 
        (CallIdentifier.operator==): Compare the CallIdentifiers in
        an order that fails sooner for non-matches.
        (CallIdentifier.callIdentifier): Return the CallIdentifier by
        reference to prevent making a new copy each time.

2008-05-20  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Darin.

        <rdar://problem/5950796> JSProfiler: dump functions are in the code
        Removed dump and logging functions from the Release version of the code
        and renamed them to be obviously for debugging only.

        * JavaScriptCore.exp:
        * profiler/Profile.cpp:
        (KJS::Profile::debugPrintData):
        (KJS::Profile::debugPrintDataSampleStyle):
        * profiler/Profile.h:
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::debugPrintData):
        (KJS::ProfileNode::debugPrintDataSampleStyle):
        * profiler/ProfileNode.h:
        * profiler/Profiler.cpp:
        * profiler/Profiler.h:

2008-05-20  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Adam.

        <rdar://problem/5950538> JSProfiler: Keep track of non-JS execution time
        We now have an extra node that represents the excess non-JS time.
        - Also changed "SCRIPT" and "anonymous function" to be more consistent
        with the debugger.

        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::stopProfiling): If this ProfileNode is the head node
        create a new child that has the excess execution time.
        (KJS::ProfileNode::calculatePercentages): Moved calculation of the
        percentages into a function since it's called from multiple places.
        * profiler/ProfileNode.h: Add the newly needed functions used above.
        (KJS::ProfileNode::setTotalTime):
        (KJS::ProfileNode::setSelfTime):
        (KJS::ProfileNode::setNumberOfCalls):
        * profiler/Profiler.cpp: renamed "SCRIPT" and "anonymous function" to be
        consistent with the debugger and use constants that can be localized
        more easily.
        (KJS::getCallIdentifiers):
        (KJS::getCallIdentifierFromFunctionImp):

2008-05-20  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        <rdar://problem/5770054> JavaScript profiler (10928)
        Removed only profiler-internal use of currentProfile since that concept
        is changing.

        * profiler/Profile.h: Now stopProfiling takes a time and bool as
        arguments.  The time is used to calculate %s from and the bool tells
        if this node is the head node and should be the one calculating the time.
        (KJS::Profile::stopProfiling):
        * profiler/ProfileNode.cpp: Ditto.
        (KJS::ProfileNode::stopProfiling):
        * profiler/ProfileNode.h: Ditto.

2008-05-20  Kevin McCullough  <kmccullough@apple.com>

        Accidentally turned on the profiler.

        * kjs/config.h:


2008-05-20  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        <rdar://problem/5770054> JavaScript profiler (10928)
        Split function name into 3 parts so that the Web Inspector can link it to
        the resource location from whence it came.

        * kjs/ustring.cpp: Implemented operator> for UStrings
        (KJS::operator>):
        * kjs/ustring.h:
        * profiler/Profile.cpp:
        (KJS::Profile::Profile): Initialize all 3 values.
        (KJS::Profile::willExecute): Use CallIdentifier struct.
        (KJS::Profile::didExecute): Ditto.
        * profiler/Profile.h: Ditto and remove unused function.
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::ProfileNode): Use CallIdentifier struct.
        (KJS::ProfileNode::willExecute): Ditto and fix an issue where we
        restarted the m_startTime even though it was already started.
        (KJS::ProfileNode::didExecute): Ditto.
        (KJS::ProfileNode::findChild): Ditto.
        (KJS::functionNameDescendingComparator): Ditto and use new comparator.
        (KJS::functionNameAscendingComparator): Ditto.
        (KJS::ProfileNode::printDataInspectorStyle): Use CallIdentifier struct.
        (KJS::ProfileNode::printDataSampleStyle): Ditto.
        * profiler/ProfileNode.h:
        (KJS::CallIdentifier::CallIdentifier): Describe the CallIdentifier struct
        (KJS::CallIdentifier::operator== ):
        (KJS::ProfileNode::create): Use the CallIdentifier struct.
        (KJS::ProfileNode::callIdentifier):
        (KJS::ProfileNode::functionName): Now only return the function name, not
        the url and line number too.
        (KJS::ProfileNode::url):
        (KJS::ProfileNode::lineNumber):
        * profiler/Profiler.cpp: Use the CallIdentifier struct. 
        (KJS::Profiler::startProfiling):
        (KJS::Profiler::willExecute):
        (KJS::Profiler::didExecute):
        (KJS::getCallIdentifiers):
        (KJS::getCallIdentifierFromFunctionImp):

2008-05-20  Timothy Hatcher  <timothy@apple.com>

        Rename sortFileName{Ascending,Descending} to
        sortFunctionName{Ascending,Descending}.

        Reviewed by Kevin McCullough.

        * JavaScriptCore.exp:
        * kjs/config.h:
        * profiler/Profile.h:
        * profiler/ProfileNode.cpp:
        (KJS::functionNameDescendingComparator):
        (KJS::ProfileNode::sortFunctionNameDescending):
        (KJS::functionNameAscendingComparator):
        (KJS::ProfileNode::sortFunctionNameAscending):
        * profiler/ProfileNode.h:

2008-05-19  Timothy Hatcher  <timothy@apple.com>

        Make the profiler use higher than millisecond resolution time-stamps.

        Reviewed by Kevin McCullough.

        * kjs/DateMath.cpp:
        (KJS::getCurrentUTCTime): Call getCurrentUTCTimeWithMicroseconds and
        floor the result.
        (KJS::getCurrentUTCTimeWithMicroseconds): Copied from the previous
        implementation of getCurrentUTCTime without the floor call.
        * kjs/DateMath.h: Addded getCurrentUTCTimeWithMicroseconds.
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::ProfileNode): Use getCurrentUTCTimeWithMicroseconds.

2008-05-19  Timothy Hatcher  <timothy@apple.com>

        Fixes a bug in the profiler where call and apply would show up
        and double the time spent in a function. We don't want to show call
        and apply at all in the profiles. This change excludes them.

        Reviewed by Kevin McCullough.

        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::stopProfiling): Remove a second for loop and
        calculate self time in the existing loop.
        * profiler/Profiler.cpp:
        (KJS::shouldExcludeFunction): Helper inline function that returns
        true in the current function in an InternalFunctionImp and it is 
        has the functionName call or apply.
        (KJS::Profiler::willExecute): Call shouldExcludeFunction and return
        early if if returns true.
        (KJS::Profiler::didExecute): Ditto.

2008-05-19  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        <rdar://problem/5770054> JavaScript profiler (10928)
        - Implement sorting by function name.

        * JavaScriptCore.exp:
        * profiler/Profile.h:
        (KJS::Profile::sortFileNameDescending):
        (KJS::Profile::sortFileNameAscending):
        * profiler/ProfileNode.cpp:
        (KJS::fileNameDescendingComparator):
        (KJS::ProfileNode::sortFileNameDescending):
        (KJS::fileNameAscendingComparator):
        (KJS::ProfileNode::sortFileNameAscending):
        * profiler/ProfileNode.h:

2008-05-19  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Adam.

        <rdar://problem/5770054> JavaScript profiler (10928)
        - Pass the exec state to profiler when calling startProfiling so that if
        profiling is started within an execution context that location is
        recorded correctly.

        * JavaScriptCore.exp:
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::printDataInspectorStyle): Dump more info for debugging
        purposes.
        * profiler/Profiler.cpp:
        (KJS::Profiler::startProfiling):
        * profiler/Profiler.h:

2008-05-19  Kevin McCullough  <kmccullough@apple.com>

        Rubberstamped by Geoff.

        Turn off the profiler because it is a performance regression.

        * kjs/config.h:

2008-05-19  Alp Toker  <alp@nuanti.com>

        Reviewed by Anders and Beth.

        http://bugs.webkit.org/show_bug.cgi?id=16495
        [GTK] Accessibility support with ATK/AT-SPI

        Initial ATK/AT-SPI accessibility support for the GTK+ port.

        * wtf/Platform.h:

2008-05-19  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        <rdar://problem/5770054> JavaScript profiler (10928)
        -In an effort to make the profiler as efficient as possible instead of
        prepending to a vector we keep the vector in reverse order and operate
        over it backwards.

        * profiler/Profile.cpp:
        (KJS::Profile::willExecute):
        (KJS::Profile::didExecute):
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::didExecute):
        (KJS::ProfileNode::endAndRecordCall):
        * profiler/ProfileNode.h:
        * profiler/Profiler.cpp:
        (KJS::getStackNames):

2008-05-16  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        <rdar://problem/5770054> JavaScript profiler (10928)
        Implement sorting for the profiler.
        I chose to sort the profileNodes in place since there is no reason they
        need to retain their original order.

        * JavaScriptCore.exp: Export the symbols.
        * profiler/Profile.h: Add the different ways a profile can be sorted.
        (KJS::Profile::sortTotalTimeDescending):
        (KJS::Profile::sortTotalTimeAscending):
        (KJS::Profile::sortSelfTimeDescending):
        (KJS::Profile::sortSelfTimeAscending):
        (KJS::Profile::sortCallsDescending):
        (KJS::Profile::sortCallsAscending):
        * profiler/ProfileNode.cpp: Implement those ways.
        (KJS::totalTimeDescendingComparator):
        (KJS::ProfileNode::sortTotalTimeDescending):
        (KJS::totalTimeAscendingComparator):
        (KJS::ProfileNode::sortTotalTimeAscending):
        (KJS::selfTimeDescendingComparator):
        (KJS::ProfileNode::sortSelfTimeDescending):
        (KJS::selfTimeAscendingComparator):
        (KJS::ProfileNode::sortSelfTimeAscending):
        (KJS::callsDescendingComparator):
        (KJS::ProfileNode::sortCallsDescending):
        (KJS::callsAscendingComparator):
        (KJS::ProfileNode::sortCallsAscending):
        * profiler/ProfileNode.h: No longer use a Deque since it cannot be
        sorted by std::sort and there was no reason not to use a Vector.  I
        previously had though I would do prepending but am not.
        (KJS::ProfileNode::selfTime):
        (KJS::ProfileNode::totalPercent):
        (KJS::ProfileNode::selfPercent):
        (KJS::ProfileNode::children):
        * profiler/Profiler.cpp: Removed these functions as they can be called
        directoy on the Profile object after getting the Vector of them.
        (KJS::getStackNames):
        * profiler/Profiler.h:

2008-05-15  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Reviewed by Simon.

        Since WebKitGtk is fully using autotools now, clean-up the .pro/.pri files
        from gtk-port.

        * JavaScriptCore.pro:
        * kjs/testkjs.pro:

2008-05-15  Kevin McCullough  <kmccullough@apple.com>

        - Build fix.

        * JavaScriptCore.exp:

2008-05-15  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        <rdar://problem/5770054> JavaScript profiler (10928)
        - Cache some values to save on computing them repetitively. This will be
        a big savings when we sort since we won't have to walk the tree for
        every comparison!
        - We cache these values when we end profiling because otherwise we won't
        know which profile to get the totalTime for the whole profile from without
        retaining a reference to the head profile or looking up the profile from
        the list of all profiles.
        - Also it's safe to assume we won't be asked for these values while we
        are still profiling since the WebInspector only get's profileNodes from
        profiles that are in the allProfiles() list and a profile is only added
        to that list after it has finished and these values will no longer
        change.

        * JavaScriptCore.exp:
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::ProfileNode):
        (KJS::ProfileNode::stopProfiling):
        (KJS::ProfileNode::printDataInspectorStyle):
        (KJS::ProfileNode::printDataSampleStyle):
        (KJS::ProfileNode::endAndRecordCall):
        * profiler/ProfileNode.h:
        (KJS::ProfileNode::totalTime):
        (KJS::ProfileNode::selfTime):
        (KJS::ProfileNode::totalPercent):
        (KJS::ProfileNode::selfPercent):
        * profiler/Profiler.cpp:
        (KJS::Profiler::stopProfiling):

2008-05-15  Simon Hausmann  <shausman@trolltech.com>

        Reviewed by Holger.

        Fix compilation when compiling with MSVC and wchar_t support.

        * wtf/unicode/qt4/UnicodeQt4.h:
        (WTF::Unicode::foldCase):
        (WTF::Unicode::umemcasecmp):

2008-05-14  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        <rdar://problem/5770054> JavaScript profiler (10928)
        - Turn on the profiler.

        * kjs/config.h:

2008-05-14  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        <rdar://problem/5770054> JavaScript profiler (10928)
        - Expose the new profiler functions to the WebInspector.

        * JavaScriptCore.exp:

2008-05-14  Kevin McCullough  <kmccullough@apple.com>

        Giving credit where credit is due.

        * ChangeLog:

2008-05-14  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geoff and Sam.

        <rdar://problem/5770054> JavaScript profiler (10928)
        Add the ability to get percentages of total and self time for displaying
        in the WebInspector.

        * profiler/Profile.h:
        (KJS::Profile::totalProfileTime):
        * profiler/ProfileNode.cpp:
        (KJS::ProfileNode::totalPercent):
        (KJS::ProfileNode::selfPercent):
        * profiler/ProfileNode.h:
        * profiler/Profiler.h:
        (KJS::Profiler::currentProfile):

2008-05-14  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam.

        <rdar://problem/5770054> JavaScript profiler (10928)
        - Rename FunctionCallProfile to ProfileNode.

        * GNUmakefile.am:
        * JavaScriptCore.exp:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * profiler/FunctionCallProfile.cpp: Removed.
        * profiler/FunctionCallProfile.h: Removed.
        * profiler/Profile.cpp:
        (KJS::Profile::Profile):
        (KJS::Profile::willExecute):
        * profiler/Profile.h:
        (KJS::Profile::callTree):
        * profiler/ProfileNode.cpp: Copied from profiler/FunctionCallProfile.cpp.
        (KJS::ProfileNode::ProfileNode):
        (KJS::ProfileNode::willExecute):
        (KJS::ProfileNode::didExecute):
        (KJS::ProfileNode::addChild):
        (KJS::ProfileNode::findChild):
        (KJS::ProfileNode::stopProfiling):
        (KJS::ProfileNode::selfTime):
        (KJS::ProfileNode::printDataInspectorStyle):
        (KJS::ProfileNode::printDataSampleStyle):
        (KJS::ProfileNode::endAndRecordCall):
        * profiler/ProfileNode.h: Copied from profiler/FunctionCallProfile.h.
        (KJS::ProfileNode::create):
        (KJS::ProfileNode::children):
        * profiler/Profiler.cpp:

2008-05-14  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by John.

        <rdar://problem/5770054> JavaScript profiler (10928)
        - Have each FunctionCallProfile be able to return it's total and self time.

        * JavaScriptCore.exp:
        * profiler/FunctionCallProfile.cpp:
        (KJS::FunctionCallProfile::selfTime):
        * profiler/FunctionCallProfile.h:
        (KJS::FunctionCallProfile::totalTime):

2008-05-14  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        <rdar://problem/5934376> REGRESSION: A script fails because of a straw BOM character in it.

        <https://bugs.webkit.org/show_bug.cgi?id=4931>
        Unicode format characters (Cf) should be removed from JavaScript source

        Of all Cf characters, we are only removing BOM, because this is what Firefox trunk has
        settled upon, after extensive discussion and investigation.

        Based on Darin's work on this bug.

        Test: fast/js/removing-Cf-characters.html

        * kjs/lexer.cpp:
        (KJS::Lexer::setCode): Tweak formatting. Use a call to shift(4) to read in the
        first characters, instead of having special case code here.
        (KJS::Lexer::shift): Add a loop when reading a character to skip BOM characters.

2008-05-13  Matt Lilek  <webkit@mattlilek.com>

        Not reviewed, build fix.

        * kjs/date_object.cpp:
        (KJS::DateObjectFuncImp::callAsFunction):

2008-05-13  Anders Carlsson  <andersca@apple.com>

        Reviewed by Sam.

        <rdar://problem/5933644> Implement Date.now
        
        Implement Date.now which returns the number of milliseconds since the epoch.
        
        * kjs/CommonIdentifiers.h:
        * kjs/date_object.cpp:
        (KJS::DateObjectFuncImp::):
        (KJS::DateObjectImp::DateObjectImp):
        (KJS::DateObjectFuncImp::callAsFunction):

2008-05-13  Kevin McCullough  <kmccullough@apple.com>

        Giving credit where credit is due.

        * ChangeLog:

2008-05-13  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Adam and Geoff.

        <rdar://problem/5770054> JavaScript profiler (10928)
        Use PassRefPtrs instead of RefPtrs when appropriate.

        * profiler/FunctionCallProfile.cpp:
        (KJS::FunctionCallProfile::addChild):
        * profiler/FunctionCallProfile.h:
        * profiler/Profile.h:
        (KJS::Profile::callTree):

2008-05-13  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam.

        <rdar://problem/5770054> JavaScript profiler (10928)
        - Made some functions static (as per Adam) and changed from using raw
        pointers to RefPtr for making these JavaScript Objects.

        * profiler/FunctionCallProfile.cpp:
        (KJS::FunctionCallProfile::addChild):
        (KJS::FunctionCallProfile::findChild):
        * profiler/FunctionCallProfile.h:
        (KJS::FunctionCallProfile::create):
        * profiler/Profile.cpp:
        (KJS::Profile::Profile):
        (KJS::Profile::willExecute):
        (KJS::Profile::didExecute):
        (KJS::functionNameCountPairComparator):
        * profiler/Profile.h:
        (KJS::Profile::create):
        (KJS::Profile::title):
        (KJS::Profile::callTree):
        * profiler/Profiler.cpp:
        (KJS::Profiler::startProfiling):
        * profiler/Profiler.h:
        (KJS::Profiler::allProfiles):
        (KJS::Profiler::clearProfiles):

2008-05-13  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoffrey Garen.

        <rdar://problem/4949018> JavaScriptCore API claims to work with UTF8 strings, but only works
        with ASCII strings
        
        * kjs/ustring.h:
        * kjs/ustring.cpp:
        (KJS::UString::Rep::createFromUTF8):
        Added. Implementation adapted from JSStringCreateWithUTF8CString().

        * API/JSStringRef.cpp:
        (JSStringCreateWithUTF8CString):
        * API/JSClassRef.cpp:
        (OpaqueJSClass::OpaqueJSClass):
        Use UString::Rep::createFromUTF8().

2008-05-12  Mark Rowe  <mrowe@apple.com>

        Reviewed by Tim Hatcher.

        <rdar://problem/4859666> WebKit needs availability macros in order to deprecate APIs

        Create WebKit availability macros that key off the Mac OS X version being targeted to
        determine the WebKit version being targeted.  Applications can define
        WEBKIT_VERSION_MIN_REQUIRED before including WebKit headers in order to target a specific
        version of WebKit.

        The availability header is being added to JavaScriptCore rather than WebKit as JavaScriptCore
        is the lowest-level portion of the public WebKit API.

        * API/WebKitAvailability.h: Added.
        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-05-12  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Maciej.

        https://bugs.webkit.org/show_bug.cgi?id=18828
        Reproducible crash with PAC file

        Naively moving JavaScriptCore into thread-specific data was inappropriate in the face of
        exiting JavaScriptCore API clients, which expect a different therading model. Temporarily
        disabling ThreadSpecific implementation until this can be sorted out.

        * wtf/ThreadSpecific.h:
        (WTF::::ThreadSpecific):
        (WTF::::~ThreadSpecific):
        (WTF::::get):
        (WTF::::set):

2008-05-12  Alexey Proskuryakov  <ap@webkit.org>

        Roll out recent  threading changes (r32807, r32810, r32819, r32822) to simplify
        SquirrelFish merging.

        * API/JSBase.cpp:
        (JSGarbageCollect):
        * API/JSCallbackObjectFunctions.h:
        (KJS::::staticFunctionGetter):
        * API/JSClassRef.cpp:
        (OpaqueJSClass::prototype):
        * API/JSObjectRef.cpp:
        (JSObjectMake):
        (JSObjectMakeFunctionWithCallback):
        (JSObjectMakeConstructor):
        (JSObjectMakeFunction):
        * API/JSValueRef.cpp:
        (JSValueMakeNumber):
        (JSValueMakeString):
        * JavaScriptCore.exp:
        * kjs/ExecState.h:
        * kjs/InitializeThreading.cpp:
        (KJS::initializeThreadingOnce):
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::~JSGlobalObject):
        (KJS::JSGlobalObject::init):
        (KJS::JSGlobalObject::put):
        (KJS::JSGlobalObject::reset):
        (KJS::JSGlobalObject::tearOffActivation):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::head):
        (KJS::JSGlobalObject::perThreadData):
        * kjs/JSLock.cpp:
        (KJS::JSLock::registerThread):
        * kjs/JSLock.h:
        (KJS::JSLock::JSLock):
        * kjs/array_instance.cpp:
        (KJS::ArrayInstance::ArrayInstance):
        (KJS::ArrayInstance::lengthGetter):
        * kjs/array_object.cpp:
        (KJS::arrayProtoFuncToString):
        (KJS::arrayProtoFuncToLocaleString):
        (KJS::arrayProtoFuncJoin):
        (KJS::arrayProtoFuncConcat):
        (KJS::arrayProtoFuncPop):
        (KJS::arrayProtoFuncPush):
        (KJS::arrayProtoFuncShift):
        (KJS::arrayProtoFuncSlice):
        (KJS::arrayProtoFuncSplice):
        (KJS::arrayProtoFuncUnShift):
        (KJS::arrayProtoFuncFilter):
        (KJS::arrayProtoFuncMap):
        (KJS::arrayProtoFuncEvery):
        (KJS::arrayProtoFuncForEach):
        (KJS::arrayProtoFuncSome):
        (KJS::arrayProtoFuncIndexOf):
        (KJS::arrayProtoFuncLastIndexOf):
        (KJS::ArrayObjectImp::ArrayObjectImp):
        (KJS::ArrayObjectImp::construct):
        * kjs/bool_object.cpp:
        (KJS::BooleanPrototype::BooleanPrototype):
        (KJS::booleanProtoFuncToString):
        (KJS::BooleanObjectImp::BooleanObjectImp):
        (KJS::BooleanObjectImp::construct):
        * kjs/collector.cpp:
        (KJS::allocateBlock):
        (KJS::Collector::recordExtraCost):
        (KJS::Collector::heapAllocate):
        (KJS::Collector::allocate):
        (KJS::Collector::allocateNumber):
        (KJS::Collector::registerAsMainThread):
        (KJS::onMainThread):
        (KJS::PlatformThread::PlatformThread):
        (KJS::getCurrentPlatformThread):
        (KJS::Collector::Thread::Thread):
        (KJS::destroyRegisteredThread):
        (KJS::initializeRegisteredThreadKey):
        (KJS::Collector::registerThread):
        (KJS::Collector::markStackObjectsConservatively):
        (KJS::Collector::markCurrentThreadConservativelyInternal):
        (KJS::Collector::markCurrentThreadConservatively):
        (KJS::suspendThread):
        (KJS::resumeThread):
        (KJS::getPlatformThreadRegisters):
        (KJS::otherThreadStackPointer):
        (KJS::Collector::markOtherThreadConservatively):
        (KJS::protectedValues):
        (KJS::Collector::protect):
        (KJS::Collector::unprotect):
        (KJS::Collector::collectOnMainThreadOnly):
        (KJS::Collector::markProtectedObjects):
        (KJS::Collector::markMainThreadOnlyObjects):
        (KJS::Collector::sweep):
        (KJS::Collector::collect):
        (KJS::Collector::size):
        (KJS::Collector::globalObjectCount):
        (KJS::Collector::protectedGlobalObjectCount):
        (KJS::Collector::protectedObjectCount):
        (KJS::Collector::protectedObjectTypeCounts):
        (KJS::Collector::isBusy):
        (KJS::Collector::reportOutOfMemoryToAllExecStates):
        * kjs/collector.h:
        (KJS::Collector::cellBlock):
        (KJS::Collector::cellOffset):
        (KJS::Collector::isCellMarked):
        (KJS::Collector::markCell):
        (KJS::Collector::reportExtraMemoryCost):
        * kjs/date_object.cpp:
        (KJS::formatLocaleDate):
        (KJS::DatePrototype::DatePrototype):
        (KJS::DateObjectImp::DateObjectImp):
        (KJS::DateObjectImp::construct):
        (KJS::DateObjectImp::callAsFunction):
        (KJS::DateObjectFuncImp::DateObjectFuncImp):
        (KJS::DateObjectFuncImp::callAsFunction):
        (KJS::dateProtoFuncToString):
        (KJS::dateProtoFuncToUTCString):
        (KJS::dateProtoFuncToDateString):
        (KJS::dateProtoFuncToTimeString):
        (KJS::dateProtoFuncToLocaleString):
        (KJS::dateProtoFuncToLocaleDateString):
        (KJS::dateProtoFuncToLocaleTimeString):
        (KJS::dateProtoFuncValueOf):
        (KJS::dateProtoFuncGetTime):
        (KJS::dateProtoFuncGetFullYear):
        (KJS::dateProtoFuncGetUTCFullYear):
        (KJS::dateProtoFuncToGMTString):
        (KJS::dateProtoFuncGetMonth):
        (KJS::dateProtoFuncGetUTCMonth):
        (KJS::dateProtoFuncGetDate):
        (KJS::dateProtoFuncGetUTCDate):
        (KJS::dateProtoFuncGetDay):
        (KJS::dateProtoFuncGetUTCDay):
        (KJS::dateProtoFuncGetHours):
        (KJS::dateProtoFuncGetUTCHours):
        (KJS::dateProtoFuncGetMinutes):
        (KJS::dateProtoFuncGetUTCMinutes):
        (KJS::dateProtoFuncGetSeconds):
        (KJS::dateProtoFuncGetUTCSeconds):
        (KJS::dateProtoFuncGetMilliSeconds):
        (KJS::dateProtoFuncGetUTCMilliseconds):
        (KJS::dateProtoFuncGetTimezoneOffset):
        (KJS::dateProtoFuncSetTime):
        (KJS::setNewValueFromTimeArgs):
        (KJS::setNewValueFromDateArgs):
        (KJS::dateProtoFuncSetYear):
        (KJS::dateProtoFuncGetYear):
        * kjs/error_object.cpp:
        (KJS::ErrorPrototype::ErrorPrototype):
        (KJS::errorProtoFuncToString):
        (KJS::ErrorObjectImp::ErrorObjectImp):
        (KJS::ErrorObjectImp::construct):
        (KJS::NativeErrorPrototype::NativeErrorPrototype):
        (KJS::NativeErrorImp::NativeErrorImp):
        (KJS::NativeErrorImp::construct):
        * kjs/function.cpp:
        (KJS::FunctionImp::lengthGetter):
        (KJS::FunctionImp::construct):
        (KJS::Arguments::Arguments):
        (KJS::ActivationImp::createArgumentsObject):
        (KJS::encode):
        (KJS::decode):
        (KJS::globalFuncParseInt):
        (KJS::globalFuncParseFloat):
        (KJS::globalFuncEscape):
        (KJS::globalFuncUnescape):
        (KJS::PrototypeFunction::PrototypeFunction):
        (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction):
        * kjs/function_object.cpp:
        (KJS::FunctionPrototype::FunctionPrototype):
        (KJS::functionProtoFuncToString):
        (KJS::FunctionObjectImp::FunctionObjectImp):
        (KJS::FunctionObjectImp::construct):
        * kjs/internal.cpp:
        (KJS::StringImp::toObject):
        * kjs/internal.h:
        (KJS::StringImp::StringImp):
        (KJS::NumberImp::operator new):
        * kjs/list.cpp:
        (KJS::List::markSet):
        (KJS::List::markProtectedListsSlowCase):
        (KJS::List::expandAndAppend):
        * kjs/list.h:
        (KJS::List::List):
        (KJS::List::~List):
        (KJS::List::markProtectedLists):
        * kjs/lookup.h:
        (KJS::staticFunctionGetter):
        (KJS::cacheGlobalObject):
        * kjs/math_object.cpp:
        (KJS::MathObjectImp::getValueProperty):
        (KJS::mathProtoFuncAbs):
        (KJS::mathProtoFuncACos):
        (KJS::mathProtoFuncASin):
        (KJS::mathProtoFuncATan):
        (KJS::mathProtoFuncATan2):
        (KJS::mathProtoFuncCeil):
        (KJS::mathProtoFuncCos):
        (KJS::mathProtoFuncExp):
        (KJS::mathProtoFuncFloor):
        (KJS::mathProtoFuncLog):
        (KJS::mathProtoFuncMax):
        (KJS::mathProtoFuncMin):
        (KJS::mathProtoFuncPow):
        (KJS::mathProtoFuncRandom):
        (KJS::mathProtoFuncRound):
        (KJS::mathProtoFuncSin):
        (KJS::mathProtoFuncSqrt):
        (KJS::mathProtoFuncTan):
        * kjs/nodes.cpp:
        (KJS::ParserRefCounted::ParserRefCounted):
        (KJS::ParserRefCounted::ref):
        (KJS::ParserRefCounted::deref):
        (KJS::ParserRefCounted::refcount):
        (KJS::ParserRefCounted::deleteNewObjects):
        (KJS::Node::handleException):
        (KJS::NumberNode::evaluate):
        (KJS::StringNode::evaluate):
        (KJS::ArrayNode::evaluate):
        (KJS::PostIncResolveNode::evaluate):
        (KJS::PostIncLocalVarNode::evaluate):
        (KJS::PostDecResolveNode::evaluate):
        (KJS::PostDecLocalVarNode::evaluate):
        (KJS::PostDecLocalVarNode::inlineEvaluateToNumber):
        (KJS::PostIncBracketNode::evaluate):
        (KJS::PostDecBracketNode::evaluate):
        (KJS::PostIncDotNode::evaluate):
        (KJS::PostDecDotNode::evaluate):
        (KJS::typeStringForValue):
        (KJS::LocalVarTypeOfNode::evaluate):
        (KJS::TypeOfResolveNode::evaluate):
        (KJS::TypeOfValueNode::evaluate):
        (KJS::PreIncLocalVarNode::evaluate):
        (KJS::PreIncResolveNode::evaluate):
        (KJS::PreDecLocalVarNode::evaluate):
        (KJS::PreDecResolveNode::evaluate):
        (KJS::PreIncConstNode::evaluate):
        (KJS::PreDecConstNode::evaluate):
        (KJS::PostIncConstNode::evaluate):
        (KJS::PostDecConstNode::evaluate):
        (KJS::PreIncBracketNode::evaluate):
        (KJS::PreDecBracketNode::evaluate):
        (KJS::PreIncDotNode::evaluate):
        (KJS::PreDecDotNode::evaluate):
        (KJS::NegateNode::evaluate):
        (KJS::BitwiseNotNode::evaluate):
        (KJS::MultNode::evaluate):
        (KJS::DivNode::evaluate):
        (KJS::ModNode::evaluate):
        (KJS::addSlowCase):
        (KJS::add):
        (KJS::AddNumbersNode::evaluate):
        (KJS::AddStringsNode::evaluate):
        (KJS::AddStringLeftNode::evaluate):
        (KJS::AddStringRightNode::evaluate):
        (KJS::SubNode::evaluate):
        (KJS::LeftShiftNode::evaluate):
        (KJS::RightShiftNode::evaluate):
        (KJS::UnsignedRightShiftNode::evaluate):
        (KJS::BitXOrNode::evaluate):
        (KJS::BitOrNode::evaluate):
        (KJS::valueForReadModifyAssignment):
        (KJS::ForInNode::execute):
        (KJS::TryNode::execute):
        (KJS::FuncDeclNode::makeFunction):
        (KJS::FuncExprNode::evaluate):
        * kjs/nodes.h:
        * kjs/number_object.cpp:
        (KJS::NumberPrototype::NumberPrototype):
        (KJS::numberProtoFuncToString):
        (KJS::numberProtoFuncToLocaleString):
        (KJS::numberProtoFuncToFixed):
        (KJS::numberProtoFuncToExponential):
        (KJS::numberProtoFuncToPrecision):
        (KJS::NumberObjectImp::NumberObjectImp):
        (KJS::NumberObjectImp::getValueProperty):
        (KJS::NumberObjectImp::construct):
        (KJS::NumberObjectImp::callAsFunction):
        * kjs/object.cpp:
        (KJS::JSObject::call):
        (KJS::JSObject::get):
        (KJS::JSObject::put):
        (KJS::JSObject::defineGetter):
        (KJS::JSObject::defineSetter):
        (KJS::JSObject::putDirect):
        (KJS::Error::create):
        * kjs/object.h:
        * kjs/object_object.cpp:
        (KJS::ObjectPrototype::ObjectPrototype):
        (KJS::objectProtoFuncToLocaleString):
        (KJS::objectProtoFuncToString):
        (KJS::ObjectObjectImp::ObjectObjectImp):
        (KJS::ObjectObjectImp::construct):
        * kjs/property_map.h:
        (KJS::SavedProperty::SavedProperty):
        (KJS::SavedProperty::init):
        (KJS::SavedProperty::~SavedProperty):
        (KJS::SavedProperty::name):
        (KJS::SavedProperty::value):
        (KJS::SavedProperty::attributes):
        * kjs/protect.h:
        (KJS::gcProtect):
        (KJS::gcUnprotect):
        * kjs/regexp_object.cpp:
        (KJS::RegExpPrototype::RegExpPrototype):
        (KJS::regExpProtoFuncToString):
        (KJS::RegExpImp::getValueProperty):
        (KJS::RegExpObjectImp::RegExpObjectImp):
        (KJS::RegExpObjectImp::arrayOfMatches):
        (KJS::RegExpObjectImp::getBackref):
        (KJS::RegExpObjectImp::getLastParen):
        (KJS::RegExpObjectImp::getLeftContext):
        (KJS::RegExpObjectImp::getRightContext):
        (KJS::RegExpObjectImp::getValueProperty):
        (KJS::RegExpObjectImp::createRegExpImp):
        * kjs/regexp_object.h:
        * kjs/string_object.cpp:
        (KJS::StringInstance::StringInstance):
        (KJS::StringInstance::lengthGetter):
        (KJS::StringInstance::indexGetter):
        (KJS::stringInstanceNumericPropertyGetter):
        (KJS::StringPrototype::StringPrototype):
        (KJS::replace):
        (KJS::stringProtoFuncCharAt):
        (KJS::stringProtoFuncCharCodeAt):
        (KJS::stringProtoFuncConcat):
        (KJS::stringProtoFuncIndexOf):
        (KJS::stringProtoFuncLastIndexOf):
        (KJS::stringProtoFuncMatch):
        (KJS::stringProtoFuncSearch):
        (KJS::stringProtoFuncReplace):
        (KJS::stringProtoFuncSlice):
        (KJS::stringProtoFuncSplit):
        (KJS::stringProtoFuncSubstr):
        (KJS::stringProtoFuncSubstring):
        (KJS::stringProtoFuncToLowerCase):
        (KJS::stringProtoFuncToUpperCase):
        (KJS::stringProtoFuncToLocaleLowerCase):
        (KJS::stringProtoFuncToLocaleUpperCase):
        (KJS::stringProtoFuncLocaleCompare):
        (KJS::stringProtoFuncBig):
        (KJS::stringProtoFuncSmall):
        (KJS::stringProtoFuncBlink):
        (KJS::stringProtoFuncBold):
        (KJS::stringProtoFuncFixed):
        (KJS::stringProtoFuncItalics):
        (KJS::stringProtoFuncStrike):
        (KJS::stringProtoFuncSub):
        (KJS::stringProtoFuncSup):
        (KJS::stringProtoFuncFontcolor):
        (KJS::stringProtoFuncFontsize):
        (KJS::stringProtoFuncAnchor):
        (KJS::stringProtoFuncLink):
        (KJS::StringObjectImp::StringObjectImp):
        (KJS::StringObjectImp::construct):
        (KJS::StringObjectImp::callAsFunction):
        (KJS::StringObjectFuncImp::StringObjectFuncImp):
        (KJS::StringObjectFuncImp::callAsFunction):
        * kjs/string_object.h:
        (KJS::StringInstanceThatMasqueradesAsUndefined::StringInstanceThatMasqueradesAsUndefined):
        * kjs/testkjs.cpp:
        (GlobalObject::GlobalObject):
        (functionGC):
        (functionRun):
        (functionReadline):
        (kjsmain):
        * kjs/ustring.h:
        * kjs/value.cpp:
        (KJS::JSCell::operator new):
        (KJS::jsString):
        (KJS::jsOwnedString):
        (KJS::jsNumberCell):
        * kjs/value.h:
        (KJS::jsNaN):
        (KJS::jsNumber):
        (KJS::jsNumberFromAnd):
        (KJS::JSCell::marked):
        (KJS::JSCell::mark):
        (KJS::JSValue::toJSNumber):
        * wtf/ThreadSpecific.h:
        (WTF::T):

2008-05-10  Julien Chaffraix  <jchaffraix@webkit.org>

        Qt & wx build fix.

        * JavaScriptCore.pri: Add profiler/Profile.cpp.
        * JavaScriptCoreSources.bkl: Ditto.

2008-05-10  Jan Michael Alonzo  <jmalonzo@unpluggable.com>

        Reviewed by Maciej.

        Gtk+ build fix

        * GNUmakefile.am: Add Profile.cpp in _sources

2008-05-09  Brady Eidson  <beidson@apple.com>

        Build Fix.  Kevin is an idiot.  
        ("My name is Kevin McCullough and I approve this message.")

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2008-05-09  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Tim.

        -<rdar://problem/5770054> JavaScript profiler (10928)
        -Add Profile class so that all profiles can be stored and retrieved by
        the WebInspector when that time comes.

        * JavaScriptCore.exp: Export the new function signatures.
        * JavaScriptCore.xcodeproj/project.pbxproj: Add the new files to the
        project
        * profiler/Profile.cpp: Added. This class represents a single run of the
        profiler.
        (KJS::Profile::Profile):
        (KJS::Profile::willExecute):
        (KJS::Profile::didExecute):
        (KJS::Profile::printDataInspectorStyle):
        (KJS::functionNameCountPairComparator):
        (KJS::Profile::printDataSampleStyle):
        * profiler/Profile.h: Added. Ditto
        (KJS::Profile::stopProfiling):
        * profiler/Profiler.cpp: Now the profiler keeps track of many profiles
        but only runs one at a time.
        (KJS::Profiler::startProfiling):
        (KJS::Profiler::stopProfiling):
        (KJS::Profiler::willExecute):
        (KJS::Profiler::didExecute):
        (KJS::Profiler::printDataInspectorStyle):
        (KJS::Profiler::printDataSampleStyle):
        * profiler/Profiler.h: Ditto.
        (KJS::Profiler::~Profiler):
        (KJS::Profiler::allProfiles):
        (KJS::Profiler::clearProfiles):

2008-05-08  Anders Carlsson  <andersca@apple.com>

        Reviewed by Mark.

        Enable NPAPI plug-ins on 64-bit.
        
        * wtf/Platform.h:

2008-05-07  Julien Chaffraix  <jchaffraix@webkit.org>

        Reviewed by Adam Roben.

        wx & Gtk build fix.

        Add SIZE_MAX definition for the wx port.

        * os-win32/stdint.h:

2008-05-07  Ariya Hidayat  <ariya.hidayat@trolltech.com>

        Reviewed by Simon.

        Support for isMainThread in the Qt port.

        * wtf/ThreadingQt.cpp:
        (WTF::initializeThreading): Adjusted.
        (WTF::isMainThread): Added.

2008-05-05  Darin Adler  <darin@apple.com>

        Reviewed by John Sullivan.

        - fix debug-only leak seen on buildbot

        * wtf/HashTable.h:
        (WTF::HashTable::checkKey): After writing an empty value in, but before constructing a
        deleted value on top of it, call the destructor so the empty value doesn't leak.

2008-05-02  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoffrey Garen.

        Get rid of static data in nodes.cpp (well, at least of non-debug one).

        No measurable change on SunSpider.

        * kjs/InitializeThreading.cpp:
        (KJS::initializeThreadingOnce):
        * kjs/nodes.cpp:
        (KJS::newTrackedObjects):
        (KJS::trackedObjectExtraRefCounts):
        (KJS::initializeNodesThreading):
        (KJS::ParserRefCounted::ParserRefCounted):
        (KJS::ParserRefCounted::ref):
        (KJS::ParserRefCounted::deref):
        (KJS::ParserRefCounted::refcount):
        (KJS::ParserRefCounted::deleteNewObjects):
        * kjs/nodes.h:
        Made newTrackedObjects and trackedObjectExtraRefCounts per-thread.

2008-05-02  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Move call stack depth counter to global object.

        * kjs/ExecState.h: (KJS::ExecState::functionCallDepth): Added a recursion depth counter to
        per-thread data.
        * kjs/JSGlobalObject.cpp: (KJS::JSGlobalObject::init): Initialize PerThreadData.functionCallDepth.
        * kjs/JSGlobalObject.h: (KJS::JSGlobalObject::perThreadData): Made the result non-const.

        * kjs/object.cpp:
        (KJS::throwStackSizeExceededError): Moved throwError to a separate function, since it is now
        the only thing in JSObject::call that needs a PIC branch.
        (KJS::JSObject::call): Use a per-thread variable instead of local static for recursion depth
        tracking.

2008-05-02  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Make JavaScriptGlue and JavaScriptCore API functions implicitly call initializeThreading
        for the sake of non-WebKit clients.

        * API/JSBase.cpp:
        (JSGarbageCollect):
        * API/JSContextRef.cpp:
        (JSGlobalContextCreate):
        These are the JavaScriptCore API bottlenecks. There are a few other JSStringRef
        and JSClassRef functions that can be called earlier, but they do not do anything that
        requires initializeThreading.

        * kjs/InitializeThreading.cpp:
        (KJS::doInitializeThreading):
        (KJS::initializeThreading):
        On Darwin, make the initialization happen under pthread_once, since there is no guarantee
        that non-WebKit clients won't try to call this function re-entrantly.

        * kjs/InitializeThreading.h:
        * wtf/Threading.h:
        Spell out initializeThreading contract.

        * wtf/ThreadingPthreads.cpp: (WTF::isMainThread): Make sure that results are correct on
        Darwin, even if threading was initialized from a secondary thread.

2008-05-02  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoffrey Garen.

        https://bugs.webkit.org/show_bug.cgi?id=18826
        Make JavaScript heap per-thread

        * wtf/ThreadSpecific.h: Make sure to initialize POD thread-specific varaibles, too
        (replaced "new T" with "new T()").

        * kjs/collector.h: Renamed Collector to Heap, made the heap per-thread. Removed support for
        multithreaded access to a heap.
        (KJS::CollectorBlock): Removed collectOnMainThreadOnly bitmap, added a reference to owner heap.
        (KJS::SmallCellCollectorBlock): Ditto.
        (KJS::Heap::markListSet): Moved from a static variable in List.cpp to a per-thread one here.
        (KJS::Heap::heap): Added a method to find which heap a JSValue is allocated in.

        * kjs/collector.cpp: Changed "const size_t" constants to #defines, to avoid a PIC branch
        (gcc was using one to access a constant used in std::max(), because it takes a reference,
        even though std::max() itself was inlined).
        (KJS::Heap::threadHeap): JS heap is now per-thread.
        (KJS::Heap::Heap): Zero-initialize the heap.
        (KJS::allocateBlock): Added NEVER_INLINE, because this function uses a PIC branch, so
        inlining it in Heap::heapAllocate() is bad for performance, now that the latter doesn't
        use any global data.
        (KJS::Heap::heapAllocate): Initialize Block::heap.
        (KJS::Heap::markCurrentThreadConservatively): Moved into markStackObjectsConservatively(),
        as GC only works with a current thread's heap now.
        (KJS::Heap::sweep): Removed collectOnMainThreadOnly checks.
        (KJS::Heap::collect): Ditto.

        * kjs/JSLock.cpp:
        * kjs/JSLock.h:
        (KJS::JSLock::JSLock):
        Removed registerThread(), as the heap no longer cares.

        * kjs/InitializeThreading.cpp: (KJS::initializeThreading): Initialize new per-thread
        variables in Heap and JSGlobalObject.

        * kjs/ExecState.h: (KJS::ExecState::heap): Added a heap pointer for faster access to
        per-thread heap, and an accessor for it.

        * kjs/JSGlobalObject.h: Made JSGlobalObject linked list per-thread.
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::~JSGlobalObject): Fixed a bug in linked list handling. It only worked
        right if the removed object was the head one!
        (KJS::JSGlobalObject::head): Return a per-thread list head.
        (KJS::JSGlobalObject::init): Store a reference to per-thread heap.
        (KJS::JSGlobalObject::reset): Pass ExecState to functions that need it.
        (KJS::JSGlobalObject::tearOffActivation): Ditto.
        (KJS::JSGlobalObject::operator new): JSGlobalObject allocation cannot use an ExecState,
        so it needs a custom operator new that directly accesses per-thread heap.

        * kjs/list.h:
        (KJS::List::List): Replaced m_isInMarkSet boolean with an actual pointer to the set, since it
        is no longer a single static object.
        (KJS::List::~List): Ditto.
        * kjs/list.cpp:
        (KJS::List::markSet): Removed, this is now stored in Heap.
        (KJS::List::markProtectedLists): Take a reference to the list.
        (KJS::List::expandAndAppend): Ask the current thread heap for a mark set reference.

        * kjs/protect.h:
        (KJS::gcProtect):
        (KJS::gcUnprotect):
        Use the newly added Heap::heap() method to find out which heap the value to be (un)protected
        belongs to.

        * kjs/property_map.h: Removed unused SavedProperty class.

        * JavaScriptCore.exp:
        * API/JSBase.cpp:
        (JSGarbageCollect):
        * API/JSCallbackObjectFunctions.h:
        (KJS::::staticFunctionGetter):
        * API/JSClassRef.cpp:
        (OpaqueJSClass::prototype):
        * API/JSObjectRef.cpp:
        (JSObjectMake):
        (JSObjectMakeFunctionWithCallback):
        (JSObjectMakeConstructor):
        (JSObjectMakeFunction):
        * API/JSValueRef.cpp:
        (JSValueMakeNumber):
        (JSValueMakeString):
        * kjs/array_instance.cpp:
        (KJS::ArrayInstance::ArrayInstance):
        (KJS::ArrayInstance::lengthGetter):
        * kjs/array_object.cpp:
        (KJS::arrayProtoFuncToString):
        (KJS::arrayProtoFuncToLocaleString):
        (KJS::arrayProtoFuncJoin):
        (KJS::arrayProtoFuncConcat):
        (KJS::arrayProtoFuncPop):
        (KJS::arrayProtoFuncPush):
        (KJS::arrayProtoFuncShift):
        (KJS::arrayProtoFuncSlice):
        (KJS::arrayProtoFuncSplice):
        (KJS::arrayProtoFuncUnShift):
        (KJS::arrayProtoFuncFilter):
        (KJS::arrayProtoFuncMap):
        (KJS::arrayProtoFuncEvery):
        (KJS::arrayProtoFuncForEach):
        (KJS::arrayProtoFuncSome):
        (KJS::arrayProtoFuncIndexOf):
        (KJS::arrayProtoFuncLastIndexOf):
        (KJS::ArrayObjectImp::ArrayObjectImp):
        (KJS::ArrayObjectImp::construct):
        * kjs/bool_object.cpp:
        (KJS::BooleanPrototype::BooleanPrototype):
        (KJS::booleanProtoFuncToString):
        (KJS::BooleanObjectImp::BooleanObjectImp):
        (KJS::BooleanObjectImp::construct):
        * kjs/date_object.cpp:
        (KJS::formatLocaleDate):
        (KJS::DatePrototype::DatePrototype):
        (KJS::DateObjectImp::DateObjectImp):
        (KJS::DateObjectImp::construct):
        (KJS::DateObjectImp::callAsFunction):
        (KJS::DateObjectFuncImp::DateObjectFuncImp):
        (KJS::DateObjectFuncImp::callAsFunction):
        (KJS::dateProtoFuncToString):
        (KJS::dateProtoFuncToUTCString):
        (KJS::dateProtoFuncToDateString):
        (KJS::dateProtoFuncToTimeString):
        (KJS::dateProtoFuncToLocaleString):
        (KJS::dateProtoFuncToLocaleDateString):
        (KJS::dateProtoFuncToLocaleTimeString):
        (KJS::dateProtoFuncValueOf):
        (KJS::dateProtoFuncGetTime):
        (KJS::dateProtoFuncGetFullYear):
        (KJS::dateProtoFuncGetUTCFullYear):
        (KJS::dateProtoFuncToGMTString):
        (KJS::dateProtoFuncGetMonth):
        (KJS::dateProtoFuncGetUTCMonth):
        (KJS::dateProtoFuncGetDate):
        (KJS::dateProtoFuncGetUTCDate):
        (KJS::dateProtoFuncGetDay):
        (KJS::dateProtoFuncGetUTCDay):
        (KJS::dateProtoFuncGetHours):
        (KJS::dateProtoFuncGetUTCHours):
        (KJS::dateProtoFuncGetMinutes):
        (KJS::dateProtoFuncGetUTCMinutes):
        (KJS::dateProtoFuncGetSeconds):
        (KJS::dateProtoFuncGetUTCSeconds):
        (KJS::dateProtoFuncGetMilliSeconds):
        (KJS::dateProtoFuncGetUTCMilliseconds):
        (KJS::dateProtoFuncGetTimezoneOffset):
        (KJS::dateProtoFuncSetTime):
        (KJS::setNewValueFromTimeArgs):
        (KJS::setNewValueFromDateArgs):
        (KJS::dateProtoFuncSetYear):
        (KJS::dateProtoFuncGetYear):
        * kjs/error_object.cpp:
        (KJS::ErrorPrototype::ErrorPrototype):
        (KJS::errorProtoFuncToString):
        (KJS::ErrorObjectImp::ErrorObjectImp):
        (KJS::ErrorObjectImp::construct):
        (KJS::NativeErrorPrototype::NativeErrorPrototype):
        (KJS::NativeErrorImp::NativeErrorImp):
        (KJS::NativeErrorImp::construct):
        * kjs/function.cpp:
        (KJS::FunctionImp::lengthGetter):
        (KJS::FunctionImp::construct):
        (KJS::Arguments::Arguments):
        (KJS::ActivationImp::createArgumentsObject):
        (KJS::encode):
        (KJS::decode):
        (KJS::globalFuncParseInt):
        (KJS::globalFuncParseFloat):
        (KJS::globalFuncEscape):
        (KJS::globalFuncUnescape):
        (KJS::PrototypeFunction::PrototypeFunction):
        (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction):
        * kjs/function_object.cpp:
        (KJS::FunctionPrototype::FunctionPrototype):
        (KJS::functionProtoFuncToString):
        (KJS::FunctionObjectImp::FunctionObjectImp):
        (KJS::FunctionObjectImp::construct):
        * kjs/internal.cpp:
        (KJS::StringImp::toObject):
        * kjs/internal.h:
        (KJS::StringImp::StringImp):
        (KJS::NumberImp::operator new):
        * kjs/lookup.h:
        (KJS::staticFunctionGetter):
        (KJS::cacheGlobalObject):
        * kjs/math_object.cpp:
        (KJS::MathObjectImp::getValueProperty):
        (KJS::mathProtoFuncAbs):
        (KJS::mathProtoFuncACos):
        (KJS::mathProtoFuncASin):
        (KJS::mathProtoFuncATan):
        (KJS::mathProtoFuncATan2):
        (KJS::mathProtoFuncCeil):
        (KJS::mathProtoFuncCos):
        (KJS::mathProtoFuncExp):
        (KJS::mathProtoFuncFloor):
        (KJS::mathProtoFuncLog):
        (KJS::mathProtoFuncMax):
        (KJS::mathProtoFuncMin):
        (KJS::mathProtoFuncPow):
        (KJS::mathProtoFuncRandom):
        (KJS::mathProtoFuncRound):
        (KJS::mathProtoFuncSin):
        (KJS::mathProtoFuncSqrt):
        (KJS::mathProtoFuncTan):
        * kjs/nodes.cpp:
        (KJS::Node::handleException):
        (KJS::NumberNode::evaluate):
        (KJS::StringNode::evaluate):
        (KJS::ArrayNode::evaluate):
        (KJS::PostIncResolveNode::evaluate):
        (KJS::PostIncLocalVarNode::evaluate):
        (KJS::PostDecResolveNode::evaluate):
        (KJS::PostDecLocalVarNode::evaluate):
        (KJS::PostDecLocalVarNode::inlineEvaluateToNumber):
        (KJS::PostIncBracketNode::evaluate):
        (KJS::PostDecBracketNode::evaluate):
        (KJS::PostIncDotNode::evaluate):
        (KJS::PostDecDotNode::evaluate):
        (KJS::typeStringForValue):
        (KJS::LocalVarTypeOfNode::evaluate):
        (KJS::TypeOfResolveNode::evaluate):
        (KJS::TypeOfValueNode::evaluate):
        (KJS::PreIncLocalVarNode::evaluate):
        (KJS::PreIncResolveNode::evaluate):
        (KJS::PreDecLocalVarNode::evaluate):
        (KJS::PreDecResolveNode::evaluate):
        (KJS::PreIncConstNode::evaluate):
        (KJS::PreDecConstNode::evaluate):
        (KJS::PostIncConstNode::evaluate):
        (KJS::PostDecConstNode::evaluate):
        (KJS::PreIncBracketNode::evaluate):
        (KJS::PreDecBracketNode::evaluate):
        (KJS::PreIncDotNode::evaluate):
        (KJS::PreDecDotNode::evaluate):
        (KJS::NegateNode::evaluate):
        (KJS::BitwiseNotNode::evaluate):
        (KJS::MultNode::evaluate):
        (KJS::DivNode::evaluate):
        (KJS::ModNode::evaluate):
        (KJS::addSlowCase):
        (KJS::add):
        (KJS::AddNumbersNode::evaluate):
        (KJS::AddStringsNode::evaluate):
        (KJS::AddStringLeftNode::evaluate):
        (KJS::AddStringRightNode::evaluate):
        (KJS::SubNode::evaluate):
        (KJS::LeftShiftNode::evaluate):
        (KJS::RightShiftNode::evaluate):
        (KJS::UnsignedRightShiftNode::evaluate):
        (KJS::BitXOrNode::evaluate):
        (KJS::BitOrNode::evaluate):
        (KJS::valueForReadModifyAssignment):
        (KJS::ForInNode::execute):
        (KJS::TryNode::execute):
        (KJS::FuncDeclNode::makeFunction):
        (KJS::FuncExprNode::evaluate):
        * kjs/number_object.cpp:
        (KJS::NumberPrototype::NumberPrototype):
        (KJS::numberProtoFuncToString):
        (KJS::numberProtoFuncToLocaleString):
        (KJS::numberProtoFuncToFixed):
        (KJS::numberProtoFuncToExponential):
        (KJS::numberProtoFuncToPrecision):
        (KJS::NumberObjectImp::NumberObjectImp):
        (KJS::NumberObjectImp::getValueProperty):
        (KJS::NumberObjectImp::construct):
        (KJS::NumberObjectImp::callAsFunction):
        * kjs/object.cpp:
        (KJS::JSObject::defineGetter):
        (KJS::JSObject::defineSetter):
        (KJS::JSObject::putDirect):
        (KJS::Error::create):
        * kjs/object.h:
        * kjs/object_object.cpp:
        (KJS::ObjectPrototype::ObjectPrototype):
        (KJS::objectProtoFuncToLocaleString):
        (KJS::objectProtoFuncToString):
        (KJS::ObjectObjectImp::ObjectObjectImp):
        (KJS::ObjectObjectImp::construct):
        * kjs/regexp_object.cpp:
        (KJS::RegExpPrototype::RegExpPrototype):
        (KJS::regExpProtoFuncToString):
        (KJS::RegExpImp::getValueProperty):
        (KJS::RegExpObjectImp::RegExpObjectImp):
        (KJS::RegExpObjectImp::arrayOfMatches):
        (KJS::RegExpObjectImp::getBackref):
        (KJS::RegExpObjectImp::getLastParen):
        (KJS::RegExpObjectImp::getLeftContext):
        (KJS::RegExpObjectImp::getRightContext):
        (KJS::RegExpObjectImp::getValueProperty):
        (KJS::RegExpObjectImp::createRegExpImp):
        * kjs/regexp_object.h:
        * kjs/string_object.cpp:
        (KJS::StringInstance::StringInstance):
        (KJS::StringInstance::lengthGetter):
        (KJS::StringInstance::indexGetter):
        (KJS::stringInstanceNumericPropertyGetter):
        (KJS::StringPrototype::StringPrototype):
        (KJS::replace):
        (KJS::stringProtoFuncCharAt):
        (KJS::stringProtoFuncCharCodeAt):
        (KJS::stringProtoFuncConcat):
        (KJS::stringProtoFuncIndexOf):
        (KJS::stringProtoFuncLastIndexOf):
        (KJS::stringProtoFuncMatch):
        (KJS::stringProtoFuncSearch):
        (KJS::stringProtoFuncReplace):
        (KJS::stringProtoFuncSlice):
        (KJS::stringProtoFuncSplit):
        (KJS::stringProtoFuncSubstr):
        (KJS::stringProtoFuncSubstring):
        (KJS::stringProtoFuncToLowerCase):
        (KJS::stringProtoFuncToUpperCase):
        (KJS::stringProtoFuncToLocaleLowerCase):
        (KJS::stringProtoFuncToLocaleUpperCase):
        (KJS::stringProtoFuncLocaleCompare):
        (KJS::stringProtoFuncBig):
        (KJS::stringProtoFuncSmall):
        (KJS::stringProtoFuncBlink):
        (KJS::stringProtoFuncBold):
        (KJS::stringProtoFuncFixed):
        (KJS::stringProtoFuncItalics):
        (KJS::stringProtoFuncStrike):
        (KJS::stringProtoFuncSub):
        (KJS::stringProtoFuncSup):
        (KJS::stringProtoFuncFontcolor):
        (KJS::stringProtoFuncFontsize):
        (KJS::stringProtoFuncAnchor):
        (KJS::stringProtoFuncLink):
        (KJS::StringObjectImp::StringObjectImp):
        (KJS::StringObjectImp::construct):
        (KJS::StringObjectImp::callAsFunction):
        (KJS::StringObjectFuncImp::StringObjectFuncImp):
        (KJS::StringObjectFuncImp::callAsFunction):
        * kjs/string_object.h:
        (KJS::StringInstanceThatMasqueradesAsUndefined::StringInstanceThatMasqueradesAsUndefined):
        * kjs/testkjs.cpp:
        (GlobalObject::GlobalObject):
        (functionGC):
        (functionRun):
        (functionReadline):
        (kjsmain):
        * kjs/ustring.h:
        * kjs/value.cpp:
        (KJS::JSCell::operator new):
        (KJS::jsString):
        (KJS::jsOwnedString):
        (KJS::jsNumberCell):
        * kjs/value.h:
        (KJS::jsNaN):
        (KJS::jsNumber):
        (KJS::jsNumberFromAnd):
        (KJS::JSCell::marked):
        (KJS::JSCell::mark):
        (KJS::JSValue::toJSNumber):
        Removed collectOnMainThreadOnly, as this is the only way to collect now. Replaced calls to
        static Collector methods with calls to per-thread Heap ones.

2008-05-02  Dan Bernstein  <mitz@apple.com>

        Reviewed by Maciej Stachowiak.

        - Mac build fix

        * wtf/StrHash.h: Added header guards and removed #include "config.h".

2008-05-01  Ada Chan  <adachan@apple.com>

        #include <wtf/StrHash.h> in identifier.cpp.

        Reviewed by Maciej.

        * kjs/identifier.cpp:

2008-05-01  Steve Falkenburg  <sfalken@apple.com>

        Build fix.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2008-05-01  Sam Weinig  <sam@webkit.org>

        Fix build.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-05-01  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Darin.

        <rdar://problem/5770054> JavaScript profiler (10928)
        - Fix "sample" output so that it can be imported into Instruments
        - Also keep track of number of times a function is profiled.

        * JavaScriptCore.xcodeproj/project.pbxproj: Add StrHash.h which needed
        to be pulled out of identifier.cpp so that it could be used by the
        profiler and identifiers.
        * kjs/identifier.cpp: Ditto.
        * profiler/FunctionCallProfile.cpp:
        (KJS::FunctionCallProfile::printDataInspectorStyle): Inspector style
        printing should show microseconds.
        (KJS::FunctionCallProfile::printDataSampleStyle): Sample style printing
        now counts the number of times a function is in the stack tree and does
        not print microseconds since that does not make sense for a sampler.
        * profiler/FunctionCallProfile.h: Keep track of number of times a
        function is profiled.
        (KJS::FunctionCallProfile::numberOfCalls):
        * profiler/Profiler.cpp:
        (KJS::functionNameCountPairComparator): Comparator for sort function in
        printDataSampleStyle.
        (KJS::Profiler::printDataSampleStyle): Print the number of times that a
        function is listed in the stack tree in order of most times listed.
        * wtf/HashCountedSet.h: Added copyToVector since it didn't exist and is
        a more standard way to copy a HashSet to a Vector. I added on variant
        that takes a pair as the Vector's type and so the HashCountedSet simply
        fills in that pair with its internal pair, and another variant that
        takes a Vector of the type of the HashCountedSet and only fills in the
        Vector with the first element of the pair.
        (WTF::copyToVector):
        * wtf/StrHash.h: Added.
        (WTF::):

2008-04-29  David Kilzer  <ddkilzer@apple.com>

        BUILD FIX for ENABLE(DASHBOARD_SUPPORT)

        * wtf/Platform.h: Defined ENABLE(DASHBOARD_SUPPORT) to 1 only for
        PLATFORM(MAC) and PLATFORM(WIN).  Changed default to 0 for other
        ports.

2008-04-29  Greg Bolsinga  <bolsinga@apple.com>

        Reviewed by Darin.

        Wrapped Dashboard code with ENABLE(DASHBOARD_SUPPORT)

        * wtf/Platform.h:

2008-04-29  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geoff.

        -<rdar://problem/5770054> JavaScript profiler (10928)
        -Keep call count.

        * profiler/FunctionCallProfile.cpp:
        (KJS::FunctionCallProfile::FunctionCallProfile):
        (KJS::FunctionCallProfile::didExecute): Implements call count and fixed a bug where a stackIndex
        of 0 was causing the assert to be hit.
        (KJS::FunctionCallProfile::stopProfiling):
        (KJS::FunctionCallProfile::endAndRecordCall):
        * profiler/FunctionCallProfile.h:

2008-04-29  Simon Hausmann  <hausmann@webkit.org>

        Qt/Windows build fix. The externally declared hash tables are actually
        declared const and the const is mangled in the symbol name, so when
        importing they also need to be marked const.

        When compiling without MULTIPLE_THREADS use a const HashTable&
        instead of a HashTable& in ThreadClassInfoHashTables to avoid
        initializing the latter with a const reference.

        * kjs/JSGlobalObject.cpp:

2008-04-28  Alexey Proskuryakov  <ap@webkit.org>

        Windows build fix.

        * kjs/ExecState.h: For whatever reason, MSVC couldn't generate a default constructor for
        a struct that had a "const List" member. Removing the const qulifier makes the problem go away.

2008-04-28  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Fix run-webkit-tests --threading
        and provisionally fix <https://bugs.webkit.org/show_bug.cgi?id=18661>
        Proxy server issue in Sunday's Nightly

        Changed ClassInfo objects for built-in objects to hold a getter function returning
        a per-thread instance. This makes it safe to share these ClassInfo objects between threads -
        and these are the only ones that need to be shared.

        * kjs/lexer.cpp:
        (KJS::Lexer::Lexer):
        (KJS::Lexer::~Lexer):
        * kjs/lexer.h:
        Made mainTable a member of Lexer, so that it no longer needs to be shared between threads.

        * kjs/object.cpp:
        (KJS::JSObject::deleteProperty):
        (KJS::JSObject::findPropertyHashEntry):
        (KJS::JSObject::propertyIsEnumerable):
        (KJS::JSObject::getPropertyAttributes):
        (KJS::JSObject::getPropertyNames):
        * kjs/object.h:
        (KJS::ClassInfo::propHashTable):
        Added a new classPropHashTableGetterFunction field to ClassInfo. If it is non-zero, the
        static table is not used.

        * kjs/JSGlobalObject.cpp:
        (KJS::ThreadClassInfoHashTables::ThreadClassInfoHashTables): This new class holds per-thread
        HashTables for built-in classes. The old static structs are copied to create per-thread
        instances.
        (KJS::JSGlobalObject::threadClassInfoHashTables): An accessor/initializer for the above.
        (KJS::JSGlobalObject::init): Copy per-thread data into a single structure for faster access.
        Also, construct globalExec.
        (KJS::JSGlobalObject::reset): Adapted for globalExec now being an OwnPtr.
        (KJS::JSGlobalObject::mark): Ditto.
        (KJS::JSGlobalObject::globalExec): Ditto.
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): Made JSGlobalObject::JSGlobalObjectData::globalExec an OwnPtr, so that it can
        be initialized from JSGlobalObject::init() after them. Otherwise, ExecState constructor was
        trying to access half-initialized JSGlobalObject to make its own copy of these table
        references, and failed.
        (KJS::JSGlobalObject::JSGlobalObject): Pass "this" value to init() to create globalExec.
        (KJS::JSGlobalObject::perThreadData): An accessor for per-thread data.

        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        * kjs/ExecState.h:
        (KJS::ExecState::propertyNames):
        (KJS::ExecState::emptyList):
        (KJS::ExecState::arrayTable):
        (KJS::ExecState::dateTable):
        (KJS::ExecState::mathTable):
        (KJS::ExecState::numberTable):
        (KJS::ExecState::RegExpImpTable):
        (KJS::ExecState::RegExpObjectImpTable):
        (KJS::ExecState::stringTable):
        * kjs/ExecStateInlines.h:
        (KJS::ExecState::ExecState):
        Each ExecState holds its own reference to per-thread data, for even faster access. Moved
        m_emptyList and m_propertyNames to the same structure, making ExecState faster to construct
        and take less space on the stack.

        * kjs/InitializeThreading.cpp: (KJS::initializeThreading): Initialize thread-static data
        added to JSGlobalObject.

        * API/JSCallbackConstructor.cpp:
        * API/JSCallbackFunction.cpp:
        * API/JSCallbackObject.cpp:
        * JavaScriptCore.exp:
        * kjs/JSVariableObject.cpp:
        (KJS::JSVariableObject::getPropertyAttributes):
        * kjs/JSVariableObject.h:
        * kjs/array_instance.cpp:
        * kjs/array_object.cpp:
        (KJS::ArrayPrototype::getOwnPropertySlot):
        * kjs/bool_object.cpp:
        * kjs/create_hash_table:
        * kjs/date_object.cpp:
        (KJS::DatePrototype::getOwnPropertySlot):
        (KJS::DateObjectImp::DateObjectImp):
        * kjs/error_object.cpp:
        * kjs/function.cpp:
        * kjs/function_object.cpp:
        (KJS::FunctionPrototype::FunctionPrototype):
        * kjs/internal.cpp:
        * kjs/lookup.h:
        * kjs/math_object.cpp:
        (KJS::MathObjectImp::getOwnPropertySlot):
        * kjs/number_object.cpp:
        (KJS::NumberObjectImp::getOwnPropertySlot):
        * kjs/object_object.cpp:
        (KJS::ObjectPrototype::ObjectPrototype):
        * kjs/regexp_object.cpp:
        (KJS::RegExpPrototype::RegExpPrototype):
        (KJS::RegExpImp::getOwnPropertySlot):
        (KJS::RegExpImp::put):
        (KJS::RegExpObjectImp::getOwnPropertySlot):
        (KJS::RegExpObjectImp::put):
        * kjs/string_object.cpp:
        (KJS::StringPrototype::getOwnPropertySlot):
        Adjust for the above changes.

2008-04-28  Darin Adler  <darin@apple.com>

        Reviewed by Adam.

        - make sure RefPtr's default hash doesn't ref/deref when computing the hash
        - remove remnants of the hash table storage type optimization

        * wtf/HashFunctions.h: Used "using" to get the hash and equal functions
        from PtrHash<P*> into PtrHash<RefPtr<P>>.

        * wtf/HashMap.h: Replaced uses of PairBaseHashTraits with PairHashTraits.
        Eliminated storage-related typedefs. Removed constructor, destructor,
        copy constructor, and destructor since the compiler-generated ones are
        fine. Removed refAll and derefAll. Took out unnnecessary typecasts.
        Removed use of RefCounter.

        * wtf/HashSet.h: Eliminated storage-related typedefs. Removed constructor,
        destructor, copy constructor, and destructor since the compiler-generated
        ones are fine. Removed refAll and derefAll. Removed unneeded template
        arguents from HashSetTranslatorAdapter. Eliminated unneeded HashSetTranslator
        template.

        * wtf/HashTable.h: Tweaked formatting. Removed NeedsRef, RefCounterBase,
        RefCounter, HashTableRefCounterBase, HashTableRefCounter, and Assigner
        class templates.

        * wtf/HashTraits.h: Removed StorageTraits, needsRef, PairBaseHashTraits,
        and HashKeyStorageTraits.

        * wtf/RefPtrHashMap.h: Made all the same fixes as in HashMap. Also made
        the corresponding changes to RefPtrHashMapRawKeyTranslator.

2008-04-28  Darin Adler  <darin@apple.com>

        Reviewed by Mitz.

        - fix assertion hit every time you view www.apple.com

        * kjs/PropertyNameArray.cpp:
        (KJS::PropertyNameArray::add): Changed assertion to allow null and empty strings.
        Now to find out why we have a property named "" and if that's a bug!

2008-04-27  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej Stachowiak.

        Fix crash inside PtrHash::hash when loading a page.

        * wtf/HashFunctions.h: Explicitly use the superclass implementation of hash to avoid infinite recursion.

2008-04-27  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix <rdar://problem/5657459> REGRESSION: JavaScriptCore no longer builds with
          GCC 4.2 due to pointer aliasing warnings

        Fix this by removing the HashTable optimizations that allowed us to share a back end
        implementation between hash tables with integers, pointers, RefPtr, and String objects
        as keys. The way it worked was incompatible with strict aliasing.

        This increases code size. On Mac OS X we'll have to regenerate .order files to avoid
        slowing down Safari startup times.

        This creates a slight slowdown in SunSpider, mitigated by the following four speedups:

        - speed up array put slightly by moving a branch (was already done for get)

        - speed up symbol table access by adding a function named inlineGet to HashMap
          and using that in symbolTableGet/Put

        - speed up PropertyNameArray creation by reducing the amount of reference count
          churn and uniqueness checking when adding names and not doing any allocation at
          all when building small arrays

        - speed up conversion of strings to floating point numbers by eliminating the
          malloc/free of the buffer for the ASCII copy of the string; a way to make
          things even faster would be to change strtod to take a UTF-16 string

        Note that there is considerable unused complexity now in HashSet/Map/Table to support
        "storage types", which is no longer used. Will do in a separate patch.

        * API/JSCallbackObjectFunctions.h:
        (KJS::JSCallbackObject<Base>::getPropertyNames): Removed explicit cast to Identifier to
        take advantage of the new PropertyNameArray::add overload and avoid reference count churn.
        * API/JSObjectRef.cpp:
        (JSPropertyNameAccumulatorAddName): Ditto.
        * JavaScriptCore.exp: Updated PropertyNameArray::add entry point name.

        * kjs/JSVariableObject.cpp: Removed now-unneeded IdentifierRepHashTraits::nullRepPtr
        definition (see below).
        (KJS::JSVariableObject::getPropertyNames): Removed explicit cast to Identifier.

        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTableGet): Use inlineGet for speed. Also changed to do
        early exit instead of nesting the body inside an if.
        (KJS::JSVariableObject::symbolTablePut): Ditto.

        * kjs/PropertyNameArray.cpp:
        (KJS::PropertyNameArray::add): Changed implementation to take a raw pointer instead of
        a reference to an identifier. Do uniqueness checking by searching the vector when the
        vector is short, only building the set once the vector is large enough.

        * kjs/PropertyNameArray.h: Added an overload of add for a raw pointer, and made the old
        add function call that one. Added an addKnownUnique function for use when the new
        name is known to be different from any other in the array. Changed the vector to have
        an inline capacity of 20.

        * kjs/SymbolTable.h: Changed IdentifierRepHash to inherit from the default hash for
        a RefPtr so we don't have to define so much. Added an overload of the hash function for
        a raw pointer as required by the new RefPtrHashMap. Got rid of the now-unneeded
        IdentifierRepHashTraits -- the default traits now work fine. Added a definition of
        empthValueIsZero to SymbolTableIndexHashTraits; not having it was incorrect, but harmless.

        * kjs/array_instance.cpp:
        (KJS::ArrayInstance::put): Move the maxArrayIndex check inside the branch that checks
        the index against the length, as done in the get function.

        * kjs/function.cpp:
        (KJS::globalFuncKJSPrint): Changed to use the new getCString instead of cstring.

        * kjs/internal.cpp: Removed printInfo debugging function, a client of cstring.
        If we need a debugging function we can easily make a better one and we haven't
        used this one in a long time.
        * kjs/internal.h: Ditto.

        * kjs/object.cpp:
        (KJS::JSObject::getPropertyNames): Removed explicit cast to Identifier.
        * kjs/property_map.cpp:
        (KJS::PropertyMap::getEnumerablePropertyNames): Ditto. Also added a special case for
        the case where the propertyNames array is empty -- in that case we know we're adding
        a set of names that are non-overlapping so we can use addKnownUnique.
        * kjs/ustring.cpp:
        (KJS::UString::getCString): Replaces cstring. Puts the C string into a CStringBuffer,
        which is a char Vector with an inline capacity. Also returns a boolean to indicate if
        the converion was lossy, which eliminates the need for a separate is8Bit call.
        (KJS::UString::toDouble): Changed to call getCString instead of cstring.
        * kjs/ustring.h: Ditto.

        * wtf/HashFunctions.h: Overload the hash and equal functions for RefPtr's default
        hash to take raw pointers. This works with the changes to RefPtrHashMap to avoid
        introducing refcount churn.

        * wtf/HashMap.h: Removed special code to convert the deleted value to the empty value
        when writing a new value into the map. This is now handled elsewhere.
        (WTF::HashMap::get): Removed code that checks for an empty hash table before calling
        HashTable::lookup; it's slightly more efficient to do this check inside lookup.

        * wtf/HashTable.h:
        (WTF::HashTable::isDeletedBucket): Changed to use isDeletedValue instead of using
        deletedValue and the equality operator.
        (WTF::HashTable::deleteBucket): Changed to use constructDeletedValue instead of
        using deletedValue and the assignment operator.
        (WTF::HashTable::checkKey): Added. Factors out the check for values that are empty
        or deleted keys that's used in various functions below.
        (WTF::HashTable::lookup): Changed to use checkKey, check for a 0 table, and also
        made public for use by RefPtrHashMap.
        (WTF::HashTable::lookupForWriting): Changed to use checkKey.
        (WTF::HashTable::fullLookupForWriting): Changed to use checkKey.
        (WTF::HashTable::add): Changed to use checkKey, and call initializeBucket on a
        deleted bucket before putting a new entry into it.
        (WTF::HashTable::addPassingHashCode): Ditto.
        (WTF::HashTable::deallocateTable): Check isDeletedBucket before calling ~ValueType.

        * wtf/HashTraits.h: Got ridd of all the HashTraits specialization for the integer
        types, since GeneicHashTraitsBase already deals with integers separately. Put the
        deleted value support into GenericHashTraitsBase. Changed FloatHashTraits to
        inherit from GenericHashTraits, and define construct/isDeletedValue rather than
        deletedValue. Removed the ref and deref functions from RefPtr's HashTraits, and
        defined construct/isDeletedValue. Eliminated DeletedValueAssigner. Changed
        PairHashTraits to define construct/isDeletedValue, and also merged
        PairBaseHashTraits in with PairHashTraits. Got rid of all specialization of
        HashKeyStorageTraits. We'll remove that, and the needsRef data member, later.

        * wtf/RefPtr.h: Added HashTableDeletedValueType, an enum type with a single value,
        HashTableDeletedValue. Used that type to make a new constructor to construct
        deleted values and also added an isHashTableDeletedValue function.

        * wtf/RefPtrHashMap.h: Added RefPtrHashMapRawKeyTranslator and used it to implement
        the raw pointer functions. This is a way to continue to avoid refcount thrash. We
        can't use the old way because it depended on the underlying map using a non-RefPtr
        type.
        (WTF::HashMap::find): Use find with RefPtrHashMapRawKeyTranslator.
        (WTF::HashMap::contains): Use contains with RefPtrHashMapRawKeyTranslator.
        (WTF::HashMap::inlineAdd): Use add with RefPtrHashMapRawKeyTranslator.
        (WTF::HashMap::get): Removed code that checks for an empty hash table before calling
        HashTable::lookup; it's slightly more efficient to do this check inside lookup.
        (WTF::HashMap::inlineGet): Added. Just like get, but marked inline for use in the
        symbol table code.

2008-04-25  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Mark Rowe.

        Remove SavedBuiltins and SavedProperties classes and the methods used to
        save data to them.  The CachedPage now stores a the JSGlobalObject in full.

        * JavaScriptCore.exp:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/JSGlobalObject.cpp:
        * kjs/JSGlobalObject.h:
        * kjs/JSVariableObject.cpp:
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::localStorage):
        * kjs/SavedBuiltins.h: Removed.
        * kjs/object.h:
        * kjs/property_map.cpp:
        * kjs/property_map.h:

2008-04-25  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Sam Weinig.

        Add some content to an empty ICU header file to prevent verification errors.

        * icu/unicode/utf_old.h:

2008-04-25  David Kilzer  <ddkilzer@apple.com>

        <rdar://problem/5819422> REGRESSION: Wrong line number passed to -willLeaveCallFrame

        Patch by George Dicker and Michael Kahl.  Reviewed by Darin.

        When -[NSObject(WebScriptDebugDelegate) webView:willLeaveCallFrame:sourceId:line:forWebFrame:]
        is invoked, the first line number of the function is returned instead of the last
        line number.  This regressed in r28458.

        * kjs/nodes.cpp:
        (KJS::FunctionBodyNodeWithDebuggerHooks::execute): Pass lastLine() instead of lineNo()
        when calling Debugger::returnEvent().

2008-04-25  Darin Adler  <darin@apple.com>

        Done with Stephanie Lewis.

        * JavaScriptCore.xcodeproj/project.pbxproj: Prepare for compilation with gcc 4.2 by
        adding -fno-strict-aliasing to CollatorICU.cpp.

2008-04-24  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        Add a #define to easily enable collecting on every allocation to aid
        debugging GC bugs.

        * kjs/collector.cpp:
        (KJS::Collector::heapAllocate):

2008-04-24  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Adam and Sam.

        -<rdar://problem/5770054> JavaScript profiler (10928)
        -Only profile the page group that starts profiling to avoid profiling
        tools that shouldn't be profiled unless explicitly requested to.

        * JavaScriptCore.exp: Export new signature.
        * kjs/JSGlobalObject.cpp: Add unique identifiers to the JSGlobalObject.
        (KJS::JSGlobalObject::init):
        * kjs/JSGlobalObject.h: Ditto.
        (KJS::JSGlobalObject::setPageGroupIdentifier):
        (KJS::JSGlobalObject::pageGroupIdentifier):
        * profiler/Profiler.cpp: Check the identifier of the page group of the
        lexical global exec state and only profile if it matches the given page
        group identifier.
        (KJS::Profiler::startProfiling):
        (KJS::Profiler::willExecute):
        (KJS::Profiler::didExecute):
        * profiler/Profiler.h: Ditto.
        (KJS::Profiler::Profiler):

2008-04-24  Julien Chaffraix  <jchaffraix@webkit.org>

        Reviewed by Simon.

        Bug 15940: Implement threading API for Qt
        https://bugs.webkit.org/show_bug.cgi?id=15940

        Original patch by Justin Haygood, tweaked by me.

        * JavaScriptCore.pri:
        * wtf/ThreadingQt.cpp: Added.
        (WTF::threadMapMutex):
        (WTF::threadMap):
        (WTF::establishIdentifierForThread):
        (WTF::clearThreadForIdentifier):
        (WTF::threadForIdentifier):
        (WTF::initializeThreading):
        (WTF::ThreadPrivate::getReturnValue):
        (WTF::ThreadPrivate::ThreadPrivate):
        (WTF::ThreadPrivate::run):
        (WTF::createThread):
        (WTF::waitForThreadCompletion): return !res to return
        0 on success (to match the pthreads implementation).
        (WTF::detachThread):
        (WTF::identifierByQthreadHandle):
        (WTF::currentThread):
        (WTF::Mutex::Mutex):
        (WTF::Mutex::~Mutex):
        (WTF::Mutex::lock):
        (WTF::Mutex::tryLock):
        (WTF::Mutex::unlock):
        (WTF::ThreadCondition::ThreadCondition):
        (WTF::ThreadCondition::~ThreadCondition):
        (WTF::ThreadCondition::wait):
        (WTF::ThreadCondition::timedWait):
        (WTF::ThreadCondition::signal):

2008-04-22  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - simplify use of HashTraits to prepare for some upcoming hash table changes

        * kjs/SymbolTable.h: Made SymbolTableIndexHashTraits derive from HashTraits<size_t>
        and specialize only the empty value.

2008-04-23  Holger Hans Peter Freyther  <zecke@selfish.org>

        Reviewed by Simon.

        Removed the #define for USE_SYSTEM_MALLOC that we set in WebKit.pri
        already.

        * wtf/Platform.h:

2008-04-21  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Adam.

        <rdar://problem/5770054> JavaScript profiler (10928)
        - When stop profiling is called we need to stop the timers on all the
        functions that are still running.

        * profiler/FunctionCallProfile.cpp:
        (KJS::FunctionCallProfile::didExecute):
        (KJS::FunctionCallProfile::stopProfiling):
        * profiler/FunctionCallProfile.h:
        * profiler/Profiler.cpp:
        (KJS::Profiler::stopProfiling):

2008-04-21  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Move collector main thread initialization from WebKit/win to KJS::initializeThreading.

        * kjs/InitializeThreading.cpp:
        (KJS::initializeThreading):

2008-04-21  Adam Roben  <aroben@apple.com>

        MSVC build fix

        Reviewed by Alexey Proskuryakov.

        * kjs/ustring.h:
        (KJS::UString::cost): Disable a warning about assigning a 32-bit
        size_t into a 31-bit size_t.

2008-04-21  Simon Hausmann  <hausmann@webkit.org>

        Reviewed by Lars.

        Made convertValueToQVariant accessible from within WebKit/qt/Api

        * bindings/qt/qt_runtime.h:

2008-04-21  Holger Hans Peter Freyther  <holger.freyther@trolltech.com>

        Reviewed by Simon.

        Build fix for Qt 4.3

        * When building WebCore/internal make sure the QT_[BEGIN,END]_NAMESPACE is
        always defined. Do this by adding defines to the compiler line
        * For users of our API this is not feasible. Every public header file should
        include qwebkitglobal.h. Define the QT_BEGIN_NAMESPACE and QT_END_NAMESPACE
        when we are building everything < 4.4.0 and don't have them defined.

        * kjs/testkjs.pro:

2008-04-19  Matt Lilek  <webkit@mattlilek.com>

        Not reviewed, Windows build fix - copy the profiler headers in all
        configurations, not just Debug_Internal.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2008-04-19  Mike Hommey  <glandium@debian.org>

        Reviewed by Alp Toker.

        Don't build testkjs with rpath.

        * GNUmakefile.am:

2008-04-18  Kevin Ollivier  <kevino@theolliviers.com>

        wx build fixes. Rename LocalStorage.h to LocalStorageEntry.h
        to avoid header detection issues between WebCore/storage/LocalStorage.h 
        and it, and add $(PROFILER_SOURCES) to the wx JSCore build.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * jscore.bkl:
        * kjs/ExecState.h:
        * kjs/JSVariableObject.h:
        * kjs/LocalStorage.h: Removed.
        * kjs/LocalStorageEntry.h: Copied from JavaScriptCore/kjs/LocalStorage.h.
        * kjs/function.h:

2008-04-18 Jan  Michael Alonzo  <jmalonzo@unpluggable.com>

        Reviewed by Alp Toker.

        http://bugs.webkit.org/show_bug.cgi?id=16620
        [GTK] Autotools make dist and make check support

        Cleanups.

        * GNUmakefile.am:

2008-04-18  Jon Honeycutt  <jhoneycutt@apple.com>

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Windows
        build fix.

2008-04-11  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Antti Koivisto.

        Silence GCC 4.3 warnings by removing extraneous consts.

        * kjs/ustring.cpp:
        * kjs/ustring.h:

2008-04-18  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam.

        -<rdar://problem/5770054> JavaScript profiler (10928)
        - Use Deque instead of Vector since the profiler uses prepend a lot
        and deque is faster at that.

        * profiler/FunctionCallProfile.h:
        (KJS::FunctionCallProfile::milliSecs): Corrected the name to match
        its output.
        * wtf/Deque.h:
        (WTF::deleteAllValues):

2008-04-18  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam and Adam.

        -<rdar://problem/5770054> JavaScript profiler (10928)
        - Cleaned up the header file and made some functions static, added
        a new, sane, printing function, and fixed a few minor bugs.

        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * profiler/FunctionCallProfile.cpp:
        (KJS::FunctionCallProfile::didExecute): Removed assertion that time is
        > 0 because at ms resolution that may not be true and only cross-
        platform way to get time differences is in ms.
        (KJS::FunctionCallProfile::printDataInspectorStyle): Added a new
        printing function for dumping data in a sane style.
        (KJS::FunctionCallProfile::printDataSampleStyle): Fixed a bug where we
        displayed too much precision when printing our floats. Also added logic
        to make sure we don't display 0 because that doesn't make sense for a
        sampling profile.
        * profiler/FunctionCallProfile.h:
        * profiler/Profiler.cpp: Moved functions that could be static into the
        implementation, and chaned the ASSERTs to early returns.  I did this
        because console.profile() is a JS function and so was being profiled
        but asserting because the profiler had not been started! In the future
        I would like to put the ASSERTs back and not profile the calls to
        console.profile() and console.profileEnd().
        (KJS::Profiler::willExecute):
        (KJS::Profiler::didExecute):
        (KJS::getStackNames): Fixed a bug where the wrong ExecState was being
        used.
        (KJS::getFunctionName):
        (KJS::Profiler::printDataInspectorStyle):
        * profiler/Profiler.h:

2008-04-18  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Fix leaks during plugin tests (which actually excercise background JS), and potential
        PAC brokenness that was not reported, but very likely.

        The leaks shadowed a bigger problem with Identifier destruction. Identifier::remove involves
        an IdentifierTable lookup, which is now a per-thread instance. Since garbage collection can
        currently happen on a different thread than allocation, a wrong table was used.

        No measurable change on SunSpider total, ~1% variation on individual tests.

        * kjs/ustring.cpp:
        (KJS::UString::Rep::create):
        (KJS::UString::Rep::destroy):
        * kjs/ustring.h:
        Replaced isIdentifier with a pointer to IdentifierTable, so that destruction can be done
        correctly. Took one bit from reportedCost, to avoid making UString::Rep larger (performance
        effect was measurable on SunSpider).

        * kjs/identifier.cpp:
        (KJS::IdentifierTable::IdentifierTable):
        (KJS::IdentifierTable::~IdentifierTable):
        (KJS::IdentifierTable::add):
        (KJS::IdentifierTable::remove):
        Make IdentifierTable a real class. Its destructor needs to zero out outstanding references,
        because some identifiers may briefly outlive it during thread destruction, and we don't want
        them to use their stale pointers.

        (KJS::LiteralIdentifierTable):
        (KJS::Identifier::add):
        Now that LiteralIdentifierTable is per-thread and can be destroyed not just during application
        shutdown, it is not appropriate to simply bump refcount for strings that get there; changed
        the table to hold RefPtrs.

        (KJS::CStringTranslator::translate):
        (KJS::UCharBufferTranslator::translate):
        (KJS::Identifier::addSlowCase):
        (KJS::Identifier::remove):
        * kjs/identifier.h:
        (KJS::Identifier::add):
        Use and update UString::Rep::identifierTable as appropriate. Updating it is now done in
        IdentifierTable::add, not in translators.

2008-04-18  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Get rid of static compareWithCompareFunctionArguments in array_instance.cpp.

        No change on SunSpider, CelticKane or iBench JavaScript. It is probable that in some cases,
        merge sort is still faster, but more investigation is needed to determine a new cutoff.
        Or possibly, it would be better to do what FIXME says (change to tree sort).

        Also, made arguments a local variable - not sure why it was a member of
        CompareWithCompareFunctionArguments.

        * kjs/array_instance.cpp:
        (KJS::CompareWithCompareFunctionArguments::CompareWithCompareFunctionArguments):
        (KJS::CompareWithCompareFunctionArguments::operator()):
        (KJS::ArrayInstance::sort):

2008-04-18  Simon Hausmann  <hausmann@webkit.org>

        Build fix for gcc 4.3. Include stdio.h for printf.

        * profiler/FunctionCallProfile.cpp:
        * profiler/Profiler.cpp:

2008-04-17  Jon Honeycutt  <jhoneycutt@apple.com>

        Reviewed by mrowe.

        * wtf/Platform.h: Add HAVE_ACCESSIBILITY to Platform.h.

2008-04-17  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Maciej.

        Thread static data destructors are not guaranteed to be called in any particular order;
        turn ThreadSpecific into a phoenix-style singleton to avoid accessing freed memory when
        deleted objects are interdependent (e.g. CommonIdentifiers and internal identifier tables).

        No change on SunSpider.

        * wtf/ThreadSpecific.h:
        (WTF::ThreadSpecific::Data::Data):
        (WTF::::get):
        (WTF::::set):
        (WTF::::destroy):

2008-04-15  Srinivas Rao. M Hamse  <msrinirao@gmail.com>

        Reviewed by Maciej Stachowiak.

        - gcc 3.x build fix

        * kjs/nodes.h: CallerType definition made public for gcc 3.x compilation

2008-04-16  Brady Eidson  <beidson@apple.com>

        Reviewed by Sam Weinig

        Change ThreadSafeShared to act like RefCounted by starting out with a single ref by default

        * wtf/Threading.h:
        (WTF::ThreadSafeShared::ThreadSafeShared):

2008-04-16  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        - To keep the behavior of the WebKit and JavaScriptCore API's the same,
          we need to hide the fact that the global object and the window object
          are no longer the same thing, and the the global object now changes on
          navigations.  To do this, only the wrapper should ever be exposed.  This
          fixes the two remaining spots where the internal global object is exposed,
          the windowScriptObject returned from [WebFrame windowObject] and the object
          return by calling JSContextGetGlobalObject on [WebFrame globalContext].

        * API/JSContextRef.cpp:
        (JSContextGetGlobalObject):
        This is a bit of a hack, this returns the "this" representation of the globalObject
        which will be the WrapperWindow for WebCore and the globalObject for non-WebCore.

        * API/JSObjectRef.cpp:
        (JSObjectSetProperty):
        Call the new putWithAttributes method instead of relying on lower-level calls.
        This is needed so that the window wrapper can forward the calls.

        * JavaScriptCore.exp:
        * kjs/Activation.h:
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::putWithAttributes):
        * kjs/JSGlobalObject.h:
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTablePutWithAttributes):
        * kjs/function.cpp:
        (KJS::ActivationImp::putWithAttributes):
        * kjs/nodes.cpp:
        (KJS::ConstDeclNode::handleSlowCase):
        (KJS::ConstDeclNode::evaluateSingle):
        (KJS::EvalNode::processDeclarations):
        * kjs/object.cpp:
        (KJS::JSObject::putWithAttributes):
        * kjs/object.h:
        Rename initializeVariable to putWithAttributes and move it down to JSObject so it
        can be used for JSObjectSetProperty.

2008-04-16  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam and Geoff.

        -<rdar://problem/5770054> JavaScript profiler (10928)
        Inital profiler prototype

        * GNUmakefile.am: Added new files to project
        * JavaScriptCore.pri: Ditto
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto
        * JavaScriptCore.xcodeproj/project.pbxproj: Ditto
        * JavaScriptCoreSources.bkl: Ditto
        * kjs/config.h: Put compiling flag in here.
        * kjs/function.cpp: Instrument calling the function eval().
        (KJS::eval):
        * kjs/interpreter.cpp: Instrument evaluating global scopes.
        (KJS::Interpreter::evaluate):
        * kjs/object.cpp: Instrument JS function calls.
        (KJS::JSObject::call):
        * profiler: Added.
        * profiler/FunctionCallProfile.cpp: Added.
        (KJS::FunctionCallProfile::FunctionCallProfile):
        (KJS::FunctionCallProfile::~FunctionCallProfile):
        (KJS::FunctionCallProfile::willExecute): Call right before the JS function or executing context is executed to start the profiler's timer.
        (KJS::FunctionCallProfile::didExecute): Call right after the JS function or executing context is executed to stop the profiler's timer.
        (KJS::FunctionCallProfile::addChild): Add a child to the current FunctionCallProfile if it isn't already a child of the current FunctionalCallProfile.
        (KJS::FunctionCallProfile::findChild): Return the child that matches the given name if there is one.
        (KJS::FunctionCallProfile::printDataSampleStyle): Print the current profiled information in a format that matches sample's output.
        * profiler/FunctionCallProfile.h: Added.
        (KJS::FunctionCallProfile::FunctionCallProfile):
        (KJS::FunctionCallProfile::~FunctionCallProfile):
        (KJS::FunctionCallProfile::functionName):
        (KJS::FunctionCallProfile::microSecs):
        * profiler/Profiler.cpp: Added.
        (KJS::Profiler::profiler):
        (KJS::Profiler::sharedProfiler): Return global singleton (may change due to multi-threading concerns)
        (KJS::Profiler::startProfiling): Don't start collecting profiling information until the user starts the profiler. Also don't clear old prfiled data until the profiler is restarted.
        (KJS::Profiler::stopProfiling): Stop collecting profile information.
        (KJS::Profiler::willExecute): Same as above. 
        (KJS::Profiler::didExecute): Same as above.
        (KJS::Profiler::insertStackNamesInTree): Follow the stack of the given names and if a sub-stack is not in the current tree, add it.
        (KJS::Profiler::getStackNames): Get the names from the different passed in parameters and order them as a stack.
        (KJS::Profiler::getFunctionName): Get the function name from the given parameter.
        (KJS::Profiler::printDataSampleStyle): Print the current profiled information in a format that matches sample's output.
        (KJS::Profiler::debugLog):
        * profiler/Profiler.h: Added.
        (KJS::Profiler::Profiler):

2008-04-16  Sam Weinig  <sam@webkit.org>

        Reviewed by Darin Adler.

        - Remove kjs_ prefix from strtod, dtoa, and freedtoa and put it
          in the KJS namespace.
        - Make strtod, dtoa, and freedtoa c++ functions instead of extern "C".
        - Remove mode switching from dtoa.  ~2% improvement on test 26. 
        - Removes all unnecessary #defines from dtoa code.

        * JavaScriptCore.exp:
        * kjs/dtoa.cpp:
        (KJS::ulp):
        (KJS::b2d):
        (KJS::d2b):
        (KJS::ratio):
        (KJS::strtod):
        (KJS::freedtoa):
        (KJS::dtoa):
        * kjs/dtoa.h:
        * kjs/function.cpp:
        (KJS::parseInt):
        * kjs/lexer.cpp:
        (KJS::Lexer::lex):
        * kjs/number_object.cpp:
        (KJS::integer_part_noexp):
        (KJS::numberProtoFuncToExponential):
        * kjs/ustring.cpp:
        (KJS::UString::from):
        (KJS::UString::toDouble):

2008-04-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Get rid of static execForCompareByStringForQSort in array_instance.cpp.

        No change on SunSpider, CelticKane or iBench JavaScript.

        * kjs/array_instance.cpp:
        (KJS::ArraySortComparator::ArraySortComparator):
        (KJS::ArraySortComparator::operator()):
        (KJS::ArrayInstance::sort):
        Switch slow case to std::sort, so that ExecState can be passed in a comparator.

2008-04-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Adam Roben.

        MSVC build fix.

        * kjs/CommonIdentifiers.cpp:
        * kjs/CommonIdentifiers.h:
        * kjs/Parser.cpp:
        * kjs/Parser.h:
        * kjs/identifier.cpp:
        * kjs/lexer.h:
        * wtf/ThreadSpecific.h:

2008-04-16  Alexey Proskuryakov  <ap@webkit.org>

        Build fix.

        * kjs/date_object.cpp:
        * kjs/date_object.h:
        Don't include DateMath.h from date_object.h, as the latter is used from WebCore, while
        where the former is not available.

2008-04-16  Holger Hans Peter Freyther  <zecke@selfish.org>

        Unreviewed build fix for MSVC. It does not want to have
        WTF in the KJS namespace.

        * kjs/CommonIdentifiers.h:

2008-04-16  Holger Hans Peter Freyther  <zecke@selfish.org>

        Unreviewed build fix for gcc.

        ::msToGregorianDateTime  is not known to it.

        * kjs/date_object.cpp:
        (KJS::DateInstance::msToGregorianDateTime):

2008-04-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Oliver Hunt.

        Initialize threadMapMutex safely (as already done in ThreadingWin).

        * wtf/ThreadingGtk.cpp:
        (WTF::threadMapMutex):
        (WTF::initializeThreading):
        * wtf/ThreadingPthreads.cpp:
        (WTF::threadMapMutex):
        (WTF::initializeThreading):

2008-04-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Adam Roben.

        Cache Gregorian date/time structure on DateInstance objects for 1.027x SunSpider speedup
        (1.65x on date-format-xparb, 1.13x on date-format-tofte).

        * kjs/DateMath.h:
        (KJS::GregorianDateTime::copyFrom): Added. It presumably makes sense to keep GregorianDateTime
        Noncopyable, so it's not just operator=.

        * kjs/date_object.h: Added a per-object cache.

        * kjs/date_object.cpp:
        (KJS::DateInstance::DateInstance):
        (KJS::DateInstance::msToGregorianDateTime):
        (KJS::dateProtoFuncToString):
        (KJS::dateProtoFuncToUTCString):
        (KJS::dateProtoFuncToDateString):
        (KJS::dateProtoFuncToTimeString):
        (KJS::dateProtoFuncToLocaleString):
        (KJS::dateProtoFuncToLocaleDateString):
        (KJS::dateProtoFuncToLocaleTimeString):
        (KJS::dateProtoFuncGetFullYear):
        (KJS::dateProtoFuncGetUTCFullYear):
        (KJS::dateProtoFuncToGMTString):
        (KJS::dateProtoFuncGetMonth):
        (KJS::dateProtoFuncGetUTCMonth):
        (KJS::dateProtoFuncGetDate):
        (KJS::dateProtoFuncGetUTCDate):
        (KJS::dateProtoFuncGetDay):
        (KJS::dateProtoFuncGetUTCDay):
        (KJS::dateProtoFuncGetHours):
        (KJS::dateProtoFuncGetUTCHours):
        (KJS::dateProtoFuncGetMinutes):
        (KJS::dateProtoFuncGetUTCMinutes):
        (KJS::dateProtoFuncGetSeconds):
        (KJS::dateProtoFuncGetUTCSeconds):
        (KJS::dateProtoFuncGetTimezoneOffset):
        (KJS::setNewValueFromTimeArgs):
        (KJS::setNewValueFromDateArgs):
        (KJS::dateProtoFuncSetYear):
        (KJS::dateProtoFuncGetYear):
        Use the cache when converting.

2008-04-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Implement an abstraction for thread-specific storage, use it to get rid of some static objects.

        SunSpider results were not conclusive, possibly up to 0.2% slowdown.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        Added ThreadSpecific.h

        * wtf/ThreadSpecific.h: Added.
        (WTF::::ThreadSpecific):
        (WTF::::~ThreadSpecific):
        (WTF::::get):
        (WTF::::set):
        (WTF::::destroy):
        (WTF::T):
        (WTF::::operator):
        Only implemented for platforms that use pthreads.

        * kjs/CommonIdentifiers.cpp:
        (KJS::CommonIdentifiers::shared):
        * kjs/CommonIdentifiers.h:
        * kjs/InitializeThreading.cpp:
        (KJS::initializeThreading):
        * kjs/Parser.cpp:
        (KJS::parser):
        * kjs/Parser.h:
        * kjs/identifier.cpp:
        (KJS::identifierTable):
        (KJS::literalIdentifierTable):
        (KJS::Identifier::initializeIdentifierThreading):
        * kjs/identifier.h:
        * kjs/lexer.cpp:
        (KJS::lexer):
        * kjs/lexer.h:
        Make static instances per-thread.

2008-04-15  Anders Carlsson  <andersca@apple.com>

        Reviewed by Adam.

        Add ENABLE_OFFLINE_WEB_APPLICATIONS to FEATURE_DEFINES.
        
        * Configurations/JavaScriptCore.xcconfig:

2008-04-15  Andre Poenitz  <andre.poenitz@trolltech.com>

        Reviewed by Simon.

        Fix compilation with Qt namespaces

        Qt can be configured to have all of its classes inside a specified namespaces.
        This is for example used in plugin/component environments like Eclipse.

        This change makes it possible to let the Qt port compile against a namespaced
        Qt by the use of macros Qt provides to properly forward declare Qt classes in
        the namespace.

        * wtf/unicode/qt4/UnicodeQt4.h:

2008-04-14  Anders Carlsson  <andersca@apple.com>

        Reviewed by Adam.

        Don't leak the prototype class.
        
        * API/JSClassRef.cpp:
        (OpaqueJSClass::create):

2008-04-14  Steve Falkenburg  <sfalken@apple.com>

        Fix build.

        * wtf/ThreadingWin.cpp:

2008-04-14  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Adam Roben.

        https://bugs.webkit.org/show_bug.cgi?id=18488
        FastMalloc doesn't release thread-specific data on Windows

        * wtf/ThreadingWin.cpp:
        (WTF::threadMapMutex): (WTF::initializeThreading): Call threadMapMutex once to initialize the static safely.
        (WTF::ThreadFunctionInvocation::ThreadFunctionInvocation): Added a structure to wrap thread entry point and arguments.
        (WTF::wtfThreadEntryPoint): Make sure to end all WTF threads with pthread_exit(), to give pthreads-win32 a chance to call
        destructors of thread-specific data.
        (WTF::createThread): Use _beginthreadex instead of CreateThread, because MSDN says so. Also removed a call to CreateEvent,
        for which I could see no reason at all.

2008-04-14  Alexey Proskuryakov  <ap@webkit.org>

        Touched a file to make JavaScriptCore.vcproj rebuild.

        * wtf/MathExtras.h:

2008-04-14  Adam Roben  <aroben@apple.com>

        Windows build fix

        Rubberstamped by Alexey Proskuryakov.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Disable
        the "potentially uninitialized variable" warning for grammar.cpp, as
        it seems to be incorrect. yylval gets initialized by the lexer, but
        MSVC doesn't seem to understand this.

2008-04-11  Antti Koivisto  <antti@apple.com>

        Reviewed by Maciej.
        
        Add default hash for pairs of hashable types.

        * wtf/HashFunctions.h:
        (WTF::PairHash::hash):
        (WTF::PairHash::equal):
        (WTF::):

2008-04-11  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff.

        Make DateMath.cpp thread safe.

        No measurable change on SunSpider (should be a very small speedup).

        * kjs/DateMath.cpp:
        (KJS::mimimumYearForDST): (KJS::equivalentYearForDST): Got rid of double caching of the
        same precomputed value.
        (KJS::calculateUTCOffset): (KJS::getUTCOffset): Factored actual UTC offset calculation code
        out of getUTCOffset(), and notification setup into initDateMath().

        (KJS::initDateMath): Added.

        * kjs/DateMath.h:
        * kjs/InitializeThreading.cpp:
        (KJS::initializeThreading):
        Added initDateMath().

2008-04-11  Alexey Proskuryakov  <ap@webkit.org>

        Windows build fix.

        * kjs/grammar.y:

2008-04-11  Alexey Proskuryakov  <ap@webkit.org>

        Tiger build fix. Forward declaring a union didn't work for whatever reason, make the
        parameters void*.

        * kjs/grammar.y:
        * kjs/lexer.cpp:
        (kjsyylex):
        (KJS::Lexer::lex):
        * kjs/lexer.h:

2008-04-11  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff.

        Generate a pure (re-entrant) parser with Bison.

        No change on SunSpider.

        * kjs/Parser.cpp:
        (KJS::Parser::parse):
        * kjs/grammar.y:
        * kjs/lexer.cpp:
        (kjsyylex):
        (KJS::Lexer::lex):
        * kjs/lexer.h:
        Pass state as function arguments, instead of global data. Don't call lexer() as often as
        before, as this function is about to become slower due to thread-specific storage.

        * kjs/function.cpp:
        (KJS::isStrWhiteSpace): Don't call isSeparatorSpace() for 8-bit characters, as these are
        already taken care of. This is a small speedup, compensating for a small slowdown caused
        by switching Bison mode.

2008-04-10  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff.

        https://bugs.webkit.org/show_bug.cgi?id=18402
        REGRESSION: visited element handling is incorrect in nested join/toString calls

        No change on SunSpider total, possibly a tiny improvement (about 0.1%).

        Test: fast/js/array-tostring-and-join.html

        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::visitedElements): Store visited elements HashSet here, making it
        common to toString/toLocalizedString/join again.

        * kjs/array_object.cpp:
        (KJS::arrayProtoFuncToString):
        (KJS::arrayProtoFuncToLocaleString):
        (KJS::arrayProtoFuncJoin):
        Got rid of static variables. Replaced UString with Vector to avoid O(n^2) behavior and
        regain performance.

        * wtf/Vector.h:
        (WTF::::resize):
        (WTF::::grow):
        (WTF::::reserveCapacity):
        (WTF::::append):
        (WTF::::insert):
        Added null checks, so that Vector methods don't crash when out of memory. The caller should
        check that data pointer is not null before proceeding.

2008-04-10  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej Stachowiak.

        Fix https://bugs.webkit.org/show_bug.cgi?id=18367 and the many dupes.
        Bug 18367: Crash during celtic kane js speed 2007 test

        GCC 4.2 on x86_64 Linux decided to reorder the local variables in markCurrentThreadConservatively's
        stack frame.  This lead to the range of addresses the collector treated as stack to exclude the
        contents of volatile registers that markCurrentThreadConservatively forces onto the stack.  This was
        leading to objects being prematurely collected if the only reference to them was via a register at
        the time a collection occurred.

        The fix for this is to move the calculation of the top of the stack into a NEVER_INLINE function
        that is called from markCurrentThreadConservatively.  This forces the dummy variable we use for
        determining the top of stack to be in a different stack frame which prevents the compiler from
        reordering it relative to the registers that markCurrentThreadConservatively forces onto the stack.

        * kjs/collector.cpp:
        (KJS::Collector::markCurrentThreadConservativelyInternal):
        (KJS::Collector::markCurrentThreadConservatively):
        * kjs/collector.h:

2008-04-10  Adam Roben  <aroben@apple.com>

        VC++ Express build fix

        * JavaScriptCore.vcproj/WTF/WTF.vcproj: Link against user32.lib so
        that anyone who links against WTF.lib will get user32.lib
        automatically.

2008-04-09  Adam Roben  <aroben@apple.com>

        VC++ Express build fix

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Link against
        user32.lib.

2008-04-09  Adam Roben  <aroben@apple.com>

        Build fix

        * JavaScriptCore.exp: Export isMainThread.

2008-04-09  Adam Roben  <aroben@apple.com>

        Build fix

        * wtf/AlwaysInline.h: Make sure to #include Platform.h before using
        the macros it defines.

2008-04-08  Mark Rowe  <mrowe@apple.com>

        Export WTF::initializeThreading() from JavaScriptCore.

        * JavaScriptCore.exp:

2008-04-04  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        First step in implementing the "split window"

        - Add a GlobalThisValue to ExecState which should be used 
          in places that used to implement the "use the global object
          as this if null" rule.
        - Factor out lookupGetter/lookupSetter into virtual methods 
          on JSObject so that they can be forwarded.
        - Make defineGetter/defineSetter virtual methods for the same
          reason.
        - Have PrototypeReflexiveFunction store the globalObject used
          to create it so that it can be used to get the correct thisObject
          for eval.

        * API/JSObjectRef.cpp:
        (JSObjectCallAsFunction):
        * JavaScriptCore.exp:
        * kjs/Activation.h:
        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        (KJS::GlobalExecState::GlobalExecState):
        * kjs/ExecState.h:
        (KJS::ExecState::globalThisValue):
        * kjs/ExecStateInlines.h:
        (KJS::ExecState::ExecState):
        (KJS::FunctionExecState::FunctionExecState):
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::reset):
        (KJS::JSGlobalObject::toGlobalObject):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData):
        (KJS::JSGlobalObject::JSGlobalObject):
        * kjs/array_instance.cpp:
        (KJS::CompareWithCompareFunctionArguments::CompareWithCompareFunctionArguments):
        (KJS::compareWithCompareFunctionForQSort):
        * kjs/array_object.cpp:
        (KJS::arrayProtoFuncSort):
        (KJS::arrayProtoFuncFilter):
        (KJS::arrayProtoFuncMap):
        (KJS::arrayProtoFuncEvery):
        (KJS::arrayProtoFuncForEach):
        (KJS::arrayProtoFuncSome):
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        (KJS::ActivationImp::toThisObject):
        (KJS::globalFuncEval):
        (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction):
        (KJS::PrototypeReflexiveFunction::mark):
        * kjs/function.h:
        (KJS::PrototypeReflexiveFunction::cachedGlobalObject):
        * kjs/function_object.cpp:
        (KJS::functionProtoFuncApply):
        (KJS::functionProtoFuncCall):
        * kjs/nodes.cpp:
        (KJS::ExpressionNode::resolveAndCall):
        (KJS::FunctionCallValueNode::evaluate):
        (KJS::LocalVarFunctionCallNode::inlineEvaluate):
        (KJS::ScopedVarFunctionCallNode::inlineEvaluate):
        (KJS::FunctionCallBracketNode::evaluate):
        (KJS::FunctionCallDotNode::inlineEvaluate):
        * kjs/object.cpp:
        (KJS::JSObject::call):
        (KJS::JSObject::put):
        (KJS::tryGetAndCallProperty):
        (KJS::JSObject::lookupGetter):
        (KJS::JSObject::lookupSetter):
        (KJS::JSObject::toThisObject):
        (KJS::JSObject::toGlobalObject):
        (KJS::JSObject::fillGetterPropertySlot):
        * kjs/object.h:
        * kjs/object_object.cpp:
        (KJS::objectProtoFuncLookupGetter):
        (KJS::objectProtoFuncLookupSetter):
        * kjs/string_object.cpp:
        (KJS::replace):

2008-04-08  Brady Eidson  <beidson@apple.com>

        Encourage Windows to rebuild - AGAIN...

        * kjs/DateMath.cpp:

2008-04-08  Adam Roben  <aroben@apple.com>

        Mac build fix

        * JavaScriptCore.exp: Add callOnMainThread, and sorted the list.

2008-04-08  Brady Eidson  <beidson@apple.com>

        Rubberstamped by Adam Roben
        
        Touch some files to *strongly* encourage Windows to rebuilt with DOM_STORAGE enabled

        * kjs/DateMath.cpp:

2008-04-08  Adam Roben  <aroben@apple.com>

        Move callOnMainThread to WTF

        Reviewed by Alexey Proskuryakov.

        * GNUmakefile.am:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        Added new files.

        * wtf/MainThread.cpp:
        * wtf/MainThread.h:
        * wtf/gtk/MainThreadGtk.cpp:
        * wtf/mac/MainThreadMac.mm:
        * wtf/qt/MainThreadQt.cpp:
        * wtf/win/MainThreadWin.cpp:
        * wtf/wx/MainThreadWx.cpp:
        Moved here from WebCore/platform. Replaced all instances of "WebCore"
        with "WTF".

        * kjs/bool_object.cpp: Touched to force JavaScriptCore.vcproj to
        build.
        to the WTF namespace.
        * wtf/ThreadingWin.cpp:
        (WTF::initializeThreading): Call initializeMainThread.

2008-04-07  Brady Eidson  <beidson@apple.com>

        Add "ENABLE_DOM_STORAGE" to keep in sync with the rest of the project

        * Configurations/JavaScriptCore.xcconfig:

2008-04-07  Adam Roben  <aroben@apple.com>

        Windows build fix

        * wtf/ThreadingWin.cpp: Back out some changes I didn't mean to land.

2008-04-07  Adam Roben  <aroben@apple.com>

        Add WTF::isMainThread

        Reviewed by Alexey Proskuryakov.

        * wtf/Threading.h: Declare the new function.
        * wtf/ThreadingGtk.cpp:
        (WTF::initializeThreading): Initialize the main thread identifier.
        (WTF::isMainThread): Added.
        * wtf/ThreadingNone.cpp: Ditto ThreadingGtk.cpp.
        (WTF::initializeThreading):
        (WTF::isMainThread):
        * wtf/ThreadingPthreads.cpp: Ditto.
        (WTF::initializeThreading):
        (WTF::isMainThread):
        * wtf/ThreadingWin.cpp: Ditto.
        (WTF::initializeThreading):
        (WTF::isMainThread):

2008-04-06  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Make UString thread-safe.

        No change on SunSpider total, although individual tests have changed a lot, up to 3%.

        * kjs/InitializeThreading.cpp: (KJS::initializeThreading): Call UString::null() to initialize
        a static.
        
        * kjs/identifier.cpp:
        (KJS::CStringTranslator::translate):
        (KJS::UCharBufferTranslator::translate):
        Use "true" for a boolean value instead of 1, because it's C++.

        * kjs/ustring.h:
        (KJS::CString::adopt): Added a method to create from a char* buffer without copying.
        (KJS::UString::Rep::ref): Removed an assertion for JSLock::lockCount, as it's no longer
        necessary to hold JSLock when working with strings.
        (KJS::UString::Rep::deref): Ditto.
        (KJS::UString::Rep::isStatic): Added a field to quickly determine that this is an empty
        or null static string.

        * kjs/ustring.cpp:
        (KJS::): Removed normalStatBufferSize and statBufferSize, as there is no reason to have such
        an advanced implementation of a debug-only ascii() method. Removed a long-obsolete comment
        about UChar.
        (KJS::UString::Rep::createCopying): Removed an assertion for JSLock::lockCount.
        (KJS::UString::Rep::create): Ditto.
        (KJS::UString::Rep::destroy): Ditto. Do not do anything for static null and empty strings,
        as refcounting is not reliable for those. Reordered branches for a noticeable speed gain -
        apparently this functiton is hot enough for SunSpider to see an effect from this!
        (KJS::UString::null): Moved a star, added a comment.
        (KJS::UString::cstring): Reimplemented to not call ascii(), which is not thread-safe.
        (KJS::UString::ascii): Simplified statBuffer handling logic.
        (KJS::UString::toDouble): Use cstring() instead of ascii().

2008-04-02  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        Ensure that debug symbols are generated for x86_64 and ppc64 builds.

        * Configurations/Base.xcconfig:

2008-04-01  Christian Dywan  <christian@imendio.com>

        Build fix for GCC 4.3.

        * wtf/unicode/icu/CollatorICU.cpp: include string.h

2008-04-01  Alexey Proskuryakov  <ap@webkit.org>

        Rubber-stamped by Darin.

        Turn off using 64-bit arithmetic on 32-bit hardware, as dtoa own code is faster than
        compiler-provided emulation.

        1% speedup on Acid3 test 26.

        * kjs/dtoa.cpp:

2008-04-01  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Make MathExtras.h thread safe.

        * kjs/math_object.cpp:
        (KJS::mathProtoFuncRandom): If threading is enabled, rely on initializeThreading to call
        wtf_random_init().

        * wtf/Threading.h:
        * wtf/ThreadingGtk.cpp:
        (WTF::initializeThreading):
        * wtf/ThreadingNone.cpp:
        (WTF::initializeThreading):
        * wtf/ThreadingPthreads.cpp:
        (WTF::initializeThreading):
        * wtf/ThreadingWin.cpp:
        (WTF::initializeThreading):
        Call wtf_random_init(); made the function non-inline to avoid having to include too many
        headers in Threading.h.

2008-03-31  Eric Seidel  <eric@webkit.org>

        Reviewed by darin.

        Make matching of regexps using ^ much faster
        http://bugs.webkit.org/show_bug.cgi?id=18086

        * pcre/pcre_compile.cpp:
        (compileBranch):
        (branchNeedsLineStart):
        * pcre/pcre_exec.cpp:
        (match):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:

2008-03-29  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Oliver Hunt.

        <rdar://problem/5829556> REGRESSION: Leak in KJS::initializeThreading()

        * kjs/InitializeThreading.cpp: (KJS::initializeThreading): There is no guarantee that
        initializeThreading() is called only once; check that the mutex hasn't been already allocated.

2008-03-29  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Bug 17924: Crash in KJS::ConstDeclNode::evaluate with |with| and |const|
        <http://bugs.webkit.org/show_bug.cgi?id=17924>
        <rdar://problem/5806933>

        It turns out this is trivially avoidable if we just match firefox's
        semantics and ensure that an assignment in a const declaration always
        writes to the variable object.

        * kjs/nodes.cpp:
        (KJS::ConstDeclNode::handleSlowCase):

2008-03-28  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Sam Weinig.

        Fix a dtoa thread safety issue.

        WebCore can call kjs_strtod without holding JS lock, but we didn't have thread safety
        compiled in for dtoa.

        This is a 0.5% regression on SunSpider, which Sam Weinig has volunteered to cover with
        his recent improvement.

        * kjs/dtoa.cpp:
        (Bigint::Balloc):
        (Bigint::Bfree):
        Changed to use fastMalloc/fastDelete - they are much faster than the dtoa custom version was
        in the presence of locking (but somewhat slower in single-threaded case).
        (Bigint::pow5mult): Got rid of the dreaded double-checked locking anti-pattern (had to
        restructure the code to avoid significant performance implications).
        (Bigint::lshift): Rewrote to avoid an allocation, if possible.

        (Bigint::rv_alloc):
        (Bigint::kjs_freedtoa):
        (Bigint::kjs_dtoa):
        Check for USE(MULTIPLE_THREADS), not dtoa legacy MULTIPLE_THREADS.

        * kjs/InitializeThreading.cpp: Added.
        (KJS::initializeThreading):
        * kjs/InitializeThreading.h: Added.
        Initialize threading at KJS level, if enabled.

        * kjs/dtoa.h: Expose dtoa mutex for KJS::initializeThreading.

        * kjs/testkjs.cpp: (kjsmain): Call initializeThreading.

        * JavaScriptCore.exp: Export KJS::initializeThreading.

        * GNUmakefile.am:
        * JavaScriptCore.exp:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCoreSources.bkl:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        Added InitializeThreading.{h,cpp}.

        * wtf/Threading.h: Removed a using directive for WTF::initializeThreading - it is only
        to be called from KJS::initializeThreading, and having it in the global namespace is useless.

2008-03-28  Brady Eidson  <beidson@apple.com>

        Reviewed by Darin

        Export Unicode/UTF8.h and convertUTF16ToUTF8() for more flexible conversion in WebCore

        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-03-27  Darin Adler  <darin@apple.com>

        Reviewed by Mark Rowe.

        <rdar://problem/5826236> Regular expressions with large nested repetition counts can have their
        compiled length calculated incorrectly.

        * pcre/pcre_compile.cpp:
        (multiplyWithOverflowCheck):
        (calculateCompiledPatternLength): Check for overflow when dealing with nested repetition counts
        and bail with an error rather than returning incorrect results.

2008-03-26  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Brady Eidson.

        Update FEATURE_DEFINES to be consistent with the other locations in which it is defined.

        * Configurations/JavaScriptCore.xcconfig:

2008-03-26  Adam Roben  <aroben@apple.com>

        Fix Bug 18060: Assertion failure (JSLock not held) beneath
        JSCallbackObject<Base>::toString

        <http://bugs.webkit.org/show_bug.cgi?id=18060>

        Reviewed by Geoff Garen.

        Bug fix:

        * API/JSCallbackObjectFunctions.h:
        (KJS::JSCallbackObject<Base>::toString): Make the DropAllLocks
        instance only be in scope while calling convertToType.

        Test:

        * API/testapi.c:
        (MyObject_convertToType): Implement type conversion to string.
        * API/testapi.js: Add a test for type conversion to string.

2008-03-26  Adam Roben  <aroben@apple.com>

        Windows build fix

        * kjs/array_instance.cpp: Touched this.
        * wtf/HashFunctions.h:
        (WTF::intHash): Added 8- and 16-bit versions of intHash.

2008-03-26  Adam Roben  <aroben@apple.com>

        Force JSC headers to be copied by touching a file

        * kjs/array_instance.cpp:
        (KJS::ArrayInstance::getPropertyNames):

2008-03-26  Adam Roben  <aroben@apple.com>

        Windows build fix after r31324

        Written with Darin.

        Added HashTable plumbing to support using wchar_t as a key type.

        * wtf/HashFunctions.h:
        * wtf/HashTraits.h:
        (WTF::):

2008-03-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - JSC part of fix for "SVG multichar glyph matching matches longest instead of first (affects Acid3 test 79)"
        http://bugs.webkit.org/show_bug.cgi?id=18118

        * wtf/HashFunctions.h:
        (WTF::):
        * wtf/HashTraits.h:
        (WTF::):

2008-03-26  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Cache C string identifiers by address, not value, assuming that C strings can only
        be literals.

        1% speedup on Acid3 test 26.

        * kjs/identifier.cpp:
        (KJS::literalIdentifierTable):
        (KJS::Identifier::add):
        Added a new table to cache UString::Reps created from C strings by address. Elements are
        never removed from this cache, as only predefined identifiers can get there.

        * kjs/identifier.h:
        (KJS::Identifier::Identifier): Added a warning.

2008-03-26  Alexey Proskuryakov  <ap@webkit.org>

        Rubber-stamped by Maciej.

        An assertion was failing in function-toString-object-literals.html when parsing 1e-500.
        The condition existed before, and got uncovered by turning compiled-out dtoa checks into
        ASSERTs.

        The assertion was verifying that the caller wasn't constructing a Bigint from 0.
        This might have had some reason behind it originally, but I couldn't find any,
        and this doesn't look like a reasonable requirement.

        * kjs/dtoa.cpp: (d2b): Removed the assertion (two copies in different code paths).

2008-03-25  Adam Roben  <aroben@apple.com>

        Fix Bug 18077: Integrate testapi.c into the Windows build

        <http://bugs.webkit.org/show_bug.cgi?id=18077>

        Reviewed by Steve Falkenburg.

        * JavaScriptCore.vcproj/testapi/testapi.vcproj: Added.

2008-03-25  Adam Roben  <aroben@apple.com>

        Make testapi.c compile under MSVC

        Currently you must compile testapi.c as C++ code since MSVC does not
        support many C features that GCC does.

        Reviewed by Steve Falkenburg.

        * API/testapi.c:
        (nan): Added an implementation of this for MSVC.
        (assertEqualsAsUTF8String): Use malloc instead of dynamically-sized
        stack arrays.
        (assertEqualsAsCharactersPtr): Ditto.
        (print_callAsFunction): Ditto.
        (main): Ditto, and explicitly cast from UniChar* to JSChar*.

2008-03-25  Adam Roben  <aroben@apple.com>

        Stop using JavaScriptCore's custom stdbool.h and stdint.h on Windows

        We can't remove the os-win32 directory yet because other ports (at
        least wx) are still relying on it.

        Reviewed by Steve Falkenburg.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
          - Made all the include paths match the one for the Debug
            configuration (these got out of sync in r30797)
          - Removed os-win32 from the include path
          - Removed os-win32 from the directories we copy to $WebKitOutputDir.
          - Removed stdint.h from the project
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make:
        Delete the files that we may have previously copied from the os-win32
        directory.

2008-03-25  Alexey Proskuryakov  <ap@webkit.org>

        Windows build fix.

        * kjs/dtoa.cpp: Include stdint.h.

2008-03-25  Alexey Proskuryakov  <ap@webkit.org>

        Rubber-stamped by Darin.

        Cleanup dtoa.cpp style.

        * kjs/dtoa.cpp:
        (Bigint::Balloc):
        (Bigint::Bfree):
        (Bigint::multadd):
        (Bigint::s2b):
        (Bigint::hi0bits):
        (Bigint::lo0bits):
        (Bigint::i2b):
        (Bigint::mult):
        (Bigint::pow5mult):
        (Bigint::lshift):
        (Bigint::cmp):
        (Bigint::diff):
        (Bigint::ulp):
        (Bigint::b2d):
        (Bigint::d2b):
        (Bigint::ratio):
        (Bigint::):
        (Bigint::match):
        (Bigint::hexnan):
        (Bigint::kjs_strtod):
        (Bigint::quorem):
        (Bigint::rv_alloc):
        (Bigint::nrv_alloc):
        (Bigint::kjs_freedtoa):
        (Bigint::kjs_dtoa):
        * kjs/dtoa.h:

2008-03-24  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        - convert a JavaScript immediate number to a string more efficiently

        2% speedup of Acid3 test 26

        * kjs/JSImmediate.cpp:
        (KJS::JSImmediate::toString): Take advantage of the fact that all immediate
        numbers are integers, and use the faster UString function for formatting integers
        instead of the slower one that works for floating point. I think this is a leftover
        from when immediate numbers were floating point.

2008-03-23  Sam Weinig  <sam@webkit.org>

        Reviewed by Darin Adler.

        Fix http://bugs.webkit.org/show_bug.cgi?id=18048
        The "thisObject" parameter to JSEvaluateScript is not used properly

        Making passing a thisObject to JSEvaluateScript actually set the thisObject of the created
        ExecState.

        * API/testapi.c:
        (main): Add tests for setting the thisObject when calling JSEvaluateScript.

        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState): Assign the thisObject to m_thisValue and remove the comment. 

2008-03-22  Jesse Ruderman  <jruderman@gmail.com>

        Reviewed by Sam Weinig.  Landed by eseidel.
        
        Make testkjs flush stdout after printing.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/testkjs.cpp:
        (functionPrint):

2008-03-21  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Optimise lookup of Math, undefined, NaN and Infinity

        Added a method to JSVariableObject to allow us to inject DontDelete properties
        into the symbol table and localStorage.  This results in a 0.4% progression in
        SunSpider, with a 8% gain in math-partial-sums.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::reset):
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTableInsert):

2008-03-21  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff Garen.

        Global properties that use LocalStorage are not correctly listed as enumerable.

        The problem was caused by JSObject::getPropertyAttributes not being aware
        of the JSVariableObject SymbolTable.  The fix is to make getPropertyAttributes
        virtual and override in JSVariableObject.  This does not produce any performance
        regression.

        * JavaScriptCore.exp:
        * kjs/JSVariableObject.cpp:
        (KJS::JSVariableObject::getPropertyNames):
        (KJS::JSVariableObject::getPropertyAttributes):
        * kjs/JSVariableObject.h:
        * kjs/object.h:

2008-03-21  Arkadiusz Miskiewicz  <arekm@maven.pl>

        Webkit does not build on linux powerpc

        <http://bugs.webkit.org/show_bug.cgi?id=17019>

        Reviewed by David Kilzer.

        * wtf/TCSpinLock.h:
        (TCMalloc_SpinLock::Unlock):

2008-03-21  Rodney Dawes  <dobey@wayofthemonkey.com>

        Reviewed by Holger.

        http://bugs.webkit.org/show_bug.cgi?id=17981

        Add javascriptcore_cppflags to Programs_minidom_CPPFLAGS.

        * GNUmakefile.am:

2008-03-21  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Oliver Hunt.

        Consolidate static identifier initializers within CommonIdentifiers.

        No reliably measurable change on SunSpider; maybe a tiny improvement (within 0.2%).

        * kjs/CommonIdentifiers.h: Added static identifiers that were lazily initialized
        throughout the code.

        * kjs/date_object.cpp:
        (KJS::DateObjectImp::DateObjectImp):
        * kjs/function_object.cpp:
        (KJS::FunctionPrototype::FunctionPrototype):
        * kjs/object_object.cpp:
        (KJS::ObjectPrototype::ObjectPrototype):
        * kjs/regexp_object.cpp:
        (KJS::RegExpPrototype::RegExpPrototype):
        Use the values from CommonIdentifiers. 

        * kjs/lookup.h: Caching the identifier in a static wasn't a win on SunSpider, removed it.

        * kjs/value.h:
        (KJS::jsNaN): We already have a shared NaN value, no need for a duplicate here.

        * wtf/MathExtras.h:
        (wtf_atan2): Having local variables for numeric_limits constants is good for readability,
        but there is no reason to keep them static.

        * JavaScriptCore.exp: Don't needlessly export JSGlobalObject::s_head.

2008-03-20  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Fix for leak introduced by inline ScopeChainNode use

        To avoid any extra branches when managing an inline ScopeChainNode
        in the ScopeChain the inline node gets inserted with a refcount of
        2.  This meant than when the ScopeChain was destroyed the ScopeChainNodes
        above the inline node would be leaked.

        We resolve this by manually popping the inline node in the
        FunctionExecState destructor.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/ExecStateInlines.h:
        (KJS::FunctionExecState::~FunctionExecState):
        * kjs/scope_chain.h:
        (KJS::ScopeChain::popInlineScopeNode):

2008-03-20  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        Ensure that the defines in FEATURE_DEFINES are sorted so that they will match the default settings of build-webkit.
        This will prevent the world from being rebuilt if you happen to switch between building in Xcode and with build-webkit on the
        command-line.

        * Configurations/JavaScriptCore.xcconfig:

2008-03-20  David Krause  <david.krause@gmail.com>

        Reviewed by David Kilzer.

        Fix http://bugs.webkit.org/show_bug.cgi?id=17923
        Bug 17923: ARM platform endian defines inaccurate

        * wtf/Platform.h: 
        Replaced !defined(__ARMEL__) check with !defined(__VFP_FP__)
        for PLATFORM(MIDDLE_ENDIAN)

2008-03-20  Maciej Stachowiak  <mjs@apple.com>

        - fix build

        * JavaScriptCore.xcodeproj/project.pbxproj: install Activation.h as private

2008-03-20  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - reduce function call overhead for 1.014x speedup on SunSpider

        I moved some functions from ExecState.cpp to ExecStateInline.h and
        from JSGlobalObject.cpp to JSGlobalObject.h, and declared them
        inline; machine function call overhead for these was hurting JS
        funcion call overhead.
        
        * kjs/ExecState.cpp:
        * kjs/ExecStateInlines.h: Added.
        (KJS::ExecState::ExecState):
        (KJS::ExecState::~ExecState):
        (KJS::FunctionExecState::FunctionExecState):
        (KJS::FunctionExecState::~FunctionExecState):
        * kjs/JSGlobalObject.cpp:
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::pushActivation):
        (KJS::JSGlobalObject::checkActivationCount):
        (KJS::JSGlobalObject::popActivation):
        * kjs/function.cpp:

2008-03-19  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Avoid heap allocating the root scope chain node for eval and closure free functions

        Maciej suggested using an inline ScopeChainNode for functions that don't use eval
        or closures as they are unable to ever capture the scope chain.  This gives us a 2.4%
        win in sunspider, a 15% win in controlflow-recursive, and big (>5%) wins in a number 
        of other tests.

        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        * kjs/ExecState.h:
        * kjs/scope_chain.h:
        (KJS::ScopeChain::push):

2008-03-19  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        Fix release build.

        * kjs/JSGlobalObject.cpp:  Add missing #include.

2008-03-19  Sam Weinig  <sam@webkit.org>

        Reviewed by Anders Carlsson.

        Fix for <rdar://problem/5785694>
        Crash occurs at KJS::Collector::collect() when loading web clip widgets with a PAC file

        Make the activeExecStates stack per JSGlobalObject instead of static to ensure
        thread safety.

        * JavaScriptCore.exp:
        * kjs/ExecState.cpp:
        (KJS::InterpreterExecState::InterpreterExecState):
        (KJS::InterpreterExecState::~InterpreterExecState):
        (KJS::EvalExecState::EvalExecState):
        (KJS::EvalExecState::~EvalExecState):
        (KJS::FunctionExecState::FunctionExecState):
        (KJS::FunctionExecState::~FunctionExecState):
        * kjs/ExecState.h:
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::mark):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::activeExecStates):
        * kjs/collector.cpp:
        (KJS::Collector::collect):
        (KJS::Collector::reportOutOfMemoryToAllExecStates): Iterate all JSGlobalObjects and report
        the OutOfMemory condition to all the ExecStates in each.

2008-03-19  Jasper Bryant-Greene  <jasper@unix.geek.nz>

        Reviewed by Maciej Stachowiak.

        Fix http://bugs.webkit.org/show_bug.cgi?id=17941
        Bug 17941: C++-style comments in JavaScriptCore API

        * API/JSBase.h:
        Remove C++-style comments from public JavaScriptCore API, replacing
        with standard C90 block comments.

2008-03-19  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        Fix http://bugs.webkit.org/show_bug.cgi?id=17939
        Bug 17939: Crash decompiling "const a = 1, b;"

        * kjs/nodes2string.cpp:
        (KJS::ConstDeclNode::streamTo): Null-check the correct variable.

2008-03-18  Oliver Hunt  <oliver@apple.com>

        Reviewed by Mark Rowe.

        Bug 17929: Incorrect decompilation with |const|, comma
        http://bugs.webkit.org/show_bug.cgi?id=17929

        There were actually two bugs here. First we weren't correctly handling const
        nodes with multiple declarations. The second issue was caused by us not 
        giving the correct precedence to the initialisers.

        * kjs/nodes2string.cpp:
        (KJS::ConstDeclNode::streamTo):

2008-03-18  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - Speed up JavaScript built-in properties by changing the
          hash table to take advantage of the identifier objects

        5% speedup for Acid3 test 26

        * JavaScriptCore.exp: Updated.
        * kjs/create_hash_table: Compute size of hash table large enough so that there
        are no collisions, but don't generate the hash table.
        * kjs/identifier.h: Made the add function that returns a PassRefPtr public.
        * kjs/lexer.cpp:
        (KJS::Lexer::lex): Updated for change to HashTable interface.
        * kjs/lookup.cpp:
        (KJS::HashTable::changeKeysToIdentifiers): Added. Finds the identifier for
        each property so the equality comparision can be done with pointer comparision.
        * kjs/lookup.h: Made the key be a union of char* with UString::Rep* so it can
        hold identifiers. Added a keysAreIdentifiers flag to the HashTable. Changed
        the Lookup functions to be member functions of HashTable instead.
        * kjs/object.cpp:
        (KJS::JSObject::deleteProperty): Update for change to HashTable.
        (KJS::JSObject::findPropertyHashEntry): Ditto.
        (KJS::JSObject::getPropertyAttributes): Ditto.
        (KJS::JSObject::getPropertyNames): Ditto.

2008-03-18  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        Fix http://bugs.webkit.org/show_bug.cgi?id=17925 and http://bugs.webkit.org/show_bug.cgi?id=17927.
        - Bug 17925: Crash in KJS::JSObject::put after setting this.__proto__
        - Bug 17927: Hang after attempting to create circular __proto__

        * kjs/object.cpp:
        (KJS::JSObject::put): Silently ignore attempts to set __proto__ to a non-object, non-null value.
        Return after setting the exception when an attempt to set a cyclic __proto__ is detected so that
        the cyclic value is not set.

2008-03-18  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - inline ActivationImp::init for 0.8% SunSpider speedup

        * kjs/Activation.h:
        (KJS::ActivationImp::init): Moved here from function.cpp
        * kjs/function.cpp:

2008-03-18  Simon Hausmann  <hausmann@webkit.org>

        Fix the Qt build.

        Including config.h like in the other .cpp files gets the #ifdeffery
        correct for rand_s.

        * kjs/JSWrapperObject.cpp:

2008-03-17  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        JavaScriptCore changes to support a WebCore speedup.

        * JavaScriptCore.exp: Export the UString::Rep::computeHash function.
        * wtf/HashSet.h: Added a find and contains function that take a translator,
        like the add function.

2008-03-18  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - a few micro-optimizations for 1.2% SunSpider speedup

        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction): check for Return completion before Throw,
        it is more likely.
        * kjs/object.cpp:
        (KJS::JSObject::put): When walking prototype chain, instead of
        checking isObject (a virtual call), compare to jsNull (compare to
        a constant) since null is the only non-object that can be in a
        prototype chain.

2008-03-17  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Optimise multi-scope function call resolution

        Refactor multiscope variable resolution and use to add
        optimised FunctionCallResolveNode subclasses.  

        2.6% gain in sunspider performance, *25%* gain in controlflow-recursive

        * kjs/nodes.cpp:
        (KJS::getSymbolTableEntry):
        (KJS::ResolveNode::optimizeVariableAccess):
        (KJS::getNonLocalSymbol):
        (KJS::ExpressionNode::resolveAndCall):
        (KJS::FunctionCallResolveNode::optimizeVariableAccess):
        (KJS::FunctionCallResolveNode::inlineEvaluate):
        (KJS::ScopedVarFunctionCallNode::inlineEvaluate):
        (KJS::ScopedVarFunctionCallNode::evaluate):
        (KJS::ScopedVarFunctionCallNode::evaluateToNumber):
        (KJS::ScopedVarFunctionCallNode::evaluateToBoolean):
        (KJS::ScopedVarFunctionCallNode::evaluateToInt32):
        (KJS::ScopedVarFunctionCallNode::evaluateToUInt32):
        (KJS::NonLocalVarFunctionCallNode::inlineEvaluate):
        (KJS::NonLocalVarFunctionCallNode::evaluate):
        (KJS::NonLocalVarFunctionCallNode::evaluateToNumber):
        (KJS::NonLocalVarFunctionCallNode::evaluateToBoolean):
        (KJS::NonLocalVarFunctionCallNode::evaluateToInt32):
        (KJS::NonLocalVarFunctionCallNode::evaluateToUInt32):
        * kjs/nodes.h:
        (KJS::ScopedVarFunctionCallNode::):
        (KJS::NonLocalVarFunctionCallNode::):

2008-03-17  David Kilzer  <ddkilzer@apple.com>

        Don't define PLATFORM(MIDDLE_ENDIAN) on little endian ARM.

        Reviewed by Darin.

        See <http://bugs.webkit.org/show_bug.cgi?id=15416#c13>.

        * wtf/Platform.h: Added check for !defined(__ARMEL__) when defining
        PLATFORM(MIDDLE_ENDIAN).

2008-03-17  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff, Darin and Weinig.

        Add fast multi-level scope lookup
        
        Add logic and AST nodes to provide rapid variable resolution across
        static scope boundaries.  This also adds logic that allows us to skip
        any static scopes that do not contain the variable to be resolved.
        
        This results in a ~2.5% speedup in SunSpider, and gives a 25-30% speedup
        in some simple and ad hoc closure and global variable access tests.

        * JavaScriptCore.exp:
        * kjs/Activation.h:
        * kjs/JSGlobalObject.cpp:
        * kjs/JSGlobalObject.h:
        * kjs/JSVariableObject.cpp:
        * kjs/JSVariableObject.h:
        * kjs/function.cpp:
        (KJS::ActivationImp::isDynamicScope):
        * kjs/nodes.cpp:
        (KJS::ResolveNode::optimizeVariableAccess):
        (KJS::ScopedVarAccessNode::inlineEvaluate):
        (KJS::ScopedVarAccessNode::evaluate):
        (KJS::ScopedVarAccessNode::evaluateToNumber):
        (KJS::ScopedVarAccessNode::evaluateToBoolean):
        (KJS::ScopedVarAccessNode::evaluateToInt32):
        (KJS::ScopedVarAccessNode::evaluateToUInt32):
        (KJS::NonLocalVarAccessNode::inlineEvaluate):
        (KJS::NonLocalVarAccessNode::evaluate):
        (KJS::NonLocalVarAccessNode::evaluateToNumber):
        (KJS::NonLocalVarAccessNode::evaluateToBoolean):
        (KJS::NonLocalVarAccessNode::evaluateToInt32):
        (KJS::NonLocalVarAccessNode::evaluateToUInt32):
        (KJS::IfElseNode::optimizeVariableAccess):
        (KJS::ScopeNode::optimizeVariableAccess):
        * kjs/nodes.h:
        (KJS::ScopedVarAccessNode::):
        (KJS::NonLocalVarAccessNode::):
        * kjs/object.h:

 2008-03-16  weihongzeng  <weihong.zeng@hotmail.com>
 
         Reviewed by Darin Adler.
 
         http://bugs.webkit.org/show_bug.cgi?id=15416
         Add support for mixed-endian processors
 
         * kjs/dtoa.cpp: Add IEEE_ARM, triggered by PLATFORM(MIDDLE_ENDIAN).
 
2008-03-16  Kevin Ollivier  <kevino@theolliviers.com>

        Rubber stamped by Darin.

        Add set-webkit-configuration support for wx port, and centralize
        build dir location setting.

        http://bugs.webkit.org/show_bug.cgi?id=17790

        * jscore.bkl:

2008-03-14  Steve Falkenburg  <sfalken@apple.com>

        PGO build fixes.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2008-03-14  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Add logic to track whether a function uses a locally scoped eval or requires a closure
        
        Now that we limit eval we can track those uses of eval that operate
        in the local scope and functions that require a closure.  We track
        this information during initial parsing to avoid yet another tree
        walk.

        * JavaScriptCore.exp:
        * kjs/NodeInfo.h:
        * kjs/Parser.cpp:
        (KJS::Parser::didFinishParsing):
        * kjs/Parser.h:
        (KJS::Parser::parse):
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::ScopeNode::ScopeNode):
        (KJS::ProgramNode::ProgramNode):
        (KJS::ProgramNode::create):
        (KJS::EvalNode::EvalNode):
        (KJS::EvalNode::create):
        (KJS::FunctionBodyNode::FunctionBodyNode):
        (KJS::FunctionBodyNode::create):
        * kjs/nodes.h:
        (KJS::ScopeNode::):
        (KJS::ScopeNode::usesEval):
        (KJS::ScopeNode::needsClosure):

2008-03-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth Dakin.

        Fixed another problem with Vector::shrinkCapacity.
        
        moveOverlapping isn't good enough for the case where the buffer hasn't
        changed, because it still destroys the contents of the buffer.

        * wtf/Vector.h:
        (WTF::::shrinkCapacity): Changed to explicitly check whether the call
        to allocateBuffer produced a new buffer. If it didn't, there's no need
        to move.

2008-03-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth Dakin.
        
        Fixed a few problems with Vector::shrinkCapacity that I noticed in testing.

        * wtf/Vector.h:
        (WTF::VectorBufferBase::deallocateBuffer): Clear our m_buffer pointer
        when we deallocate m_buffer, in case we're not asked to reallocate a new
        buffer. (Otherwise, we would use a stale m_buffer if we were asked to
        perform any operations after shrinkCapacity was called.)
        
        (WTF::VectorBuffer::allocateBuffer): Made VectorBuffer with inline
        capacity aware that calls to allocateBuffer might be shrinks, rather
        than grows, so we shouldn't allocate a new buffer on the heap unless
        our inline buffer is too small.
        
        (WTF::::shrinkCapacity): Call resize() instead of just setting m_size,
        so destructors run. Call resize before reallocating the buffer to make
        sure that we still have access to the objects we need to destroy. Call
        moveOverlapping instead of move, since a call to allocateBuffer on an
        inline buffer may produce identical storage.

2008-03-14  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Get rid of a localime() call on platforms that have better alternatives.

        * kjs/DateMath.h: Added getLocalTime();

        * kjs/DateMath.cpp:
        (KJS::getLocalTime):
        (KJS::getDSTOffsetSimple):
        Implementation moved from getDSTOffsetSimple().

        * kjs/date_object.cpp:
        (KJS::DateObjectImp::callAsFunction): Switched to getLocalTime().

2008-03-14  David D. Kilzer  <ddkilzer@apple.com>

        Unify concept of enabling the Mac Java bridge.

        Reviewed by Darin and Anders.

        * wtf/Platform.h: Define ENABLE_MAC_JAVA_BRIDGE here.

2008-03-13  Mark Mentovai  <mark@moxienet.com>

        Reviewed by eseidel.  Landed by eseidel.

        * wtf/FastMalloc.cpp: #include <wtf/HashSet.h> outside of any
        namespaces.

2008-03-13  Mark Mentovai  <mark@moxienet.com>

        Reviewed by eseidel.  Landed by eseidel.

        * pcre/pcre_exec.cpp: Fix misnamed variable, allowing -DDEBUG build
        to succeed.
        * wtf/ThreadingPthreads.cpp: #include <sys/time.h> for gettimeofday
        in non-pch build.

2008-03-13  Steve Falkenburg  <sfalken@apple.com>

        PGO build fixes.
        
        Disable PGO for normal release builds.
        Added work-in-progress Release_PGOInstrument/Release_PGOOptimize targets.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2008-03-13  Beth Dakin  <bdakin@apple.com>

        Reviewed by Geoff.

        Adding new functionality to Vector. Currently all of the shrink and 
        resize functions on Vector only shrink the size of the Vector, not 
        the capacity. For the Vector to take up as little memory as 
        possible, though, it is necessary to be able to shrink the capacity 
        as well. So this patch adds that functionality. 

        I need this for a speed up I am working on, and Geoff wants to use 
        it in a speed up he is working on also, so he asked me to commit it 
        now. 

        * wtf/Vector.h:
        (WTF::VectorBufferBase::allocateBuffer):
        (WTF::::shrinkCapacity):

2008-03-13  Simon Hausmann  <hausmann@webkit.org>

        Reviewed by Adam Roben.

        Attempt at fixing the Qt/Windows build bot. Quote using double-quotes
        instead of single quotes.

        * pcre/dftables:

2008-03-12  Steve Falkenburg  <sfalken@apple.com>

        Build fix.

        * JavaScriptCore.vcproj/WTF/WTF.vcproj:

2008-03-12  Alp Toker  <alp@atoker.com>

        Another autotools testkjs build fix attempt.

        * GNUmakefile.am:

2008-03-12  Alp Toker  <alp@atoker.com>

        Attempt to fix the autotools testkjs build on systems with
        non-standard include paths.

        * GNUmakefile.am:

2008-03-11  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        <rdar://problem/5787743> REGRESSION: Crash at WTF::Collator::CreateCollator() running fast/js/kde/StringObject.html on Windows

        * wtf/unicode/icu/CollatorICU.cpp:
        (WTF::Collator::createCollator): Check for null (== user default) m_locale before calling strcmp.

2008-03-11  Steve Falkenburg  <sfalken@apple.com>

        Disable LTCG/PGO for grammar.cpp and nodes.cpp.
        PGO on these files causes us to hang.
        
        Copy newer vsprops files from relative WebKitLibraries path to environment variable based path.
        
        Reviewed by Oliver.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make:

2008-03-10  Darin Adler  <darin@apple.com>

        - Windows build fix

        * kjs/function.cpp: (KJS::decode): Initialize variable.

2008-03-10  Brent Fulgham  <bfulgham@gmail.com>

        Windows build fix

        Reviewed by Adam.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make:
        Set the PATH to include Cygwin before running touch.

2008-03-10  Eric Seidel  <eric@webkit.org>

        Build fix for JSC on windows.

        * API/JSStringRefCF.cpp:
        (JSStringCreateWithCFString):
        * kjs/function.cpp:
        (KJS::decode):
        * kjs/nodes2string.cpp:
        (KJS::escapeStringForPrettyPrinting):

2008-03-10  Eric Seidel  <eric@webkit.org>
        
        No review, build fix only.
        
        Attempt to fix the windows build?

        * kjs/ustring.h: change unsigned short to UChar

2008-03-10  Eric Seidel  <eric@webkit.org>

        Reviewed by Darin.

        Remove KJS::UChar, use ::UChar instead
        http://bugs.webkit.org/show_bug.cgi?id=17017

        * API/JSStringRef.cpp:
        (JSStringCreateWithCharacters):
        (JSStringCreateWithUTF8CString):
        * API/JSStringRefCF.cpp:
        (JSStringCreateWithCFString):
        * JavaScriptCore.exp:
        * kjs/Parser.h:
        * kjs/function.cpp:
        (KJS::decode):
        (KJS::parseInt):
        (KJS::parseFloat):
        (KJS::globalFuncEscape):
        (KJS::globalFuncUnescape):
        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::construct):
        * kjs/identifier.cpp:
        (KJS::Identifier::equal):
        (KJS::CStringTranslator::translate):
        * kjs/interpreter.h:
        * kjs/lexer.cpp:
        (KJS::Lexer::setCode):
        (KJS::Lexer::shift):
        (KJS::Lexer::lex):
        (KJS::Lexer::convertUnicode):
        (KJS::Lexer::makeIdentifier):
        * kjs/lookup.cpp:
        (KJS::keysMatch):
        * kjs/nodes2string.cpp:
        (KJS::escapeStringForPrettyPrinting):
        (KJS::SourceStream::operator<<):
        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp):
        (KJS::RegExp::match):
        * kjs/string_object.cpp:
        (KJS::substituteBackreferences):
        (KJS::stringProtoFuncCharCodeAt):
        (KJS::stringProtoFuncToLowerCase):
        (KJS::stringProtoFuncToUpperCase):
        (KJS::stringProtoFuncToLocaleLowerCase):
        (KJS::stringProtoFuncToLocaleUpperCase):
        * kjs/ustring.cpp:
        (KJS::UString::Rep::computeHash):
        (KJS::UString::UString):
        (KJS::UString::append):
        (KJS::UString::ascii):
        (KJS::UString::operator=):
        (KJS::UString::is8Bit):
        (KJS::UString::toStrictUInt32):
        (KJS::UString::find):
        (KJS::operator==):
        (KJS::operator<):
        (KJS::compare):
        (KJS::UString::UTF8String):
        * kjs/ustring.h:
        * pcre/pcre.h:

2008-03-09  Steve Falkenburg  <sfalken@apple.com>

        Stop Windows build if an error occurs in a prior project.

        Rubber stamped by Darin.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make:
        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2008-03-09  J¸rg Billeter  <j@bitron.ch>

        Reviewed by Alp Toker.

        Conditionalise ICU for Unicode in the GTK+ port.

        * wtf/Platform.h:

2008-03-07  David D. Kilzer  <ddkilzer@apple.com>

        Unify concept of enabling Netscape Plug-in API (NPAPI).

        Reviewed by Darin.

        * wtf/Platform.h: Define ENABLE_NETSCAPE_PLUGIN_API here.

2008-03-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Fixed <rdar://problem/5689093> Stricter (ES4) eval semantics
        
        The basic rule is:
        
        - "eval(s)" is treated as an operator that gives the ES3 eval behavior.
            ... but only if there is no overriding declaration of "eval" in scope.
        - All other invocations treat eval as a function that evaluates a
        script in the context of its "this" object.
            ... but if its "this" object is not the global object it was
            originally associated with, eval throws an exception.
        
        Because only expressions of the form "eval(s)" have access to local
        scope, the compiler can now statically determine whether a function
        needs local scope to be dynamic.

        * kjs/nodes.h: Added FunctionCallEvalNode. It works just like
        FuncationCallResolveNode, except it statically indicates that the node
        may execute eval in the ES3 way.
        * kjs/nodes.cpp:
        * kjs/nodes2string.cpp:

        * tests/mozilla/expected.html: This patch happens to fix a Mozilla JS
        test, but it's a bit of a pyrrhic victory. The test intends to test
        Mozilla's generic API for calling eval on any object, but, in reality,
        we only support calling eval on the global object.

2008-03-06  Steve Falkenburg  <sfalken@apple.com>

        Build fix.

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2008-03-06  Steve Falkenburg  <sfalken@apple.com>

        Build fix.

        * JavaScriptCore.vcproj/WTF/WTF.vcproj:

2008-03-06  Alp Toker  <alp@atoker.com>

        Fix the build fix in r30845 to support out-of-tree builds.

        * GNUmakefile.am:

2008-03-06  Steve Falkenburg  <sfalken@apple.com>

        Build fix.

        * wtf/ThreadingWin.cpp:
        (WTF::ThreadCondition::timedWait):

2008-03-06  Darin Adler  <darin@apple.com>

        - another small step towards fixing the Qt build

        * JavaScriptCore.pri: Remove more references to the now-obsolete bindings directory.

2008-03-06  Darin Adler  <darin@apple.com>

        - a small step towards fixing the Qt build

        * JavaScriptCore.pri: Remove references to files no longer present in JavaScriptCore/bindings.

2008-03-06  Brady Eidson  <beidson@apple.com>

        Gtk Build fix

        * wtf/ThreadingGtk.cpp:
        (WTF::ThreadCondition::timedWait):

2008-03-06  Alexey Proskuryakov  <ap@webkit.org>

        Wx build fix.

        * wtf/unicode/icu/CollatorICU.cpp:
        (WTF::Collator::userDefault): Put ICU workaround under both PLATFORM(DARWIN) and
        PLATFORM(CF) checks, so that each port can decide if it wants to use CF on Mac for it.

2008-03-06  Brady Eidson <beidson@apple.com>

        Reviewed by Darin

        Add a timedWait() method to ThreadCondition

        * JavaScriptCore.exp:

        * wtf/Threading.h:

        * wtf/ThreadingGtk.cpp:
        (WTF::ThreadCondition::timedWait):

        * wtf/ThreadingNone.cpp:
        (WTF::ThreadCondition::timedWait):

        * wtf/ThreadingPthreads.cpp:
        (WTF::ThreadCondition::timedWait):

        * wtf/ThreadingWin.cpp:
        (WTF::ThreadCondition::timedWait): Needs implementation

2008-03-06  Alexey Proskuryakov  <ap@webkit.org>

        More build fixes.

        * jscore.bkl: Add the wtf/unicode directory.
        * wtf/unicode/CollatorDefault.cpp:
        (WTF::Collator::userDefault): Use a constructor that does exist.
        * wtf/unicode/icu/CollatorICU.cpp: Mac build fix for case-sensitive file systems.

2008-03-06  Darin Adler  <darin@apple.com>

        - try to fix the Qt build

        * JavaScriptCore.pri: Add the wtf/unicode directory.

2008-03-06  Darin Adler  <darin@apple.com>

        - try to fix the GTK build

        * GNUmakefile.am: Add a -I for the wtf/unicode directory.

2008-03-06  Darin Adler  <darin@apple.com>

        - try to fix the Mac build

        * icu/unicode/parseerr.h: Copied from ../WebCore/icu/unicode/parseerr.h.
        * icu/unicode/ucol.h: Copied from ../WebCore/icu/unicode/ucol.h.
        * icu/unicode/uloc.h: Copied from ../WebCore/icu/unicode/uloc.h.
        * icu/unicode/unorm.h: Copied from ../WebCore/icu/unicode/unorm.h.
        * icu/unicode/uset.h: Copied from ../WebCore/icu/unicode/uset.h.

2008-03-06  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        <rdar://problem/5687269> Need to create a Collator abstraction for WebCore and JavaScriptCore

        * wtf/Threading.h:
        (WTF::initializeThreading):
        * wtf/ThreadingGtk.cpp:
        (WTF::initializeThreading):
        * wtf/ThreadingNone.cpp:
        * wtf/ThreadingPthreads.cpp:
        * wtf/ThreadingWin.cpp:
        Added AtomicallyInitializedStatic.

        * kjs/string_object.cpp: (KJS::localeCompare): Changed to use Collator.

        * GNUmakefile.am:
        * JavaScriptCore.exp:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        Added new fiiles to projects.

        * wtf/unicode/Collator.h: Added.
        (WTF::Collator::):
        * wtf/unicode/CollatorDefault.cpp: Added.
        (WTF::Collator::Collator):
        (WTF::Collator::~Collator):
        (WTF::Collator::setOrderLowerFirst):
        (WTF::Collator::collate):
        * wtf/unicode/icu/CollatorICU.cpp: Added.
        (WTF::cachedCollatorMutex):
        (WTF::Collator::Collator):
        (WTF::Collator::~Collator):
        (WTF::Collator::setOrderLowerFirst):
        (WTF::Collator::collate):
        (WTF::Collator::createCollator):
        (WTF::Collator::releaseCollator):

2008-03-05  Kevin Ollivier  <kevino@theolliviers.com>

        Fix the wx build after the bindings move.

        * JavaScriptCoreSources.bkl:
        * jscore.bkl:

2008-03-05  Alp Toker  <alp@atoker.com>

        GTK+ build fix for breakage introduced in r30800.

        Track moved bridge sources from JavaScriptCore to WebCore.

        * GNUmakefile.am:

2008-03-05  Brent Fulgham  <bfulgham@gmail.com>

        Reviewed by Adam Roben.

        Remove definition of WTF_USE_SAFARI_THEME from wtf/Platform.h
        because the PLATFORM(CG) flag is not set until config.h has
        already included this file.

        * wtf/Platform.h:  Remove useless definition of WTF_USE_SAFARI_THEME

2008-03-05  Brady Eidson  <beidson@apple.com>

        Reviewed by Alexey and Mark Rowe

        Fix for <rdar://problem/5778247> - Reproducible crash on storage/execute-sql-args.html

        DatabaseThread::unscheduleDatabaseTasks() manually filters through a MessageQueue,
        removing particular items for Databases that were shutting down.

        This filtering operation is not atomic, and therefore causes a race condition with the
        MessageQueue waking up and reading from the message queue.  

        The end result was an attempt to dereference a null DatabaseTask.  Timing-wise, this never
        seemed to happen in a debug build, otherwise an assertion would've caught it.  Replacing that
        assertion with a crash in a release build is what revealed this bug.

        * wtf/MessageQueue.h:
        (WTF::::waitForMessage): Tweak the waiting logic to check the queue's empty state then go back
          to sleep if the queue was empty - checking m_killed each time it wakes up.

2008-03-05  David D. Kilzer  <ddkilzer@apple.com>

        Remove unused header includes from interpreter.cpp.

        Reviewed by Darin.

        * kjs/interpreter.cpp: Remove unused header includes.

2008-03-05  Anders Carlsson  <andersca@apple.com>

        Reviewed by Sam.
        
        Remove bindings/.

        * bindings: Removed.

2008-03-05  Anders Carlsson  <andersca@apple.com>

        Don't build bindings/ anymore.
        
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2008-03-05  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff.

        Don't build JavaScriptCore/bindings.
        
        * JavaScriptCore.exp:
        Export a couple of new functions. 
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        Remove bindings/
        
        * kjs/config.h:
        No need to define HAVE_JNI anymore.
        
        * kjs/interpreter.cpp:
        Remove unnecessary include.

2008-03-05  David D. Kilzer  <ddkilzer@apple.com>

        Allow override of default script file name using command-line argument.

        Reviewed by Adele.

        * API/minidom.c:
        (main): Allow first command-line argument to override the default script
        file name of "minidom.js".
        * API/testapi.c:
        (main): Allow first command-line argument to override the default script
        file name of "testapi.js".

2008-03-04  Mark Rowe  <mrowe@apple.com>

        Mac build fix.

        * JavaScriptCore.exp:  Add new symbol to exports file.

2008-03-03  Oliver Hunt  <oliver@apple.com>

        Reviewed by Anders.

        Make ForInNode check for the timeout interrupt

        * kjs/nodes.cpp:
        (KJS::ForInNode::execute):

2008-03-02  Brent Fulgham  <bfulgham@gmail.com>

        Reviewed by Alp Toker.

        http://bugs.webkit.org/show_bug.cgi?id=17415
        GTK Build (using autotools) on Mac OS (DarwinPorts) Fails

        Add -lstdc++ to link flags for minidom program.  This corrects
        a build error for the GTK+ on Mac OS.

        * GNUmakefile.am:

2008-03-01  Mark Rowe  <mrowe@apple.com>

        Reviewed by Tim Hatcher.

        Update Xcode configuration to support building debug and release from the mysterious future.

        * Configurations/Base.xcconfig:
        * Configurations/DebugRelease.xcconfig:

2008-02-29  Brent Fulgham  <bfulgham@gmail.com>

        http://bugs.webkit.org/show_bug.cgi?id=17483
        Implement scrollbars on Windows (Cairo)

        Reviewed by Adam Roben.

        * wtf/Platform.h:

2008-02-29  Adam Roben  <aroben@apple.com>

        Remove unused DebuggerImp::abort and DebuggerImp::aborted

        Reviewed by Tim and Sam.

        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::construct):
        * kjs/internal.h:
        (KJS::DebuggerImp::DebuggerImp):
        * kjs/nodes.cpp:
        (KJS::Node::handleException):
        (KJS::FunctionBodyNodeWithDebuggerHooks::execute):

2008-02-28  Eric Christopher  <echristo@apple.com>

        Reviewed by Geoffrey Garen.

        ** TOTAL **:          1.005x as fast    2867.6ms +/- 0.4%  2853.2ms +/- 0.3%    significant

        * kjs/nodes.cpp: Tell the compiler that exceptions are unexpected (for
        the sake of branch prediction and code organization).

2008-02-27  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Sam Weinig.

        http://bugs.webkit.org/show_bug.cgi?id=17030
        Small buffer overflow within initialization

        * kjs/date_object.cpp:
        (KJS::DateObjectFuncImp::callAsFunction):
        (KJS::parseDate):
        Remove unnecessary and incorrect memset() calls - GregorianDateTime can initialize itself.

2008-02-25  Sam Weinig  <sam@webkit.org>

        Reviewed by Dan Bernstein.

        - Add a variant of remove that takes a position and a length.

        * wtf/Vector.h:
        (WTF::Vector::remove):

2008-02-25  Mark Mentovai  <mark@moxienet.com>

        Reviewed by Mark Rowe.

        Enable CollectorHeapIntrospector to build by itself, as well as in an AllInOneFile build.
        http://bugs.webkit.org/show_bug.cgi?id=17538

        * kjs/CollectorHeapIntrospector.cpp: Provide "using" declaration for
          WTF::RemoteMemoryReader.
        * kjs/collector.h: Move CollectorHeap declaration here...
        * kjs/collector.cpp: ... from here.

2008-02-25  Darin Adler  <darin@apple.com>

        Reviewed by Adam.

        * JavaScriptCore.exp: Sort the contents of this file.

2008-02-25  Adam Roben  <aroben@apple.com>

        MSVC build fix

        * kjs/testkjs.cpp:
        (functionQuit): Don't add a return statement after exit(0) for MSVC.

2008-02-24  Sam Weinig  <sam@webkit.org>

        Reviewed by Mark Rowe.

        http://bugs.webkit.org/show_bug.cgi?id=17529
        Add support for reading from stdin from testkjs

        * kjs/testkjs.cpp:
        (GlobalObject::GlobalObject): Add readline function to global object.
        (functionReadline): Added. Reads characters from stdin until a '\n' or
        EOF is encountered. The input is returned as a String to the caller.

2008-02-24  Sam Weinig  <sam@webkit.org>

        Reviewed by Mark Rowe.

        http://bugs.webkit.org/show_bug.cgi?id=17528
        Give testkjs a bath

        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj: Make the testkjs.cpp use 4 space indentation.
        * kjs/testkjs.cpp:
        (StopWatch::getElapsedMS):
        (GlobalObject::className):
        (GlobalObject::GlobalObject):
        Rename GlobalImp to GlobalObject and setup the global functions
        in the GlobalObject's constructor. Also, use static functions for
        the implementation so we can use the standard PrototypeFunction
        class and remove TestFunctionImp.
        (functionPrint): Move print() functionality here.
        (functionDebug): Move debug() functionality here.
        (functionGC): Move gc() functionality here.
        (functionVersion): Move version() functionality here.
        (functionRun): Move run() functionality here.
        (functionLoad): Move load() functionality here.
        (functionQuit): Move quit() functionality here.
        (prettyPrintScript): Fix indentation.
        (runWithScripts): Since all the functionality of createGlobalObject is
        now in the GlobalObject constructor, just call new here.
        (parseArguments): Fix indentation.
        (kjsmain): Ditto
        (fillBufferWithContentsOfFile): Ditto.

2008-02-24  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver Hunt and Mark Rowe.

        http://bugs.webkit.org/show_bug.cgi?id=17505
        Add support for getting command line arguments in testkjs

        - This slightly changes the behavior of parsing arguments by requiring
          a '-f' before all files. 

        * kjs/testkjs.cpp:
        (createGlobalObject): Add a global property called 'arguments' which
        contains an array with the parsed arguments as strings.
        (runWithScripts): Pass in the arguments vector so that it can be passed
        to the global object.
        (parseArguments): Change parsing rules to require a '-f' before any script
        file. After all '-f' and '-p' arguments have been parsed, the remaining
        are added to the arguments vector and exposed to the script. If there is a
        chance of ambiguity (the user wants to pass the string '-f' to the script),
        the string '--' can be used separate the options from the pass through 
        arguments.
        (kjsmain):

2008-02-24  Dan Bernstein  <mitz@apple.com>

        Reviewed by Darin Adler.

        - fix http://bugs.webkit.org/show_bug.cgi?id=17511
          REGRESSION: Reproducible crash in SegmentedSubstring::SegmentedSubstring(SegmentedSubstring const&)

        * wtf/Deque.h:
        (WTF::::expandCapacityIfNeeded): Fixed the case where m_start and m_end
        are both zero but the buffer capacity is non-zero.
        (WTF::::prepend): Added validity checks.

2008-02-23  Jan Michael Alonzo  <jmalonzo@unpluggable.com>

        Rubber stamped by Darin.

        Add separator '\' after libJavaScriptCore_la_LIBADD and cleanup
        whitespaces introduced in the previous commit.

        * GNUmakefile.am: 

2008-02-23  Jan Michael Alonzo  <jmalonzo@unpluggable.com>

        * GNUmakefile.am: Add GLOBALDEPS for testkjs and minidom.

2008-02-23  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - http://bugs.webkit.org/show_bug.cgi?id=17496
          make Deque use a circular array; add iterators

        * wtf/Deque.h: Wrote an all-new version of this class that uses a circular
        buffer. Growth policy is identical to vector. Added iterators.

        * wtf/Vector.h: Made two small refinements while using this to implement
        Deque: Made VectorBufferBase derive from Noncopyable, which would have
        saved me some debugging time if it had been there. Renamed Impl and
        m_impl to Buffer and m_buffer.

2008-02-23  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - http://bugs.webkit.org/show_bug.cgi?id=17067
          eliminate attributes parameter from JSObject::put for speed/clarity

        * API/JSCallbackObject.h: Removed attribute arguments.
        * API/JSCallbackObjectFunctions.h:
        (KJS::JSCallbackObject<Base>::put): Ditto.
        * API/JSObjectRef.cpp:
        (JSObjectSetProperty): Use initializeVariable or putDirect when necessary
        to set attribute values.
        * JavaScriptCore.exp: Updated.
        * bindings/objc/objc_runtime.h: Removed attribute arguments.
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::put): Ditto.
        * bindings/runtime_array.cpp:
        (RuntimeArray::put): Ditto.
        * bindings/runtime_array.h: Ditto.
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::put): Ditto.
        * bindings/runtime_object.h: Ditto. Also removed canPut which was only
        called from one place in WebCore that can use hasProperty instead.

        * kjs/Activation.h: Removed attribute argument from put and added the new
        initializeVariable function that's used to put variables in variable objects.
        Also made isActivationObject a const member.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::put): Removed attribute argument.
        (KJS::JSGlobalObject::initializeVariable): Added. Used to give variables
        their initial values, which can include the read-only property.
        (KJS::JSGlobalObject::reset): Removed obsolete comments about flags.
        Removed Internal flag, which is no longer needed.
        * kjs/JSGlobalObject.h: More of the same.

        * kjs/JSVariableObject.h: Added pure virtual initializeVariable function.
        (KJS::JSVariableObject::symbolTablePut): Removed checkReadOnly flag; we always
        check read-only.
        (KJS::JSVariableObject::symbolTableInitializeVariable): Added.

        * kjs/array_instance.cpp:
        (KJS::ArrayInstance::put): Removed attribute argument.
        * kjs/array_instance.h: Ditto.

        * kjs/function.cpp:
        (KJS::FunctionImp::put): Ditto.
        (KJS::Arguments::put): Ditto.
        (KJS::ActivationImp::put): Ditto.
        (KJS::ActivationImp::initializeVariable): Added.
        * kjs/function.h: Removed attribute arguments.

        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::construct): Removed Internal flag.

        * kjs/lookup.h:
        (KJS::lookupPut): Removed attributes argument. Also changed to use putDirect
        instead of calling JSObject::put.
        (KJS::cacheGlobalObject): Ditto.

        * kjs/nodes.cpp:
        (KJS::ConstDeclNode::handleSlowCase): Call initializeVariable to initialize
        the constant.
        (KJS::ConstDeclNode::evaluateSingle): Ditto.
        (KJS::TryNode::execute): Use putDirect to set up the new object.
        (KJS::FunctionBodyNode::processDeclarations): Removed Internal.
        (KJS::ProgramNode::processDeclarations): Ditto.
        (KJS::EvalNode::processDeclarations): Call initializeVariable to initialize
        the variables and functions.
        (KJS::FuncDeclNode::makeFunction): Removed Internal.
        (KJS::FuncExprNode::evaluate): Ditto.

        * kjs/object.cpp: Removed canPut, which was only being used in one code path,
        not the normal high speed one.
        (KJS::JSObject::put): Removed attribute argument. Moved the logic from
        canPut here, in the one code ath that was still using it.
        * kjs/object.h: Removed Internal attribute, ad canPut function. Removed the
        attributes argument to the put function. Made isActivationObject const.

        * kjs/regexp_object.cpp:
        (KJS::RegExpImp::put): Removed attributes argument.
        (KJS::RegExpImp::putValueProperty): Ditto.
        (KJS::RegExpObjectImp::put): Ditto.
        (KJS::RegExpObjectImp::putValueProperty): Ditto.
        * kjs/regexp_object.h: Ditto.

        * kjs/string_object.cpp:
        (KJS::StringInstance::put): Removed attributes argument.
        * kjs/string_object.h: Ditto.

2008-02-23  Jan Michael Alonzo  <jmalonzo@unpluggable.com>

        Not reviewed, Gtk build fix.

        * kjs/testkjs.pro:

2008-02-23  Alexey Proskuryakov  <ap@webkit.org>

        Windows build fix - move ThreadCondition implementation from WebCore to WTF.

        * wtf/ThreadingWin.cpp:
        (WTF::ThreadCondition::ThreadCondition):
        (WTF::ThreadCondition::~ThreadCondition):
        (WTF::ThreadCondition::wait):
        (WTF::ThreadCondition::signal):
        (WTF::ThreadCondition::broadcast):

2008-02-23  Alexey Proskuryakov  <ap@webkit.org>

        Touch some files, hoping that Windows build bot will create JSC headers.

        * kjs/AllInOneFile.cpp:
        * kjs/array_instance.cpp:
        * wtf/HashTable.cpp:

2008-02-23  Alexey Proskuryakov  <ap@webkit.org>

        Qt/Wx build fix - this file was still in a wrong namespace, too.

        * wtf/ThreadingNone.cpp:

2008-02-23  Alexey Proskuryakov  <ap@webkit.org>

        More build fixing - fix mismatched braces.

        * JavaScriptCore.pri:

2008-02-23  Alexey Proskuryakov  <ap@webkit.org>

        Wx and Gtk build fixes.

        * JavaScriptCore.pri: Don't try to compile ThreadingPthreads.
        * wtf/ThreadingGtk.cpp: Use a correct namespace.

2008-02-23  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        Move basic threading support from WebCore to WTF.

        Added mutex protection to MessageQueue::killed() for paranoia sake.

        * GNUmakefile.am:
        * JavaScriptCore.exp:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * wtf/Locker.h: Copied from WebCore/platform/Locker.h.
        * wtf/MessageQueue.h: Copied from WebCore/platform/MessageQueue.h.
        (WTF::::killed):
        * wtf/Threading.h: Copied from WebCore/platform/Threading.h.
        * wtf/ThreadingGtk.cpp: Copied from WebCore/platform/gtk/ThreadingGtk.cpp.
        (WebCore::createThread):
        * wtf/ThreadingNone.cpp: Copied from WebCore/platform/ThreadingNone.cpp.
        * wtf/ThreadingPthreads.cpp: Copied from WebCore/platform/pthreads/ThreadingPthreads.cpp.
        (WTF::createThread):
        * wtf/ThreadingWin.cpp: Copied from WebCore/platform/win/ThreadingWin.cpp.
        (WTF::createThread):
        (WTF::Mutex::Mutex):
        (WTF::Mutex::~Mutex):
        (WTF::Mutex::lock):
        (WTF::Mutex::tryLock):
        (WTF::Mutex::unlock):

2008-02-22  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Partial fix for <rdar://problem/5744037> Gmail out of memory (17455)
        
        I'm removing KJS_MEM_LIMIT for the following reasons:
        
        - We have a few reports of KJS_MEM_LIMIT breaking important web
        applications, like GMail and Google Reader. (For example, if you
        simply open 12 GMail tabs, tab #12 will hit the limit.)

        - Firefox has no discernable JS object count limit, so any limit, even
        a large one, is a potential compatibility problem.
        
        - KJS_MEM_LIMIT does not protect against malicious memory allocation,
        since there are many ways to maliciously allocate memory without
        increasing the JS object count.
        
        - KJS_MEM_LIMIT is already mostly broken, since it only aborts the
        script that breaches the limit, not any subsequent scripts.
        
        - We've never gotten bug reports about websites that would have
        benefited from an unbroken KJS_MEM_LIMIT. The initial check-in of
        KJS_MEM_LIMIT (KJS revision 80061) doesn't mention a website that
        needed it.
        
        - Any website that brings you anywhere close to crashing due to the
        number of live JS objects will almost certainly put up the "slow
        script" dialog at least 20 times beforehand.

        * kjs/collector.cpp:
        (KJS::Collector::collect):
        * kjs/collector.h:
        * kjs/nodes.cpp:
        (KJS::TryNode::execute):

2008-02-22  Oliver Hunt  <oliver@apple.com>

        Reviewed by Alexey P.

        <rdar://problem/5759327> REGRESSION: while(NaN) acts like while(true)

        Fix yet another case where we incorrectly relied on implicit double
        to bool coercion.

        * kjs/nodes.cpp:
        (KJS::PostDecLocalVarNode::evaluateToBoolean):

2008-02-20  Michael Knaup  <michael.knaup@mac.com>

        Reviewed by Darin.

        Fix for Bug 16753: date set methods with no args should result in NaN (Acid3 bug)
        The set values result in NaN now when called with no args, NaN or +/- inf values.
        The setYear, setFullYear and setUTCFullYear methods used on NaN dates work as 
        descripted in the standard.

        * kjs/date_object.cpp:
        (KJS::fillStructuresUsingTimeArgs):
        (KJS::fillStructuresUsingDateArgs):
        (KJS::setNewValueFromTimeArgs):
        (KJS::setNewValueFromDateArgs):
        (KJS::dateProtoFuncSetYear):

2008-02-19  Anders Carlsson  <andersca@apple.com>

        Reviewed by Darin.

        Change OpaqueJSClass and RootObject to start with a ref count of 1.
        
        * API/JSClassRef.cpp:
        (OpaqueJSClass::OpaqueJSClass):
        (OpaqueJSClass::createNoAutomaticPrototype):
        (OpaqueJSClass::create):
        * API/JSClassRef.h:
        * API/JSObjectRef.cpp:
        (JSClassCreate):
        * bindings/runtime_root.cpp:
        (KJS::Bindings::RootObject::create):
        (KJS::Bindings::RootObject::RootObject):

2008-02-19  Darin Adler  <darin@apple.com>

        Rubber stamped by Anders.

        - removed explicit initialization to 1 for RefCounted; that's now the default

        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp): Removed RefCounted initializer.

2008-02-19  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - next step for http://bugs.webkit.org/show_bug.cgi?id=17257
          start ref counts at 1 instead of 0 for speed

        * wtf/RefCounted.h:
        (WTF::RefCounted::RefCounted): Have refcounts default to 1. This allows us to start
        removing the explicit initialization of RefCounted from classes and eventually we
        can remove the ability to have the initial count of 0 entirely.

2008-02-18  Samuel Weinig  <sam@webkit.org>

        Reviewed by Geoff Garen.

        Fix for http://bugs.webkit.org/show_bug.cgi?id=17419
        Remove CompatMode from JavaScriptCore as it is never set to anything other than NativeMode

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::init):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::setDebugger):
        * kjs/date_object.cpp:
        (KJS::dateProtoFuncGetYear):

2008-02-18  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        * wtf/ASCIICType.h:
        (WTF::toASCIIHexValue): Added.

2008-02-17  Darin Adler  <darin@apple.com>

        * wtf/ListHashSet.h: (WTF::swap): Removed stray return statement.

2008-02-15  Adam Roben  <aroben@apple.com>

        Make JavaScriptCore's FEATURE_DEFINES match WebCore's

        Reviewed by Mark.

        * Configurations/JavaScriptCore.xcconfig:

2008-02-14  Stephanie Lewis <slewis@apple.com>

        Reviewed by Geoff.

        Update order files.

        * JavaScriptCore.order:

2008-02-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Fixed <rdar://problem/5737835> nee http://bugs.webkit.org/show_bug.cgi?id=17329
        Crash in JSGlobalObject::popActivation when inserting hyperlink in Wordpress (17329)
        
        Don't reset the "activations" stack in JSGlobalObject::reset, since we
        might be executing a script during the call to reset, and the script
        needs to safely run to completion.
        
        Instead, initialize the "activations" stack when the global object is
        created, and subsequently rely on pushing and popping during normal
        execution to maintain the stack's state.
        
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::init):
        (KJS::JSGlobalObject::reset):

2008-02-13  Bernhard Rosenkraenzer  <bero@arklinux.org>

        Reviewed by Darin.

        - http://bugs.webkit.org/show_bug.cgi?id=17339
          JavaScriptCore does not build with gcc 4.3

        * kjs/interpreter.cpp: Add include of <unistd.h>, since that's where
        getpid() comes from.

2008-02-13  Oliver Hunt  <oliver@apple.com>

        Reviewed by Alexey P.

        <rdar://problem/5737003> REGRESSION (r27747): can't browse pictures on fastcupid.com

        When converting numeric values to booleans we need to account for NaN

        * kjs/nodes.cpp:
        (KJS::MultNode::evaluateToBoolean):
        (KJS::ModNode::evaluateToBoolean):

2008-02-08  Samuel Weinig  <sam@webkit.org>

        Reviewed by Brady Eidson.

        <rdar://problem/5659216> REGRESSION: PLT 0.3% slower due to r28868 (caching ClassNodeList and NamedNodeList)

        - Tweak the statements in isASCIISpace to account for the statistical distribution of
          usage in the PLT.

        .4% speedup on my machine.  Stephanie's machine shows this as .3% speedup.

        * wtf/ASCIICType.h:
        (WTF::isASCIISpace): 

2008-02-11  Sam Weinig  <sam@webkit.org>

        Reviewed by Anders Carlsson.

        Fixes for:
        <rdar://problem/5735497> Match Firefox's cross-domain model more accurately by return the built-in version of functions even if they have been overridden
        <rdar://problem/5735443> Crash when setting the Window objects prototype to a custom Object and then calling a method on it

        - Expose the native Object.prototype.toString implementation so that it can be used for cross-domain
          toString calling.

        * JavaScriptCore.exp:
        * kjs/object_object.cpp:
        * kjs/object_object.h:

2008-02-10  Darin Adler  <darin@apple.com>

        Rubber stamped by Eric.

        * kjs/ExecState.h:
        (KJS::ExecState::takeException): Added.

2008-02-10  Darin Adler  <darin@apple.com>

        Reviewed by Eric.

        - http://bugs.webkit.org/show_bug.cgi?id=17256
          eliminate default ref. count of 0 in RefCounted class

        * wtf/RefCounted.h:
        (WTF::RefCounted::RefCounted): Remove default of 0.

2008-02-10  Darin Adler  <darin@apple.com>

        Reviewed by Eric.

        - http://bugs.webkit.org/show_bug.cgi?id=17256
          Make clients of RefCounted explicitly set the count to 0.

        * API/JSClassRef.cpp:
        (OpaqueJSClass::OpaqueJSClass):
        * bindings/runtime_root.cpp:
        (KJS::Bindings::RootObject::RootObject):

2008-02-09  Darin Adler  <darin@apple.com>

        Reviewed by Mitz.

        - http://bugs.webkit.org/show_bug.cgi?id=17256
          Change RegExp to start its ref count at 1, not 0

        We'll want to do this to every RefCounted class, one at a time.

        * kjs/nodes.h:
        (KJS::RegExpNode::RegExpNode): Use RegExp::create instead of new RegExp.
        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp): Marked inline, set initial ref count to 1.
        (KJS::RegExp::create): Added. Calls new RegExp then adopts the initial ref.
        * kjs/regexp.h: Reformatted. Made the constructors private. Added static
        create functions that return objects already wrapped in PassRefPtr.
        * kjs/regexp_object.cpp:
        (KJS::regExpProtoFuncCompile): Use RegExp::create instead of new RegExp.
        (KJS::RegExpObjectImp::construct): Ditto.
        * kjs/string_object.cpp:
        (KJS::stringProtoFuncMatch): Ditto.
        (KJS::stringProtoFuncSearch): Ditto.

2008-02-08  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        <rdar://problem/5731773> REGRESSION (r28973): Extraneous parentheses in function.toString()
        https://bugs.webkit.org/show_bug.cgi?id=17214

        Make a subclass of CommaNode to provide the correct precedence for each expression in
        a variable declaration list.

        * kjs/grammar.y:
        * kjs/nodes.h:
        (KJS::VarDeclCommaNode::):

2008-02-08  Darin Adler  <darin@apple.com>

        Reviewed by Oliver.

        - fix http://bugs.webkit.org/show_bug.cgi?id=17247
          Labelled continue/break can fail in some cases

        Test: fast/js/continue-break-multiple-labels.html

        * kjs/nodes.h:
        (KJS::StatementNode::pushLabel): Made this virtual.
        (KJS::LabelNode::pushLabel): Forward pushLabel calls to the statement inside.

2008-02-08  Darin Adler  <darin@apple.com>

        Reviewed by Eric.

        - fix http://bugs.webkit.org/show_bug.cgi?id=15003
          Function.prototype.constructor should not be DontDelete/ReadOnly (Acid3 bug)

        Test: fast/js/constructor-attributes.html

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::reset): Remove unwanted attributes from "constructor".
        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::construct): Ditto.
        * kjs/nodes.cpp:
        (KJS::FuncDeclNode::makeFunction): Ditto.
        (KJS::FuncExprNode::evaluate): Ditto.

2008-02-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Added an ASSERT to catch refCount underflow, since it caused a leak in
        my last check-in.

        * wtf/RefCounted.h:
        (WTF::RefCounted::deref):

2008-02-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.

        PLT speedup related to <rdar://problem/5659272> REGRESSION: PLT .4%
        slower due to r28884 (global variable symbol table optimization)
        
        Tweaked RefCounted::deref() to be a little more efficient.

        1% - 1.5% speedup on my machine. .7% speedup on Stephanie's machine.
        
        * wtf/RefCounted.h:
        (WTF::RefCounted::deref): Don't modify m_refCount if we're just going
        to delete the object anyway. Also, use a simple == test, which might be
        faster than <= on some hardware.

2008-02-06  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        - fix http://bugs.webkit.org/show_bug.cgi?id=17094
          Array.prototype functions create length properties with DontEnum/DontDelete

        Test results match Gecko with very few obscure exceptions that seem to be
        bugs in Gecko.

        Test: fast/js/array-functions-non-arrays.html

        * kjs/array_object.cpp:
        (KJS::arrayProtoFuncConcat):  Removed DontEnum and DontDelete from the call
        to set length.
        (KJS::arrayProtoFuncPop): Ditto. Also added missing call to deleteProperty,
        which is not needed for real arrays, but is needed for non-arrays.
        (KJS::arrayProtoFuncPush): Ditto.
        (KJS::arrayProtoFuncShift): Ditto.
        (KJS::arrayProtoFuncSlice): Ditto.
        (KJS::arrayProtoFuncSort): Removed incorrect call to set length when
        the array has no elements.
        (KJS::arrayProtoFuncSplice): Removed DontEnum and DontDelete from the call
        to set length.
        (KJS::arrayProtoFuncUnShift): Ditto. Also added a check for 0 arguments to
        make behavior match the specification in that case.
        * kjs/nodes.cpp:
        (KJS::ArrayNode::evaluate): Removed DontEnum and DontDelete from the call
        to set length.

2008-02-06  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        - replace calls to put to set up properties with calls to putDirect, to
          prepare for a future change where put won't take attributes any more,
          and for a slight performance boost

        * API/JSObjectRef.cpp:
        (JSObjectMakeConstructor): Use putDirect instead of put.
        * kjs/CommonIdentifiers.h: Removed lastIndex.
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::reset): Use putDirect instead of put.
        * kjs/array_object.cpp:
        (KJS::arrayProtoFuncConcat): Took out extra call to get length (unused).
        (KJS::ArrayObjectImp::ArrayObjectImp): Use putDirect instead of put.
        * kjs/error_object.cpp:
        (KJS::ErrorPrototype::ErrorPrototype): Use putDirect instead of put.
        * kjs/function.cpp:
        (KJS::Arguments::Arguments): Use putDirect instead of put.
        (KJS::PrototypeFunction::PrototypeFunction): Use putDirect instead of put.
        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::construct): Use putDirect instead of put.
        * kjs/nodes.cpp:
        (KJS::FuncDeclNode::makeFunction): Use putDirect instead of put.
        (KJS::FuncExprNode::evaluate): Use putDirect instead of put.
        * kjs/regexp_object.cpp:
        (KJS::regExpProtoFuncCompile): Use setLastIndex instead of put(lastIndex).
        (KJS::RegExpImp::match): Get and set lastIndex by using m_lastIndex instead of
        calling get and put.
        * kjs/regexp_object.h:
        (KJS::RegExpImp::setLastIndex): Added.
        * kjs/string_object.cpp:
        (KJS::stringProtoFuncMatch): Use setLastIndex instead of put(lastIndex).

2008-02-05  Sam Weinig  <sam@webkit.org>

        Reviewed by Anders Carlsson.

        Fix for http://bugs.webkit.org/show_bug.cgi?id=8080
        NodeList (and other DOM lists) items are not enumeratable using for..in

        * JavaScriptCore.exp:

2008-02-05  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        Update versioning to support the mysterious future.

        * Configurations/Version.xcconfig: Add SYSTEM_VERSION_PREFIX_1060.

2008-02-04  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Oliver Hunt.

        Fixes Bug 16889: REGRESSION (r29425): Canvas-based graphing calculator fails to run
              Bug 17015: REGRESSION (r29414-29428): www.fox.com "shows" menu fails to render
              Bug 17164: REGRESSION: JavaScript pop-up menu appears at wrong location when hovering image at http://news.chinatimes.com/

        <http://bugs.webkit.org/show_bug.cgi?id=16889>
        <rdar://problem/5696255>

        <http://bugs.webkit.org/show_bug.cgi?id=17015>

        <http://bugs.webkit.org/show_bug.cgi?id=17164>
        <rdar://problem/5720947>

        The ActivationImp tear-off (r29425) introduced a problem with ReadModify
        nodes that first resolve a slot, call valueForReadModifyNode(), and then
        store a value in the previously resolved slot. Since valueForReadModifyNode()
        may cause a tear-off, the slot needs to be resolved again, but this was
        not happening with the existing code.

        * kjs/nodes.cpp:
        (KJS::ReadModifyLocalVarNode::evaluate):
        (KJS::ReadModifyResolveNode::evaluate):

2008-02-04  Cameron McCormack <cam@mcc.id.au>

        Reviewed by Geoff Garen.

        Remove some unneccesary UNUSED_PARAMs.  Clarify ownership rule of return value of JSObjectCopyPropertyNames.

        * API/JSNode.c:
        (JSNode_appendChild):
        (JSNode_removeChild):
        (JSNode_replaceChild):
        (JSNode_getNodeType):
        (JSNode_getFirstChild):
        * API/JSNodeList.c:
        (JSNodeList_length):
        * API/JSObjectRef.h:

2008-02-04  Rodney Dawes  <dobey@wayofthemonkey.com>

        Reviewed by Alp Toker and Mark Rowe.

        Fix http://bugs.webkit.org/show_bug.cgi?id=17175.
        Bug 17175: Use of C++ compiler flags in CFLAGS

        * GNUmakefile.am: Use global_cxxflags as well as global_cflags in CXXFLAGS.

2008-02-04  Alp Toker  <alp@atoker.com>

        Rubber-stamped by Mark Rowe.

        Remove all trailing whitespace in the GTK+ port and related
        components.

        * GNUmakefile.am:

2008-02-02  Darin Adler  <darin@apple.com>

        Reviewed by Geoff Garen.

        PLT speedup related to <rdar://problem/5659272> REGRESSION: PLT .4%
        slower due to r28884 (global variable symbol table optimization)

        Geoff's theory is that the slowdown was due to copying hash tables when
        putting things into the back/forward cache. If that's true, then this
        should fix the problem.

        (According to Geoff's measurements, in a PLT that exaggerates the
        importance of symbol table saving during cached page creation, this
        patch is a ~3X speedup in cached page creation, and a 9% speedup overall.)

        * JavaScriptCore.exp: Updated.

        * kjs/JSVariableObject.cpp:
        (KJS::JSVariableObject::saveLocalStorage): Updated for changes to SavedProperty,
        which has been revised to avoid initializing each SavedProperty twice when building
        the array. Store the property names too, so we don't have to store the symbol table
        separately. Do this by iterating the symbol table instead of the local storage vector.
        (KJS::JSVariableObject::restoreLocalStorage): Ditto. Restore the symbol table as
        well as the local storage vector.

        * kjs/JSVariableObject.h: Removed save/restoreSymbolTable and do that work inside
        save/restoreLocalStorage instead. Made restoreLocalStorage a non-const member function
        that takes a const reference to a SavedProperties object.

        * kjs/LocalStorage.h: Changed attributes to be unsigned instead of int to match
        other declarations of attributes elsewhere.

        * kjs/property_map.cpp:
        (KJS::SavedProperties::SavedProperties): Updated for data member name change.
        (KJS::PropertyMap::save): Updated for data member name change and to use the new
        inline init function instead of setting the fields directly. This allows us to
        skip initializing the SavedProperty objects when first allocating the array, and
        just do it when we're actually setting up the individual elements.
        (KJS::PropertyMap::restore): Updated for SavedProperty changes.

        * kjs/property_map.h: Changed SavedProperty from a struct to a class. Set it up so
        it does not get initialized at construction time to avoid initializing twice when
        creating an array of SavedProperty. Removed the m_ prefixes from the members of
        the SavedProperties struct. Generally we use m_ for class members and not struct.

2008-02-02  Tony Chang  <idealisms@gmail.com>

        Reviewed by darin.  Landed by eseidel.

        Add #define guards for WIN32_LEAN_AND_MEAN and _CRT_RAND_S.

        * kjs/config.h:
        * wtf/FastMalloc.cpp:
        * wtf/TCSpinLock.h:

2008-01-28  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Darin Adler.

        - Fix whitespace in nodes.h/cpp and nodes2string.cpp.

        (NOTE: Specific changed functions elided for space and clarity)
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:

2008-01-27  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver Hunt.

        Patch for http://bugs.webkit.org/show_bug.cgi?id=17025
        nodes.h/cpp has been rolling around in the mud - lets hose it down

        - Rename member variables to use the m_ prefix.

        (NOTE: Specific changed functions elided for space and clarity)
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:

2008-01-27  Darin Adler  <darin@apple.com>

        Reviewed by Oliver.

        - fix <rdar://problem/5657450> REGRESSION: const is broken

        Test: fast/js/const.html

        SunSpider said this was 0.3% slower. And I saw some Shark samples in
        JSGlobalObject::put -- not a lot but a few. We may be able to regain the
        speed, but for now we will take that small hit for correctness sake.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::put): Pass the checkReadOnly flag in to symbolTablePut
        instead of passing attributes.

        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTablePut): Removed the code to set attributes
        here, since we only set attributes when creating a property. Added the code
        to check read-only here, since we need that to implement const!

        * kjs/function.cpp:
        (KJS::ActivationImp::put): Pass the checkReadOnly flag in to symbolTablePut
        instead of passing attributes.

        * kjs/nodes.cpp:
        (KJS::isConstant): Added.
        (KJS::PostIncResolveNode::optimizeVariableAccess): Create a PostIncConstNode
        if optimizing for a local variable and the variable is constant.
        (KJS::PostDecResolveNode::optimizeVariableAccess): Ditto. But PostDecConstNode.
        (KJS::PreIncResolveNode::optimizeVariableAccess): Ditto. But PreIncConstNode.
        (KJS::PreDecResolveNode::optimizeVariableAccess): Ditto. But PreDecConstNode.
        (KJS::PreIncConstNode::evaluate): Return the value + 1.
        (KJS::PreDecConstNode::evaluate): Return the value - 1.
        (KJS::PostIncConstNode::evaluate): Return the value converted to a number.
        (KJS::PostDecConstNode::evaluate): Ditto.
        (KJS::ReadModifyResolveNode::optimizeVariableAccess): Create a ReadModifyConstNode
        if optimizing for a local variable and the variable is constant.
        (KJS::AssignResolveNode::optimizeVariableAccess): Ditto. But AssignConstNode.
        (KJS::ScopeNode::optimizeVariableAccess): Pass the local storage to the
        node optimizeVariableAccess functions, since that's where we need to look to
        figure out if a variable is constant.
        (KJS::FunctionBodyNode::processDeclarations): Moved the call to
        optimizeVariableAccess until after localStorage is set up.
        (KJS::ProgramNode::processDeclarations): Ditto.

        * kjs/nodes.h: Fixed the IsConstant and HasInitializer values. They are used
        as flag masks, so a value of 0 will not work for IsConstant. Changed the
        first parameter to optimizeVariableAccess to be a const reference to a symbol
        table and added a const reference to local storage. Added classes for const
        versions of local variable access: PostIncConstNode, PostDecConstNode,
        PreIncConstNode, PreDecConstNode, ReadModifyConstNode, and AssignConstNode.

        * kjs/object.cpp:
        (KJS::JSObject::put): Tweaked comments a bit, and changed the checkReadOnly
        expression to match the form used at the two other call sites.

2008-01-27  Darin Adler  <darin@apple.com>

        Reviewed by Oliver.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16498
          ''.constructor.toString() gives [function]

        Test: fast/js/function-names.html

        * kjs/array_object.cpp:
        (KJS::ArrayObjectImp::ArrayObjectImp): Use the class name as the constructor's function name.
        * kjs/bool_object.cpp:
        (KJS::BooleanObjectImp::BooleanObjectImp): Ditto.
        * kjs/date_object.cpp:
        (KJS::DateObjectImp::DateObjectImp): Ditto.
        * kjs/error_object.cpp:
        (KJS::ErrorPrototype::ErrorPrototype): Make the error object be an Error.
        (KJS::ErrorObjectImp::ErrorObjectImp): Use the class name as the constructor's function name.
        (KJS::NativeErrorPrototype::NativeErrorPrototype): Take const UString&.
        (KJS::NativeErrorImp::NativeErrorImp): Use the prototype's name as the constructor's function
        name.
        * kjs/error_object.h: Change ErrorPrototype to inherit from ErrorInstance. Change the
        NativeErrorImp constructor to take a NativeErrorPrototype pointer for its prototype.
        * kjs/function.h: Removed unneeded constructor for internal functions without names.
        We want to avoid those!
        * kjs/function_object.cpp:
        (KJS::functionProtoFuncToString): Removed code that writes out just [function] for functions
        that have no names. There's no reason to do that.
        (KJS::FunctionObjectImp::FunctionObjectImp): Use the class name as the constructor's
        function name.
        * kjs/internal.cpp: Removed the unused constructor.
        * kjs/number_object.cpp:
        (KJS::fractionalPartToString): Marked static for internal linkage.
        (KJS::exponentialPartToString): Ditto.
        (KJS::numberProtoFuncToPrecision): Removed an unneeded else.
        (KJS::NumberObjectImp::NumberObjectImp): Use the class name as the constructor's
        function name.
        (KJS::NumberObjectImp::getValueProperty): Tweaked formatting.
        * kjs/object_object.cpp:
        (KJS::ObjectObjectImp::ObjectObjectImp): Use "Object" for the function name.
        * kjs/regexp_object.cpp:
        (KJS::RegExpObjectImp::RegExpObjectImp): Use "RegExp" for the function name.
        * kjs/string_object.cpp:
        (KJS::StringObjectImp::StringObjectImp): Use the class name as the constructor's
        function name.

2008-01-26  Darin Adler  <darin@apple.com>

        Reviewed by Oliver.

        - fix http://bugs.webkit.org/show_bug.cgi?id=17027
          Incorrect Function.toString behaviour with read/modify/write operators performed on negative numbers

        Test: fast/js/function-toString-parentheses.html

        The problem here was that a NumberNode with a negative number in it had the wrong
        precedence. It's not a primary expression, it's a unary operator with a primary
        expression after it.

        Once the precedence of NumberNode was fixed, the cases from bug 17020 were also
        fixed without trying to treat bracket nodes like dot nodes. That wasn't needed.
        The reason we handle numbers before dot nodes specially is that the dot is a
        legal character in a number. The same is not true of a bracket. Eventually we
        could get smarter, and only add the parentheses when there is actual ambiguity.
        There is none if the string form of the number already has a dot in it, or if
        it's a number with a alphabetic name like infinity or NAN.

        * kjs/nodes.h: Renamed back from ObjectAccess to DotExpr.
        (KJS::NumberNode::precedence): Return PrecUnary for negative numbers, since
        they serialize as a unary operator, not a primary expression.
        * kjs/nodes2string.cpp:
        (KJS::SourceStream::operator<<): Clear m_numberNeedsParens if this adds
        parens; one set is enough.
        (KJS::bracketNodeStreamTo): Remove unneeded special flag here. Normal
        operator precedence suffices.
        (KJS::NewExprNode::streamTo): Ditto.

2008-01-26  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej and Darin.

        Fix for http://bugs.webkit.org/show_bug.cgi?id=17020
        Function.toString does not parenthesise numbers for the bracket accessor

        It turns out that logic was there for all of the dot accessor nodes to make numbers be
        parenthesised properly, so it was a trivial extension to extend that to the bracket nodes.
        I renamed the enum type to reflect the fact that it is now used for both dot and bracket
        accessors.

        * kjs/nodes2string.cpp:
        (KJS::bracketNodeStreamTo):
        (KJS::BracketAccessorNode::streamTo):

2008-01-26  Oliver Hunt  <oliver@apple.com>

        Reviewed by Darin.

        Fix Bug 17018: Incorrect code generated from Function.toString for get/setters in object literals

        Don't quote getter and setter names during output, as that is simply wrong.

        * kjs/nodes2string.cpp:
        (KJS::PropertyNode::streamTo):

2008-01-26  Darin Adler  <darin@apple.com>

        Reviewed by Eric Seidel.

        - http://bugs.webkit.org/show_bug.cgi?id=16860
          a bit of cleanup after the Activation optimization

        * JavaScriptCore.exp: Export the GlobalExecState constructor instead of
        the global flavor of the ExecState constructor. It'd probably be cleaner
        to not export either one, but JSGlobalObject inlines the code that
        constructs the ExecState. If we changed that, we could remove this export.

        * JavaScriptCore.xcodeproj/project.pbxproj: Re-sorted a few things and
        put the new source files into the kjs group rather than at the top level.

        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState): Marked inline and updated for data member
        name changes. This is now only for use for the derived classes. Also removed
        code that sets the unused m_savedExec data member for the global case. That
        data member is only used for the other two types.
        (KJS::ExecState::~ExecState): Marked inline and removed all the code.
        The derived class destructors now inclde the appropriate code.
        (KJS::ExecState::lexicalGlobalObject): Removed unneeded special case for
        an empty scope chain. The bottom function already returns 0 for that case,
        so the general case code handles it fine. Also changed to use data members
        directly rather than calling functions.
        (KJS::GlobalExecState::GlobalExecState): Added. Calls through to the base
        class constructor.
        (KJS::GlobalExecState::~GlobalExecState): Added.
        (KJS::InterpreterExecState::InterpreterExecState): Added. Moved code to
        manipulate activeExecStates here since we don't want to have to check for the
        special case of globalExec.
        (KJS::InterpreterExecState::~InterpreterExecState): Added.
        (KJS::EvalExecState::EvalExecState): Added.
        (KJS::EvalExecState::~EvalExecState): Added.
        (KJS::FunctionExecState::FunctionExecState): Added.
        (KJS::FunctionExecState::~FunctionExecState): Added.

        * kjs/ExecState.h: Tweaked the header, includes, and declarations a bit.
        Made ExecState inherit from Noncopyable. Reformatted some comments and
        made them a bit more brief. Rearranged declarations a little bit and removed
        unused savedExec function. Changed seenLabels function to return a reference
        rather than a pointer. Made constructors and destructor protected, and also
        did the same with all data members. Renamed m_thisVal to m_thisValue and
        ls to m_labelStack. Added three new derived classes for each of the
        types of ExecState. The primary goal here was to remove a branch from the
        code in the destructor, but it's also clearer than overloading the arguments
        to the ExecState constructor.

        * kjs/JSGlobalObject.cpp:
        (KJS::getCurrentTime): Fixed formatting.
        (KJS::JSGlobalObject::pushActivation): Removed parentheses that don't make
        the expression clearer -- other similar sites didn't have these parentheses,
        even the one a couple lines earlier that sets stackEntry.
        (KJS::JSGlobalObject::tearOffActivation): Got rid of unneeded static_cast
        (I think I mentioned this during patch review) and used an early exit so that
        the entire contents of the function aren't nested inside an if statement.
        Also removed the check of codeType, instead checking Activation for 0.
        For now, I kept the codeType check, but inside an assertion.

        * kjs/JSGlobalObject.h: Changed type of globalExec to GlobalExecState.
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction): Changed type to FunctionExecState.
        (KJS::GlobalFuncImp::callAsFunction): Changed type to EvalExecState.
        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate): Changed type to GlobalExecState.

        * kjs/nodes.cpp:
        (KJS::ContinueNode::execute): Changed code since seenLabels() returns a
        reference now instead of a pointer.
        (KJS::BreakNode::execute): Ditto.
        (KJS::LabelNode::execute): Ditto.

2008-01-26  Sam Weinig  <sam@webkit.org>

        Reviewed by Mark Rowe.

        Cleanup node2string a little.
        - Remove some unnecessary branching.
        - Factor out bracket and dot streaming into static inline functions.

        * kjs/nodes.h:
        * kjs/nodes2string.cpp:
        (KJS::bracketNodeStreamTo):
        (KJS::dotNodeStreamTo):
        (KJS::FunctionCallBracketNode::streamTo):
        (KJS::FunctionCallDotNode::streamTo):
        (KJS::PostIncBracketNode::streamTo):
        (KJS::PostDecBracketNode::streamTo):
        (KJS::PostIncDotNode::streamTo):
        (KJS::PostDecDotNode::streamTo):
        (KJS::DeleteBracketNode::streamTo):
        (KJS::DeleteDotNode::streamTo):
        (KJS::PreIncBracketNode::streamTo):
        (KJS::PreDecBracketNode::streamTo):
        (KJS::PreIncDotNode::streamTo):
        (KJS::PreDecDotNode::streamTo):
        (KJS::ReadModifyBracketNode::streamTo):
        (KJS::AssignBracketNode::streamTo):
        (KJS::ReadModifyDotNode::streamTo):
        (KJS::AssignDotNode::streamTo):
        (KJS::WhileNode::streamTo):

2008-01-26  Mark Rowe  <mrowe@apple.com>

        Reviewed by Darin Adler.

        Fix http://bugs.webkit.org/show_bug.cgi?id=17001
        Bug 17001: Build error with Gtk port on Mac OS X

        If both XP_MACOSX and XP_UNIX are defined then X11.h and Carbon.h will both be included.
        These provide conflicting definitions for a type named 'Cursor'.  As XP_UNIX is set by
        the build system when targeting X11, it doesn't make sense for XP_MACOSX to also be set
        in this instance.

        * bindings/npapi.h: Don't define XP_MACOSX if XP_UNIX is defined.

2008-01-26  Darin Adler  <darin@apple.com>

        Reviewed by Oliver.

        - fix http://bugs.webkit.org/show_bug.cgi?id=17013
          JSC can't round trip certain for-loops

        Test: fast/js/toString-for-var-decl.html

        * kjs/nodes.h: Added PlaceholderTrueNode so we can put nodes into
        for loops without injecting the word "true" into them (nice, but not
        the bug fix). Fixed ForNode constructor so expr1WasVarDecl is set
        only when there is an expression, since it's common for the actual
        variable declaration to be moved by the parser.

        * kjs/nodes2string.cpp:
        (KJS::PlaceholderTrueNode::streamTo): Added. Empty.

2008-01-25  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Fix for bug 17012: REGRESSION: JSC can't round trip an object literal

        Add logic to ensure that object literals and function expressions get
        parentheses when necessary.

        * kjs/nodes.h:
        * kjs/nodes2string.cpp:
        (KJS::SourceStream::operator<<):

2008-01-24  Steve Falkenburg  <sfalken@apple.com>

        Build fix.

        * JavaScriptCore.vcproj/JavaScriptCore.sln:

2008-01-24  Steve Falkenburg  <sfalken@apple.com>

        Build fix.

        * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln:

2008-01-24  Michael Goddard  <michael.goddard@trolltech.com>

        Reviewed by Simon.

        Fix QDateTime to JS Date conversion.
        Several conversion errors (some UTC related, some month
        offset related) and the conversion distance for Date
        to DateTime conversion weights were fixed (it should never
        be better to convert a JS Number into a Date rather than
        an int).
        
        * bindings/qt/qt_runtime.cpp:
        (KJS::Bindings::convertValueToQVariant):
        (KJS::Bindings::convertQVariantToValue):

2008-01-24  Michael Goddard  <michael.goddard@trolltech.com>

        Reviewed by Simon.

        Add support for calling QObjects.
        Add support for invokeDefaultMethod (via a call to
        a specific slot), and also allow using it as a
        constructor, like QtScript.
        

        * bindings/qt/qt_class.cpp:
        (KJS::Bindings::QtClass::fallbackObject):
        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtRuntimeObjectImp::construct):
        (KJS::Bindings::QtInstance::QtInstance):
        (KJS::Bindings::QtInstance::~QtInstance):
        (KJS::Bindings::QtInstance::implementsCall):
        (KJS::Bindings::QtInstance::invokeDefaultMethod):
        * bindings/qt/qt_instance.h:
        * bindings/qt/qt_runtime.cpp:
        (KJS::Bindings::findMethodIndex):
        (KJS::Bindings::QtRuntimeMetaMethod::QtRuntimeMetaMethod):
        (KJS::Bindings::QtRuntimeMetaMethod::callAsFunction):
        * bindings/qt/qt_runtime.h:

2008-01-24  Michael Goddard  <michael.goddard@trolltech.com>

        Reviewed by Simon.

        Code style cleanups.
        Add spaces before/after braces in inline function.

        * bindings/qt/qt_instance.h:

2008-01-24  Michael Goddard  <michael.goddard@trolltech.com>

        Reviewed by Simon.

        Code style cleanups.
        Remove spaces and unneeded declared parameter names.

        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtRuntimeObjectImp::removeFromCache):

2008-01-24  Michael Goddard  <michael.goddard@trolltech.com>

        Reviewed by Simon.

        Clear stale RuntimeObjectImps.
        Since other objects can have refs to the QtInstance,
        we can't rely on the QtInstance being deleted when the
        RuntimeObjectImp is invalidate or deleted.  This
        could result in a stale JSObject being returned for
        a valid Instance.

        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtRuntimeObjectImp::QtRuntimeObjectImp):
        (KJS::Bindings::QtRuntimeObjectImp::~QtRuntimeObjectImp):
        (KJS::Bindings::QtRuntimeObjectImp::invalidate):
        (KJS::Bindings::QtRuntimeObjectImp::removeFromCache):
        (KJS::Bindings::QtInstance::getRuntimeObject):
        * bindings/runtime.cpp:
        (KJS::Bindings::Instance::createRuntimeObject):
        * bindings/runtime.h:

2008-01-23  Alp Toker  <alp@atoker.com>

        Rubber-stamped by Mark Rowe.

        Remove whitespace after -I in automake include lists.

        * GNUmakefile.am:

2008-01-23  Michael Goddard <michael.goddard@trolltech.com>

        Reviewed by Lars Knoll <lars@trolltech.com>.

        Reworked the JavaScriptCore Qt bindings:
        
        * Add initial support for string and variant arrays, as well
        as sub QObjects in the JS bindings.
        
        * Don't expose fields marked as not scriptable by moc.
        
        * Add support for dynamic properties and accessing named
        QObject children of an object (like QtScript and older
        IE DOM style JS).
        * Add support for custom toString methods.
        
        * Fine tune some bindings to be closer to QtScript.
        Make void functions return undefined, and empty/
        null QStrings return a zero length string.
        
        * Create framework for allowing more direct method calls.
        Since RuntimeMethod doesn't allow us to add additional
        methods/properties to a function, add these classes.
        Start prototyping object.signal.connect(...).
        
        * Add signal support to the Qt bindings.
        Allow connecting to signals (object.signal.connect(slot)),
        disconnecting, and emitting signals.  Currently chooses
        the first signal that matches the name, so this will need
        improvement.
        
        * Add property names, and resolve signals closer to use.
        Enumerating properties now returns some of the Qt properties
        and signals.  Slots and methods aren't quite present.  Also,
        resolve signal connections etc. closer to the time of use, so
        we can do more dynamic resolution based on argument type etc.
        Still picks the first one with the same name, at the moment.
        
        * Make signature comparison code consistent.
        Use the same code for checking meta signatures in
        the method and fallback getters, and avoid a
        QByteArray construction when we can.
        
        * Fix minor memory leak, and handle pointers better.
        Delete the private object in the dtors, and use RefPtrs
        for holding Instances etc.
        
        * Handle method lookup better.
        Allow invocation time method lookup based on the arguments,
        which is closer to QtScript behaviour.  Also, cache the
        method lists and delete them in the QtClass dtor (stops
        a memory leak).
        
        * Improve JS to Qt data type conversions.
        Add some support for Date & RegExp JS objects,
        and provide some metrics on the quality of the
        conversion.
        
        * A couple of fixes for autotest failures.
        Better support for converting lists, read/write only
        QMetaProperty support, modified slot search order...)

        * bindings/qt/qt_class.cpp:
        (KJS::Bindings::QtClass::QtClass):
        (KJS::Bindings::QtClass::~QtClass):
        (KJS::Bindings::QtClass::name):
        (KJS::Bindings::QtClass::fallbackObject):
        (KJS::Bindings::QtClass::methodsNamed):
        (KJS::Bindings::QtClass::fieldNamed):
        * bindings/qt/qt_class.h:
        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtInstance::QtInstance):
        (KJS::Bindings::QtInstance::~QtInstance):
        (KJS::Bindings::QtInstance::getRuntimeObject):
        (KJS::Bindings::QtInstance::getClass):
        (KJS::Bindings::QtInstance::implementsCall):
        (KJS::Bindings::QtInstance::getPropertyNames):
        (KJS::Bindings::QtInstance::invokeMethod):
        (KJS::Bindings::QtInstance::invokeDefaultMethod):
        (KJS::Bindings::QtInstance::stringValue):
        (KJS::Bindings::QtInstance::booleanValue):
        (KJS::Bindings::QtInstance::valueOf):
        (KJS::Bindings::QtField::name):
        (KJS::Bindings::QtField::valueFromInstance):
        (KJS::Bindings::QtField::setValueToInstance):
        * bindings/qt/qt_instance.h:
        (KJS::Bindings::QtInstance::getBindingLanguage):
        (KJS::Bindings::QtInstance::getObject):
        * bindings/qt/qt_runtime.cpp:
        (KJS::Bindings::QWKNoDebug::QWKNoDebug):
        (KJS::Bindings::QWKNoDebug::~QWKNoDebug):
        (KJS::Bindings::QWKNoDebug::operator<<):
        (KJS::Bindings::):
        (KJS::Bindings::valueRealType):
        (KJS::Bindings::convertValueToQVariant):
        (KJS::Bindings::convertQVariantToValue):
        (KJS::Bindings::QtRuntimeMethod::QtRuntimeMethod):
        (KJS::Bindings::QtRuntimeMethod::~QtRuntimeMethod):
        (KJS::Bindings::QtRuntimeMethod::codeType):
        (KJS::Bindings::QtRuntimeMethod::execute):
        (KJS::Bindings::QtRuntimeMethodData::~QtRuntimeMethodData):
        (KJS::Bindings::QtRuntimeMetaMethodData::~QtRuntimeMetaMethodData):
        (KJS::Bindings::QtRuntimeConnectionMethodData::~QtRuntimeConnectionMethodData):
        (KJS::Bindings::QtMethodMatchType::):
        (KJS::Bindings::QtMethodMatchType::QtMethodMatchType):
        (KJS::Bindings::QtMethodMatchType::kind):
        (KJS::Bindings::QtMethodMatchType::isValid):
        (KJS::Bindings::QtMethodMatchType::isVariant):
        (KJS::Bindings::QtMethodMatchType::isMetaType):
        (KJS::Bindings::QtMethodMatchType::isUnresolved):
        (KJS::Bindings::QtMethodMatchType::isMetaEnum):
        (KJS::Bindings::QtMethodMatchType::enumeratorIndex):
        (KJS::Bindings::QtMethodMatchType::variant):
        (KJS::Bindings::QtMethodMatchType::metaType):
        (KJS::Bindings::QtMethodMatchType::metaEnum):
        (KJS::Bindings::QtMethodMatchType::unresolved):
        (KJS::Bindings::QtMethodMatchType::typeId):
        (KJS::Bindings::QtMethodMatchType::name):
        (KJS::Bindings::QtMethodMatchData::QtMethodMatchData):
        (KJS::Bindings::QtMethodMatchData::isValid):
        (KJS::Bindings::QtMethodMatchData::firstUnresolvedIndex):
        (KJS::Bindings::indexOfMetaEnum):
        (KJS::Bindings::findMethodIndex):
        (KJS::Bindings::findSignalIndex):
        (KJS::Bindings::QtRuntimeMetaMethod::QtRuntimeMetaMethod):
        (KJS::Bindings::QtRuntimeMetaMethod::mark):
        (KJS::Bindings::QtRuntimeMetaMethod::callAsFunction):
        (KJS::Bindings::QtRuntimeMetaMethod::getOwnPropertySlot):
        (KJS::Bindings::QtRuntimeMetaMethod::lengthGetter):
        (KJS::Bindings::QtRuntimeMetaMethod::connectGetter):
        (KJS::Bindings::QtRuntimeMetaMethod::disconnectGetter):
        (KJS::Bindings::QtRuntimeConnectionMethod::QtRuntimeConnectionMethod):
        (KJS::Bindings::QtRuntimeConnectionMethod::callAsFunction):
        (KJS::Bindings::QtRuntimeConnectionMethod::getOwnPropertySlot):
        (KJS::Bindings::QtRuntimeConnectionMethod::lengthGetter):
        (KJS::Bindings::QtConnectionObject::QtConnectionObject):
        (KJS::Bindings::QtConnectionObject::~QtConnectionObject):
        (KJS::Bindings::QtConnectionObject::metaObject):
        (KJS::Bindings::QtConnectionObject::qt_metacast):
        (KJS::Bindings::QtConnectionObject::qt_metacall):
        (KJS::Bindings::QtConnectionObject::execute):
        (KJS::Bindings::QtConnectionObject::match):
        (KJS::Bindings::::QtArray):
        (KJS::Bindings::::~QtArray):
        (KJS::Bindings::::rootObject):
        (KJS::Bindings::::setValueAt):
        (KJS::Bindings::::valueAt):
        * bindings/qt/qt_runtime.h:
        (KJS::Bindings::QtField::):
        (KJS::Bindings::QtField::QtField):
        (KJS::Bindings::QtField::fieldType):
        (KJS::Bindings::QtMethod::QtMethod):
        (KJS::Bindings::QtMethod::name):
        (KJS::Bindings::QtMethod::numParameters):
        (KJS::Bindings::QtArray::getLength):
        (KJS::Bindings::QtRuntimeMethod::d_func):
        (KJS::Bindings::QtRuntimeMetaMethod::d_func):
        (KJS::Bindings::QtRuntimeConnectionMethod::d_func):
        (KJS::Bindings::):
        * bindings/runtime.cpp:
        (KJS::Bindings::Instance::createBindingForLanguageInstance):
        (KJS::Bindings::Instance::createRuntimeObject):
        (KJS::Bindings::Instance::reallyCreateRuntimeObject):
        * bindings/runtime.h:

2008-01-22  Anders Carlsson  <andersca@apple.com>

        Reviewed by Darin and Adam.

        <rdar://problem/5688975>
        div element on microsoft site has wrong left offset.
        
        Return true even if NPN_GetProperty returns null or undefined. This matches Firefox 
        (and is what the Silverlight plug-in expects).
        
        * bindings/NP_jsobject.cpp:
        (_NPN_GetProperty):

2008-01-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed http://bugs.webkit.org/show_bug.cgi?id=16909
        REGRESSION: Amazon.com crash (ActivationImp)
        
        (and a bunch of other crashes)
        
        Plus, a .7% SunSpider speedup to boot.
        
        Replaced the buggy currentExec and savedExec mechanisms with an
        explicit ExecState stack.

        * kjs/collector.cpp:
        (KJS::Collector::collect): Explicitly mark the ExecState stack.

        (KJS::Collector::reportOutOfMemoryToAllExecStates): Slight change in
        behavior: We no longer throw an exception in any global ExecStates,
        since global ExecStates are more like pseudo-ExecStates, and aren't
        used for script execution. (It's unclear what would happen if you left
        an exception waiting around in a global ExecState, but it probably
        wouldn't be good.)

2008-01-21  Jan Michael Alonzo  <jmalonzo@unpluggable.com>

        Reviewed by Alp Toker.

        http://bugs.webkit.org/show_bug.cgi?id=16955
        Get errors when cross-compile webkit-gtk

        * GNUmakefile.am: removed ICU_CFLAGS

2008-01-18  Kevin McCullough  <kmccullough@apple.com>

        - Build fix.

        * kjs/ustring.h:

2008-01-18  Kevin McCullough  <kmccullough@apple.com>

        - Build fix.

        * kjs/ustring.cpp:
        * kjs/ustring.h:
        (KJS::UString::cost):

2008-01-18  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geoff.

        - Correctly report cost of appended strings to trigger GC.

        * kjs/ustring.cpp:
        (KJS::UString::Rep::create):
        (KJS::UString::UString): Don't create unnecssary objects.
        (KJS::UString::cost): Report cost if necessary but also keep track of 
        reported cost.
        * kjs/ustring.h:

2008-01-18  Simon Hausmann  <hausmann@webkit.org>

        Reviewed by Holger.

        Fix return type conversions from Qt slots to JS values.
        
        This also fixes fast/dom/open-and-close-by-DOM.html, which called
        layoutTestController.windowCount().
        
        When constructing the QVariant that holds the return type we cannot
        use the QVarian(Type) constuctor as that will create a null variant.
        We have to use the QVariant(Type, void *) constructor instead, just
        like in QMetaObject::read() for example.
        

        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtInstance::getRuntimeObject):

2008-01-18  Prasanth Ullattil  <prasanth.ullattil@trolltech.com>

        Reviewed by Simon Hausmann <hausmann@webkit.org>.

        Fix compilation on Win64(2): Implemented currentThreadStackBase on X86-64 on Windows
        

        * kjs/collector.cpp:
        (KJS::Collector::heapAllocate):

2008-01-18  Prasanth Ullattil  <prasanth.ullattil@trolltech.com>

        Reviewed by Simon Hausmann <hausmann@webkit.org>.

        Fix compilation on Win64(1): Define WTF_PLATFORM_X86_64 correctly on Win64.
        

        * wtf/Platform.h:

2008-01-17  Antti Koivisto  <antti@apple.com>

        Fix Windows build.

        * kjs/regexp_object.cpp:
        (KJS::regExpProtoFuncToString):

2008-01-16  Sam Weinig  <sam@webkit.org>

        Reviewed by Darin.

        Fix for http://bugs.webkit.org/show_bug.cgi?id=16901
        Convert remaining JS function objects to use the new PrototypeFunction class

        - Moves Boolean, Function, RegExp, Number, Object and Global functions to their
          own static function implementations so that they can be used with the
          PrototypeFunction class.  SunSpider says this is 1.003x as fast.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::reset):
        * kjs/array_object.h:
        * kjs/bool_object.cpp:
        (KJS::BooleanInstance::BooleanInstance):
        (KJS::BooleanPrototype::BooleanPrototype):
        (KJS::booleanProtoFuncToString):
        (KJS::booleanProtoFuncValueOf):
        (KJS::BooleanObjectImp::BooleanObjectImp):
        (KJS::BooleanObjectImp::implementsConstruct):
        (KJS::BooleanObjectImp::construct):
        (KJS::BooleanObjectImp::callAsFunction):
        * kjs/bool_object.h:
        (KJS::BooleanInstance::classInfo):
        * kjs/error_object.cpp:
        (KJS::ErrorPrototype::ErrorPrototype):
        (KJS::errorProtoFuncToString):
        * kjs/error_object.h:
        * kjs/function.cpp:
        (KJS::globalFuncEval):
        (KJS::globalFuncParseInt):
        (KJS::globalFuncParseFloat):
        (KJS::globalFuncIsNaN):
        (KJS::globalFuncIsFinite):
        (KJS::globalFuncDecodeURI):
        (KJS::globalFuncDecodeURIComponent):
        (KJS::globalFuncEncodeURI):
        (KJS::globalFuncEncodeURIComponent):
        (KJS::globalFuncEscape):
        (KJS::globalFuncUnEscape):
        (KJS::globalFuncKJSPrint):
        (KJS::PrototypeFunction::PrototypeFunction):
        * kjs/function.h:
        * kjs/function_object.cpp:
        (KJS::FunctionPrototype::FunctionPrototype):
        (KJS::functionProtoFuncToString):
        (KJS::functionProtoFuncApply):
        (KJS::functionProtoFuncCall):
        * kjs/function_object.h:
        * kjs/number_object.cpp:
        (KJS::NumberPrototype::NumberPrototype):
        (KJS::numberProtoFuncToString):
        (KJS::numberProtoFuncToLocaleString):
        (KJS::numberProtoFuncValueOf):
        (KJS::numberProtoFuncToFixed):
        (KJS::numberProtoFuncToExponential):
        (KJS::numberProtoFuncToPrecision):
        * kjs/number_object.h:
        (KJS::NumberInstance::classInfo):
        (KJS::NumberObjectImp::classInfo):
        (KJS::NumberObjectImp::):
        * kjs/object_object.cpp:
        (KJS::ObjectPrototype::ObjectPrototype):
        (KJS::objectProtoFuncValueOf):
        (KJS::objectProtoFuncHasOwnProperty):
        (KJS::objectProtoFuncIsPrototypeOf):
        (KJS::objectProtoFuncDefineGetter):
        (KJS::objectProtoFuncDefineSetter):
        (KJS::objectProtoFuncLookupGetter):
        (KJS::objectProtoFuncLookupSetter):
        (KJS::objectProtoFuncPropertyIsEnumerable):
        (KJS::objectProtoFuncToLocaleString):
        (KJS::objectProtoFuncToString):
        * kjs/object_object.h:
        * kjs/regexp_object.cpp:
        (KJS::RegExpPrototype::RegExpPrototype):
        (KJS::regExpProtoFuncTest):
        (KJS::regExpProtoFuncExec):
        (KJS::regExpProtoFuncCompile):
        (KJS::regExpProtoFuncToString):
        * kjs/regexp_object.h:

2008-01-16  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej & Darin.

        Fixes Bug 16868: Gmail crash
          and Bug 16871: Crash when loading apple.com/startpage

        <http://bugs.webkit.org/show_bug.cgi?id=16868>
        <rdar://problem/5686108>

        <http://bugs.webkit.org/show_bug.cgi?id=16871>
        <rdar://problem/5686670>

        Adds ActivationImp tear-off for cross-window eval() and fixes an
        existing garbage collection issue exposed by the ActivationImp tear-off
        patch (r29425) that can occur when an ExecState's m_callingExec is
        different than its m_savedExec.

        * kjs/ExecState.cpp:
        (KJS::ExecState::mark):
        * kjs/function.cpp:
        (KJS::GlobalFuncImp::callAsFunction):

2008-01-16  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver.

        Clean up MathObjectImp, it needed a little scrubbing.

        * kjs/math_object.cpp:
        (KJS::MathObjectImp::MathObjectImp):
        (KJS::MathObjectImp::getOwnPropertySlot):
        (KJS::MathObjectImp::getValueProperty):
        (KJS::mathProtoFuncACos):
        (KJS::mathProtoFuncASin):
        (KJS::mathProtoFuncATan):
        (KJS::mathProtoFuncATan2):
        (KJS::mathProtoFuncCos):
        (KJS::mathProtoFuncExp):
        (KJS::mathProtoFuncLog):
        (KJS::mathProtoFuncSin):
        (KJS::mathProtoFuncSqrt):
        (KJS::mathProtoFuncTan):
        * kjs/math_object.h:
        (KJS::MathObjectImp::classInfo):
        (KJS::MathObjectImp::):

2008-01-16  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        Rename Lexer variable bol to atLineStart.

        * kjs/lexer.cpp:
        (KJS::Lexer::Lexer):
        (KJS::Lexer::setCode):
        (KJS::Lexer::nextLine):
        (KJS::Lexer::lex):
        * kjs/lexer.h:

2008-01-16  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen and Anders Carlsson.

        Remove uses of KJS_PURE_ECMA as we don't ever build with it defined,
        and we have many features that are not included in the ECMA spec.

        * kjs/lexer.cpp:
        (KJS::Lexer::Lexer):
        (KJS::Lexer::setCode):
        (KJS::Lexer::nextLine):
        (KJS::Lexer::lex):
        * kjs/lexer.h:
        * kjs/string_object.cpp:
        * kjs/string_object.h:

2008-01-15  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        Fix <rdar://problem/5595552> r27608 introduced a 20% increase in JS binary size, 4% increase in WebCore binary size

        - This changes the way JS functions that use Lookup tables are handled.  Instead of using
          one class per function, which allowed specialization of the virtual callAsFunction
          method, we now use one class, PrototypeFunction, which takes a pointer to a static
          function to use as the implementation.  This significantly decreases the binary size
          of JavaScriptCore (about 145k on an Intel only build) while still keeping some of the
          speedup r27608 garnered (SunSpider says this is 1.005x as slow, which should leave some
          wiggle room from the original 1% speedup) and keeps the functions implementations in separate
          functions to help with optimizations.

        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/array_object.cpp:
        (KJS::arrayProtoFuncToString):
        (KJS::arrayProtoFuncToLocaleString):
        (KJS::arrayProtoFuncJoin):
        (KJS::arrayProtoFuncConcat):
        (KJS::arrayProtoFuncPop):
        (KJS::arrayProtoFuncPush):
        (KJS::arrayProtoFuncReverse):
        (KJS::arrayProtoFuncShift):
        (KJS::arrayProtoFuncSlice):
        (KJS::arrayProtoFuncSort):
        (KJS::arrayProtoFuncSplice):
        (KJS::arrayProtoFuncUnShift):
        (KJS::arrayProtoFuncFilter):
        (KJS::arrayProtoFuncMap):
        (KJS::arrayProtoFuncEvery):
        (KJS::arrayProtoFuncForEach):
        (KJS::arrayProtoFuncSome):
        (KJS::arrayProtoFuncIndexOf):
        (KJS::arrayProtoFuncLastIndexOf):
        * kjs/array_object.h:
        * kjs/date_object.cpp:
        (KJS::DatePrototype::getOwnPropertySlot):
        (KJS::dateProtoFuncToString):
        (KJS::dateProtoFuncToUTCString):
        (KJS::dateProtoFuncToDateString):
        (KJS::dateProtoFuncToTimeString):
        (KJS::dateProtoFuncToLocaleString):
        (KJS::dateProtoFuncToLocaleDateString):
        (KJS::dateProtoFuncToLocaleTimeString):
        (KJS::dateProtoFuncValueOf):
        (KJS::dateProtoFuncGetTime):
        (KJS::dateProtoFuncGetFullYear):
        (KJS::dateProtoFuncGetUTCFullYear):
        (KJS::dateProtoFuncToGMTString):
        (KJS::dateProtoFuncGetMonth):
        (KJS::dateProtoFuncGetUTCMonth):
        (KJS::dateProtoFuncGetDate):
        (KJS::dateProtoFuncGetUTCDate):
        (KJS::dateProtoFuncGetDay):
        (KJS::dateProtoFuncGetUTCDay):
        (KJS::dateProtoFuncGetHours):
        (KJS::dateProtoFuncGetUTCHours):
        (KJS::dateProtoFuncGetMinutes):
        (KJS::dateProtoFuncGetUTCMinutes):
        (KJS::dateProtoFuncGetSeconds):
        (KJS::dateProtoFuncGetUTCSeconds):
        (KJS::dateProtoFuncGetMilliSeconds):
        (KJS::dateProtoFuncGetUTCMilliseconds):
        (KJS::dateProtoFuncGetTimezoneOffset):
        (KJS::dateProtoFuncSetTime):
        (KJS::dateProtoFuncSetMilliSeconds):
        (KJS::dateProtoFuncSetUTCMilliseconds):
        (KJS::dateProtoFuncSetSeconds):
        (KJS::dateProtoFuncSetUTCSeconds):
        (KJS::dateProtoFuncSetMinutes):
        (KJS::dateProtoFuncSetUTCMinutes):
        (KJS::dateProtoFuncSetHours):
        (KJS::dateProtoFuncSetUTCHours):
        (KJS::dateProtoFuncSetDate):
        (KJS::dateProtoFuncSetUTCDate):
        (KJS::dateProtoFuncSetMonth):
        (KJS::dateProtoFuncSetUTCMonth):
        (KJS::dateProtoFuncSetFullYear):
        (KJS::dateProtoFuncSetUTCFullYear):
        (KJS::dateProtoFuncSetYear):
        (KJS::dateProtoFuncGetYear):
        * kjs/date_object.h:
        * kjs/function.cpp:
        (KJS::PrototypeFunction::PrototypeFunction):
        (KJS::PrototypeFunction::callAsFunction):
        * kjs/function.h:
        * kjs/lookup.h:
        (KJS::HashEntry::):
        (KJS::staticFunctionGetter):
        * kjs/math_object.cpp:
        (KJS::mathProtoFuncAbs):
        (KJS::mathProtoFuncACos):
        (KJS::mathProtoFuncASin):
        (KJS::mathProtoFuncATan):
        (KJS::mathProtoFuncATan2):
        (KJS::mathProtoFuncCeil):
        (KJS::mathProtoFuncCos):
        (KJS::mathProtoFuncExp):
        (KJS::mathProtoFuncFloor):
        (KJS::mathProtoFuncLog):
        (KJS::mathProtoFuncMax):
        (KJS::mathProtoFuncMin):
        (KJS::mathProtoFuncPow):
        (KJS::mathProtoFuncRandom):
        (KJS::mathProtoFuncRound):
        (KJS::mathProtoFuncSin):
        (KJS::mathProtoFuncSqrt):
        (KJS::mathProtoFuncTan):
        * kjs/math_object.h:
        * kjs/string_object.cpp:
        (KJS::stringProtoFuncToString):
        (KJS::stringProtoFuncValueOf):
        (KJS::stringProtoFuncCharAt):
        (KJS::stringProtoFuncCharCodeAt):
        (KJS::stringProtoFuncConcat):
        (KJS::stringProtoFuncIndexOf):
        (KJS::stringProtoFuncLastIndexOf):
        (KJS::stringProtoFuncMatch):
        (KJS::stringProtoFuncSearch):
        (KJS::stringProtoFuncReplace):
        (KJS::stringProtoFuncSlice):
        (KJS::stringProtoFuncSplit):
        (KJS::stringProtoFuncSubstr):
        (KJS::stringProtoFuncSubstring):
        (KJS::stringProtoFuncToLowerCase):
        (KJS::stringProtoFuncToUpperCase):
        (KJS::stringProtoFuncToLocaleLowerCase):
        (KJS::stringProtoFuncToLocaleUpperCase):
        (KJS::stringProtoFuncLocaleCompare):
        (KJS::stringProtoFuncBig):
        (KJS::stringProtoFuncSmall):
        (KJS::stringProtoFuncBlink):
        (KJS::stringProtoFuncBold):
        (KJS::stringProtoFuncFixed):
        (KJS::stringProtoFuncItalics):
        (KJS::stringProtoFuncStrike):
        (KJS::stringProtoFuncSub):
        (KJS::stringProtoFuncSup):
        (KJS::stringProtoFuncFontcolor):
        (KJS::stringProtoFuncFontsize):
        (KJS::stringProtoFuncAnchor):
        (KJS::stringProtoFuncLink):
        * kjs/string_object.h:

2008-01-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Adam Roben.
        
        Some tweaks to our headerdoc, suggested by David Gatwood on the docs
        team.

        * API/JSBase.h:
        * API/JSObjectRef.h:
        * API/JSStringRef.h:
        * API/JSValueRef.h:

2008-01-15  Alp Toker  <alp@atoker.com>

        Rubber-stamped by Anders.

        Make the HTTP backend configurable in the GTK+ port. curl is currently
        the only option.

        * wtf/Platform.h: Don't hard-code WTF_USE_CURL for GTK

2008-01-15  Sam Weinig  <sam@webkit.org>

        Reviewed by Beth Dakin.

        Remove unneeded variable.

        * kjs/string_object.cpp:
        (KJS::StringProtoFuncSubstr::callAsFunction):

2008-01-14  Steve Falkenburg  <sfalken@apple.com>

        Use shared vsprops for most vcproj properties.
        
        Reviewed by Darin.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add missing Debug_Internal config.
        * JavaScriptCore.vcproj/WTF/WTF.vcproj: Add missing Debug_Internal config.
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2008-01-14  Adam Roben  <aroben@apple.com>

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Added
        some headers that were missing from the vcproj so their contents will
        be included in Find in Files.

2008-01-14  Adam Roben  <aroben@apple.com>

        Fix Bug 16871: Crash when loading apple.com/startpage

        <http://bugs.webkit.org/show_bug.cgi?id=16871>
        <rdar://problem/5686670>

        Patch written by Darin, reviewed by me.

        * kjs/ExecState.cpp:
        (KJS::ExecState::mark): Call ActivationImp::markChildren if our
        m_activation is on the stack. This is what ScopeChain::mark also does,
        but apparently in some cases it's possible for an ExecState's
        ActivationImp to not be in any ScopeChain.

2008-01-14  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Oliver.

        -<rdar://problem/5622667> REGRESSION (Leopard-ToT): Endless loading loop
        trying to view techreport.com comments
        - We need to set values in the map, because if they are already in the
        map they will not be reset when we use add().

        * kjs/array_instance.cpp:
        (KJS::ArrayInstance::put):

2008-01-14  Darin Adler  <darin@apple.com>

        Reviewed by Adam.

        - re-speed-up the page load test (my StringImpl change slowed it down)

        * wtf/RefCounted.h:
        (WTF::RefCounted::RefCounted): Allow derived classes to start with a reference
        count other than 0. Eventually everyone will want to start with a 1. This is a
        staged change. For now, there's a default of 0, and you can specify 1. Later,
        there will be no default and everyone will have to specify. And then later, there
        will be a default of 1. Eventually, we can take away even the option of starting
        with 0!

        * wtf/Vector.h:
        (WTF::Vector::Vector): Sped up creation of non-empty vectors by removing the
        overhead of first constructing something empty and then calling resize.
        (WTF::Vector::clear): Sped up the common case of calling clear on an empty
        vector by adding a check for that case.
        (WTF::Vector::releaseBuffer): Marked this function inline and removed a branch
        in the case of vectors with no inline capacity (normal vectors) by leaving out
        the code to copy the inline buffer in that case.

2008-01-14  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by David Kilzer.

        http://bugs.webkit.org/show_bug.cgi?id=16787
        array.splice() with 1 element not working

        Test: fast/js/array-splice.html

        * kjs/array_object.cpp:
        (KJS::ArrayProtoFuncSplice::callAsFunction): Implement this Mozilla extension, and fix
        some other edge cases.

2008-01-13  Steve Falkenburg  <sfalken@apple.com>

        Share common files across projects.
        
        Unify vsprops files
        Debug:          common.vsprops, debug.vsprops
        Debug_Internal: common.vsprops, debug.vsprops, debug_internal.vsprops
        Release:        common.vsprops, release.vsprops
        
        Shared properties can go into common.vsprops, shared debug settings can go into debug.vsprops.
        debug_internal.vsprops will be mostly empty except for file path prefix modifiers.

        Reviewed by Adam Roben.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * JavaScriptCore.vcproj/debug.vsprops: Removed.
        * JavaScriptCore.vcproj/debug_internal.vsprops: Removed.
        * JavaScriptCore.vcproj/release.vsprops: Removed.
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2008-01-13  Marius Bugge Monsen  <mbm@trolltech.com>

        Contributions and review by Adriaan de Groot,
        Simon Hausmann, Eric Seidel, and Darin Adler.

        - http://bugs.webkit.org/show_bug.cgi?id=16590
          Compilation fixes for Solaris.

        * kjs/DateMath.h:
        (KJS::GregorianDateTime::GregorianDateTime): Use the WIN_OS code path
        for SOLARIS too, presumably because Solaris also lacks the tm_gtoff and tm_zone
        fields.
        (KJS::GregorianDateTime::operator tm): Ditto.

        * kjs/collector.cpp:
        (KJS::currentThreadStackBase): Use thr_stksegment on Solaris.

        * wtf/MathExtras.h:
        (isfinite): Implement for Solaris.
        (isinf): Ditto.
        (signbit): Ditto. But this one is wrong, so I added a FIXME.

        * wtf/Platform.h: Define PLATFORM(SOLARIS) when "sun" or "__sun" is defined.

2008-01-13  Michael Goddard  <michael.goddard@trolltech.com>

        Reviewed by Anders Carlsson.

        Add binding language type to Instance.
        Allows runtime determination of the type of an
        Instance, to allow safe casting.  Doesn't actually
        add any safe casting yet, though.

        Add a helper function to get an Instance from a JSObject*.
        Given an object and the expected binding language, see if
        the JSObject actually wraps an Instance of the given type
        and return it.  Otherwise return 0.

        Move RuntimeObjectImp creations into Instance.
        Make the ctor protected, and Instance a friend class, so
        that all creation of RuntimeObjectImps goes through
        one place.

        Remove copy ctor/assignment operator for QtInstance.
        Instance itself is Noncopyable, so QtInstance doesn't
        need to have these.

        Add caching for QtInstance and associated RuntimeObjectImps.
        Push any dealings with QtLanguage bindings into QtInstance,
        and cache them there, rather than in the Instance layer.  Add
        a QtRuntimeObjectImp to help with caching.

        * JavaScriptCore.exp:
        * bindings/c/c_instance.h:
        * bindings/jni/jni_instance.h:
        * bindings/objc/objc_instance.h:
        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtRuntimeObjectImp::QtRuntimeObjectImp):
        (KJS::Bindings::QtRuntimeObjectImp::~QtRuntimeObjectImp):
        (KJS::Bindings::QtRuntimeObjectImp::invalidate):
        (KJS::Bindings::QtRuntimeObjectImp::removeFromCache):
        (KJS::Bindings::QtInstance::QtInstance):
        (KJS::Bindings::QtInstance::~QtInstance):
        (KJS::Bindings::QtInstance::getQtInstance):
        (KJS::Bindings::QtInstance::getRuntimeObject):
        * bindings/qt/qt_instance.h:
        (KJS::Bindings::QtInstance::getBindingLanguage):
        * bindings/runtime.cpp:
        (KJS::Bindings::Instance::createBindingForLanguageInstance):
        (KJS::Bindings::Instance::createRuntimeObject):
        (KJS::Bindings::Instance::getInstance):
        * bindings/runtime.h:
        * bindings/runtime_object.h:
        (KJS::RuntimeObjectImp::getInternalInstance):

2008-01-12  Alp Toker  <alp@atoker.com>

        Reviewed by Mark Rowe.

        Hide non-public symbols in GTK+/autotools release builds.

        * GNUmakefile.am:

2008-01-12  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Mark Rowe.

        Fix http://bugs.webkit.org/show_bug.cgi?id=16852
        Fixes leaking of ActivationStackNode objects.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::deleteActivationStack):
        (KJS::JSGlobalObject::~JSGlobalObject):
        (KJS::JSGlobalObject::init):
        (KJS::JSGlobalObject::reset):
        * kjs/JSGlobalObject.h:

2008-01-12  Darin Adler  <darin@apple.com>

        - try to fix Qt Windows build

        * pcre/dftables: Remove reliance on the list form of Perl pipes.

2008-01-12  Darin Adler  <darin@apple.com>

        - try to fix Qt build

        * kjs/function.cpp: Added include of scope_chain_mark.h.
        * kjs/scope_chain_mark.h: Added multiple-include guards.

2008-01-12  Mark Rowe  <mrowe@apple.com>

        Another Windows build fix.

        * kjs/Activation.h:

2008-01-12  Mark Rowe  <mrowe@apple.com>

        Attempted Windows build fix.  Use struct consistently when forward-declaring
        ActivationStackNode and StackActivation.

        * kjs/Activation.h:
        * kjs/JSGlobalObject.h:

2008-01-12  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Fixes a problem with the ActivationImp tear-off patch (r29425) where
        some of the calls to JSGlobalObject::tearOffActivation() were using
        the wrong test to determine whether it should leave a relic behind.

        * kjs/function.cpp:
        (KJS::FunctionImp::argumentsGetter):
        (KJS::ActivationImp::getOwnPropertySlot):

2008-01-11  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed <rdar://problem/5665251> REGRESSION (r28880-r28886): Global
        variable access (16644)
        
        This bug was caused by var declarations shadowing built-in properties of
        the global object.
        
        To match Firefox, we've decided that var declarations will never shadow
        built-in properties of the global object or its prototypes. We used to
        behave more like IE, which allows shadowing, but walking that line got
        us into trouble with websites that sent us down the Firefox codepath.

        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTableGet): New code to support calling
        hasProperty before the variable object is fully initialized (so you
        can call it during initialization).

        * kjs/nodes.cpp:.
        (KJS::ProgramNode::initializeSymbolTable): Always do a full hasProperty
        check when looking for duplicates, not getDirect, since it only checks
        the property map, and not hasOwnProperty, since it doesn't check
        prototypes.
        (KJS::EvalNode::processDeclarations): ditto

        * kjs/property_slot.h:
        (KJS::PropertySlot::ungettableGetter): Best function name evar.

2008-01-11  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Maciej.

        Optimized ActivationImp allocation, so that activation records are now
        first allocated on an explicitly managed stack and only heap allocated
        when necessary. Roughly a 5% improvement on SunSpider, and a larger
        improvement on benchmarks that use more function calls.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/Activation.h: Added.
        (KJS::ActivationImp::ActivationData::ActivationData):
        (KJS::ActivationImp::ActivationImp):
        (KJS::ActivationImp::classInfo):
        (KJS::ActivationImp::isActivationObject):
        (KJS::ActivationImp::isOnStack):
        (KJS::ActivationImp::d):
        (KJS::StackActivation::StackActivation):
        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        (KJS::ExecState::~ExecState):
        * kjs/ExecState.h:
        (KJS::ExecState::replaceScopeChainTop):
        (KJS::ExecState::setActivationObject):
        (KJS::ExecState::setLocalStorage):
        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::reset):
        (KJS::JSGlobalObject::pushActivation):
        (KJS::JSGlobalObject::checkActivationCount):
        (KJS::JSGlobalObject::popActivationHelper):
        (KJS::JSGlobalObject::popActivation):
        (KJS::JSGlobalObject::tearOffActivation):
        * kjs/JSGlobalObject.h:
        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::JSVariableObjectData::JSVariableObjectData):
        (KJS::JSVariableObject::JSVariableObject):
        * kjs/function.cpp:
        (KJS::FunctionImp::argumentsGetter):
        (KJS::ActivationImp::ActivationImp):
        (KJS::ActivationImp::~ActivationImp):
        (KJS::ActivationImp::init):
        (KJS::ActivationImp::getOwnPropertySlot):
        (KJS::ActivationImp::markHelper):
        (KJS::ActivationImp::mark):
        (KJS::ActivationImp::ActivationData::ActivationData):
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/function.h:
        * kjs/nodes.cpp:
        (KJS::PostIncResolveNode::evaluate):
        (KJS::PostDecResolveNode::evaluate):
        (KJS::PreIncResolveNode::evaluate):
        (KJS::PreDecResolveNode::evaluate):
        (KJS::ReadModifyResolveNode::evaluate):
        (KJS::AssignResolveNode::evaluate):
        (KJS::WithNode::execute):
        (KJS::TryNode::execute):
        (KJS::FunctionBodyNode::processDeclarations):
        (KJS::FuncExprNode::evaluate):
        * kjs/object.h:
        * kjs/scope_chain.h:
        (KJS::ScopeChain::replace):
        * kjs/scope_chain_mark.h: Added.
        (KJS::ScopeChain::mark):

2008-01-11  Simon Hausmann  <hausmann@webkit.org>

        Reviewed by Mark Rowe.

        Fix the (clean) qmake build. For generating chartables.c we don't
        depend on a separate input source file anymore, the dftables perl
        script is enough. So use that instead as value for the .input
        variable, to ensure that qmake also generates a rule to call dftables.

        * pcre/pcre.pri:

2008-01-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by John Sullivan.

        Fixed some world leak reports:
        * <rdar://problem/5669436> PLT complains about world leak of 1 JavaScript
        Interpreter after running cvs-base suite

        * <rdar://problem/5669423> PLT complains about world leak if browser
        window is open when PLT starts
        
        * kjs/collector.h: Added the ability to distinguish between global
        objects and GC-protected global objects, since we only consider the
        latter to be world leaks.
        * kjs/collector.cpp:

2008-01-11  Mark Rowe  <mrowe@apple.com>

        Silence qmake warning about ctgen lacking input.

        Rubber-stamped by Alp Toker.

        * pcre/pcre.pri:

2008-01-10  David Kilzer  <ddkilzer@apple.com>

        dftables should be rewritten as a script

        <http://bugs.webkit.org/show_bug.cgi?id=16818>
        <rdar://problem/5681463>

        Reviewed by Darin.

        Rewrote the dftables utility in Perl.  Attempted to switch all
        build systems to call the script directly instead of building
        a binary first.  Only the Xcode build was able to be tested.

        * DerivedSources.make: Added pcre directory to VPATH and changed
        to invoke dftables directly.
        * GNUmakefile.am: Removed build information and changed to invoke
        dftables directly.
        * JavaScriptCore.vcproj/JavaScriptCore.sln: Removed reference to
        dftables project.
        * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: Ditto.
        * JavaScriptCore.vcproj/dftables: Removed.
        * JavaScriptCore.vcproj/dftables/dftables.vcproj: Removed.
        * JavaScriptCore.xcodeproj/project.pbxproj: Removed dftables target.
        * jscore.bkl: Removed dftables executable definition.
        * pcre/dftables: Copied from JavaScriptCore/pcre/dftables.cpp.
        * pcre/dftables.cpp: Removed.
        * pcre/dftables.pro: Removed.
        * pcre/pcre.pri: Removed references to dftables.cpp and changed to
        invoke dftables directly.

2008-01-10  Dan Bernstein  <mitz@apple.com>

        Reviewed by Darin Adler.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16782
          <rdar://problem/5675331> REGRESSION(r29266): Reproducible crash in fast/replaced/image-map.html

        The crash resulted from a native object (DumpRenderTree's
        EventSender) causing its wrapper to be invalidated (by clicking a
        link that replaced the document in the window) and consequently
        deallocated. The fix is to use RefPtrs to protect the native object
        from deletion by self-invalidation.

        * bindings/runtime_method.cpp:
        (RuntimeMethod::callAsFunction):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::fallbackObjectGetter):
        (RuntimeObjectImp::fieldGetter):
        (RuntimeObjectImp::methodGetter):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::defaultValue):
        (RuntimeObjectImp::callAsFunction):

2008-01-07  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej Stachowiak.

        Turn testIsInteger assertions into compile-time asserts and move them into HashTraits.h
        where possible.

        * kjs/testkjs.cpp:
        * wtf/HashTraits.h:

2008-01-07  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by Mark.

        Enable SVG_FONTS by default.

        * Configurations/JavaScriptCore.xcconfig:

2008-01-07  Darin Adler  <darin@apple.com>

        Rubber stamped by David Kilzer.

        - get rid of empty fpconst.cpp

        * GNUmakefile.am: Remove fpconst.cpp.
        * JavaScriptCore.pri: Ditto.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto.
        * JavaScriptCore.xcodeproj/project.pbxproj: Ditto.
        * JavaScriptCoreSources.bkl: Ditto.

        * kjs/fpconst.cpp: Removed.

2008-01-07  Darin Adler  <darin@apple.com>

        Reviewed by David Kilzer.

        - fix alignment problem with NaN and Inf globals

        * kjs/fpconst.cpp: Move the contents of this file from here back to
        value.cpp. The reason this was in a separate file is that the DARWIN
        version of this used a declaration of the globals with a different
        type to avoid creating "init routines". That's no longer necessary for
        DARWIN and was never necessary for the non-DARWIN code path.
        To make this patch easy to merge, I didn't actually delete this file
        yet. We'll do that in a separate changeset.

        * kjs/value.cpp: If C99's NAN and INFINITY are present, then use them,
        othrewise use the union trick from fpconst.cpp. I think it would be
        better to eliminate KJS::NaN and KJS::Inf and just use NAN and INFINITY
        directly or std::numeric_limits<double>::quiet_nan() and
        std::numeric_limits<double>::infinity(). But when I tried that, it
        slowed down SunSpider. Someone else could do that cleanup if they
        could do it without slowing down the engine.

2008-01-07  Adam Roben  <aroben@apple.com>

        Windows build fix

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Added
        JavaScript.h to the project.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make:
        Copy JavaScript.h to WEBKITOUTPUTDIR.

2008-01-07  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin.

        Fix Mac build.

        * API/JSNode.c:
        * API/JSNode.h:
        * API/JSNodeList.c:
        * API/JSNodeList.h:
        * API/JavaScript.h:
        * API/JavaScriptCore.h:
        * API/minidom.c:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-01-07  Alp Toker  <alp@atoker.com>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=16029
        JavaScriptCore.h is not suitable for platforms other than Mac OS X

        Introduce a new JavaScriptCore/JavaScript.h public API header. This
        should be used by all new portable code using the JavaScriptCore API.

        JavaScriptCore/JavaScriptCore.h will remain for compatibility with
        existing applications that depend on it including JSStringRefCF.h
        which isn't portable.

        Also add minidom to the GTK+/autotools build since we can now support
        it on all platforms.

        * API/JSNode.h:
        * API/JSNodeList.h:
        * API/JavaScript.h: Added.
        * API/JavaScriptCore.h:
        * ForwardingHeaders/JavaScriptCore/JavaScript.h: Added.
        * GNUmakefile.am:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2008-01-06  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Abstract all DateObject.set* functions in preparation for fixing:
        http://bugs.webkit.org/show_bug.cgi?id=16753
        
        SunSpider had random changes here and there but was overall a wash.

        * kjs/date_object.cpp:
        (KJS::fillStructuresUsingTimeArgs):
        (KJS::setNewValueFromTimeArgs):
        (KJS::setNewValueFromDateArgs):
        (KJS::DateProtoFuncSetMilliSeconds::callAsFunction):
        (KJS::DateProtoFuncSetUTCMilliseconds::callAsFunction):
        (KJS::DateProtoFuncSetSeconds::callAsFunction):
        (KJS::DateProtoFuncSetUTCSeconds::callAsFunction):
        (KJS::DateProtoFuncSetMinutes::callAsFunction):
        (KJS::DateProtoFuncSetUTCMinutes::callAsFunction):
        (KJS::DateProtoFuncSetHours::callAsFunction):
        (KJS::DateProtoFuncSetUTCHours::callAsFunction):
        (KJS::DateProtoFuncSetDate::callAsFunction):
        (KJS::DateProtoFuncSetUTCDate::callAsFunction):
        (KJS::DateProtoFuncSetMonth::callAsFunction):
        (KJS::DateProtoFuncSetUTCMonth::callAsFunction):
        (KJS::DateProtoFuncSetFullYear::callAsFunction):
        (KJS::DateProtoFuncSetUTCFullYear::callAsFunction):

2008-01-06  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by Dan.

        Add new helper function isArabicChar - SVG Fonts support needs it.

        * wtf/unicode/icu/UnicodeIcu.h:
        (WTF::Unicode::isArabicChar):
        * wtf/unicode/qt4/UnicodeQt4.h:
        (WTF::Unicode::isArabicChar):

2008-01-06  Alp Toker  <alp@atoker.com>

        Reviewed by Mark Rowe.

        Use $(EXEEXT) to account for the .exe extension in the GTK+ Windows
        build. (This is already done correctly in DerivedSources.make.) Issue
        noticed by Mikkel when building in Cygwin.

        Add a missing slash. This was a hack from the qmake build system that
        isn't necessary with autotools.

        * GNUmakefile.am:

2008-01-05  Darin Adler  <darin@apple.com>

        * API/JSRetainPtr.h: One more file that needed the change below.

2008-01-05  Darin Adler  <darin@apple.com>

        * wtf/OwnPtr.h: OwnPtr needs the same fix as RefPtr below.

2008-01-05  Adam Roben  <aroben@apple.com>

        Build fix.

        Reviewed by Maciej.

        * wtf/RetainPtr.h: Use PtrType instead of T* because of the
        RemovePointer magic.

2008-01-05  Darin Adler  <darin@apple.com>

        Rubber stamped by Maciej Stachowiak.

        - cut down own PIC branches by using a pointer-to-member-data instead of a
          pointer-to-member-function in WTF smart pointers

        * wtf/OwnArrayPtr.h:
        * wtf/OwnPtr.h:
        * wtf/PassRefPtr.h:
        * wtf/RefPtr.h:
        * wtf/RetainPtr.h:
        Use a pointer to the m_ptr member instead of the get member.
        The GCC compiler generates better code for this idiom.

2008-01-05  Henry Mason  <hmason@mac.com>

        Reviewed by Maciej Stachowiak.

        http://bugs.webkit.org/show_bug.cgi?id=16738
        Bug 16738: Collector block offset could be stored as an cell offset instead of a byte offset

        Gives a 0.4% SunSpider boost and prettier code.

        * kjs/collector.cpp: Switched to cell offsets from byte offsets
        (KJS::Collector::heapAllocate):
        (KJS::Collector::sweep):

2008-01-04  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej Stachowiak.

        Have the two malloc zones print useful diagnostics if their free method are unexpectedly invoked.
        Due to <rdar://problem/5671357> this can happen if an application attempts to free a pointer that
        was not allocated by any registered malloc zone on the system.

        * kjs/CollectorHeapIntrospector.h:
        * wtf/FastMalloc.cpp:

2008-01-04  Alp Toker  <alp@atoker.com>

        GTK+ autotools build fix. Terminate empty rules.

        * GNUmakefile.am:

2008-01-03  Simon Hausmann  <hausmann@webkit.org>

        Reviewed by Mark Rowe.

        Fix compilation with gcc 4.3: limits.h is needed for INT_MAX.

        * pcre/pcre_exec.cpp:

2008-01-03  Darin Adler  <darin@apple.com>

        * tests/mozilla/expected.html: The fix for bug 16696 also fixed a test
        case, ecma_3/RegExp/perlstress-002.js, so updated results to expect
        that test to succeed.

2008-01-02  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16696
          JSCRE fails fails to match Acid3 regexp

        Test: fast/regex/early-acid3-86.html

        The problem was with the cutoff point between backreferences and octal
        escape sequences. We need to determine the cutoff point by counting the
        total number of capturing brackets, which requires an extra pass through
        the expression when compiling it.

        * pcre/pcre_compile.cpp:
        (CompileData::CompileData): Added numCapturingBrackets. Removed some
        unused fields.
        (compileBranch): Use numCapturingBrackets when calling checkEscape.
        (calculateCompiledPatternLength): Use numCapturingBrackets when calling
        checkEscape, and also store the bracket count at the end of the compile.
        (jsRegExpCompile): Call calculateCompiledPatternLength twice -- once to
        count the number of brackets and then a second time to calculate the length.

2008-01-02  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16696
          JSCRE fails fails to match Acid3 regexp

        Test: fast/regex/early-acid3-86.html

        The problem was with the cutoff point between backreferences and octal
        escape sequences. We need to determine the cutoff point by counting the
        total number of capturing brackets, which requires an extra pass through
        the expression when compiling it.

        * pcre/pcre_compile.cpp:
        (CompileData::CompileData): Added numCapturingBrackets. Removed some
        unused fields.
        (compileBranch): Use numCapturingBrackets when calling checkEscape.
        (calculateCompiledPatternLength): Use numCapturingBrackets when calling
        checkEscape, and also store the bracket count at the end of the compile.
        (jsRegExpCompile): Call calculateCompiledPatternLength twice -- once to
        count the number of brackets and then a second time to calculate the length.

2008-01-02  David Kilzer <ddkilzer@webkit.org>

        Reviewed and landed by Darin.

        * kjs/nodes.cpp:
        (KJS::DoWhileNode::execute): Added a missing return.

2008-01-02  Darin Adler  <darin@apple.com>

        - try to fix Qt build

        * wtf/unicode/qt4/UnicodeQt4.h:
        (WTF::Unicode::foldCase): Add some missing const.

2008-01-02  Alice Liu  <alice.liu@apple.com>

        Reviewed by Sam Weinig.

        need to export ASCIICType.h for use in DRT

        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * wtf/ASCIICType.h:
        (WTF::isASCIIUpper):

2008-01-02  Sam Weinig  <sam@webkit.org>

        Reviewed by Beth Dakin.

        Cleanup error_object.h/cpp.

        * kjs/JSGlobalObject.cpp:
        (KJS::JSGlobalObject::reset):
        * kjs/error_object.cpp:
        (KJS::ErrorInstance::ErrorInstance):
        (KJS::ErrorPrototype::ErrorPrototype):
        (KJS::ErrorProtoFuncToString::ErrorProtoFuncToString):
        (KJS::ErrorProtoFuncToString::callAsFunction):
        (KJS::ErrorObjectImp::ErrorObjectImp):
        (KJS::ErrorObjectImp::implementsConstruct):
        (KJS::ErrorObjectImp::construct):
        (KJS::ErrorObjectImp::callAsFunction):
        (KJS::NativeErrorPrototype::NativeErrorPrototype):
        (KJS::NativeErrorImp::NativeErrorImp):
        (KJS::NativeErrorImp::implementsConstruct):
        (KJS::NativeErrorImp::construct):
        (KJS::NativeErrorImp::callAsFunction):
        (KJS::NativeErrorImp::mark):
        * kjs/error_object.h:
        (KJS::ErrorInstance::classInfo):
        (KJS::NativeErrorImp::classInfo):

2008-01-02  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Alp Toker.

        * GNUmakefile.am: Add missing dependency on grammar.y.

2008-01-01  Darin Adler  <darin@apple.com>

        Reviewed by Eric.

        - fix for http://bugs.webkit.org/show_bug.cgi?id=16695
          JSC allows non-identifier codepoints in identifiers (affects Acid3)

        Test: fast/js/kde/parse.html

        * kjs/lexer.cpp:
        (KJS::Lexer::lex): Added additional states to distinguish Unicode escapes at the
        start of identifiers from ones inside identifiers. Rejected characters that don't pass
        the isIdentStart and isIdentPart tests.
        (KJS::Lexer::convertUnicode): Removed incorrect FIXME comment.

        * kjs/lexer.h: Added new states to distinguish \u escapes at the start of identifiers
        from \u escapes inside identifiers.

2008-01-01  Darin Adler  <darin@apple.com>

        - rolled scope chain optimization out; it was breaking the world

2008-01-01  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - http://bugs.webkit.org/show_bug.cgi?id=16685
          eliminate List::empty() to cut down on PIC branches

        Also included one other speed-up -- remove the call to reserveCapacity from
        FunctionBodyNode::processDeclarations in all but the most unusual cases.

        Together these make SunSpider 1.016x as fast.

        * JavaScriptCore.exp: Updated.
        * kjs/ExecState.cpp:
        (KJS::globalEmptyList): Added. Called only when creating global ExecState
        instances.
        (KJS::ExecState::ExecState): Broke constructor up into three separate functions,
        for the three separate node types. Also went through each of the three and
        streamlined as much as possible, removing dead code. This prevents us from having
        to access the global in the function body version of the constructor.

        * kjs/ExecState.h: Added emptyList(). Replaced the constructor with a set of
        three that are specific to the different node types that can create new execution
        state objects.

        * kjs/array_object.cpp:
        (KJS::ArrayProtoFuncToLocaleString::callAsFunction): Use exec->emptyList() instead
        of List::empty().
        (KJS::ArrayProtoFuncConcat::callAsFunction): Ditto.
        (KJS::ArrayProtoFuncSlice::callAsFunction): Ditto.
        (KJS::ArrayProtoFuncSplice::callAsFunction): Ditto.
        (KJS::ArrayProtoFuncFilter::callAsFunction): Ditto.
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction): Updated to call new ExecState constructor.
        (KJS::GlobalFuncImp::callAsFunction): Ditto (for eval).
        * kjs/function_object.cpp:
        (FunctionObjectImp::construct): Use exec->emptyList() instead of List::empty().

        * kjs/list.cpp: Removed List::empty.
        * kjs/list.h: Ditto.

        * kjs/nodes.cpp:
        (KJS::ElementNode::evaluate): Use exec->emptyList() instead of List::empty().
        (KJS::ArrayNode::evaluate): Ditto.
        (KJS::ObjectLiteralNode::evaluate): Ditto.
        (KJS::PropertyListNode::evaluate): Ditto.
        (KJS::FunctionBodyNode::processDeclarations): Another speed-up. Check the capacity
        before calling reserveCapacity, because it doesn't get inlined the local storage
        vector is almost always big enough -- saving the function call overhead is a big
        deal.
        (KJS::FuncDeclNode::makeFunction): Use exec->emptyList() instead of List::empty().
        (KJS::FuncExprNode::evaluate): Ditto.
        * kjs/object.cpp:
        (KJS::tryGetAndCallProperty): Ditto.
        * kjs/property_slot.cpp:
        (KJS::PropertySlot::functionGetter): Ditto.
        * kjs/string_object.cpp:
        (KJS::StringProtoFuncSplit::callAsFunction): Ditto.

2008-01-01  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16648
          REGRESSION (r28165): Yuku.com navigation prints "jsRegExpExecute failed with result -2"
          <rdar://problem/5646486> REGRESSION (r28165): Layout test fast/regex/test1 fails intermittently

        Fixes 34 failing test cases in the fast/regex/test1.html test.

        Restored the stack which prevents infinite loops for brackets that match the empty
        string; it had been removed as an optimization.

        Unfortunately, restoring this stack causes the regular expression test in SunSpider
        to be 1.095x as slow and the overall test to be 1.004x as slow. Maybe we can find
        a correct optimization to restore the speed!

        It's possible the original change was on the right track but just off by one.

        * pcre/pcre_exec.cpp: Add back eptrblock, but name it BracketChainNode.
        (MatchStack::pushNewFrame): Add back the logic needed here.
        (startNewGroup): Ditto.
        (match): Ditto.

2008-01-01  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - http://bugs.webkit.org/show_bug.cgi?id=16683
          speed up function calls by making ScopeChain::push cheaper

        This gives a 1.019x speedup on SunSpider.

        After doing this, I realized this probably will be obsolete when the optimization
        to avoid creating an activation object is done. When we do that one we should check
        if rolling this out will speed things up, since this does add overhead at the time
        you copy the scope chain.

        * kjs/object.h: Removed the ScopeChain::release function. It was
        marked inline, and called in exactly one place, so moved it there.
        No idea why it was in this header file!

        * kjs/scope_chain.cpp: Removed the overload of the ScopeChain::push
        function that takes another ScopeChain. It was unused. I think we used
        it over in WebCore at one point, but not any more.

        * kjs/scope_chain.h: Changed ScopeChainNode into a struct rather than
        a class, got rid of its constructor so we can have one that's uninitialized,
        and moved the refCount into a derived struct, ScopeChainHeapNode. Made _node
        mutable so it can be changed in the moveToHeap function. Changed the copy
        constructor and assignment operator to call moveToHeap, since the top node
        can't be shared when it's embedded in another ScopeChain object. Updated
        functions as needed to handle the case where the first object isn't on the
        heap or to add casts for cases where it's guaranteed to be. Changed the push
        function to always put the new node into the ScopeChain object; it will get
        put onto the heap when needed later.

2008-01-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Fixed slight logic error in reserveCapacity, where we would reallocate
        the storage buffer unnecessarily.

        * wtf/Vector.h:
        (WTF::::reserveCapacity): No need to grow the buffer if newCapacity is
        equal to capacity().

2008-01-01  Darin Adler  <darin@apple.com>

        Reviewed by Oliver.

        - http://bugs.webkit.org/show_bug.cgi?id=16684
          eliminate debugger overhead from function body execution

        Speeds SunSpider up 1.003x. That's a small amount, but measurable.

        * JavaScriptCore.exp: Updated.
        * kjs/Parser.h:
        (KJS::Parser::parse): Create the node with a static member function named create() instead
        of using new explicitly.

        * kjs/grammar.y: Changed calls to new FunctionBodyNode to use FunctionBodyNode::create().

        * kjs/nodes.cpp:
        (KJS::ProgramNode::create): Added. Calls new.
        (KJS::EvalNode::create): Ditto.
        (KJS::FunctionBodyNode::create): Ditto, but creates FunctionBodyNodeWithDebuggerHooks
        when a debugger is present.
        (KJS::FunctionBodyNode::execute): Removed debugger hooks.
        (KJS::FunctionBodyNodeWithDebuggerHooks::FunctionBodyNodeWithDebuggerHooks): Added.
        (KJS::FunctionBodyNodeWithDebuggerHooks::execute): Calls the debugger, then the code,
        then the debugger again.

        * kjs/nodes.h: Added create functions, made the constructors private and protected.

2007-12-30  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        More small cleanup to array_object.cpp

        * kjs/array_object.cpp:
        (KJS::ArrayProtoFuncToString::callAsFunction):
        (KJS::ArrayProtoFuncToLocaleString::callAsFunction):
        (KJS::ArrayProtoFuncJoin::callAsFunction):
        (KJS::ArrayProtoFuncConcat::callAsFunction):
        (KJS::ArrayProtoFuncReverse::callAsFunction):
        (KJS::ArrayProtoFuncShift::callAsFunction):
        (KJS::ArrayProtoFuncSlice::callAsFunction):
        (KJS::ArrayProtoFuncSort::callAsFunction):
        (KJS::ArrayProtoFuncSplice::callAsFunction):
        (KJS::ArrayProtoFuncUnShift::callAsFunction):
        (KJS::ArrayProtoFuncFilter::callAsFunction):
        (KJS::ArrayProtoFuncMap::callAsFunction):
        (KJS::ArrayProtoFuncEvery::callAsFunction):

2007-12-30  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Apply wkstyle to array_object.cpp

        * kjs/array_object.cpp:
        (KJS::ArrayPrototype::ArrayPrototype):
        (KJS::ArrayPrototype::getOwnPropertySlot):
        (KJS::ArrayProtoFuncConcat::callAsFunction):
        (KJS::ArrayProtoFuncPop::callAsFunction):
        (KJS::ArrayProtoFuncReverse::callAsFunction):
        (KJS::ArrayProtoFuncShift::callAsFunction):
        (KJS::ArrayProtoFuncSlice::callAsFunction):
        (KJS::ArrayProtoFuncSort::callAsFunction):
        (KJS::ArrayProtoFuncSplice::callAsFunction):
        (KJS::ArrayProtoFuncUnShift::callAsFunction):
        (KJS::ArrayProtoFuncFilter::callAsFunction):
        (KJS::ArrayProtoFuncMap::callAsFunction):
        (KJS::ArrayProtoFuncEvery::callAsFunction):
        (KJS::ArrayProtoFuncLastIndexOf::callAsFunction):
        (KJS::ArrayObjectImp::ArrayObjectImp):
        (KJS::ArrayObjectImp::implementsConstruct):
        (KJS::ArrayObjectImp::construct):
        (KJS::ArrayObjectImp::callAsFunction):

2007-12-30  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Remove maxInt/minInt, replacing with std:max/min<int>()

        * kjs/array_object.cpp:
        (KJS::ArrayProtoFuncSplice::callAsFunction):
        * kjs/operations.cpp:
        * kjs/operations.h:

2007-12-30  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.
        
        Update Number.toString to properly throw exceptions.
        Cleanup code in Number.toString implementation.

        * kjs/number_object.cpp:
        (KJS::numberToString):
        * kjs/object.cpp:
        (KJS::Error::create): Remove bogus debug lines.

2007-12-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Oliver.

        ASSERT when debugging via Drosera due to missed var lookup optimization.
        http://bugs.webkit.org/show_bug.cgi?id=16634
        
        No test case possible.

        * kjs/nodes.cpp:
        (KJS::BreakpointCheckStatement::optimizeVariableAccess):
        * kjs/nodes.h:

2007-12-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Oliver.

        Fix (-0).toFixed() and re-factor a little
        Fix (-0).toExponential() and printing of trailing 0s in toExponential
        Fix toPrecision(nan) handling
        http://bugs.webkit.org/show_bug.cgi?id=16640

        * kjs/number_object.cpp:
        (KJS::numberToFixed):
        (KJS::fractionalPartToString):
        (KJS::numberToExponential):
        (KJS::numberToPrecision):

2007-12-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        More changes to make number code readable

        * kjs/number_object.cpp:
        (KJS::integer_part_noexp):
        (KJS::numberToFixed):
        (KJS::numberToExponential):

2007-12-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        More small cleanups to toPrecision

        * kjs/number_object.cpp:
        (KJS::numberToPrecision):

2007-12-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        More small attempts to make number code readable

        * kjs/number_object.cpp:
        (KJS::exponentialPartToString):
        (KJS::numberToExponential):
        (KJS::numberToPrecision):

2007-12-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Break out callAsFunction implementations into static functions

        * kjs/number_object.cpp:
        (KJS::numberToString):
        (KJS::numberToFixed):
        (KJS::numberToExponential):
        (KJS::numberToPrecision):
        (KJS::NumberProtoFunc::callAsFunction):

2007-12-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Apply wkstyle/astyle and fix placement of *

        * kjs/number_object.cpp:
        (KJS::NumberInstance::NumberInstance):
        (KJS::NumberPrototype::NumberPrototype):
        (KJS::NumberProtoFunc::NumberProtoFunc):
        (KJS::integer_part_noexp):
        (KJS::intPow10):
        (KJS::NumberProtoFunc::callAsFunction):
        (KJS::NumberObjectImp::NumberObjectImp):
        (KJS::NumberObjectImp::getOwnPropertySlot):
        (KJS::NumberObjectImp::getValueProperty):
        (KJS::NumberObjectImp::implementsConstruct):
        (KJS::NumberObjectImp::construct):
        (KJS::NumberObjectImp::callAsFunction):
        * kjs/object.cpp:
        (KJS::JSObject::put):

2007-12-27  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        ASSERT in JavaScriptCore while viewing WICD test case
        http://bugs.webkit.org/show_bug.cgi?id=16626
        
        * kjs/nodes.cpp:
        (KJS::ForInNode::execute): move KJS_CHECK_EXCEPTION to proper place

2007-12-26  Jan Michael Alonzo  <jmalonzo@unpluggable.com>

        Reviewed by Alp Toker.

        http://bugs.webkit.org/show_bug.cgi?id=16390
        Use autotools or GNU make as the build system for the GTK port

        * GNUmakefile.am: Added.

2007-12-25  Maciej Stachowiak  <mjs@apple.com>
        
        Reviewed by Oliver.
                
        - Remove unnecessary redundant check from property setting
        http://bugs.webkit.org/show_bug.cgi?id=16602
                
        1.3% speedup on SunSpider.
        
        * kjs/object.cpp:
        (KJS::JSObject::put): Don't do canPut check when not needed; let
        the PropertyMap handle it.        
        (KJS::JSObject::canPut): Don't check the static property
        table. lookupPut does that already.
        
2007-12-24  Alp Toker  <alp@atoker.com>

        Fix builds that don't use AllInOneFile.cpp following breakage
        introduced in r28973.

        * kjs/grammar.y:

2007-12-24  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.

        - Optimize variable declarations
        http://bugs.webkit.org/show_bug.cgi?id=16585
        
        3.5% speedup on SunSpider.

        var statements now result in either assignments or empty statements.
        
        This allows a couple of optimization opportunities:
        - No need to branch at runtime to check if there is an initializer
        - EmptyStatementNodes can be removed entirely (also done in this patch)
        - Assignment expressions get properly optimized for local variables
        
        This patch also includes some code cleanup:
        - Most of the old VarStatement/VarDecl logic is now only used for const declarations, 
          thus it is renamed appropriately
        - AssignExprNode is gone
        
        * JavaScriptCore.exp:
        * kjs/NodeInfo.h:
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::SourceElements::append):
        (KJS::ConstDeclNode::ConstDeclNode):
        (KJS::ConstDeclNode::optimizeVariableAccess):
        (KJS::ConstDeclNode::handleSlowCase):
        (KJS::ConstDeclNode::evaluateSingle):
        (KJS::ConstDeclNode::evaluate):
        (KJS::ConstStatementNode::optimizeVariableAccess):
        (KJS::ConstStatementNode::execute):
        (KJS::VarStatementNode::optimizeVariableAccess):
        (KJS::VarStatementNode::execute):
        (KJS::ForInNode::ForInNode):
        (KJS::ForInNode::optimizeVariableAccess):
        (KJS::ForInNode::execute):
        (KJS::FunctionBodyNode::initializeSymbolTable):
        (KJS::ProgramNode::initializeSymbolTable):
        (KJS::FunctionBodyNode::processDeclarations):
        (KJS::ProgramNode::processDeclarations):
        (KJS::EvalNode::processDeclarations):
        * kjs/nodes.h:
        (KJS::DeclarationStacks::):
        (KJS::StatementNode::):
        (KJS::ConstDeclNode::):
        (KJS::ConstStatementNode::):
        (KJS::EmptyStatementNode::):
        (KJS::VarStatementNode::):
        (KJS::ForNode::):
        * kjs/nodes2string.cpp:
        (KJS::ConstDeclNode::streamTo):
        (KJS::ConstStatementNode::streamTo):
        (KJS::ScopeNode::streamTo):
        (KJS::VarStatementNode::streamTo):
        (KJS::ForNode::streamTo):
        (KJS::ForInNode::streamTo):

2007-12-21  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        * JavaScriptCore.exp: Remove unused symbol to prevent a weak external symbol
        being generated in JavaScriptCore.framework.

2007-12-21  Darin Adler  <darin@apple.com>

        Requested by Maciej.

        * kjs/nodes.h: Use the new NEVER_INLINE here and eliminate the old
        KJS_NO_INLINE. We don't want to have two, and we figured it was better
        to keep the one that's in WTF.

2007-12-21  Darin Adler  <darin@apple.com>

        Reviewed by Eric.

        - http://bugs.webkit.org/show_bug.cgi?id=16561
          remove debugger overhead from non-debugged JavaScript execution

        1.022x as fast on SunSpider.

        * JavaScriptCore.exp: Updated.

        * kjs/NodeInfo.h: Renamed SourceElementsStub to SourceElements,
        since that more accurately describes the role of this object, which
        is a reference-counted wrapper for a Vector.

        * kjs/Parser.cpp:
        (KJS::Parser::didFinishParsing): Changed parameter type to SourceElements,
        and use plain assignment instead of set.
        * kjs/Parser.h: Changed parameter type of didFinishParsing to a
        SourceElements. Also changed m_sourceElements; we now use a RefPtr instead
        of an OwnPtr as well.

        * kjs/grammar.y: Got rid of all the calls to release() on SourceElements.
        That's now handed inside the constructors for various node types, since we now
        use vector swapping instead.

        * kjs/nodes.cpp:
        (KJS::Node::rethrowException): Added NEVER_INLINE, because this was getting inlined
        and we want exception handling out of the normal code flow.
        (KJS::SourceElements::append): Moved here from the header. This now handles
        creating a BreakpointCheckStatement for each statement in the debugger case.
        That way we can get breakpoint handling without having it in every execute function.
        (KJS::BreakpointCheckStatement::BreakpointCheckStatement): Added.
        (KJS::BreakpointCheckStatement::execute): Added. Contains the code that was formerly
        in the StatementNode::hitStatement function and the KJS_BREAKPOINT macro.
        (KJS::BreakpointCheckStatement::streamTo): Added.
        (KJS::ArgumentListNode::evaluateList): Use KJS_CHECKEXCEPTIONVOID since the return
        type is void.
        (KJS::VarStatementNode::execute): Removed KJS_BREAKPOINT.
        (KJS::BlockNode::BlockNode): Changed parameter type to SourceElements.
        Changed code to use release since the class now contains a vector rather than
        a vector point.
        (KJS::BlockNode::optimizeVariableAccess): Updated since member is now a vector
        rather than a vector pointer.
        (KJS::BlockNode::execute): Ditto.
        (KJS::ExprStatementNode::execute): Removed KJS_BREAKPOINT.
        (KJS::IfNode::execute): Ditto.
        (KJS::IfElseNode::execute): Ditto.
        (KJS::DoWhileNode::execute): Ditto.
        (KJS::WhileNode::execute): Ditto.
        (KJS::ContinueNode::execute): Ditto.
        (KJS::BreakNode::execute): Ditto.
        (KJS::ReturnNode::execute): Ditto.
        (KJS::WithNode::execute): Ditto.
        (KJS::CaseClauseNode::optimizeVariableAccess): Updated since member is now a vector
        rather than a vector pointer.
        (KJS::CaseClauseNode::executeStatements): Ditto.
        (KJS::SwitchNode::execute): Removed KJS_BREAKPOINT.
        (KJS::ThrowNode::execute): Ditto.
        (KJS::TryNode::execute): Ditto.
        (KJS::ScopeNode::ScopeNode): Changed parameter type to SourceElements.
        (KJS::ProgramNode::ProgramNode): Ditto.
        (KJS::EvalNode::EvalNode): Ditto.
        (KJS::FunctionBodyNode::FunctionBodyNode): Ditto.
        (KJS::ScopeNode::optimizeVariableAccess): Updated since member is now a vector
        rather than a vector pointer.

        * kjs/nodes.h: Removed hitStatement. Renamed SourceElements to StatementVector.
        Renamed SourceElementsStub to SourceElements and made it derive from
        ParserRefCounted rather than from Node, hold a vector rather than a pointer to
        a vector, and changed the release function to swap with another vector rather
        than the pointer idiom. Updated BlockNode and CaseClauseNode to hold actual
        vectors instead of pointers to vectors. Added BreakpointCheckStatement.

        * kjs/nodes2string.cpp:
        (KJS::statementListStreamTo): Changed to work on a vector instead of a pointer
        to a vector.
        (KJS::BlockNode::streamTo): Ditto.
        (KJS::CaseClauseNode::streamTo):  Ditto.

        * wtf/AlwaysInline.h: Added NEVER_INLINE.
        * wtf/PassRefPtr.h: Tweaked formatting. Added clear() function that matches the
        ones in OwnPtr and auto_ptr.
        * wtf/RefPtr.h: Ditto.

2007-12-21  Darin Adler  <darin@apple.com>

        - fix broken regression tests

        The broken tests were fast/js/do-while-expression-value.html and
        fast/js/while-expression-value.html.

        * kjs/nodes.cpp: Check in the correct version of this file. I had accidentally landed
        an old version of my patch for bug 16471.
        (KJS::statementListExecute): The logic here was backwards. Have to set the value
        even for non-normal execution results.

2007-12-20  Alexey Proskuryakov  <ap@webkit.org>

        Windows build fix

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Copy npruntime_internal.h
        to WebKitBuild.

2007-12-20  Eric Seidel  <eric@webkit.org>

        Reviewed by mjs.
        
        Split IfNode into IfNode and IfElseNode for speedup.
        http://bugs.webkit.org/show_bug.cgi?id=16470
        
        SunSpider claims this is 1.003x as fast as before.
        (This required running with --runs 15 to get consistent enough results to tell!)

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::IfNode::optimizeVariableAccess):
        (KJS::IfNode::execute):
        (KJS::IfNode::getDeclarations):
        (KJS::IfElseNode::optimizeVariableAccess):
        (KJS::IfElseNode::execute):
        (KJS::IfElseNode::getDeclarations):
        * kjs/nodes.h:
        (KJS::IfNode::):
        (KJS::IfElseNode::):
        * kjs/nodes2string.cpp:
        (KJS::IfNode::streamTo):
        (KJS::IfElseNode::streamTo):

2007-12-20  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        * wtf/OwnPtr.h:
        (WTF::operator==): Added.
        (WTF::operator!=): Added.

2007-12-20  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        AST optimization: Avoid NULL-checking ForNode's child nodes.
        
        0.6% speedup on SunSpider.
        
        This is a proof of concept patch that demonstrates how to optimize
        grammar productions with optional components, like
        
            for (optional; optional; optional) {
                ...
            }
            
        The parser emits NULL for an optional component that is not present.

        Instead of checking for a NULL child at execution time, a node that
        expects an optional component to be present more often than not checks
        for a NULL child at construction time, and substitutes a viable
        alternative node in its place.

        (We'd like the parser to start emitting NULL a lot more once we teach
        it to emit NULL for certain no-op productions like EmptyStatement and
        VariableStatement, so, as a foundation, it's important for nodes with
        NULL optional components to be fast.)

        * kjs/Parser.cpp:
        (KJS::Parser::didFinishParsing): Check for NULL SourceElements. Also,
        moved didFinishParsing into the .cpp file because adding a branch while
        it was in the header file caused a substantial and inexplicable
        performance regression. (Did I mention that GCC is crazy?)

        * kjs/grammar.y:

        * kjs/nodes.cpp:
        (KJS::BlockNode::BlockNode): Check for NULL SourceElements.
        (KJS::ForNode::optimizeVariableAccess): No need to check for NULL here.
        (KJS::ForNode::execute): No need to check for NULL here.
        * kjs/nodes.h:
        (KJS::ForNode::): Check for NULL SourceElements. Substitute a TrueNode
        because it's semantically harmless, and it evaluates to boolean in an
        efficient manner.

2007-12-20  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Slight logic reordering in JSImmediate::from(double)

        This gives a 0.6% improvement in SunSpider.

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::from):

2007-12-20  Eric Seidel  <eric@webkit.org>

        Reviewed by mjs.

        Fix major Array regression introduced by 28899.

        SunSpider claims this is at least 1.37x as fast as pre-regression. :)

        * kjs/array_instance.cpp: make Arrays fast again!

2007-12-20  Eric Seidel  <eric@webkit.org>

        Reviewed by Geoff, then re-rubber-stamped by Geoff after final search/replace and testing.

        Small reworking of Date code for 4% speedup on Date tests (0.2% overall)
        http://bugs.webkit.org/show_bug.cgi?id=16537

        Make msToYear human-readable
        Make msToDayInMonth slightly more readable and avoid recalculating msToYear
        Remove use of isInLeapYear to avoid calling msToYear
        Remove dayInYear call by changing msToDayInMonth to dayInMonthFromDayInYear
        Remove more duplicate calls to dayInYear and getUTCOffset for further speedup

        * kjs/DateMath.cpp:
        (KJS::daysFrom1970ToYear):
        (KJS::msToYear):
        (KJS::monthFromDayInYear):
        (KJS::checkMonth):
        (KJS::dayInMonthFromDayInYear):
        (KJS::dateToDayInYear):
        (KJS::getDSTOffsetSimple):
        (KJS::getDSTOffset):
        (KJS::gregorianDateTimeToMS):
        (KJS::msToGregorianDateTime):

2007-12-20  Rodney Dawes  <dobey@wayofthemonkey.com>

        Reviewed by Darin Adler.

        Proxy includes of npruntime.h or npapi.h through npruntime_internal.h
        Include stdio.h in npapi.h for the use of FILE with XP_UNIX defined
        This is for building with X11, as some type and enum names conflict
        with #define names in X11 headers.
        http://bugs.webkit.org/show_bug.cgi?id=15669

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/NP_jsobject.h:
        * bindings/npapi.h:
        * bindings/npruntime.cpp:
        * bindings/npruntime_impl.h:
        * bindings/npruntime_priv.h:
        * bindings/npruntime_internal.h:
        * bindings/testbindings.cpp:
        * bindings/c/c_class.h:
        * bindings/c/c_runtime.h:
        * bindings/c/c_utility.h:

2007-12-20  Darin Adler  <darin@apple.com>

        - re-fix http://bugs.webkit.org/show_bug.cgi?id=16471
          Completions need to be smaller (or not exist at all)

        Same patch as last time with the test failures problem fixed.

        * kjs/function.cpp:
        (KJS::GlobalFuncImp::callAsFunction): Make sure to check the completion
        type from newExec to see if the execute raised an exception.

2007-12-20  Darin Adler  <darin@apple.com>

        - roll out that last change -- it was causing test failures;
          I'll check it back in after fixing them

2007-12-20  Darin Adler  <darin@apple.com>

        Reviewed by Eric.

        - http://bugs.webkit.org/show_bug.cgi?id=16471
          Completions need to be smaller (or not exist at all)

        SuSpider shows 2.4% speedup.

        Stop using completions in the execution engine.
        Instead, the completion type and label target are both
        stored in the ExecState.

        * API/JSContextRef.cpp: Removed unneeded include of "completion.h".
        * bindings/runtime_method.cpp: Removed unused execute function.
        * bindings/runtime_method.h: Ditto.

        * kjs/ExecState.h: Added completionType, breakOrContinueTarget,
        setCompletionType, setNormalCompletion, setBreakCompletion,
        setContinueCompletion, setReturnValueCompletion, setThrowCompletion,
        setInterruptedCompletion, m_completionType, and m_breakOrContinueTarget.

        * kjs/completion.h: Removed constructor and getter for target
        for break and continue from Completion. This class is now only
        used for the public API to Interpreter and such.

        * kjs/date_object.h: Removed unused execute function.

        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction): Removed some unneeded
        exception processing. Updated to call the new execute function
        and to get the completion type from the ExecState. Merged in
        the execute function, which repeated some of the same logic and
        was called only from here.
        (KJS::GlobalFuncImp::callAsFunction): More of the same for eval.
        * kjs/function.h: Removed execute.

        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate): Added code to convert the result of
        execut into a Completion.

        * kjs/nodes.cpp:
        (KJS::Node::setErrorCompletion): Renamed from createErrorCompletion.
        Now sets the completion type in the ExecState.
        (KJS::Node::rethrowException): Now sets the completion type in the
        ExecState.
        (KJS::StatementNode::hitStatement): Now sets the completion type in
        the ExecState.
        (KJS::VarStatementNode::execute): Updated to put completion type in
        the ExecState instead of a Completion object.
        (KJS::statementListExecute): Ditto. Also changed the for loop to use
        indices instead of iterators.
        (KJS::BlockNode::execute): Updated return type.
        (KJS::EmptyStatementNode::execute): Updated to put completion type in
        the ExecState instead of a Completion object.
        (KJS::ExprStatementNode::execute): Ditto.
        (KJS::IfNode::execute): Ditto.
        (KJS::DoWhileNode::execute): Ditto. Also streamlined the logic a little
        to make the normal case a little faster and moved the end outside the
        loop so that "break" can do a break.
        (KJS::WhileNode::execute): Ditto.
        (KJS::ForNode::execute): Ditto.
        (KJS::ForInNode::execute): Ditto.
        (KJS::ContinueNode::execute): Updated to put completion type in
        the ExecState instead of a Completion object.
        (KJS::BreakNode::execute): Ditto.
        (KJS::ReturnNode::execute): Ditto.
        (KJS::WithNode::execute): Ditto.
        (KJS::CaseClauseNode::executeStatements): Ditto. Also renamed to have
        execute in its name to reflect the fact that it's a member of the same
        family of functions.
        (KJS::CaseBlockNode::executeBlock): Ditto.
        (KJS::SwitchNode::execute): Ditto.
        (KJS::LabelNode::execute): Ditto.
        (KJS::ThrowNode::execute): Ditto.
        (KJS::TryNode::execute): Ditto.
        (KJS::ProgramNode::execute): Ditto.
        (KJS::EvalNode::execute): Ditto.
        (KJS::FunctionBodyNode::execute): Ditto.
        (KJS::FuncDeclNode::execute): Ditto.

        * kjs/nodes.h: Renamed setErrorCompletion to createErrorCompletion, made
        hitStatement protected, changed return value of execute to a JSValue,
        renamed evalStatements to executeStatements, and evalBlock to executeBlock.

        * kjs/number_object.h: Removed unused execute function.

2007-12-20  Geoffrey Garen  <ggaren@apple.com>

        Added Radar number.

        * kjs/nodes.cpp:
        (KJS::ProgramNode::processDeclarations):

2007-12-20  Geoffrey Garen  <ggaren@apple.com>

        Linux build fix: config.h has to come first.

        * kjs/error_object.cpp:

2007-12-19  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Optimized global access to global variables, using a symbol table.
        
        SunSpider reports a 1.5% overall speedup, a 6.2% speedup on 3d-morph,
        and a whopping 33.1% speedup on bitops-bitwise-and.

        * API/JSCallbackObjectFunctions.h: Replaced calls to JSObject:: with
        calls to Base::, since JSObject is not always our base class. This
        was always a bug, but the bug is even more apparent after some of my
        changes.

        (KJS::::staticFunctionGetter): Replaced use of getDirect with call to
        getOwnPropertySlot. Global declarations are no longer stored in the
        property map, so a call to getDirect is insufficient for finding
        override properties.

        * API/testapi.c: 
        * API/testapi.js: Added test for the getDirect change mentioned above.

        * kjs/ExecState.cpp: 
        * kjs/ExecState.h: Dialed back the optimization to store a direct
        pointer to the localStorage buffer. One ExecState can grow the global
        object's localStorage without another ExecState's knowledge, so
        ExecState can't store a direct pointer to the localStorage buffer
        unless/until we invent a way to update all the relevant ExecStates.

        * kjs/JSGlobalObject.cpp: Inserted the symbol table into get and put
        operations.
        (KJS::JSGlobalObject::reset): Reset the symbol table and local storage,
        too. Also, clear the property map here, removing the need for a
        separate call.

        * kjs/JSVariableObject.cpp:
        * kjs/JSVariableObject.h: Added support for saving localStorage and the
        symbol table to the back/forward cache, and restoring them.

        * kjs/function.cpp:
        (KJS::GlobalFuncImp::callAsFunction): Renamed progNode to evalNode
        because it's an EvalNode, not a ProgramNode.

        * kjs/lookup.h:
        (KJS::cacheGlobalObject): Replaced put with faster putDirect, since
        that's how the rest of lookup.h works. putDirect is safe here because
        cacheGlobalObject is only used for objects whose names are not valid
        identifiers.

        * kjs/nodes.cpp: The good stuff!

        (KJS::EvalNode::processDeclarations): Replaced hasProperty with
        the new hasOwnProperty, which is slightly faster.

        * kjs/object.h: Nixed clearProperties because clear() does this job now.

        * kjs/property_map.cpp:
        * kjs/property_map.h: More back/forward cache support.
        
        * wtf/Vector.h:
        (WTF::::grow): Added fast non-branching grow function. I used it in
        an earlier version of this patch, even though it's not used anymore.

2007-12-09  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        Build fix for non-Mac platforms.  Move NodeInfo into its own header so that the YYTYPE
        declaration in grammar.h is able to declare members of that type.

        * kjs/NodeInfo.h: Added.
        (KJS::createNodeInfo):
        (KJS::mergeDeclarationLists):
        (KJS::appendToVarDeclarationList):
        * kjs/grammar.y:
        * kjs/lexer.cpp:

2007-12-19  Oliver Hunt  <oliver@apple.com>

        Make appendToVarDeclarationList static

        RS=Weinig.

        * kjs/grammar.y:

2007-12-18  Oliver Hunt  <oliver@apple.com>

        Remove dead code due to removal of post-parse declaration discovery.

        RS=Geoff.

        Due to the removal of the declaration discovery pass after parsing we
        no longer need any of the logic used for that discovery.

        * kjs/nodes.cpp:
        (KJS::Node::Node):
        (KJS::VarDeclNode::VarDeclNode):
        (KJS::BlockNode::BlockNode):
        (KJS::ForInNode::ForInNode):
        (KJS::CaseBlockNode::CaseBlockNode):
        * kjs/nodes.h:
        (KJS::VarStatementNode::):
        (KJS::IfNode::):
        (KJS::DoWhileNode::):
        (KJS::WhileNode::):
        (KJS::WithNode::):
        (KJS::LabelNode::):
        (KJS::TryNode::):
        (KJS::FuncDeclNode::):
        (KJS::CaseClauseNode::):
        (KJS::ClauseListNode::):
        (KJS::SwitchNode::):

2007-12-18  Oliver Hunt  <oliver@apple.com>

        Replace post-parse pass to find declarations with logic in the parser itself

        Reviewed by Geoff.

        Instead of finding declarations in a pass following the initial parsing of
        a program, we incorporate the logic directly into the parser.  This lays
        the groundwork for further optimisations (such as improving performance in
        declaration expressions -- var x = y; -- to match that of standard assignment)
        in addition to providing a 0.4% performance improvement in SunSpider.

        * JavaScriptCore.exp:
        * kjs/Parser.cpp:
        (KJS::Parser::parse):
        * kjs/Parser.h:
        (KJS::Parser::didFinishParsing):
        (KJS::Parser::parse):
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::ParserTracked::ParserTracked):
        (KJS::ParserTracked::~ParserTracked):
        (KJS::ParserTracked::ref):
        (KJS::ParserTracked::deref):
        (KJS::ParserTracked::refcount):
        (KJS::ParserTracked::clearNewTrackedObjects):
        (KJS::Node::Node):
        (KJS::ScopeNode::ScopeNode):
        (KJS::ProgramNode::ProgramNode):
        (KJS::EvalNode::EvalNode):
        (KJS::FunctionBodyNode::FunctionBodyNode):
        (KJS::FunctionBodyNode::initializeSymbolTable):
        (KJS::FunctionBodyNode::processDeclarations):
        * kjs/nodes.h:
        (KJS::ParserTracked::):
        (KJS::Node::):
        (KJS::ScopeNode::):

2007-12-18  Xan Lopez  <xan@gnome.org>

        Reviewed by Geoff.

        Fix http://bugs.webkit.org/show_bug.cgi?id=14521
        Bug 14521: JavaScriptCore fails to build on Linux/PPC gcc 4.1.2
        
        * wtf/TCSpinLock.h:
        (TCMalloc_SpinLock::Unlock):

        Use less strict memory operand constraint on inline asm generation.
        PLATFORM(DARWIN) left unpatched due to Apple's GCC bug.

        Patch by David Kilzer <ddkilzer@webkit.org>

2007-12-18  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Maciej Stachowiak.

        Remove outdated and non-functioning project files for the Apollo port.

        * JavaScriptCore.apolloproj: Removed.

2007-12-18  Darin Adler  <darin@apple.com>

        - fix Windows build

        * pcre/pcre_exec.cpp:
        (jsRegExpExecute): Change back from false/true to 0/1 -- I probably should not have
        deleted MATCH_MATCH and MATCH_NOMATCH, but I'm going to leave them out.

2007-12-18  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16458
          REGRESSION (r28164): regular expressions can now hang due to lack of a match limit
          <rdar://problem/5636067>

        Test: fast/regex/slow.html

        Slows down SunSpider a bit (about 1.01x); filed a bug to follow up on that:
        http://bugs.webkit.org/show_bug.cgi?id=16503

        * pcre/pcre.h: Changed name of error code to not specifically mention "recursion".
        * pcre/pcre_exec.cpp:
        (match): Replaced the depth limit, MATCH_RECURSION_LIMIT, with a total match looping
        limit, matchLimit. Also eliminated the constants for MATCH_MATCH and MATCH_NOMATCH,
        since they are just true and false (1 and 0).
        (jsRegExpExecute): More of the MATCH_MATCH change.

2007-12-17  Darin Adler  <darin@apple.com>

        - speculative build fix for non-gcc platforms

        * pcre/pcre_exec.cpp: (match): Remove unused cases from return switch.

2007-12-16  Mark Rowe  <mrowe@apple.com>

        Speculative build fix for non-Mac platforms.

        * pcre/pcre_compile.cpp: Include string.h for memset, memmove, etc.

2007-12-16  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=16438
        - removed some more unused code
        - changed quite a few more names to WebKit-style
        - moved more things out of pcre_internal.h
        - changed some indentation to WebKit-style
        - improved design of the functions for reading and writing
          2-byte values from the opcode stream (in pcre_internal.h)

        * pcre/dftables.cpp:
        (main): Added the kjs prefix a normal way in lieu of using macros.

        * pcre/pcre_compile.cpp: Moved some definitions here from pcre_internal.h.
        (errorText): Name changes, fewer typedefs.
        (checkEscape): Ditto. Changed uppercase conversion to use toASCIIUpper.
        (isCountedRepeat): Name change.
        (readRepeatCounts): Name change.
        (firstSignificantOpcode): Got rid of the use of OP_lengths, which is
        very lightly used here. Hard-coded the length of OP_BRANUMBER.
        (firstSignificantOpcodeSkippingAssertions): Ditto. Also changed to
        use the advanceToEndOfBracket function.
        (getOthercaseRange): Name changes.
        (encodeUTF8): Ditto.
        (compileBranch): Name changes. Removed unused after_manual_callout and
        the code to handle it. Removed code to handle OP_ONCE since we never
        emit this opcode. Changed to use advanceToEndOfBracket in more places.
        (compileBracket): Name changes.
        (branchIsAnchored): Removed code to handle OP_ONCE since we never emit
        this opcode.
        (bracketIsAnchored): Name changes.
        (branchNeedsLineStart): More fo the same.
        (bracketNeedsLineStart): Ditto.
        (branchFindFirstAssertedCharacter): Removed OP_ONCE code.
        (bracketFindFirstAssertedCharacter): More of the same.
        (calculateCompiledPatternLengthAndFlags): Ditto.
        (returnError): Name changes.
        (jsRegExpCompile): Ditto.

        * pcre/pcre_exec.cpp: Moved some definitions here from pcre_internal.h.
        (matchRef): Updated names.
        Improved macros to use the do { } while(0) idiom so they expand to single
        statements rather than to blocks or multiple statements. And refeactored
        the recursive match macros.
        (MatchStack::pushNewFrame): Name changes.
        (getUTF8CharAndIncrementLength): Name changes.
        (match): Name changes. Removed the ONCE opcode.
        (jsRegExpExecute): Name changes.

        * pcre/pcre_internal.h: Removed quite a few unneeded includes. Rewrote
        quite a few comments. Removed the macros that add kjs prefixes to the
        functions with external linkage; instead renamed the functions. Removed
        the unneeded typedefs pcre_uint16, pcre_uint32, and uschar. Removed the
        dead and not-all-working code for LINK_SIZE values other than 2, although
        we aim to keep the abstraction working. Removed the OP_LENGTHS macro.
        (put2ByteValue): Replaces put2ByteOpcodeValueAtOffset.
        (get2ByteValue): Replaces get2ByteOpcodeValueAtOffset.
        (put2ByteValueAndAdvance): Replaces put2ByteOpcodeValueAtOffsetAndAdvance.
        (putLinkValueAllowZero): Replaces putOpcodeValueAtOffset; doesn't do the
        addition, since a comma is really no better than a plus sign. Added an
        assertion to catch out of range values and changed the parameter type to
        int rather than unsigned.
        (getLinkValueAllowZero): Replaces getOpcodeValueAtOffset.
        (putLinkValue): New function that most former callers of the
        putOpcodeValueAtOffset function can use; asserts the value that is
        being stored is non-zero and then calls putLinkValueAllowZero.
        (getLinkValue): Ditto.
        (putLinkValueAndAdvance): Replaces putOpcodeValueAtOffsetAndAdvance. No
        caller was using an offset, which makes sense given the advancing behavior.
        (putLinkValueAllowZeroAndAdvance): Ditto.
        (isBracketOpcode): Added. For use in an assertion.
        (advanceToEndOfBracket): Renamed from moveOpcodePtrPastAnyAlternateBranches,
        and removed comments about how it's not well designed. This function takes
        a pointer to the beginning of a bracket and advances to the end of the
        bracket.

        * pcre/pcre_tables.cpp: Updated names.
        * pcre/pcre_ucp_searchfuncs.cpp:
        (kjs_pcre_ucp_othercase): Ditto.
        * pcre/pcre_xclass.cpp:
        (getUTF8CharAndAdvancePointer): Ditto.
        (kjs_pcre_xclass): Ditto.
        * pcre/ucpinternal.h: Ditto.

        * wtf/ASCIICType.h:
        (WTF::isASCIIAlpha): Added an int overload, like the one we already have for
        isASCIIDigit.
        (WTF::isASCIIAlphanumeric): Ditto.
        (WTF::isASCIIHexDigit): Ditto.
        (WTF::isASCIILower): Ditto.
        (WTF::isASCIISpace): Ditto.
        (WTF::toASCIILower): Ditto.
        (WTF::toASCIIUpper): Ditto.

2007-12-16  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16459
          REGRESSION: assertion failure with regexp with \B in a case-ignoring character range
          <rdar://problem/5646361>

        The problem was that \B was not handled properly in character classes.

        Test: fast/js/regexp-overflow.html

        * pcre/pcre_compile.cpp:
        (check_escape): Added handling of ESC_b and ESC_B in character classes here.
        Allows us to get rid of the handling of \b in character classes from all the
        call sites that handle it separately and to handle \B properly as well.
        (compileBranch): Remove the ESC_b handling, since it's not needed any more.
        (calculateCompiledPatternLengthAndFlags): Ditto.

2007-12-16  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej Stachowiak.

        Fix http://bugs.webkit.org/show_bug.cgi?id=16448
        Bug 16448: [GTK] Celtic Kane JavaScript performance on Array test is slow relative to Mac

        * kjs/array_instance.cpp:
        (KJS::compareByStringPairForQSort):
        (KJS::ArrayInstance::sort): Convert JSValue's to strings once up front and then sort the
        results.  This avoids calling toString twice per comparison, but requires a temporary buffer
        so we only use this approach in cases where the array being sorted is not too large.

2007-12-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler and Maciej Stachowiak.
        
        More refactoring to support global variable optimization.
        
        Changed SymbolTable to use RefPtr<UString::Rep> as its key instead of
        UString::Rep*. With globals, the symbol table can outlast the
        declaration node for any given symbol, so the symbol table needs to ref
        its symbol names.
        
        In support, specialized HashMaps with RefPtr keys to allow lookup
        via raw pointer, avoiding refcount churn.
        
        SunSpider reports a .6% speedup (prolly just noise).

        * JavaScriptCore.vcproj/WTF/WTF.vcproj: Added new file: wtf/RefPtrHashMap.h
        * JavaScriptCore.xcodeproj/project.pbxproj: ditto

        * kjs/JSVariableObject.cpp:
        (KJS::JSVariableObject::getPropertyNames): Symbol table keys are RefPtrs now.

        * kjs/SymbolTable.h: Modified key traits to match RefPtr. Added a
        static Rep* for null, which helps compute the deletedValue() trait.

        * wtf/HashMap.h: #include the RefPtr specialization so everyone can use it.

        * wtf/RefPtrHashMap.h: Copied from wtf/HashMap.h. Added overloaded versions
        of find(), contains(), get(), set(), add(), remove(), and take() that take
        raw pointers as keys.

2007-12-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=16162
        Problems with float parsing on Linux (locale-dependent parsing was used).

        * kjs/dtoa.cpp: Removed USE_LOCALE to reduce future confusion.
        * kjs/lexer.cpp: (KJS::Lexer::lex): Parse with kjs_strtod, not the system one.

2007-12-14  Alp Toker  <alp@atoker.com>

        Reviewed by Mark Rowe.

        Enable the AllInOneFile.cpp optimization for the GTK+ port.

        * JavaScriptCore.pri:

2007-12-14  Mark Rowe  <mrowe@apple.com>

        Unreviewed.  Remove commented out fprintf's that were for debugging purposes only.

        * wtf/FastMalloc.cpp:
        (WTF::TCMalloc_PageHeap::IncrementalScavenge):

2007-12-14  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej Stachowiak.

        Don't use the MADV_DONTNEED code path for now as it has no effect on Mac OS X and is
        currently untested on other platforms.

        * wtf/TCSystemAlloc.cpp:
        (TCMalloc_SystemRelease): Return after releasing memory rather than potentially falling
        through into another mechanism if multiple are supported.

2007-12-14  Alp Toker  <alp@atoker.com>

        Build fix for GTK+/Qt and ports that don't use AllInOneFile.cpp.

        Include UnusedParam.h.

        * wtf/TCSystemAlloc.cpp:

2007-12-14  Oliver Hunt  <oliver@apple.com>

        Reviewed by Stephanie.

        Fix build on windows

        * wtf/FastMalloc.cpp:
        (WTF::TCMalloc_PageHeap::IncrementalScavenge):

2007-12-14  Dan Bernstein  <mitz@apple.com>

        - try again to fix the Windows build

        * wtf/TCSystemAlloc.cpp:
        (TCMalloc_SystemRelease):

2007-12-14  Dan Bernstein  <mitz@apple.com>

        - try to fix the Windows build

        * wtf/TCSystemAlloc.cpp:
        (TCMalloc_SystemRelease):

2007-12-14  Mark Rowe <mrowe@apple.com>

        Reviewed by Maciej and Oliver.

        Add final changes to make TCMalloc release memory to the system.
        This results in a 0.4% regression against ToT, but this is offset
        against the gains made by the original TCMalloc r38 merge - in fact
        we retain around 0.3-0.4% progression overall.

        * wtf/FastMalloc.cpp:
        (WTF::InitSizeClasses):
        (WTF::TCMalloc_PageHeap::IncrementalScavenge):
        * wtf/TCSystemAlloc.cpp:
        (TCMalloc_SystemRelease):

2007-12-14  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        - removed unnecessary includes of "Vector.h"

        * wtf/HashMap.h:
        (WTF::copyKeysToVector): Make the type of the vector be a template parameter.
        This allows copying keys into a vector of a base class or one with an inline capacity.
        (WTF::copyValuesToVector): Ditto.
        * wtf/HashSet.h:
        (WTF::copyToVector): Ditto.

2007-12-14  Anders Carlsson  <andersca@apple.com>

        Reviewed by Darin and Geoff.

        <rdar://problem/5619295> 
        REGRESSION: 303-304: Embedded YouTube video fails to render- JS errors (16150) (Flash 9)
        
        Get rid of unnecessary and incorrect security checks for plug-ins accessing JavaScript objects. 
        
        The way this used to work was that each NPObject that wrapped a JSObject would have a root object
        corresponding to the frame object (used for managing the lifecycle) and an origin root object (used for
        doing security checks). 
        
        This would prevent a plug-in from accessing a frame's window object if it's security origin was different
        (some parts of the window, such as the location object, can be accessed from frames with different security 
        origins, and those checks are being done in WebCore).
        
        Also, if a plug-in were to access a window object of a frame that later went away, it could lead to that
        Window JSObject being garbage collected and the NPObject pointing to freed memory.
        
        How this works now is that there is no origin root object anymore, and all NPObject wrappers that are created
        for a plug-in will have the root object of the containing frame of that plug-in.
        
        * bindings/NP_jsobject.cpp:
        (jsDeallocate):
        Don't free the origin root object.
        
        (_NPN_CreateScriptObject):
        Remove the origin root object parameter.
        
        (_NPN_InvokeDefault):
        (_NPN_Invoke):
        (_NPN_Evaluate):
        (_NPN_GetProperty):
        (_NPN_SetProperty):
        (_NPN_RemoveProperty):
        (_NPN_HasProperty):
        (_NPN_HasMethod):
        (_NPN_Enumerate):
        Get rid of all security checks.
        
        * bindings/NP_jsobject.h:
        Remove originRootObject from the JavaScriptObject struct.
        
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertValueToNPVariant):
        Always use the root object from the ExecState.
        
2007-12-13  Steve Falkenburg  <sfalken@apple.com>

        Move source file generation into its own vcproj to fix build dependencies.

        Reviewed by Adam.

        * JavaScriptCore.vcproj/JavaScriptCore.sln:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: Added.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj: Added.
        * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln:

2007-12-13  Alp Toker  <alp@atoker.com>

        http://bugs.webkit.org/show_bug.cgi?id=16406
        [Gtk] JavaScriptCore needs -lpthread

        Build fix for Debian and any other platforms that don't implicitly
        link to pthread.

        Link to pthread on non-Windows platforms until this dependency is
        removed from JSC.

2007-12-11  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Build fix: Note some variables that are used only for ASSERTs.

        * API/testapi.c:
        (Base_finalize):
        (globalObject_initialize):
        (testInitializeFinalize):

2007-12-11  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Fixed: All JS tests crash on Windows.

        NDEBUG wasn't defined when compiling testkjs in release builds, so the
        HashTable definition in HashTable.h included an extra data member.

        The solution was to add NDEBUG to the release testkjs configuration on
        Windows and Mac.
        
        For giggles, I also added other missing #defines to testkjs on Windows.

        * Configurations/Base.xcconfig:
        * Configurations/JavaScriptCore.xcconfig:
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/testkjs.cpp:
        (main):

2007-12-11  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Removed bogus ASSERT.
        
        ASSERT should only be used when we know that a code path will not be
        taken. This code path is taken often during the jsFunFuzz test.

        * pcre/pcre_exec.cpp:
        (jsRegExpExecute):

2007-12-11  Darin Adler  <darin@apple.com>

        * wtf/unicode/qt4/UnicodeQt4.h: Try to fix Qt build by adding U16_IS_SINGLE.

2007-12-10  Darin Adler  <darin@apple.com>

        Reviewed by Sam Weinig.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16379
          REGRESSION(r28525): Failures in http/tests/xmlhttprequest/response-encoding.html and
          fast/dom/xmlhttprequest-html-response-encoding.html
          and <rdar://problem/5640230> REGRESSION (306A4-ToT): Access violation in PCRE function
          find_firstassertedchar

        Test: fast/js/regexp-find-first-asserted.html

        * pcre/pcre_compile.cpp:
        (compileBracket): Take out unnecessary initialization of out parameters.
        (branchFindFirstAssertedCharacter): Added. Broke out the half of the function that handles
        a branch.
        (bracketFindFirstAssertedCharacter): Renamed from find_firstassertedchar. Also removed the
        options parameter -- the caller can handle the options.
        (jsRegExpCompile): Changed call site to call the appropriate bracket or branch version of
        the find_firstassertedchar function. Also put the REQ_IGNORE_CASE code here instead of
        passing in the options.

2007-12-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.

        Split this:
        
                            FunctionBodyNode
                                    ^
                                    |
                                ProgramNode
            
        into this:
            
                                ScopeNode
                ^                   ^                   ^
                |                   |                   |
        FunctionBodyNode        ProgramNode         EvalNode

        in preparation for specializing each class more while optimizing global
        variable access.
        
        Also removed some cruft from the FunctionBodyNode interface to simplify
        things.
        
        SunSpider says this patch is a .8% speedup, which seems reasonable,
        since it eliminates a few branches and adds KJS_FAST_CALL in a few
        places.
        
        Layout tests and JS tests pass. Also, this baby builds on Windows! (Qt
        mileage may vary...)

2007-12-10  Geoffrey Garen  <ggaren@apple.com>

        RS by Mark Rowe.
        
        Mac build fix: added some exported symbols, now that Parser::parse is
        defined in the header.

        * JavaScriptCore.exp:

2007-12-10  Sam Weinig  <sam@webkit.org>

        Build fix.

        Template methods need to be in the header.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * kjs/Parser.cpp:
        * kjs/Parser.h:
        (KJS::Parser::parse):

2007-12-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Merged different implementations of Parser::parse into a single,
        templatized implementation, in preparation for adding yet another
        implementation for "eval" code.
        
        JS and layout tests pass.

2007-12-10  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Mark Rowe

        <rdar://problem/5639463> Bundle versions on Tiger should be 4523.x not 523.x

        * Configurations/Version.xcconfig: Some Tiger versions of Xcode don't set MAC_OS_X_VERSION_MAJOR,
          so assume Tiger and use a 4 for the SYSTEM_VERSION_PREFIX.

2007-12-10  Mark Rowe  <mrowe@apple.com>

        Tiger build fix.

        * kjs/grammar.y: Use @1 and @0 in place of @$ where Tiger's bison chokes.

2007-12-10  Darin Adler  <darin@apple.com>

        Reviewed by Mark Rowe.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16375
          REGRESSION: Safari crashes on quit

        Probably a debug-only issue.

        * kjs/Parser.cpp:
        (KJS::parser): Create the parser and never destroy it by using a pointer instead
        of a global object.

2007-12-09  Darin Adler  <darin@apple.com>

        Reviewed by Sam Weinig.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16369
          REGRESSION (r28525): regular expression tests failing due to bad firstByte optimization

        * pcre/pcre_compile.cpp: Changed some names to use interCaps intead of under_scores.
        (branchIsAnchored): Broke is_anchored into two separate functions; this one works on a
        branch and the other on an anchor. The old function would only work on a bracket.
        Also removed unneeded parameters; the anchored check does not require the bracket
        map or the options any more because we have a reduced set of features.
        (bracketIsAnchored): Ditto.
        (branchNeedsLineStart): Broke canApplyFirstCharOptimization into two functions and gave
        both a better name. This is the function that was returning the wrong value. The failure
        was beacuse the old function would only work on a bracket.
        (bracketNeedsLineStart): Ditto.
        (jsRegExpCompile): Changed to call the appropriate branch or bracket flavor of the
        functions based on whether we compiled an outer bracket. Also removed inaccurate comments
        and unneeded parameters.

        - other small changes

        * pcre/pcre.h: Renumbered error codes, in a logical order. First, normal failure, then
        the recursion limit, then running out of memory, and finally an unexpected internal error.

        * pcre/pcre_exec.cpp: Fixed indentation.
        (jsRegExpExecute): Corrected an inaccurate comment.

2007-12-09  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16370
          REGRESSION (r28540): source URL and line number no longer set for outer function/programs

        Test: fast/js/exception-linenums-in-html-1.html
        Test: fast/js/exception-linenums-in-html-2.html
        Test: fast/js/exception-linenums.html

        By the time the ProgramNode was constructed, the source URL was empty.

        * kjs/Parser.cpp:
        (KJS::Parser::parseProgram): Added code to set and clear m_sourceURL, which is now
        handled here instead of in the lexer; it needs to still be set when we create the
        program node. Call setLoc to set the first and last line number.
        (KJS::Parser::parseFunctionBody): Ditto, but for the body.
        (KJS::Parser::parse): Removed the sourceURL argument.

        * kjs/Parser.h: Added sourceURL(), m_sourceURL, and m_lastLine. Added a lastLine
        parameter to didFinishParsing, since the bison grammar knows the last line number
        and we otherwise do not know it. Removed the sourceURL parameter from parse, since
        that's now handled at a higher level.

        * kjs/grammar.y: Pass the last line number to didFinishParsing.

        * kjs/lexer.cpp:
        (KJS::Lexer::setCode): Removed the sourceURL argument and the code to set m_sourceURL.
        (KJS::Lexer::clear): Ditto.
        * kjs/lexer.h: More of the same.

        * kjs/nodes.cpp:
        (KJS::FunctionBodyNode::FunctionBodyNode): Get the source URL from the parser rather
        than from the lexer. Removed unneeded call to setLoc, since the line numbers already
        both default to -1.

2007-12-08  Oliver Hunt  <oliver@apple.com>

        Reviewed by Sam W.

        Split the ENABLE_SVG_EXPERIMENTAL_FEATURES flag into separate flags.
        
        Fixes <rdar://problem/5620249> Must disable SVG animation
        <rdar://problem/5612772> Disable SVG filters on Mac to match Windows behavior
        
        Minor config changes.

        * Configurations/JavaScriptCore.xcconfig:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-12-07  Sam Weinig  <sam@webkit.org>

        Reviewed by Darin.

        - Rename isSafeScript to allowsAccessFrom.

        * bindings/NP_jsobject.cpp:
        (_isSafeScript):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::allowsAccessFrom): Reverse caller/argument of allowsAccessFrom to match
        the new call.

2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Refactored variable access optimization: Removed the assumption that
        the FunctionBodyNode holds the symbol table.
        
2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added #include.

        * kjs/nodes.cpp:

2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added #include.

        * kjs/interpreter.cpp:

2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added #include.

        * kjs/grammar.y:

2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added #include.

        * kjs/function_object.cpp:

2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Fixed crash seen running layout tests.
        
        Reverted a change I made earlier today. Added a comment to try to
        discourage myself from making this mistake a third time.

        * kjs/function.cpp:
        (KJS::ActivationImp::mark):
        * kjs/function.h:
        (KJS::ActivationImp::ActivationImpData::ActivationImpData):

2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Refactored parsing of global code: Removed the assumption that 
        ProgramNode inherits from FunctionBodyNode from the parser.

        * kjs/Parser.cpp:
        (KJS::Parser::parseProgram):
        (KJS::Parser::parseFunctionBody):
        (KJS::Parser::parse):
        * kjs/Parser.h:
        (KJS::Parser::didFinishParsing):
        * kjs/function.cpp:
        * kjs/grammar.y:
        * kjs/nodes.h:

2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added JSVariableObject.cpp to the .pri file.

        * JavaScriptCore.pri:

2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added #include.

        * kjs/function.cpp:

2007-12-07  Steve Falkenburg  <sfalken@apple.com>

        Re-named our B&I flag from BUILDBOT to PRODUCTION.

        Reviewed by Sam Weinig.

        * JavaScriptCore.vcproj/JavaScriptCore.make:
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Build fix: removed stray name qualification.

        * kjs/function.h:
        (KJS::ActivationImp::ActivationImp):

2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Build fix: moved functions with qualified names outside of class
        declaration.

        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTableGet):
        (KJS::JSVariableObject::symbolTablePut):

2007-12-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.

        Next step in refactoring JSGlobalObject: Added JSVariableObject class,
        and factored symbol-table-related code into it. (JSGlobalObject doesn't
        use the symbol table code yet, though.)
        
        Layout and JS tests, and testapi, pass. SunSpider reports no regression.

2007-12-07  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16185
          jsRegExpCompile should not add implicit non-capturing bracket

        While this does not make SunSpider faster, it will make many regular
        expressions a bit faster.

        * pcre/pcre_compile.cpp: Moved CompileData struct in here from the
        header since it's private to this file.
        (compile_branch): Updated for function name change.
        (compile_bracket): Renamed from compile_regex, since, for one thing,
        this does not compile an entire regular expression.
        (calculateCompiledPatternLengthAndFlags): Removed unused item_count
        local variable. Renamed CompileData to cd instead of compile_block
        to be consistent with other functions. Added code to set the
        needOuterBracket flag if there's at least one "|" at the outer level.
        (jsRegExpCompile): Renamed CompileData to cd instead of compile_block
        to be consistent with other functions. Removed unneeded "size" field
        from the compiled regular expression. If no outer bracket is needed,
        then use compile_branch to compile the regular expression.

        * pcre/pcre_internal.h: Removed the CompileData struct, which is now
        private to pcre_compile.cpp. Removed the size member from JSRegExp.

2007-12-06  Kevin Ollivier  <kevino@theolliviers.com>

        MSVC7 build fix due to a compiler bug with placement new and/or
        templates and casting.

        Reviewed by Darin Adler.

        * wtf/Vector.h:
        (WTF::::append):

2007-12-06  Darin Adler  <darin@apple.com>

        Reviewed by Eric Seidel.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16321
          new RegExp("[\u0097]{4,6}", "gmy") crashes in DEBUG builds
          <rdar://problem/5632992>

        Test: fast/js/regexp-oveflow.html

        * pcre/pcre_compile.cpp:
        (calculateCompiledPatternLengthAndFlags): In the case where a single character
        character class is optimized to not use a character class at all, the preflight
        code was not setting the lastitemlength variable.

2007-12-05  Mark Rowe  <mrowe@apple.com>

        Qt Windows build fix.  Include the time-related headers in the correct place.

        * kjs/JSGlobalObject.cpp:
        * kjs/interpreter.cpp:

2007-12-05  Darin Adler  <darin@apple.com>

        Not reviewed; just undoing a previous commit.

        - remove earlier incorrect fix for http://bugs.webkit.org/show_bug.cgi?id=16220
          <rdar://problem/5625221> Crash opening www.news.com (CNet)

        The real bug was the backwards ?: in the compile function, which Geoff just
        fixed. Rolling out the incorrect earlier fix.

        * pcre/pcre_compile.cpp: (calculateCompiledPatternLengthAndFlags): Take out
        the unneeded preflight change. The regression test proves this is still working
        fine, so the bug remains fixed.

2007-12-01  Mark Rowe  <mrowe@apple.com>

        Build fix.  Include headers before trying to use the things that they declare.

        * kjs/JSImmediate.cpp:
        * kjs/nodes.cpp:
        * kjs/object.cpp:
        * kjs/object_object.cpp:
        * kjs/regexp_object.cpp:
        * kjs/string_object.cpp:

2007-12-05  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added some #includes.

        * kjs/JSImmediate.cpp:

2007-12-05  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added some #includes.

        * kjs/JSGlobalObject.cpp:
        * kjs/JSImmediate.cpp:

2007-12-05  Geoffrey Garen  <ggaren@apple.com>

        Build fix: Fixed #include spelling.

        * kjs/debugger.cpp:

2007-12-05  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added #include.

        * kjs/debugger.cpp:

2007-12-05  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added a forward declaration.

        * kjs/debugger.h:

2007-12-05  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added an #include.

        * kjs/error_object.cpp:

2007-12-05  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added an #include.

        * kjs/bool_object.cpp:

2007-12-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.

        Third step in refactoring JSGlobalObject: Moved data members and 
        functions accessing data members from Interpreter to JSGlobalObject.
        Changed Interpreter member functions to static functions.
        
        This resolves a bug in global object bootstrapping, where the global
        ExecState could be used when uninitialized.
        
        This is a big change, but it's mostly code motion and renaming.
        
        Layout and JS tests, and testjsglue and testapi, pass. SunSpider reports
        a .7% regression, but Shark sees no difference related to this patch,
        and SunSpider reported a .7% speedup from an earlier step in this 
        refactoring, so I think it's fair to call that a wash.

2007-12-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler. (Or vice versa.)
        
        Fixed ASSERT during run-javascriptcore-tests. (Darin just added the
        ASSERT, but the bug wasn't new.)

        * pcre/pcre_compile.cpp:
        (compile_branch): The ?: operator here was backwards, causing us to
        execute the loop too many times, adding stray KET opcodes to the
        compiled regular expression.

2007-12-05  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geoff.

        - Wait until local variable data is fully constructed before notifying the debugger of entering
        or leaving a call frame.

        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        * kjs/nodes.cpp:
        (KJS::FunctionBodyNode::execute):

2007-12-05  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver.

        Build fix for GCC 4.2. Cast via a union to avoid strict-aliasing issues.

        * wtf/FastMalloc.cpp:
        (WTF::):
        (WTF::getPageHeap):

2007-12-05  Mark Rowe  <mrowe@apple.com>

        Reviewed by Darin.

        Fix testkjs in 64-bit.

        When built for 64-bit the TCMalloc spin lock uses pthread mutexes rather than a custom spin lock
        implemented in assembly.  If we fail to initialize the pthread mutex, attempts to lock or unlock
        it will fail and trigger a call to abort.

        * wtf/FastMalloc.cpp: Initialize the spin lock so that we can later lock and unlock it.
        * wtf/TCSpinLock.h: Add an Init method to the optimised spin lock.

2007-12-04  Oliver Hunt  <oliver@apple.com>

        Fix gtk build.

        * wtf/TCSystemAlloc.cpp:

2007-12-03  Oliver Hunt  <oliver@apple.com>

        Reviewed by Mark Rowe and Geoff Garen.

        Merge TCMalloc r38

        It also result in a performance progression between 0.5% and 
        0.9% depending on the test, however most if not all of this 
        gain will be consumed by the overhead involved in the later
        change to release memory to the system.

        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * wtf/FastMalloc.cpp:
        (WTF::KernelSupportsTLS):
        (WTF::CheckIfKernelSupportsTLS):
        (WTF::):
        (WTF::ClassIndex):
        (WTF::SLL_Next):
        (WTF::SLL_SetNext):
        (WTF::SLL_Push):
        (WTF::SLL_Pop):
        (WTF::SLL_PopRange):
        (WTF::SLL_PushRange):
        (WTF::SLL_Size):
        (WTF::SizeClass):
        (WTF::ByteSizeForClass):
        (WTF::NumMoveSize):
        (WTF::InitSizeClasses):
        (WTF::AllocationSize):
        (WTF::TCMalloc_PageHeap::GetSizeClassIfCached):
        (WTF::TCMalloc_PageHeap::CacheSizeClass):
        (WTF::TCMalloc_PageHeap::init):
        (WTF::TCMalloc_PageHeap::New):
        (WTF::TCMalloc_PageHeap::AllocLarge):
        (WTF::TCMalloc_PageHeap::Carve):
        (WTF::TCMalloc_PageHeap::Delete):
        (WTF::TCMalloc_PageHeap::IncrementalScavenge):
        (WTF::PagesToMB):
        (WTF::TCMalloc_PageHeap::Dump):
        (WTF::TCMalloc_PageHeap::GrowHeap):
        (WTF::TCMalloc_PageHeap::Check):
        (WTF::ReleaseFreeList):
        (WTF::TCMalloc_PageHeap::ReleaseFreePages):
        (WTF::TCMalloc_ThreadCache_FreeList::Push):
        (WTF::TCMalloc_ThreadCache_FreeList::PushRange):
        (WTF::TCMalloc_ThreadCache_FreeList::PopRange):
        (WTF::TCMalloc_ThreadCache_FreeList::Pop):
        (WTF::TCMalloc_Central_FreeList::length):
        (WTF::TCMalloc_Central_FreeList::tc_length):
        (WTF::TCMalloc_Central_FreeList::Init):
        (WTF::TCMalloc_Central_FreeList::ReleaseListToSpans):
        (WTF::TCMalloc_Central_FreeList::EvictRandomSizeClass):
        (WTF::TCMalloc_Central_FreeList::MakeCacheSpace):
        (WTF::TCMalloc_Central_FreeList::ShrinkCache):
        (WTF::TCMalloc_Central_FreeList::InsertRange):
        (WTF::TCMalloc_Central_FreeList::RemoveRange):
        (WTF::TCMalloc_Central_FreeList::FetchFromSpansSafe):
        (WTF::TCMalloc_Central_FreeList::Populate):
        (WTF::TCMalloc_ThreadCache::Init):
        (WTF::TCMalloc_ThreadCache::Cleanup):
        (WTF::TCMalloc_ThreadCache::Allocate):
        (WTF::TCMalloc_ThreadCache::Deallocate):
        (WTF::TCMalloc_ThreadCache::FetchFromCentralCache):
        (WTF::TCMalloc_ThreadCache::ReleaseToCentralCache):
        (WTF::TCMalloc_ThreadCache::Scavenge):
        (WTF::TCMalloc_ThreadCache::PickNextSample):
        (WTF::TCMalloc_ThreadCache::NewHeap):
        (WTF::TCMalloc_ThreadCache::GetThreadHeap):
        (WTF::TCMalloc_ThreadCache::GetCache):
        (WTF::TCMalloc_ThreadCache::GetCacheIfPresent):
        (WTF::TCMalloc_ThreadCache::InitTSD):
        (WTF::TCMalloc_ThreadCache::CreateCacheIfNecessary):
        (WTF::TCMallocStats::ExtractStats):
        (WTF::TCMallocStats::DumpStats):
        (WTF::TCMallocStats::DumpStackTraces):
        (WTF::TCMallocStats::TCMallocImplementation::MarkThreadIdle):
        (WTF::TCMallocStats::TCMallocImplementation::ReleaseFreeMemory):
        (WTF::TCMallocStats::TCMallocGuard::TCMallocGuard):
        (WTF::TCMallocStats::TCMallocGuard::~TCMallocGuard):
        (WTF::TCMallocStats::DoSampledAllocation):
        (WTF::TCMallocStats::CheckCachedSizeClass):
        (WTF::TCMallocStats::CheckedMallocResult):
        (WTF::TCMallocStats::SpanToMallocResult):
        (WTF::TCMallocStats::do_malloc):
        (WTF::TCMallocStats::do_free):
        (WTF::TCMallocStats::do_memalign):
        (WTF::TCMallocStats::do_malloc_stats):
        (WTF::TCMallocStats::do_mallopt):
        (WTF::TCMallocStats::do_mallinfo):
        (WTF::TCMallocStats::realloc):
        (WTF::TCMallocStats::cpp_alloc):
        (WTF::TCMallocStats::operator new):
        (WTF::TCMallocStats::):
        (WTF::TCMallocStats::operator new[]):
        (WTF::TCMallocStats::malloc_stats):
        (WTF::TCMallocStats::mallopt):
        (WTF::TCMallocStats::mallinfo):
        * wtf/TCPackedCache.h: Added.
        (PackedCache::PackedCache):
        (PackedCache::Put):
        (PackedCache::Has):
        (PackedCache::GetOrDefault):
        (PackedCache::Clear):
        (PackedCache::EntryToValue):
        (PackedCache::EntryToUpper):
        (PackedCache::KeyToUpper):
        (PackedCache::UpperToPartialKey):
        (PackedCache::Hash):
        (PackedCache::KeyMatch):
        * wtf/TCPageMap.h:
        (TCMalloc_PageMap2::PreallocateMoreMemory):
        * wtf/TCSystemAlloc.cpp:
        (TCMalloc_SystemRelease):
        * wtf/TCSystemAlloc.h:

2007-12-04  Anders Carlsson  <andersca@apple.com>

        Reviewed by Sam.

        Make isSafeScript const.
        
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::isSafeScript):

2007-12-04  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix first part of http://bugs.webkit.org/show_bug.cgi?id=16220
          <rdar://problem/5625221> Crash opening www.news.com (CNet)

        Test: fast/js/regexp-overflow.html

        * pcre/pcre_compile.cpp:
        (calculateCompiledPatternLengthAndFlags): Add room for the additional BRA/KET that
        was generated in the compile code but not taken into account here.

2007-12-03  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix http://bugs.webkit.org/show_bug.cgi?id=15618
          <rdar://problem/5619353> REGRESSION: Stack overflow/crash in KJS::equal (15618)

        Test: fast/js/recursion-limit-equal.html

        * kjs/operations.cpp: (KJS::equal): Check the exception from toPrimitive.

2007-12-03  Dan Bernstein  <mitz@apple.com>

        - fix a copy-and-paste-o

        * bindings/npruntime.cpp:
        (_NPN_GetIntIdentifier):

2007-12-03  Dan Bernstein  <mitz@apple.com>

        Reviewed by Darin Adler.

        - fix an ASSERT when getIntIdentifier is called with 0 or -1

        * bindings/npruntime.cpp:
        (_NPN_GetIntIdentifier): We cannot use the hashmap for 0 and -1 since
        they are the empty value and the deleted value. Instead, keep the
        identifiers for those two integers in a static array.

2007-12-02  Darin Adler  <darin@apple.com>

        Reviewed by Mitz.

        - fix http://bugs.webkit.org/show_bug.cgi?id=15848
          <rdar://problem/5619330> REGRESSION: Assertion failure viewing comments page on digg.com

        Test: fast/js/sparse-array.html

        * kjs/array_instance.cpp:
        (KJS::ArrayInstance::inlineGetOwnPropertySlot): Check sparse array cutoff before looking
        in hash map. Can't avoid the branch because we can't look for 0 in the hash.
        (KJS::ArrayInstance::deleteProperty): Ditto.

2007-12-02  Geoffrey Garen  <ggaren@apple.com>

        Build fix: added an #include.

        * kjs/collector.cpp:

2007-12-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Eric Seidel.

        Second step in refactoring JSGlobalObject: moved virtual functions from
        Interpreter to JSGlobalObject.
        
        Layout and JS tests pass. SunSpider reports a .7% speedup -- don't 
        believe his lies.

2007-12-01  Alp Toker  <alp@atoker.com>

        Reviewed by Adam Roben.

        http://bugs.webkit.org/show_bug.cgi?id=16228
        kJSClassDefinitionEmpty is not exported with JS_EXPORT

        Add JS_EXPORT to kJSClassDefinitionEmpty.

        Make the gcc compiler check take precedence over the WIN32||_WIN32
        check to ensure that symbols are exported on Windows when using gcc.

        Add a TODO referencing the bug about JS_EXPORT in the Win build
        (http://bugs.webkit.org/show_bug.cgi?id=16227)

        Don't define JS_EXPORT as 'extern' when the compiler is unknown since
        it would result in the incorrect expansion:

          extern extern const JSClassDefinition kJSClassDefinitionEmpty;

        (This was something we inherited from CFBase.h that doesn't make sense
        for JSBase.h)

        * API/JSBase.h:
        * API/JSObjectRef.h:

2007-11-30  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth Dakin.
        
        Reversed the ownership relationship between Interpreter and JSGlobalObject.
        Now, the JSGlobalObject owns the Interpreter, and top-level objects
        that need the two to persist just protect the JSGlobalObject from GC.
        
        Global object bootstrapping looks a little odd right now, but it will
        make much more sense soon, after further rounds of refactoring.

        * bindings/runtime_root.h: Made this class inherit from RefCounted,
        to avoid code duplication.

        * kjs/collector.cpp:
        (KJS::Collector::collect): No need to give special GC treatment to 
        Interpreters, since we mark their global objects, which mark them.

        * kjs/interpreter.cpp:
        (KJS::Interpreter::mark): No need to mark our global object, since it
        marks us.
        * kjs/interpreter.h: Don't inherit from RefCounted -- JSGlobalObject 
        owns us directly.

        * kjs/testkjs.cpp: Modified to follow the new rules.
        (createGlobalObject):
        (runWithScripts):

2007-11-30  Brent Fulgham  <bfulgham@gmail.com>

        Reviewed by Eric.

        * ChangeLog:
        * pcre/pcre_compile.cpp:
        (compile_branch):

2007-11-30  Eric Seidel  <eric@webkit.org>

        No review, build fix only.
        
        Fix uninitialized var warnings in release build.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * pcre/pcre_compile.cpp:
        (compile_regex):

2007-11-30  Darin Adler  <darin@apple.com>

        Reviewed by Adam Roben.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16207
          JavaScript regular expressions should match UTF-16 code units rather than characters

        SunSpider says this is 5.5% faster on the regexp test, 0.4% faste overall.

        Test: fast/js/regexp-non-bmp.html

        Renamed ANY_CHAR to NOT_NEWLINE to more-accurately reflect its meaning.

        * pcre/pcre_compile.cpp:
        (compile_branch): Removed calls to the UTF-16 character accessor functions, replacing
        them with simple pointer dereferences in some cases, and no code at all in others.
        (calculateCompiledPatternLengthAndFlags): Ditto.

        * pcre/pcre_exec.cpp:
        (match): Fixed indentation of some case labels (including all the BEGIN_OPCODE).
        Removed calls to the UTF-16 character accessor functions, replacing them with simple
        pointer dereferences in some cases, and no code at all in others. Also removed some
        explicit UTF-16 support code in a few cases. Removed the unneeded "UTF-8" code path
        in the ANY_CHAR repeat code, and in another case, eliminated the code to check against
        end_subject in because it is already done outside the loop.
        (jsRegExpExecute):

        * pcre/pcre_internal.h: Removed all the UTF-16 helper functions.

2007-11-30  Eric Seidel  <eric@webkit.org>

        Reviewed by darin.
        
        PCRE crashes under GuardMalloc
        http://bugs.webkit.org/show_bug.cgi?id=16127
        check against patternEnd to make sure we don't walk off the end of the string

        * pcre/pcre_compile.cpp:
        (compile_branch):
        (calculateCompiledPatternLengthAndFlags):

2007-11-30  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.
        
        Fix layout test regressions caused by r28186
        http://bugs.webkit.org/show_bug.cgi?id=16195
        change first_byte and req_byte back to shorts instead of chars
        (I think PCRE stuffs information in the high bits) 

        * pcre/pcre_internal.h:

2007-11-29  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej and Darin.

        Make the JS collector work with multiple threads 

        Under heavy contention it was possible the GC to suspend other
        threads inside the pthread spinlock, which could lead to the GC
        thread blocking on the pthread spinlock itself.

        We now determine and store each thread's stack base when it is
        registered, thus removing the need for any calls to pthread_get_stackaddr_np
        that needed the pthread spinlock.

        * kjs/collector.cpp:
        (KJS::Collector::Thread::Thread):
        (KJS::Collector::registerThread):
        (KJS::Collector::markOtherThreadConservatively):

2007-11-29  Adam Roben  <aroben@apple.com>

        Windows build fix

        Removed some unreachable code (ironically, the code was some
        ASSERT_NOT_REACHED()s).

        * pcre/pcre_compile.cpp:
        (compile_branch):
        * pcre/pcre_exec.cpp:
        (match):

2007-11-29  Eric Seidel  <eric@webkit.org>

        Reviewed by Mark Rowe.
        
        Fix for --guard crash of fast/js/regexp-charclass-crash introduced by r28151.

        * pcre/pcre_compile.cpp:
        (is_anchored):

2007-11-28  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.  Rubber-stamped by Eric.

        * pcre/pcre_exec.cpp:
        (match): Add braces around the body of the case statement to prevent
        wanings about jumps across the initialization of a variable.

2007-11-29  Eric Seidel  <eric@webkit.org>

        Reviewed by Mark Rowe.
        
        Attempt to fix non-mac builds after PCRE cleanup.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCoreSources.bkl:
        * pcre/pcre.pri:

2007-11-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Centralize code for subjectPtr adjustments using inlines, only ever check for a single
        trailing surrogate (as UTF16 only allows one), possibly fix PCRE bugs involving char
        classes and garbled UTF16 strings.

        * pcre/pcre_exec.cpp:
        (match):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:
        (getPreviousChar):
        (movePtrToPreviousChar):
        (movePtrToNextChar):
        (movePtrToStartOfCurrentChar):

2007-11-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        change getChar* functions to return result and push 'c' into local scopes for clarity

        * pcre/pcre_compile.cpp:
        (compile_branch):
        (calculateCompiledPatternLengthAndFlags):
        * pcre/pcre_exec.cpp:
        (match):
        * pcre/pcre_internal.h:
        (getChar):
        (getCharAndAdvance):
        (getCharAndLength):
        (getCharAndAdvanceIfSurrogate):

2007-11-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Comment cleanup

        * pcre/pcre_exec.cpp:
        (match):

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Further cleanups to calculateCompiledPatternLengthAndFlags

        * pcre/pcre_compile.cpp:
        (calculateCompiledPatternLengthAndFlags):
        * pcre/pcre_internal.h:

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Give consistent naming to the RegExp options/compile flags

        * pcre/pcre_compile.cpp:
        (compile_branch):
        (is_anchored):
        (find_firstassertedchar):
        (printCompiledRegExp):
        (jsRegExpCompile):
        * pcre/pcre_exec.cpp:
        (jsRegExpExecute):
        * pcre/pcre_internal.h:

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Pull first_byte and req_byte optimizations out into separate static funtions, SunSpider reported this as a win.

        * pcre/pcre_exec.cpp:
        (tryFirstByteOptimization):
        (tryRequiredByteOptimization):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        give PCRE_MULTILINE a better name: OptionMatchAcrossMultipleLines

        * pcre/pcre_compile.cpp:
        (compile_branch):
        (is_anchored):
        (printCompiledRegExp):
        (jsRegExpCompile):
        * pcre/pcre_exec.cpp:
        (jsRegExpExecute):
        * pcre/pcre_internal.h:

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Oliver.

        Deprecate jsRegExpExecute's offset-vector fallback code

        * pcre/pcre_exec.cpp:
        (jsRegExpExecute):

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Make cur_is_word and prev_is_word locals, and change OP_ANY to OP_ANY_CHAR for clarity

        * pcre/pcre_compile.cpp:
        (find_fixedlength):
        (compile_branch):
        (canApplyFirstCharOptimization):
        * pcre/pcre_exec.cpp:
        (match):
        * pcre/pcre_internal.h:

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Mitz & Maciej.

        Change _NC operators to use _IGNORING_CASE for clarity

        * pcre/pcre_compile.cpp:
        (find_fixedlength):
        (compile_branch):
        (find_firstassertedchar):
        * pcre/pcre_exec.cpp:
        (match):
        * pcre/pcre_internal.h:

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Mitz.

        Remove branch from return

        * pcre/pcre_compile.cpp:
        (compile_branch):
        * pcre/pcre_exec.cpp:
        (match):

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Add repeatInformationFromInstructionOffset inline

        * pcre/pcre_exec.cpp:
        (repeatInformationFromInstructionOffset):
        (match):

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Remove no longer used error code JSRegExpErrorMatchLimit

        * kjs/regexp.cpp:
        (KJS::RegExp::match):
        * pcre/pcre.h:
        * pcre/pcre_internal.h:

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Make i locally scoped for better code clarity

        * pcre/pcre_exec.cpp:
        (match):

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Give subjectPtr and instructionPtr sane names, reduce size of MatchFrame for a 0.2% speedup.

        * pcre/pcre_compile.cpp:
        (compile_branch):
        (calculateCompiledPatternLengthAndFlags):
        * pcre/pcre_exec.cpp:
        (match_ref):
        (MatchStack::pushNewFrame):
        (getUTF8CharAndIncrementLength):
        (match):
        * pcre/pcre_internal.h:
        (getChar):
        (getCharAndAdvance):
        (getCharAndLength):
        (getCharAndAdvanceIfSurrogate):
        * pcre/pcre_xclass.cpp:
        (getUTF8CharAndAdvancePointer):

2007-11-26  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Small speedup (0.7%) by simplifying canUseStackBufferForNextFrame() check

        * pcre/pcre_exec.cpp:
        (MatchStack::MatchStack):
        (MatchStack::popCurrentFrame):

2007-11-25  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Lower MATCH_LIMIT_RECURSION to more sane levels to prevent hangs on run-javascriptcore-tests

        * pcre/pcre_internal.h:

2007-11-25  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Remove match_is_group variable for another 5% speedup

        * pcre/pcre_compile.cpp:
        * pcre/pcre_exec.cpp:
        (startNewGroup):
        (match):

2007-11-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Abstract frame variables into locals and args

        * pcre/pcre_compile.cpp:
        (compile_branch):
        * pcre/pcre_exec.cpp:
        (match):
        * pcre/pcre_internal.h:

2007-11-28  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Section off MatchData arguments into args struct

        * pcre/pcre_exec.cpp:
        (MatchStack::pushNewFrame):
        (match):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Remove redundant eptrblock struct

        * pcre/pcre_exec.cpp:
        (MatchStack::pushNewFrame):
        (match):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Remove redundant match_call_count and move recursion check out of super-hot code path
        SunSpider says this is at least an 8% speedup for regexp.

        * pcre/pcre_exec.cpp:
        (MatchStack::MatchStack):
        (MatchStack::pushNewFrame):
        (MatchStack::popCurrentFrame):
        (MatchStack::popAllFrames):
        (match):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Get rid of GETCHAR* macros, replacing them with better named inlines

        * pcre/pcre_compile.cpp:
        (compile_branch):
        (calculateCompiledPatternLengthAndFlags):
        * pcre/pcre_exec.cpp:
        (match):
        * pcre/pcre_internal.h:
        (getCharAndAdvance):
        (getCharAndLength):
        (getCharAndAdvanceIfSurrogate):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Further cleanup GET/PUT inlines

        * pcre/pcre_internal.h:
        (putOpcodeValueAtOffset):
        (getOpcodeValueAtOffset):
        (putOpcodeValueAtOffsetAndAdvance):
        (put2ByteOpcodeValueAtOffset):
        (get2ByteOpcodeValueAtOffset):
        (put2ByteOpcodeValueAtOffsetAndAdvance):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Give GET, PUT better names, and add (poor) moveOpcodePtrPastAnyAlternateBranches

        * pcre/pcre_compile.cpp:
        (firstSignificantOpCodeSkippingAssertions):
        (find_fixedlength):
        (complete_callout):
        (compile_branch):
        (compile_regex):
        (is_anchored):
        (canApplyFirstCharOptimization):
        (find_firstassertedchar):
        * pcre/pcre_exec.cpp:
        (match):
        * pcre/pcre_internal.h:
        (putOpcodeValueAtOffset):
        (getOpcodeValueAtOffset):
        (putOpcodeValueAtOffsetAndAdvance):
        (put2ByteOpcodeValueAtOffset):
        (get2ByteOpcodeValueAtOffset):
        (moveOpcodePtrPastAnyAlternateBranches):
        * pcre/pcre_ucp_searchfuncs.cpp:
        (_pcre_ucp_othercase):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Add inlines for toLowerCase, isWordChar, isSpaceChar for further regexp speedup

        * pcre/pcre_compile.cpp:
        (compile_branch):
        (jsRegExpCompile):
        * pcre/pcre_exec.cpp:
        (match):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:
        (toLowerCase):
        (flipCase):
        (classBitmapForChar):
        (charTypeForChar):
        (isWordChar):
        (isSpaceChar):
        (CompileData::CompileData):
        * pcre/pcre_xclass.cpp:
        (_pcre_xclass):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        cleanup _pcre_ucp_othercase

        * pcre/pcre_ucp_searchfuncs.cpp:
        (_pcre_ucp_othercase):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Use better variable names for case ignoring options

        * pcre/pcre_compile.cpp:
        (compile_branch):
        (find_firstassertedchar):
        (printCompiledRegExp):
        (jsRegExpCompile):
        * pcre/pcre_exec.cpp:
        (match_ref):
        (match):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        split first_significant_code into two simpler functions

        * pcre/pcre_compile.cpp:
        (firstSignificantOpCode):
        (firstSignificantOpCodeSkippingAssertions):
        (is_anchored):
        (canApplyFirstCharOptimization):
        (find_firstassertedchar):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        clean up is_counted_repeat

        * pcre/pcre_compile.cpp:
        (is_counted_repeat):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        clean up check_escape

        * pcre/pcre_compile.cpp:
        (check_escape):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Reformat find_fixedlength

        * pcre/pcre_compile.cpp:
        (find_fixedlength):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        reformat is_anchored

        * pcre/pcre_compile.cpp:
        (is_anchored):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Remove unused function could_be_empty_branch

        * pcre/pcre_compile.cpp:
        (first_significant_code):
        (find_fixedlength):
        (compile_branch):
        (canApplyFirstCharOptimization):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Pass around MatchData objects by reference

        * pcre/pcre_exec.cpp:
        (pchars):
        (match_ref):
        (match):
        (jsRegExpExecute):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        give PCRE_STARTLINE a better name and rename match_data to MatchData

        * pcre/pcre_compile.cpp:
        (compile_branch):
        (canApplyFirstCharOptimization):
        (find_firstassertedchar):
        (printCompiledRegExp):
        (jsRegExpCompile):
        * pcre/pcre_exec.cpp:
        (pchars):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Clean up find_firstassertedchar

        * pcre/pcre_compile.cpp:
        (get_othercase_range):
        (find_firstassertedchar):
        (calculateCompiledPatternLengthAndFlags):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Tim Hatcher.

        Pass around CompileData& instead of CompileData*

        * pcre/pcre_compile.cpp:
        (compile_branch):
        (jsRegExpCompile):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Clean up compile_branch, move _pcre_ord2utf8, and rename CompileData

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * pcre/pcre_compile.cpp:
        (_pcre_ord2utf8):
        (calculateCompiledPatternLengthAndFlags):
        (jsRegExpCompile):
        * pcre/pcre_internal.h:
        * pcre/pcre_ord2utf8.cpp: Removed.

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        removing more macros

        * pcre/pcre_compile.cpp:
        (could_be_empty_branch):
        (compile_branch):
        (calculateCompiledPatternLengthAndFlags):
        * pcre/pcre_exec.cpp:
        (match):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:
        * pcre/pcre_xclass.cpp:

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        clean up formating in compile_branch

        * pcre/pcre_compile.cpp:
        (compile_branch):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Fix spacing for read_repeat_counts

        * pcre/pcre_compile.cpp:
        (read_repeat_counts):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Get rid of PCRE custom char types

        * pcre/pcre_compile.cpp:
        (check_escape):
        (complete_callout):
        (compile_branch):
        (compile_regex):
        (calculateCompiledPatternLengthAndFlags):
        (jsRegExpCompile):
        * pcre/pcre_exec.cpp:
        (match_ref):
        (match):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        reformat get_othercase_range

        * pcre/pcre_compile.cpp:
        (get_othercase_range):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Remove register keyword and more cleanup

        * pcre/pcre_compile.cpp:
        (find_fixedlength):
        (compile_branch):
        (is_anchored):
        (is_startline):
        (find_firstassertedchar):
        (calculateCompiledPatternLengthAndFlags):
        (jsRegExpCompile):
        * pcre/pcre_exec.cpp:
        (MatchStack::canUseStackBufferForNextFrame):
        (MatchStack::allocateNextFrame):
        (MatchStack::pushNewFrame):
        (MatchStack::frameIsStackAllocated):
        (MatchStack::popCurrentFrame):
        (MatchStack::unrollAnyHeapAllocatedFrames):
        (getUTF8CharAndIncrementLength):
        (match):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:
        (PUT2INC):
        (isLeadingSurrogate):
        (isTrailingSurrogate):
        (decodeSurrogatePair):
        (getChar):
        * pcre/pcre_ord2utf8.cpp:
        (_pcre_ord2utf8):
        * pcre/pcre_xclass.cpp:
        (getUTF8CharAndAdvancePointer):
        (_pcre_xclass):

2007-11-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Clean up jsRegExpExecute

        * pcre/pcre_compile.cpp:
        (returnError):
        (jsRegExpCompile):
        * pcre/pcre_exec.cpp:
        (jsRegExpExecute):
        * pcre/pcre_internal.h:

2007-11-29  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Merging updated system alloc and spinlock code from r38 of TCMalloc.

        This is needed as a precursor to the merge of TCMalloc proper.

        * wtf/FastMalloc.cpp:
        (WTF::TCMalloc_PageHeap::GrowHeap):
        * wtf/TCSpinLock.h:
        (TCMalloc_SpinLock::TCMalloc_SpinLock):
        (TCMalloc_SpinLock::):
        (TCMalloc_SpinLock::Lock):
        (TCMalloc_SpinLock::Unlock):
        (TCMalloc_SpinLock::IsHeld):
        * wtf/TCSystemAlloc.cpp:
        (TrySbrk):
        (TryMmap):
        (TryVirtualAlloc):
        (TryDevMem):
        (TCMalloc_SystemAlloc):
        * wtf/TCSystemAlloc.h:

2007-11-28  Brady Eidson <beidson@apple.com>

        Reviewed by Geoff

        Add copyKeysToVector utility, mirroring copyValuesToVector
        Also change the copyValuesToVector implementation to be a little more attractive

        * wtf/HashMap.h:
        (WTF::copyKeysToVector):
        (WTF::copyValuesToVector):

2007-11-27  Alp Toker  <alp@atoker.com>

        Reviewed by Mark Rowe.

        Add a list of public JavaScriptCore headers for installation.

        This follows the convention used for the Qt and GTK+ header lists.

        * headers.pri: Added.

2007-11-27  Alp Toker  <alp@atoker.com>

        Prospective MSVC build fix.

        Roll back dllexport/dllimport support for now.

        * API/JSBase.h:

2007-11-27  Alp Toker  <alp@atoker.com>

        Reviewed by Maciej.

        http://bugs.webkit.org/show_bug.cgi?id=15569
        [gtk] GTK JavaScriptCore needs to export symbols for JSC API and WTF

        Introduce JS_EXPORT to mark symbols to be exported as public API.

        Export all public symbols in the JavaScriptCore C API.

        This matches conventions for exporting symbols set by the CF and CG
        frameworks.

        * API/JSBase.h:
        * API/JSContextRef.h:
        * API/JSObjectRef.h:
        * API/JSStringRef.h:
        * API/JSStringRefBSTR.h:
        * API/JSStringRefCF.h:
        * API/JSValueRef.h:

2007-11-27  Anders Carlsson  <andersca@apple.com>

        Reviewed by Adam.

        Make PropertyNameArray and ScopeChain COMEnumVariant friendly.
        
        * kjs/PropertyNameArray.cpp:
        (KJS::PropertyNameArray::swap):
        Implement PropertyNameArray::swap.
        
        * kjs/PropertyNameArray.h:
        Add ValueType typedef. Replace PropertyNameArrayIterator with 
        PropertyNameArray::const_iterator.
        
        * kjs/nodes.cpp:
        (KJS::ForInNode::execute):
        * kjs/scope_chain.cpp:
        (KJS::ScopeChain::print):
        Update for changes to PropertyNameArray.
        
        * kjs/scope_chain.h:
        Add const_iterator and ValueType typedef.
        
2007-11-27  Anders Carlsson  <andersca@apple.com>

        Reviewed by Darin.

        Add a ValueType typedef.
        
        * wtf/Vector.h:

2007-11-26  Darin Adler  <darin@apple.com>

        Reviewed by Mitz.

        - fix http://bugs.webkit.org/show_bug.cgi?id=16096
          REGRESSION (r26653-r26699): Plaxo.com addressbook does not load in webkit nightlies

        Test: fast/js/regexp-overflow.html

        * pcre/pcre_compile.cpp: (calculateCompiledPatternLengthAndFlags):
        Removed a stray "ptr++" that I added by accident when merging the
        changes between PCRE 6.4 and 6.5. 

2007-11-26  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Kevin McCullough.
        
        Fixed <rdar://problem/5597937> REGRESSION (r27126): Drosera does not 
        show variables (can't enumerate ActivationImp properties)
        
        Implemented a custom ActivationImp::getPropertyNames, since 
        ActivationImp now uses a custom property storage mechanism for local
        variables.

        * kjs/function.cpp:
        (KJS::ActivationImp::getPropertyNames):
        * kjs/function.h:

2007-11-26  Alp Toker  <alp@atoker.com>

        GTK+/Qt/Wx build fix for breakage introduced in r28039.

        * ForwardingHeaders/JavaScriptCore/JSRetainPtr.h: Added.

2007-11-24  Laszlo Gombos  <laszlo.gombos@gmail.com>

        Reviewed by Maciej Stachowiak.

        Fix minor compiler warning (GCC 4.1.3)

        * pcre/pcre_internal.h:
        * pcre/pcre_ucp_searchfuncs.cpp:
        (_pcre_ucp_othercase):

2007-11-25  Mark Rowe  <mrowe@apple.com>

        Reviewed by Dan Bernstein.

        Fix http://bugs.webkit.org/show_bug.cgi?id=16129
        Bug 16129: REGRESSION (r27761-r27811): malloc error while visiting http://mysit.es (crashes release build)

        * pcre/pcre_compile.cpp: Change errorcode to be passed by reference so that any error code is propagated
        to our caller like they expect.

2007-11-23  Kevin Ollivier  <kevino@theolliviers.com>

        MSVC7 build fix. (rand_s doesn't exist there)

        Reviewed by Adam Roben.

        * kjs/config.h:
        * wtf/MathExtras.h:

2007-11-23  Kevin Ollivier  <kevino@theolliviers.com>

        wx build fix. Move WX_PYTHON logic into project build settings,
        add WebKitLibraries dirs on Win, and explicitly include JSCore 
        headers in testkjs rather than getting them from a template.
        (Include dir order of JSCore/WTF and ICU headers is important due  
        to wtf/unicode/utf8.h.)

        * jscore.bkl:

2007-11-23  Simon Hausmann  <hausmann@webkit.org>

        Reviewed by George Staikos <staikos@kde.org>.

        Fix make (dist)clean on Windows.
        
        OBJECTS_DIR_WTR does not exist anymore, use GENERATED_SOURCES_DIR.
        

        * JavaScriptCore.pri:
        * pcre/pcre.pri:

2007-11-22  Simon Hausmann  <hausmann@kde.org>

        Reviewed by George.

        Make the directory of where to put the generated sources configurable through the GENERATED_SOURCE_DIR variable

        * JavaScriptCore.pri:
        * pcre/pcre.pri:

2007-11-22  Simon Hausmann  <hausmann@kde.org>

        Reviewed by George.

        Centralize the setup for all the extra compilers in a addExtraCompiler function.
        
        This allows adding a "generated_files" target that builds all generated files using "make generated_files".
        For the build inside Qt we do not generate actual rules for the extra compilers but instead
        do the variable substitution of compiler.output manually and add the generated sources to SOURCES.

        * JavaScriptCore.pri:
        * pcre/pcre.pri:

2007-11-20  Mark Rowe  <mrowe@apple.com>

        Reviewed by Tim Hatcher.

        <rdar://problem/5602936> Need to resolve new GCC 4.2 warnings

        Fix all warnings emitted by GCC 4.2 when building JavaScriptCore.  This allows builds with
        -Werror to succeed.  At present they will crash when executed due to code that is not safe
        under strict aliasing (<rdar://problem/5536806>).

        * Configurations/Base.xcconfig: Remove the -Wno-long-double flag.
        * kjs/date_object.cpp:
        (KJS::formatTime): Test whether the stack-allocated string is empty rather than at a non-null address.
        * kjs/dtoa.cpp:
        (Bigint::): Tweak formatting to silence warnings.
        * pcre/pcre_exec.cpp:
        (match): Tweak formatting to silence warnings
        * wtf/Assertions.cpp: Add printf format attribute to functions that warrant it.
        * wtf/Assertions.h: Ditto.

2007-11-19  Kevin Ollivier  <kevino@theolliviers.com>

        wx port build fix (wx headers include ctype functions).

        * kjs/config.h:

2007-11-19  Kevin Ollivier  <kevino@theolliviers.com>

        Remove outdated and unused Windows port files.

        Reviewed by Adam Roben.

        * Makefile.vc: Removed.
        * README-Win32.txt: Removed.

2007-11-18  Eric Seidel  <eric@webkit.org>

        Reviewed by Oliver.

        * tests/mozilla/jsDriver.pl: exit non-0 when user aborts test run

2007-11-17  Mark Rowe  <mrowe@apple.com>

        Reviewed by Darin Adler.

        Fix: <rdar://problem/5607032> REGRESSION: testapi exits with assertion failure in debug build
             <rdar://problem/5440659> JSGlobalContextCreate throws away globalObjectClass's prototype
             http://bugs.webkit.org/show_bug.cgi?id=16033

        Split Interpreter's initialization into two distinct steps:  the creation of the global prototypes
        and constructors, and storing them on the global object.  This allows JSClassRef's passed to
        JSGlobalContextCreate to be instantiated with the correct prototype.

        * API/JSCallbackObject.cpp: Assert at compile-time that the custom global object will fit in a collector cell.
        * API/JSCallbackObject.h:
        * API/JSCallbackObjectFunctions.h:
        (KJS::::JSCallbackObject):
        (KJS::::init):
        * API/JSContextRef.cpp:
        (JSGlobalContextCreate): Construct and set the interpreter's global object separately.  When globalObjectClass
        is passed we need to set the interpreter's global object before doing the JSCallbackObject's initialization to
        prevent any JSObjectInitializeCallback's being invoked before a global object is set.
        * API/testapi.c:
        (globalObject_initialize): Test the object passed in is correct and that it has the expected global properties.
        (globalObject_get):
        (globalObject_set):
        (main):
        * API/testapi.js: Test that any static properties exposed by the global object's custom class are found.
        * JavaScriptCore.exp:
        * bindings/testbindings.cpp:
        (main): Update for changes in Interpreter method signatures.
        * bindings/testbindings.mm:
        (main): Ditto.
        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        (KJS::ExecState::mark):
        (KJS::ExecState::setGlobalObject):
        * kjs/ExecState.h: Rename scope to m_scopeChain.
        * kjs/interpreter.cpp:
        (KJS::Interpreter::Interpreter):
        (KJS::Interpreter::init):
        (KJS::Interpreter::globalObject):
        (KJS::Interpreter::setGlobalObject):
        (KJS::Interpreter::resetGlobalObjectProperties):
        (KJS::Interpreter::createObjectsForGlobalObjectProperties):
        (KJS::Interpreter::setGlobalObjectProperties): Switch to using putDirect to ensure that the global object's put method
        cannot interfere with setting of the global properties.  This prevents a user-written JSClassRef from attempting to
        call back into JavaScript from the initialization of the global object's members.
        * kjs/interpreter.h:
        * kjs/testkjs.cpp:
        (setupInterpreter): Update for changes in Interpreter method signatures.

2007-11-17  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        Prevent testapi from reporting false leaks.  Clear out local variables pointing at
        JSObjectRefs to allow their values to be collected.

        * API/testapi.c:
        (main):

2007-11-17  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

        Prevent testapi from crashing if testapi.js can not be found by nil-checking the result of createStringWithContentsOfFile.

        * API/testapi.c:
        (main):

2007-11-17  Alp Toker  <alp@atoker.com>

        Reviewed by Eric.

        http://bugs.webkit.org/show_bug.cgi?id=16032
        JS minidom is not portable

        Use a plain UTF-8 string instead of a CFString.

        Print to stdout, not stderr like CFShow() would have done, since that
        behaviour seems unintentional.

        * API/minidom.c:
        (main):

2007-11-17  Steve Falkenburg  <sfalken@apple.com>

        Windows build fix.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2007-11-16  Mark Rowe  <mrowe@apple.com>

        Windows build fix.

        * kjs/lexer.cpp:
        (KJS::Lexer::record8):

2007-11-16  Mark Rowe  <mrowe@apple.com>

        Reviewed by Eric.

        Replace strings, identifier, buffer8 and buffer16 members of Lexer with vectors.
        SunSpider claims this is a 0.7% speedup.

        * kjs/lexer.cpp:
        (KJS::Lexer::Lexer):
        (KJS::Lexer::lex):
        (KJS::Lexer::record8):
        (KJS::Lexer::record16):
        (KJS::Lexer::scanRegExp):
        (KJS::Lexer::clear):
        (KJS::Lexer::makeIdentifier):
        (KJS::Lexer::makeUString):
        * kjs/lexer.h:
        * kjs/ustring.cpp:
        (KJS::UString::UString): Add a convenience constructor that takes a const Vector<UChar>&.
        * kjs/ustring.h:

2007-11-16  Adam Roben  <aroben@apple.com>

        Windows build fix

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Add a new include path
        and ignore the int -> bool conversion warning.

2007-11-16  Alexey Proskuryakov  <ap@webkit.org>

        Fix Windows debug build.
        Rubber-stamped by Eric

        * pcre/pcre_exec.cpp: (match): Removed ASSERT_NOT_REACHED assertions that were making MSVC
        complain about unreachable code.

2007-11-15  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * kjs/Parser.cpp:

2007-11-15  Mark Rowe  <mrowe@apple.com>

        Mac build and header search path sanity fix.

        Reviewed by Sam Weinig and Tim Hatcher.

        Move base setting for HEADER_SEARCH_PATHS into Base.xcconfig, and extend
        it in JavaScriptCore.xcconfig.  This removes the need to override it on a
        per-target basis inside the .xcodeproj file.

        * Configurations/Base.xcconfig:
        * Configurations/JavaScriptCore.xcconfig:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-11-15  Mark Rowe  <mrowe@apple.com>

        Qt build fix.

        * kjs/Parser.h:

2007-11-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Eric Seidel.

        Another round of grammar / parsing cleanup.
        
        1. Created distinct parser calls for parsing function bodies vs
        programs. This will help later with optimizing global variable access.
        
        2. Turned Parser into a singleton. Cleaned up Lexer's singleton 
        interface.
        
        3. Modified Lexer to free a little more memory when done lexing. (Added
        FIXMEs for similar issues that I didn't fix.)
        
        4. Changed Lexer::makeIdentifier and Lexer::makeUString to start 
        respecting the arguments passed to them. (No behavior change, but this
        problem could have caused serious problems for an unsuspecting user of
        these functions.)
        
        5. Removed KJS_DEBUG_MEM because it was bit-rotted.
        
        6. Removed Parser::prettyPrint because the same work was simpler to do
        at the call site.
        
        7. Some renames:
        
            "Parser::accept" => "Parser::didFinishParsing"
            "Parser::sid" => "Parser::m_sourceID"
            "Lexer::doneParsing" => "Lexer::clear"
            "sid" => "sourceId"
            "lineno" => "lineNo"
        
        * JavaScriptCore.exp:
        * kjs/Parser.cpp:
        (KJS::Parser::Parser):
        (KJS::Parser::parseProgram):
        (KJS::Parser::parseFunctionBody):
        (KJS::Parser::parse):
        (KJS::Parser::didFinishParsing):
        (KJS::parser):
        * kjs/Parser.h:
        (KJS::Parser::sourceId):
        * kjs/function.cpp:
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/function_object.cpp:
        (FunctionObjectImp::construct):
        * kjs/grammar.y:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::checkSyntax):
        (KJS::Interpreter::evaluate):
        * kjs/interpreter.h:
        * kjs/lexer.cpp:
        (kjsyylex):
        (KJS::lexer):
        (KJS::Lexer::Lexer):
        (KJS::Lexer::~Lexer):
        (KJS::Lexer::scanRegExp):
        (KJS::Lexer::doneParsing):
        (KJS::Lexer::makeIdentifier):
        (KJS::Lexer::makeUString):
        * kjs/lexer.h:
        (KJS::Lexer::pattern):
        (KJS::Lexer::flags):
        (KJS::Lexer::sawError):
        * kjs/nodes.cpp:
        (KJS::Node::Node):
        (KJS::FunctionBodyNode::FunctionBodyNode):
        * kjs/nodes.h:
        * kjs/testkjs.cpp:
        (prettyPrintScript):
        (kjsmain):
        * kjs/ustring.cpp:
        * kjs/ustring.h:

2007-11-15  Oliver Hunt  <oliver@apple.com>

        Reviewed by Darin.

        <rdar://problem/5601548> REGRESSION: All SourceElements and their children leak after a syntax error
        
        Add a stub node to maintain the Vector of SourceElements until assignment.

        * kjs/grammar.y:
        * kjs/nodes.h:
        (KJS::SourceElementsStub::SourceElementsStub):
        (KJS::SourceElementsStub::append):
        (KJS::SourceElementsStub::release):
        (KJS::SourceElementsStub::):
        (KJS::SourceElementsStub::precedence):

2007-11-15  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Abstract most of RMATCH into MatchStack functions.
        
        SunSpider claims this, combined with the last 2 patches was a 1% speedup, 10% for dna-regexp.

        * pcre/pcre_exec.cpp:
        (MatchStack::canUseStackBufferForNextFrame):
        (MatchStack::allocateNextFrame):
        (MatchStack::pushNewFrame):
        (MatchStack::frameIsStackAllocated):
        (MatchStack::popCurrentFrame):
        (MatchStack::unrollAnyHeapAllocatedFrames):
        (match):

2007-11-15  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Remove RETURN_ERROR, add MatchStack
        
        * pcre/pcre_exec.cpp:
        (MatchStack::MatchStack):
        (MatchStack::unrollAnyHeapAllocatedFrames):
        (matchError):
        (match):
        
2007-11-15  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.

        Clean up match function to match WebKit style

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * pcre/pcre_exec.cpp:
        (match):

2007-11-15  Steve Falkenburg  <sfalken@apple.com>

        Windows build fix.

        * JavaScriptCore.vcproj/JavaScriptCore.make:

2007-11-14  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=15982
        Improve JSString UTF-8 decoding

        * API/JSStringRef.cpp:
        (JSStringCreateWithUTF8CString): Use strict decoding, return 0 on error.

        * wtf/unicode/UTF8.cpp:
        (WTF::Unicode::convertUTF16ToUTF8):
        (WTF::Unicode::convertUTF8ToUTF16):
        * wtf/unicode/UTF8.h:
        Made these function names start with a lower case letter.

        * kjs/ustring.cpp: (KJS::UString::UTF8String): Updated for the above renaming.

        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertUTF8ToUTF16WithLatin1Fallback): Renamed to highlight the difference
        from convertUTF8ToUTF16 in wtf/unicode.
        (KJS::Bindings::convertNPStringToUTF16): Updated for the above renaming.
        (KJS::Bindings::identifierFromNPIdentifier): Ditto.
        * bindings/c/c_utility.h: Made convertUTF8ToUTF16WithLatin1Fallback() a file static.

2007-11-14  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Anders.

        Fix the Xcode project file after it was messed up in r27402.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-11-14  Eric Seidel  <eric@webkit.org>

        Reviewed by Oliver.
        
        More PCRE style cleanup.

        * pcre/pcre_compile.cpp:
        (compile_regex):

2007-11-14  Adam Roben  <aroben@apple.com>

        Clean up the bison conflict checking script

        Reviewed by Geoff.

        * DerivedSources.make:

2007-11-14  Eric Seidel  <eric@webkit.org>

        Reviewed by Geoff.

        Another round of PCRE cleanups: inlines
        
        SunSpider claims that this, combined with my previous PCRE cleanup were a 0.7% speedup, go figure.

        * pcre/pcre_compile.cpp:
        (jsRegExpCompile):
        * pcre/pcre_exec.cpp:
        (match):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:
        (PUT):
        (GET):
        (PUT2):
        (GET2):
        (isNewline):

2007-11-14  Eric Seidel  <eric@webkit.org>

        Reviewed by Sam.
        
        Give PCRE a (small) bath.
        Fix some formating and break things off into separate functions
        http://bugs.webkit.org/show_bug.cgi?id=15993

        * pcre/pcre_compile.cpp:
        (calculateCompiledPatternLengthAndFlags):
        (printCompiledRegExp):
        (returnError):
        (jsRegExpCompile):
        * pcre/pcre_internal.h:
        (compile_data::compile_data):

2007-11-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Eric Seidel.
        
        Cleaned up the JavaScript grammar a bit.
        
        1. Changed BlockNode to always hold a child vector (which may be empty),
        eliminating a few NULL-check branches in the common execution case.
        
        2. Changed the Block production to correctly report its starting and 
        ending line numbers to the debugger. (It used to report its ending line
        as its starting line.) Also, removed duplicate line-reporting code
        inside the BlockNode constructor.
        
        3. Moved curly braces up from FunctionBody production into parent
        productions. (I had to move the line number reporting code, too, since
        it depends on the location of the curly braces.) This matches the ECMA
        spec more closely, and makes some future changes I plan easier.
        
        4. Fixed statementList* convenience functions to deal appropriately with
        empty Vectors.

        SunSpider reports a small and statistically insignificant speedup.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::statementListPushFIFO):
        (KJS::statementListGetDeclarations):
        (KJS::statementListInitializeDeclarationStack):
        (KJS::statementListInitializeVariableAccessStack):
        (KJS::BlockNode::BlockNode):
        (KJS::BlockNode::optimizeVariableAccess):
        (KJS::BlockNode::getDeclarations):
        (KJS::BlockNode::execute):
        (KJS::FunctionBodyNode::initializeDeclarationStacks):
        (KJS::FunctionBodyNode::optimizeVariableAccess):

2007-11-13  Anders Carlsson  <andersca@apple.com>

        Add RefCounted.h (And remove Shared.h)
        
        * JavaScriptCore.vcproj/WTF/WTF.vcproj:

2007-11-13  Geoffrey Garen  <ggaren@apple.com>

        Build fix.

        * kjs/regexp.h:

2007-11-13  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Anders Carlsson.

        Renamed Shared to RefCounted.

        * API/JSClassRef.h:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/interpreter.h:
        * kjs/regexp.h:
        * wtf/RefCounted.h: Copied from JavaScriptCore/wtf/Shared.h.
        (WTF::RefCounted::RefCounted):
        * wtf/Shared.h: Removed.

2007-11-13  Adam Roben  <aroben@apple.com>

        Build fix

        Reviewed by Geoff.

        * kjs/regexp.h: Added a missing #include.

2007-11-13  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.

        Moved Shared.h into wtf so it could be used in more places. Deployed
        Shared in places where JSCore previously had hand-rolled ref-counting
        classes.

        * API/JSClassRef.cpp:
        (OpaqueJSClass::OpaqueJSClass):
        * API/JSClassRef.h:
        * API/JSObjectRef.cpp:
        (JSClassRetain):
        (JSClassRelease):
        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::init):
        * kjs/interpreter.h:
        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp):
        * kjs/regexp.h:
        * wtf/Shared.h: Copied from WebCore/platform/Shared.h.

2007-11-13  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Add an ASSERT to getTruncatedInt32 to enforce proper usage.
        Best part about this patch?  It doesn't break the web!

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::getTruncatedInt32):
        (KJS::JSImmediate::toDouble):
        (KJS::JSImmediate::getUInt32):

2007-11-13  Alexey Proskuryakov  <ap@webkit.org>

        Windows build fix.

        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertUTF8ToUTF16):
        * kjs/ustring.cpp:
        (KJS::UString::UTF8String):
        * wtf/unicode/UTF8.cpp:
        (WTF::Unicode::ConvertUTF8ToUTF16):

2007-11-13  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix http://bugs.webkit.org/show_bug.cgi?id=11231
          RegExp bug when handling newline characters
          and a number of other differences between PCRE behvior
          and JavaScript regular expressions:

          + single-digit sequences like \4 should be treated as octal
            character constants, unless there is a sufficient number
            of brackets for them to be treated as backreferences

          + \8 turns into the character "8", not a binary zero character
            followed by "8" (same for 9)

          + only the first 3 digits should be considered part of an
            octal character constant (the old behavior was to decode
            an arbitrarily long sequence and then mask with 0xFF)

          + if \x is followed by anything other than two valid hex digits,
            then it should simply be treated a the letter "x"; that includes
            not supporting the \x{41} syntax

          + if \u is followed by anything less than four valid hex digits,
            then it should simply be treated a the letter "u"

          + an extra "+" should be a syntax error, rather than being treated
            as the "possessive quantifier"

          + if a "]" character appears immediately after a "[" character that
            starts a character class, then that's an empty character class,
            rather than being the start of a character class that includes a
            "]" character

          + a "$" should not match a terminating newline; we could have gotten
            PCRE to handle this the way we wanted by passing an appropriate option

        Test: fast/js/regexp-no-extensions.html

        * pcre/pcre_compile.cpp:
        (check_escape): Check backreferences against bracount to catch both
        overflows and things that should be treated as octal. Rewrite octal
        loop to not go on indefinitely. Rewrite both hex loops to match and
        remove \x{} support.
        (compile_branch): Restructure loops so that we don't special-case a "]"
        at the beginning of a character class. Remove code that treated "+" as
        the possessive quantifier.
        (jsRegExpCompile): Change the "]" handling here too.

        * pcre/pcre_exec.cpp: (match): Changed CIRC to match the DOLL implementation.
        Changed DOLL to remove handling of "terminating newline", a Perl concept
        which we don't need.

        * tests/mozilla/expected.html: Two tests are fixed now:
        ecma_3/RegExp/regress-100199.js and ecma_3/RegExp/regress-188206.js.
        One test fails now: ecma_3/RegExp/perlstress-002.js -- our success before
        was due to a bug (we treated all 1-character numeric escapes as backreferences).
        The date tests also now both expect success -- whatever was making them fail
        before was probably due to the time being close to a DST shift; maybe we need
        to get rid of those tests.

2007-11-13  Darin Adler  <darin@apple.com>

        * kjs/JSImmediate.h: (KJS::JSImmediate::getTruncatedInt32):
        Remove too-strong assert that was firing constantly and preventing even basic
        web browsing from working in a debug build. This function is used in many
        cases where the immediate value is not a number; the assertion could perhaps
        be added back later with a bit of reorganization.

2007-11-13  Alp Toker  <alp@atoker.com>

        Build fix for breakage to non-Mac builds introduced in r27746.

        * kjs/ustring.cpp:

2007-11-13  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.

        Clean up evaluateToBoolean functions to use inlines instead of copy/paste code

        * kjs/JSImmediate.h:
        * kjs/nodes.cpp:
        (KJS::GreaterNode::inlineEvaluateToBoolean):
        (KJS::GreaterNode::evaluate):
        (KJS::LessEqNode::inlineEvaluateToBoolean):
        (KJS::LessEqNode::evaluate):
        (KJS::GreaterEqNode::inlineEvaluateToBoolean):
        (KJS::GreaterEqNode::evaluate):
        (KJS::InNode::evaluateToBoolean):
        (KJS::EqualNode::inlineEvaluateToBoolean):
        (KJS::EqualNode::evaluate):
        (KJS::NotEqualNode::inlineEvaluateToBoolean):
        (KJS::NotEqualNode::evaluate):
        (KJS::StrictEqualNode::inlineEvaluateToBoolean):
        (KJS::StrictEqualNode::evaluate):
        (KJS::NotStrictEqualNode::inlineEvaluateToBoolean):
        (KJS::NotStrictEqualNode::evaluate):
        * kjs/nodes.h:

2007-11-12  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Fixed http://bugs.webkit.org/show_bug.cgi?id=15958
        base64 spends 1.1% of total time checking for special Infinity case
        
        Use a fast character test instead of calling strncmp.
        
        1.1% speedup on string-base64. SunSpider reports a .4% speedup overall;
        Sharks reports only .1%. Who are you going to believe? Huh?

        * kjs/ustring.cpp:
        (KJS::UString::toDouble):

2007-11-12  Eric Seidel  <eric@webkit.org>

        Reviewed by Oliver.

        Add evaluateToInt32 and evaluateUInt32 methods and deploy them.
        Fix a few missing evaluateToBoolean methods
        Deploy all evaluateTo* functions to more nodes to avoid slowdowns
        http://bugs.webkit.org/show_bug.cgi?id=15950
        
        SunSpider claims this is at least a 1.4% speedup.

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::getTruncatedInt32):
        (KJS::JSImmediate::toDouble):
        (KJS::JSImmediate::getUInt32):
        * kjs/nodes.cpp:
        (KJS::ExpressionNode::evaluateToNumber):
        (KJS::ExpressionNode::evaluateToInt32):
        (KJS::ExpressionNode::evaluateToUInt32):
        (KJS::NumberNode::evaluateToInt32):
        (KJS::NumberNode::evaluateToUInt32):
        (KJS::ImmediateNumberNode::evaluateToInt32):
        (KJS::ImmediateNumberNode::evaluateToUInt32):
        (KJS::ResolveNode::evaluate):
        (KJS::ResolveNode::evaluateToNumber):
        (KJS::ResolveNode::evaluateToBoolean):
        (KJS::ResolveNode::evaluateToInt32):
        (KJS::ResolveNode::evaluateToUInt32):
        (KJS::LocalVarAccessNode::evaluateToInt32):
        (KJS::LocalVarAccessNode::evaluateToUInt32):
        (KJS::BracketAccessorNode::evaluateToNumber):
        (KJS::BracketAccessorNode::evaluateToBoolean):
        (KJS::BracketAccessorNode::evaluateToInt32):
        (KJS::BracketAccessorNode::evaluateToUInt32):
        (KJS::DotAccessorNode::inlineEvaluate):
        (KJS::DotAccessorNode::evaluate):
        (KJS::DotAccessorNode::evaluateToNumber):
        (KJS::DotAccessorNode::evaluateToBoolean):
        (KJS::DotAccessorNode::evaluateToInt32):
        (KJS::DotAccessorNode::evaluateToUInt32):
        (KJS::NewExprNode::inlineEvaluate):
        (KJS::NewExprNode::evaluate):
        (KJS::NewExprNode::evaluateToNumber):
        (KJS::NewExprNode::evaluateToBoolean):
        (KJS::NewExprNode::evaluateToInt32):
        (KJS::NewExprNode::evaluateToUInt32):
        (KJS::FunctionCallResolveNode::inlineEvaluate):
        (KJS::FunctionCallResolveNode::evaluate):
        (KJS::FunctionCallResolveNode::evaluateToNumber):
        (KJS::FunctionCallResolveNode::evaluateToBoolean):
        (KJS::FunctionCallResolveNode::evaluateToInt32):
        (KJS::FunctionCallResolveNode::evaluateToUInt32):
        (KJS::LocalVarFunctionCallNode::evaluate):
        (KJS::LocalVarFunctionCallNode::evaluateToNumber):
        (KJS::LocalVarFunctionCallNode::evaluateToBoolean):
        (KJS::LocalVarFunctionCallNode::evaluateToInt32):
        (KJS::LocalVarFunctionCallNode::evaluateToUInt32):
        (KJS::FunctionCallDotNode::evaluate):
        (KJS::FunctionCallDotNode::evaluateToNumber):
        (KJS::FunctionCallDotNode::evaluateToBoolean):
        (KJS::FunctionCallDotNode::evaluateToInt32):
        (KJS::FunctionCallDotNode::evaluateToUInt32):
        (KJS::PostDecLocalVarNode::inlineEvaluateToNumber):
        (KJS::PostDecLocalVarNode::evaluateToNumber):
        (KJS::PostDecLocalVarNode::evaluateToBoolean):
        (KJS::PostDecLocalVarNode::evaluateToInt32):
        (KJS::PostDecLocalVarNode::evaluateToUInt32):
        (KJS::typeStringForValue):
        (KJS::UnaryPlusNode::evaluate):
        (KJS::UnaryPlusNode::evaluateToBoolean):
        (KJS::UnaryPlusNode::evaluateToNumber):
        (KJS::UnaryPlusNode::evaluateToInt32):
        (KJS::BitwiseNotNode::inlineEvaluateToInt32):
        (KJS::BitwiseNotNode::evaluate):
        (KJS::BitwiseNotNode::evaluateToNumber):
        (KJS::BitwiseNotNode::evaluateToBoolean):
        (KJS::BitwiseNotNode::evaluateToInt32):
        (KJS::MultNode::evaluateToBoolean):
        (KJS::MultNode::evaluateToInt32):
        (KJS::MultNode::evaluateToUInt32):
        (KJS::DivNode::evaluateToInt32):
        (KJS::DivNode::evaluateToUInt32):
        (KJS::ModNode::evaluateToBoolean):
        (KJS::ModNode::evaluateToInt32):
        (KJS::ModNode::evaluateToUInt32):
        (KJS::AddNode::evaluateToNumber):
        (KJS::AddNode::evaluateToInt32):
        (KJS::AddNode::evaluateToUInt32):
        (KJS::AddNumbersNode::evaluateToInt32):
        (KJS::AddNumbersNode::evaluateToUInt32):
        (KJS::SubNode::evaluateToInt32):
        (KJS::SubNode::evaluateToUInt32):
        (KJS::LeftShiftNode::inlineEvaluateToInt32):
        (KJS::LeftShiftNode::evaluate):
        (KJS::LeftShiftNode::evaluateToNumber):
        (KJS::LeftShiftNode::evaluateToInt32):
        (KJS::RightShiftNode::inlineEvaluateToInt32):
        (KJS::RightShiftNode::evaluate):
        (KJS::RightShiftNode::evaluateToNumber):
        (KJS::RightShiftNode::evaluateToInt32):
        (KJS::UnsignedRightShiftNode::inlineEvaluateToUInt32):
        (KJS::UnsignedRightShiftNode::evaluate):
        (KJS::UnsignedRightShiftNode::evaluateToNumber):
        (KJS::UnsignedRightShiftNode::evaluateToInt32):
        (KJS::LessNode::inlineEvaluateToBoolean):
        (KJS::LessNode::evaluate):
        (KJS::LessNode::evaluateToBoolean):
        (KJS::LessNumbersNode::inlineEvaluateToBoolean):
        (KJS::LessNumbersNode::evaluate):
        (KJS::LessNumbersNode::evaluateToBoolean):
        (KJS::LessStringsNode::inlineEvaluateToBoolean):
        (KJS::LessStringsNode::evaluate):
        (KJS::BitAndNode::evaluate):
        (KJS::BitAndNode::inlineEvaluateToInt32):
        (KJS::BitAndNode::evaluateToNumber):
        (KJS::BitAndNode::evaluateToBoolean):
        (KJS::BitAndNode::evaluateToInt32):
        (KJS::BitXOrNode::inlineEvaluateToInt32):
        (KJS::BitXOrNode::evaluate):
        (KJS::BitXOrNode::evaluateToNumber):
        (KJS::BitXOrNode::evaluateToBoolean):
        (KJS::BitXOrNode::evaluateToInt32):
        (KJS::BitOrNode::inlineEvaluateToInt32):
        (KJS::BitOrNode::evaluate):
        (KJS::BitOrNode::evaluateToNumber):
        (KJS::BitOrNode::evaluateToBoolean):
        (KJS::BitOrNode::evaluateToInt32):
        (KJS::ConditionalNode::evaluateToNumber):
        (KJS::ConditionalNode::evaluateToInt32):
        (KJS::ConditionalNode::evaluateToUInt32):
        (KJS::valueForReadModifyAssignment):
        (KJS::AssignExprNode::evaluate):
        (KJS::AssignExprNode::evaluateToBoolean):
        (KJS::AssignExprNode::evaluateToNumber):
        (KJS::AssignExprNode::evaluateToInt32):
        (KJS::VarDeclNode::handleSlowCase):
        * kjs/nodes.h:
        (KJS::FunctionCallResolveNode::precedence):
        (KJS::AddNode::precedence):
        (KJS::AddNode::):
        (KJS::LessNumbersNode::):
        (KJS::LessStringsNode::):
        * kjs/value.cpp:
        (KJS::JSValue::toInt32SlowCase):
        (KJS::JSValue::toUInt32SlowCase):
        * kjs/value.h:
        (KJS::JSValue::asCell):
        (KJS::JSValue::toInt32):
        (KJS::JSValue::toUInt32):

2007-11-12  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=15953
        Add UTF-8 encoding/decoding to WTF

        * kjs/ustring.h: Moved UTF8SequenceLength() and decodeUTF8Sequence() to wtf/unicode.
        * kjs/ustring.cpp: (KJS::UString::UTF8String): Changed this function to take a strict/lenient
        parameter. Callers are not interested in getting decoding results in strict mode, so 
        this allows for bailing out as soon as an error is seen.

        * kjs/function.cpp:
        (KJS::encode): Updated for new UString::UTF8String() signature.

        * API/JSStringRef.cpp:
        (JSStringCreateWithCharacters): Disambiguate UChar.
        (JSStringCreateWithUTF8CString): Actually use UTF-8 when creating the string!
        * bindings/c/c_utility.cpp: (KJS::Bindings::convertUTF8ToUTF16): Use ConvertUTF8ToUTF16().

        * wtf/unicode/UTF8.cpp: Added.
        (WTF::Unicode::inlineUTF8SequenceLengthNonASCII):
        (WTF::Unicode::inlineUTF8SequenceLength):
        (WTF::Unicode::UTF8SequenceLength):
        (WTF::Unicode::decodeUTF8Sequence):
        (WTF::Unicode::):
        (WTF::Unicode::ConvertUTF16ToUTF8):
        (WTF::Unicode::isLegalUTF8):
        (WTF::Unicode::ConvertUTF8ToUTF16):
        * wtf/unicode/UTF8.h: Added.
        (WTF::Unicode::):
        Some code moved from ustring.h, some adapted from unicode.org sources.

        * JavaScriptCore.exp:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        Added UTF8.{h,cpp}

2007-11-12  Josh Aas  <joshmoz@gmail.com>

        Reviewed by Darin.

        - http://bugs.webkit.org/show_bug.cgi?id=15946
          add NPPValue NPPVpluginDrawingModel (Mozilla bug 403418 compat)

        * bindings/npapi.h:

2007-11-12  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        - http://bugs.webkit.org/show_bug.cgi?id=15951
          REGRESSION: assertion failure in regexp match() when running JS tests

        Test: fast/js/regexp-many-brackets.html

        * pcre/pcre_exec.cpp: (match): Added back accidentally-removed case for
        the BRANUMBER opcode.

2007-11-12  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix use of prefix and config.h, got rid of a few unneeded things in
          the PCRE code; no behavior changes

        * API/JSBase.cpp: Added include of config.h.
        * API/JSCallbackConstructor.cpp: Ditto.
        * API/JSCallbackFunction.cpp: Ditto.
        * API/JSCallbackObject.cpp: Ditto.
        * API/JSClassRef.cpp: Ditto.
        * API/JSContextRef.cpp: Ditto.
        * API/JSObjectRef.cpp: Ditto.
        * API/JSStringRef.cpp: Ditto.
        * API/JSValueRef.cpp: Ditto.

        * JavaScriptCorePrefix.h: Removed obsolete <ctype.h> workaround.
        Moved new/delete macros after includes, as they are in WebCore's prefix.
        Removed "config.h".

        * pcre/dftables.cpp: (main): Changed back to not use a separate maketables
        function. This is needed for PCRE, but not helpful for our use. Also changed
        the tables to all be 128 entries long instead of 256, since only the first
        128 are ever used.

        * pcre/pcre_compile.cpp: Added include of config.h. Eliminated digitab,
        which was only being used to check hex digits. Changed all uses of TRUE and
        FALSE to use the C++ true and false instead.
        (check_escape): Just the TRUE/FALSE thing.
        (is_counted_repeat): Ditto.
        (could_be_empty_branch): Ditto.
        (get_othercase_range): Ditto.
        (compile_branch): Ditto.
        (compile_regex): Ditto.
        (is_anchored): Ditto.
        (is_startline): Ditto.
        (find_firstassertedchar): Ditto.
        (jsRegExpCompile): Ditto.

        * pcre/pcre_exec.cpp: Added include of config.h. Changed all uses of TRUE and
        FALSE to use the C++ true and false instead.
        (match_ref): Just the TRUE/FALSE thing.
        (match): Ditto. Removed some unneeded braces.
        (jsRegExpExecute): Just the TRUE/FALSE thing.

        * pcre/pcre_internal.h: Moved the constants needed by dftables.cpp to the top
        of the file instead of the bottom, so they can be used. Also changed the table
        sizes to 128 instead of 256. Removed macro definitions of FALSE and TRUE.
        Set array sizes for all the const arrays. Changed _pcre_utf8_table1_size to
        be a macro instead of a extern int.

        * pcre/pcre_maketables.cpp: Removed. It's all in dftables.cpp now.

        * pcre/pcre_tables.cpp: Made table sizes explicit.

        * pcre/pcre_xclass.cpp: Just the TRUE/FALSE thing.

2007-11-12  Adam Roben  <aroben@apple.com>

        Build fix

        * wtf/FastMalloc.h: Add missing using statement.

2007-11-11  Oliver Hunt  <oliver@apple.com>

        Reviewed by Darin.

        Add special fastZeroedMalloc function to replace a 
        number of fastCalloc calls where one argument was 1.
        
        This results in a 0.4% progression in SunSpider, more
        than making up for the earlier regression caused by 
        additional overflow checks.

        * JavaScriptCore.exp:
        * kjs/array_instance.cpp:
        * kjs/property_map.cpp:
        * wtf/FastMalloc.cpp:
        * wtf/FastMalloc.h:
        * wtf/HashTable.h:

2007-11-11  Adam Roben  <aroben@apple.com>

        Fix <rdar://5578982> ASSERT in HashTable::checkTableConsistencyExceptSize beneath WebNotificationCenter

        The bug was due to a mismatch between HashMap::remove and
        HashTable::checkTableConsistency. HashMap::remove can delete the value
        stored in the HashTable (by derefing it), which is not normally
        allowed by HashTable. It's OK in this case because the value is about
        to be removed from the table, but HashTable wasn't aware of this.

        HashMap::remove now performs the consistency check itself before
        derefing the value.

        Darin noticed that the same bug would occur in HashSet, so I've fixed
        it there as well.

        Reviewed by Darin.

        * wtf/HashMap.h:
        (WTF::HashMap::remove): Perform the HashTable consistency check
        manually before calling deref.
        * wtf/HashSet.h:
        (WTF::HashSet::remove): Ditto.
        * wtf/HashTable.h: Made checkTableConsistency public so that HashMap
        and HashSet can call it.
        (WTF::HashTable::removeAndInvalidateWithoutEntryConsistencyCheck):
        Added.
        (WTF::HashTable::removeAndInvalidate): Added.
        (WTF::HashTable::remove):
        (WTF::HashTable::removeWithoutEntryConsistencyCheck): Added.

2007-11-11  Mark Rowe  <mrowe@apple.com>

        Build fix.  Use the correct filename case.

        * kjs/nodes.h:

2007-11-11  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Fixed http://bugs.webkit.org/show_bug.cgi?id=15902
        15% of string-validate-input.js is spent compiling the same regular expression
        
        Store a compiled representation of the regular expression in the AST.
        
        Only a .2% SunSpider speedup overall, but a 10.6% speedup on 
        string-validate-input.js.

        * kjs/nodes.cpp:
        (KJS::RegExpNode::evaluate):
        * kjs/nodes.h:
        (KJS::RegExpNode::):
        * kjs/nodes2string.cpp:
        (KJS::RegExpNode::streamTo):
        * kjs/regexp.cpp:
        (KJS::RegExp::flags):
        * kjs/regexp.h:
        (KJS::RegExp::pattern):
        * kjs/regexp_object.cpp:
        (KJS::RegExpObjectImp::construct):
        (KJS::RegExpObjectImp::createRegExpImp):
        * kjs/regexp_object.h:

2007-11-11  Oliver Hunt  <oliver@apple.com>

        Reviewed by Eric.

        Partial fix for <rdar://problem/5585334> numfuzz: integer overflows opening malformed SVG file in WebCore::ImageBuffer::create

        Unfortunately this is a very slight regression, but is unavoidable.

        * wtf/FastMalloc.cpp:

2007-11-10  Eric Seidel  <eric@webkit.org>

        Reviewed by darin.
        
        Add simple type inferencing to the parser, and create custom
        AddNode and LessNode subclasses based on inferred types.
        http://bugs.webkit.org/show_bug.cgi?id=15884
        
        SunSpider claims this is at least a 0.5% speedup.

        * JavaScriptCore.exp:
        * kjs/grammar.y:
        * kjs/internal.cpp:
        (KJS::NumberImp::getPrimitiveNumber):
        (KJS::GetterSetterImp::getPrimitiveNumber):
        * kjs/internal.h:
        * kjs/lexer.cpp:
        (KJS::Lexer::lex):
        * kjs/nodes.cpp:
        (KJS::Node::Node):
        (KJS::StringNode::evaluate):
        (KJS::StringNode::evaluateToNumber):
        (KJS::StringNode::evaluateToBoolean):
        (KJS::RegExpNode::evaluate):
        (KJS::UnaryPlusNode::optimizeVariableAccess):
        (KJS::AddNode::evaluate):
        (KJS::AddNode::evaluateToNumber):
        (KJS::AddNumbersNode::inlineEvaluateToNumber):
        (KJS::AddNumbersNode::evaluate):
        (KJS::AddNumbersNode::evaluateToNumber):
        (KJS::AddStringsNode::evaluate):
        (KJS::AddStringLeftNode::evaluate):
        (KJS::AddStringRightNode::evaluate):
        (KJS::lessThan):
        (KJS::lessThanEq):
        (KJS::LessNumbersNode::evaluate):
        (KJS::LessStringsNode::evaluate):
        * kjs/nodes.h:
        (KJS::ExpressionNode::):
        (KJS::RegExpNode::):
        (KJS::RegExpNode::precedence):
        (KJS::TypeOfResolveNode::):
        (KJS::LocalVarTypeOfNode::):
        (KJS::UnaryPlusNode::):
        (KJS::UnaryPlusNode::precedence):
        (KJS::AddNode::):
        (KJS::AddNode::precedence):
        (KJS::AddNumbersNode::):
        (KJS::AddStringLeftNode::):
        (KJS::AddStringRightNode::):
        (KJS::AddStringsNode::):
        (KJS::LessNode::):
        (KJS::LessNode::precedence):
        (KJS::LessNumbersNode::):
        (KJS::LessStringsNode::):
        * kjs/nodes2string.cpp:
        (KJS::StringNode::streamTo):
        * kjs/object.cpp:
        * kjs/object.h:
        * kjs/value.h:
        (KJS::JSValue::getPrimitiveNumber):

2007-11-11  Darin Adler  <darin@apple.com>

        - try another way of fixing dftables builds -- refactor pcre_internal.h a bit

        * pcre/pcre_internal.h: Make most of this header do nothing when DFTABLES is set.
        Later we can break it into two files.

        * JavaScriptCore.vcproj/dftables/dftables.vcproj: Take out now-unneeded include paths.
        * pcre/dftables.cpp: Set DFTABLES. Use delete instead of free.
        * pcre/dftables.pro: Take out now-unneeded include paths.
        * pcre/pcre_maketables.cpp: Use new instead of malloc.

2007-11-11  Darin Adler  <darin@apple.com>

        * pcre/dftables.pro: Try fixing Qt builds (I looked at qt-win) by adding
        another include path.

2007-11-11  Darin Adler  <darin@apple.com>

        * JavaScriptCore.xcodeproj/project.pbxproj: Try fixing Mac Tiger builds
        by adding another include path.

2007-11-11  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        - http://bugs.webkit.org/show_bug.cgi?id=15924
          next round of changes to JSRegExp (formerly PCRE)

        This is a combination of converting to C++, tweaking the API, and adding
        some additional optimizations.

        Future steps will involve getting rid of the use of UTF-8 completely
        (we'll use UTF-16 exclusively instead), eliminating more source files,
        and some more speed-ups.

        SunSpider says the current round is an 0.9% speed-up overall, and a
        5.3% speed-up for regexp.

        * JavaScriptCore.exp: Updated for new entry points.

        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/dftables/dftables.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * jscore.bkl:
        Updated for new source file names and ForwardingHeaders.

        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp): Changed to use the error message without calling
        strdup on it and to pass the new types and options.
        (KJS::RegExp::~RegExp): Removed the now-unneeded free of the error message.
        (KJS::RegExp::match): Pass the new types and options.
        * kjs/regexp.h: Update type of m_constructionError.

        * pcre/AUTHORS: Update to reflect the status of the project -- we don't include
        the Google parts, and this isn't the PCRE library, per se.
        * pcre/COPYING: Ditto.

        * pcre/dftables.cpp: Copied from JavaScriptCore/pcre/dftables.c.
        (main): Removed unneeded ctype_digit.

        * pcre/pcre.h: Convert to C++, tweak API a bit. Use UChar instead of JSRegExpChar.

        * pcre/pcre_compile.cpp: Copied from JavaScriptCore/pcre/pcre_compile.c.
        Moved a lot of private stuff used only within this file here from pcre_internal.h.
        Renumbered the error codes.
        (error_text): Use a single string with embedded nulls for the error text (I got
        this idea from newer versions of PCRE).
        (check_escape): Changed return type to be enum instead of int. Replaced ctype_digit
        uses with isASCIIDigit.
        (is_counted_repeat): Ditto.
        (read_repeat_counts): Ditto.
        (first_significant_code): Ditto.
        (find_fixedlength): Ditto.
        (could_be_empty_branch): Ditto.
        (compile_branch): Ditto. Also removed some code that handles changing options.
        JavaScript doesn't have any of the features that allow options to change.
        (compile_regex): Updated for change to options parameter.
        (is_anchored): Ditto.
        (find_firstassertedchar): Ditto.
        (jsRegExpCompile): Changed to take separate flags instead of an options int.
        Also changed to call new/delete instead of pcre_malloc/free.
        (jsRegExpFree): Ditto.

        * pcre/pcre_exec.cpp: Copied from JavaScriptCore/pcre/pcre_exec.c.
        Added a case that uses computed goto for the opcode loop, but did not turn it on.
        Changed the RMATCH macro to handle returns more efficiently by putting the where
        pointer in the new frame instead of the old one, allowing us to branch to the
        return with a single statement. Switched to new/delete from pcre_malloc/free.
        Changed many RRETURN callers to not set the return value since it's already
        set correctly. Replaced the rrc variable with an is_match variable. Values other
        than "match" and "no match" are now handled differently. This allows us to remove
        the code to check for those cases in various rules.
        (match): All the case statements use a macro BEGIN_OPCODE instead. And all the
        continue statements, or break statements that break out of the outer case use
        a macro NEXT_OPCODE instead. Replaced a few if statements with assertions.
        (jsRegExpExecute): Use new/delete instead of pcre_malloc/free. Removed unused
        start_match field from the match block.

        * pcre/pcre_internal.h: Moved the last few configuration macros from pcre-config.h
        in here. Removed various unused types. Converted from JSRegExpChar to UChar.
        Eliminated pcre_malloc/free. Replaced the opcode enum with a macro that can be
        used in multiple places. Unfortunately we lose the comments for each opcode; we
        should find a place to put those back. Removed ctype_digit.

        * pcre/pcre_maketables.cpp: Copied from JavaScriptCore/pcre/pcre_maketables.c.
        (pcre_maketables): Got rid of the conditional code that allows this to be compiled
        in -- it's only used for dftables now (and soon may be obsolete entirely).
        Changed code for cbit_digit to not use isdigit, and took the "_" case out of the
        loop. Removed ctype_digit.

        * pcre/pcre_ord2utf8.cpp: Copied from JavaScriptCore/pcre/pcre_ord2utf8.c.

        * pcre/pcre_tables.cpp: Copied from JavaScriptCore/pcre/pcre_tables.c.
        Moved _pcre_OP_lengths out of here into pcre_exec.cpp.

        * pcre/pcre_ucp_searchfuncs.cpp: Copied from JavaScriptCore/pcre/pcre_ucp_searchfuncs.c.
        Updated for other file name changes.

        * pcre/pcre_xclass.cpp: Copied from JavaScriptCore/pcre/pcre_xclass.c.

        * pcre/ucpinternal.h: Updated header.

        * pcre/ucptable.cpp: Copied from JavaScriptCore/pcre/ucptable.c.

        * wtf/ASCIICType.h: (WTF::isASCIIDigit): Removed a branch by changing from && to
        & for this operation. Also added an overload that takes an int because that's
        useful for PCRE. Later we could optimize for int and overload other functions in
        this file; stuck to this simple one for now.

        * wtf/unicode/icu/UnicodeIcu.h: Removed unused isUpper.
        * wtf/unicode/qt4/UnicodeQt4.h: Ditto.

        * pcre/LICENCE: Removed.
        * pcre/pcre-config.h: Removed.
        * wtf/FastMallocPCRE.cpp: Removed.

        * pcre/dftables.c: Renamed to cpp.
        * pcre/pcre_compile.c: Ditto.
        * pcre/pcre_exec.c: Ditto.
        * pcre/pcre_maketables.c: Ditto.
        * pcre/pcre_ord2utf8.c: Ditto.
        * pcre/pcre_tables.c: Ditto.
        * pcre/pcre_ucp_searchfuncs.c: Ditto.
        * pcre/pcre_xclass.c: Ditto.
        * pcre/ucptable.c: Ditto.

2007-11-11  Eric Seidel  <eric@webkit.org>

        Reviewed by Oliver.

        Add KJS_CHECKEXCEPTIONBOOLEAN to match rest of nodes.cpp

        * kjs/nodes.cpp:
        (KJS::ExpressionNode::evaluateToBoolean):
        (KJS::LessNode::evaluateToBoolean):
        (KJS::GreaterNode::evaluateToBoolean):
        (KJS::LessEqNode::evaluateToBoolean):
        (KJS::GreaterEqNode::evaluateToBoolean):
        (KJS::InstanceOfNode::evaluateToBoolean):
        (KJS::InNode::evaluateToBoolean):
        (KJS::EqualNode::evaluateToBoolean):
        (KJS::NotEqualNode::evaluateToBoolean):
        (KJS::StrictEqualNode::evaluateToBoolean):
        (KJS::NotStrictEqualNode::evaluateToBoolean):
        (KJS::LogicalAndNode::evaluateToBoolean):
        (KJS::LogicalOrNode::evaluateToBoolean):
        (KJS::ConditionalNode::evaluateToBoolean):

2007-11-10  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        - fix http://bugs.webkit.org/show_bug.cgi?id=15927
          REGRESSION(r27487): delete a.c followed by __defineGetter__("c", ...) incorrectly deletes another property
          and <rdar://problem/5586384> REGRESSION (r27487): Can't switch out of Edit HTML Source mode on Leopard Wiki

        Test: fast/js/delete-then-put.html

        * kjs/property_map.cpp:
        (KJS::PropertyMap::put): Added a missing "- 1"; code to find an empty slot was not working.
        (KJS::PropertyMap::checkConsistency): Added a missing range check that would have caught this
        problem before.

        - roll out a last-minute change to my evaluateToBoolean patch that was incorrect.

        * kjs/nodes.h: (KJS::ExprStatementNode::ExprStatementNode): Take out call to
        optimizeForUnnecessaryResult, since the result is used in some cases.

2007-11-10  Adam Roben  <aroben@apple.com>

        Windows build fix

        Roll out some changes that were (seemingly accidentally) checked in
        with r27664.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2007-11-10  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        - http://bugs.webkit.org/show_bug.cgi?id=15915
          add an evaluation path for booleans like the one we have for numbers

        Gives 1.1% on SunSpider.

        * kjs/grammar.y: Create TrueNode and FalseNode instead of BooleanNode.

        * kjs/nodes.h: Changed to use Noncopyable. Moved optimizeForUnnecessaryResult
        down from Node to ExpressionNode. Changed some classes to not inherit from
        ExpressionNode where not necessary, and removed unnneeded evaluate functions
        as well as evaluate functions that need not be virtual. Call the
        optimizeForUnnecessaryResult function on the start of a for loop too.
        * kjs/nodes.cpp:
        (KJS::ExpressionNode::evaluateToBoolean): Added.
        (KJS::FalseNode::evaluate): Added.
        (KJS::TrueNode::evaluate): Added.
        (KJS::NumberNode::evaluateToBoolean): Added.
        (KJS::StringNode::evaluateToBoolean): Added.
        (KJS::LocalVarAccessNode::evaluateToBoolean): Added.
        (KJS::BracketAccessorNode::evaluateToBoolean): Added.
        (KJS::LogicalNotNode::evaluate): Changed to call evaluateToBoolean.
        (KJS::LogicalNotNode::evaluateToBoolean): Added.
        (KJS::lessThan): Changed to return bool.
        (KJS::lessThanEq): Ditto.
        (KJS::LessNode::evaluate): Changed since lessThan returns bool.
        (KJS::LessNode::evaluateToBoolean): Added.
        (KJS::GreaterNode::evaluate): Changed since lessThanEq returns bool.
        (KJS::GreaterNode::evaluateToBoolean): Added.
        (KJS::LessEqNode::evaluate): Changed since lessThanEq returns bool.
        (KJS::LessEqNode::evaluateToBoolean): Added.
        (KJS::GreaterEqNode::evaluate): Changed since lessThan returns bool.
        (KJS::GreaterEqNode::evaluateToBoolean): Added.
        (KJS::InstanceOfNode::evaluateToBoolean): Added.
        (KJS::InNode::evaluateToBoolean): Added.
        (KJS::EqualNode::evaluateToBoolean): Added.
        (KJS::NotEqualNode::evaluateToBoolean): Added.
        (KJS::StrictEqualNode::evaluateToBoolean): Added.
        (KJS::NotStrictEqualNode::evaluateToBoolean): Added.
        (KJS::ConditionalNode::evaluate): Changed to call evaluateToBoolean.
        (KJS::IfNode::execute): Ditto.
        (KJS::DoWhileNode::execute): Ditto.
        (KJS::WhileNode::execute): Ditto.
        (KJS::ForNode::execute): Ditto.

        * kjs/nodes2string.cpp:
        (KJS::FalseNode::streamTo): Added.
        (KJS::TrueNode::streamTo): Added.

2007-11-09  Adam Roben  <aroben@apple.com>

        Windows build fix

        Reviewed by Darin.

        * kjs/value.h:
        (KJS::jsNumber): Add some explicit casts.

2007-11-08  Darin Adler  <darin@apple.com>

        - fix build

        * kjs/grammar.y:
        * kjs/nodes.h:
        * kjs/property_map.cpp:

2007-11-08  Darin Adler  <darin@apple.com>

        - roll out accidentally-checked in changes

        * kjs/nodes.cpp: Back to previous version.
        * kjs/nodes.h: Ditto.
        * kjs/grammar.y: Ditto.

2007-11-08  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15912
          fasta spends a lot of time in qsort

        * kjs/property_map.cpp:
        (KJS::PropertyMap::getEnumerablePropertyNames):
        Use insertion sort instead of qsort for small sets of property names.
        We can probably do some even-better speedups of for/in, but this nets
        0.6% overall and 6.7% on fasta.

2007-11-08  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15906
          getting characters by indexing into a string is very slow

        This fixes one source of the slowness -- the conversion to an unused
        Identifier as we call the get function from the slot -- but doesn't
        fix others, such as the fact that we have to allocate a new UString::Rep
        for every single character.

        Speeds up string-base64 30%, and at least 0.5% overall.
        But does slow down access-fannkuch quite a bit. Might be worth
        revisiting in the future to see what we can do about that (although
        I did look at a profile for a while).

        * kjs/property_slot.h: Add a new marker for "numeric" property slots;
        slots where we don't need to pass the identifier to the get function.
        (KJS::PropertySlot::getValue): Added code to call the numeric get function.
        (KJS::PropertySlot::setCustomNumeric): Added.
        * kjs/string_object.cpp:
        (KJS::StringInstance::indexGetter): Changed to use substr() instead
        of constructing a wholly new UString each time.
        (KJS::stringInstanceNumericPropertyGetter): Added. Like indexGetter, but
        takes advantage of setCustomNumeric to avoid creating an Identifier.
        (KJS::StringInstance::getOwnPropertySlot): Changed to use setCustomNumeric.

2007-11-08  Darin Adler  <darin@apple.com>

        Reviewed by Oliver.

        - http://bugs.webkit.org/show_bug.cgi?id=15904
          more speed-ups possible by tightening up int version of JSImmediate

        1% improvement of SunSpider

        * kjs/JSImmediate.h: Eliminate the now-unneeded FPBitValues struct template.
        (KJS::JSImmediate::from): Overload for most numeric types; many types can
        do fewer branches and checks.
        (KJS::JSImmediate::getUInt32): Removed unneeded check for undefined.
        (KJS::JSImmediate::getTruncatedInt32): Ditto.
        (KJS::JSImmediate::getTruncatedUInt32): Ditto. There's no difference any more
        between getUInt32 and getTruncatedUInt32, so that's worth a rename and merge later.

        * kjs/grammar.y: Update since fromDouble is now just from.
        * kjs/nodes.h: Ditto.

        * kjs/value.h: (KJS::jsNumber): Overload for most numeric types.

2007-11-08  Kevin Ollivier  <kevino@theolliviers.com>

        Bakefiles for building JavaScriptCore, needed by wx port.

        Reviewed by Mark Rowe.

        * JavaScriptCoreSources.bkl: Added.
        * jscore.bkl: Added.

2007-11-08  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Fix regression caused by earlier bitwise and optimisation.  1 & undefined != 1.

        The implementation of JSImmediate::areBothImmediateNumbers relies on 
        (JSImmediate::getTag(immediate1) & JSImmediate::getTag(immediate2)) having 
        a unique result when both immediate values are numbers.

        The regression was due to UndefinedType & NumberType returning NumberType (3 & 1).
        By swapping the value of NumberType and UndefinedType this ceases to be a problem.

        * kjs/JSType.h:

2007-11-08  Darin Adler  <darin@apple.com>

        - fix build

        * kjs/nodes.h: Add missing parameter name.

2007-11-08  Eric Seidel  <eric@webkit.org>

        Reviewed by darin.

        Add ExpressionNode subclass of Node, use it.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::ForInNode::ForInNode):
        * kjs/nodes.h:
        (KJS::ExpressionNode::):
        (KJS::NullNode::):
        (KJS::NullNode::precedence):
        (KJS::BooleanNode::):
        (KJS::BooleanNode::precedence):
        (KJS::RegExpNode::):
        (KJS::RegExpNode::precedence):
        (KJS::ThisNode::):
        (KJS::ThisNode::precedence):
        (KJS::ResolveNode::):
        (KJS::ElementNode::):
        (KJS::ArrayNode::):
        (KJS::PropertyNode::):
        (KJS::PropertyNode::precedence):
        (KJS::PropertyNode::name):
        (KJS::PropertyListNode::):
        (KJS::ObjectLiteralNode::):
        (KJS::ObjectLiteralNode::precedence):
        (KJS::BracketAccessorNode::):
        (KJS::DotAccessorNode::):
        (KJS::DotAccessorNode::precedence):
        (KJS::ArgumentListNode::):
        (KJS::ArgumentsNode::):
        (KJS::NewExprNode::):
        (KJS::NewExprNode::precedence):
        (KJS::FunctionCallValueNode::):
        (KJS::FunctionCallValueNode::precedence):
        (KJS::FunctionCallResolveNode::):
        (KJS::FunctionCallBracketNode::):
        (KJS::FunctionCallBracketNode::precedence):
        (KJS::FunctionCallDotNode::):
        (KJS::FunctionCallDotNode::precedence):
        (KJS::PrePostResolveNode::):
        (KJS::PostfixBracketNode::):
        (KJS::PostfixBracketNode::precedence):
        (KJS::PostIncBracketNode::):
        (KJS::PostIncBracketNode::isIncrement):
        (KJS::PostDecBracketNode::):
        (KJS::PostDecBracketNode::isIncrement):
        (KJS::PostfixDotNode::):
        (KJS::PostfixDotNode::precedence):
        (KJS::PostIncDotNode::):
        (KJS::PostIncDotNode::isIncrement):
        (KJS::PostDecDotNode::):
        (KJS::PostDecDotNode::isIncrement):
        (KJS::PostfixErrorNode::):
        (KJS::PostfixErrorNode::precedence):
        (KJS::DeleteResolveNode::):
        (KJS::DeleteBracketNode::):
        (KJS::DeleteBracketNode::precedence):
        (KJS::DeleteDotNode::):
        (KJS::DeleteDotNode::precedence):
        (KJS::DeleteValueNode::):
        (KJS::DeleteValueNode::precedence):
        (KJS::VoidNode::):
        (KJS::VoidNode::precedence):
        (KJS::TypeOfResolveNode::):
        (KJS::TypeOfValueNode::):
        (KJS::PrefixBracketNode::):
        (KJS::PrefixBracketNode::precedence):
        (KJS::PreIncBracketNode::):
        (KJS::PreIncBracketNode::isIncrement):
        (KJS::PreDecBracketNode::):
        (KJS::PreDecBracketNode::isIncrement):
        (KJS::PrefixDotNode::):
        (KJS::PrefixDotNode::precedence):
        (KJS::PreIncDotNode::):
        (KJS::PreIncDotNode::isIncrement):
        (KJS::PreDecDotNode::):
        (KJS::PreDecDotNode::isIncrement):
        (KJS::PrefixErrorNode::):
        (KJS::PrefixErrorNode::precedence):
        (KJS::UnaryPlusNode::):
        (KJS::UnaryPlusNode::precedence):
        (KJS::NegateNode::):
        (KJS::NegateNode::precedence):
        (KJS::BitwiseNotNode::):
        (KJS::BitwiseNotNode::precedence):
        (KJS::LogicalNotNode::):
        (KJS::LogicalNotNode::precedence):
        (KJS::AddNode::):
        (KJS::AddNode::precedence):
        (KJS::LeftShiftNode::):
        (KJS::LeftShiftNode::precedence):
        (KJS::RightShiftNode::):
        (KJS::RightShiftNode::precedence):
        (KJS::UnsignedRightShiftNode::):
        (KJS::UnsignedRightShiftNode::precedence):
        (KJS::LessNode::):
        (KJS::LessNode::precedence):
        (KJS::GreaterNode::):
        (KJS::GreaterNode::precedence):
        (KJS::LessEqNode::):
        (KJS::LessEqNode::precedence):
        (KJS::GreaterEqNode::):
        (KJS::GreaterEqNode::precedence):
        (KJS::InstanceOfNode::):
        (KJS::InstanceOfNode::precedence):
        (KJS::InNode::):
        (KJS::InNode::precedence):
        (KJS::EqualNode::):
        (KJS::EqualNode::precedence):
        (KJS::NotEqualNode::):
        (KJS::NotEqualNode::precedence):
        (KJS::StrictEqualNode::):
        (KJS::StrictEqualNode::precedence):
        (KJS::NotStrictEqualNode::):
        (KJS::NotStrictEqualNode::precedence):
        (KJS::BitAndNode::):
        (KJS::BitAndNode::precedence):
        (KJS::BitOrNode::):
        (KJS::BitOrNode::precedence):
        (KJS::BitXOrNode::):
        (KJS::BitXOrNode::precedence):
        (KJS::LogicalAndNode::):
        (KJS::LogicalAndNode::precedence):
        (KJS::LogicalOrNode::):
        (KJS::LogicalOrNode::precedence):
        (KJS::ConditionalNode::):
        (KJS::ConditionalNode::precedence):
        (KJS::ReadModifyResolveNode::):
        (KJS::ReadModifyResolveNode::precedence):
        (KJS::AssignResolveNode::):
        (KJS::AssignResolveNode::precedence):
        (KJS::ReadModifyBracketNode::):
        (KJS::ReadModifyBracketNode::precedence):
        (KJS::AssignBracketNode::):
        (KJS::AssignBracketNode::precedence):
        (KJS::AssignDotNode::):
        (KJS::AssignDotNode::precedence):
        (KJS::ReadModifyDotNode::):
        (KJS::ReadModifyDotNode::precedence):
        (KJS::AssignErrorNode::):
        (KJS::AssignErrorNode::precedence):
        (KJS::CommaNode::):
        (KJS::CommaNode::precedence):
        (KJS::AssignExprNode::):
        (KJS::AssignExprNode::precedence):
        (KJS::ExprStatementNode::):
        (KJS::IfNode::):
        (KJS::DoWhileNode::):
        (KJS::WhileNode::):
        (KJS::ReturnNode::):
        (KJS::WithNode::):
        (KJS::ThrowNode::):
        (KJS::ParameterNode::):
        (KJS::CaseClauseNode::):
        (KJS::CaseClauseNode::precedence):
        (KJS::ClauseListNode::):
        (KJS::SwitchNode::):

2007-11-08  Oliver Hunt  <oliver@apple.com>

        Reviewed by Sam.

        Add a fast path for bitwise-and of two immediate numbers for a 0.7% improvement in SunSpider (4% bitop improvement).

        This only improves bitwise-and performance, as the additional logic required 
        for similar code paths on or, xor, and shifting requires additional operations
        and branches that negate (and in certain cases, regress) any advantage we might
        otherwise receive.

        This improves performance on all bitop tests, the cryptography tests, as well as 
        the string-base64 and string-unpack-code tests.  No significant degradation on 
        any other tests.

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::areBothImmediateNumbers):
        (KJS::JSImmediate::andImmediateNumbers):
        * kjs/nodes.cpp:
        (KJS::BitAndNode::evaluate):
        * kjs/value.h:
        (KJS::jsNumberFromAnd):

2007-11-08  Adam Roben  <aroben@apple.com>

        Stop using KJS inside of MathExtras.h

        Reviewed by Darin.

        * wtf/MathExtras.h: Removed an unused header, and a now-unused
        forward-declaration.
        (wtf_atan2): Use std::numeric_limits intead of KJS.

2007-11-08  Sam Weinig  <sam@webkit.org>

        Windows build fix.

        * kjs/date_object.cpp:
        (KJS::DateProtoFuncToLocaleString::callAsFunction): Fix unused arg warning.
        (KJS::DateProtoFuncToLocaleDateString::callAsFunction): ditto
        (KJS::DateProtoFuncToLocaleTimeString::callAsFunction): ditto

2007-11-08  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * kjs/lookup.h: Add missing include.

2007-11-08  Sam Weinig  <sam@webkit.org>

        Reviewed by Darin.

        Convert JavaScript internal function objects to use one class per
        function.  This avoids a switch statement inside what used to be
        the shared function classes and will allow Shark to better analyze
        the code.

        To make this switch, the value property of the HashEntry was changed
        to a union of an intptr_t (which is used to continue handle valueGetters)
        and function pointer which points to a static constructor for the
        individual new function objects.

        SunSpider claims this is a 1.0% speedup.

        * kjs/array_object.cpp:
        (KJS::ArrayPrototype::getOwnPropertySlot):
        (KJS::getProperty):
        (KJS::ArrayProtoFuncToString::callAsFunction):
        (KJS::ArrayProtoFuncToLocaleString::callAsFunction):
        (KJS::ArrayProtoFuncJoin::callAsFunction):
        (KJS::ArrayProtoFuncConcat::callAsFunction):
        (KJS::ArrayProtoFuncPop::callAsFunction):
        (KJS::ArrayProtoFuncPush::callAsFunction):
        (KJS::ArrayProtoFuncReverse::callAsFunction):
        (KJS::ArrayProtoFuncShift::callAsFunction):
        (KJS::ArrayProtoFuncSlice::callAsFunction):
        (KJS::ArrayProtoFuncSort::callAsFunction):
        (KJS::ArrayProtoFuncSplice::callAsFunction):
        (KJS::ArrayProtoFuncUnShift::callAsFunction):
        (KJS::ArrayProtoFuncFilter::callAsFunction):
        (KJS::ArrayProtoFuncMap::callAsFunction):
        (KJS::ArrayProtoFuncEvery::callAsFunction):
        (KJS::ArrayProtoFuncForEach::callAsFunction):
        (KJS::ArrayProtoFuncSome::callAsFunction):
        (KJS::ArrayProtoFuncIndexOf::callAsFunction):
        (KJS::ArrayProtoFuncLastIndexOf::callAsFunction):
        * kjs/array_object.h:
        (KJS::ArrayPrototype::classInfo):
        * kjs/create_hash_table:
        * kjs/date_object.cpp:
        (KJS::DatePrototype::getOwnPropertySlot):
        (KJS::DateProtoFuncToString::callAsFunction):
        (KJS::DateProtoFuncToUTCString::callAsFunction):
        (KJS::DateProtoFuncToDateString::callAsFunction):
        (KJS::DateProtoFuncToTimeString::callAsFunction):
        (KJS::DateProtoFuncToLocaleString::callAsFunction):
        (KJS::DateProtoFuncToLocaleDateString::callAsFunction):
        (KJS::DateProtoFuncToLocaleTimeString::callAsFunction):
        (KJS::DateProtoFuncValueOf::callAsFunction):
        (KJS::DateProtoFuncGetTime::callAsFunction):
        (KJS::DateProtoFuncGetFullYear::callAsFunction):
        (KJS::DateProtoFuncGetUTCFullYear::callAsFunction):
        (KJS::DateProtoFuncToGMTString::callAsFunction):
        (KJS::DateProtoFuncGetMonth::callAsFunction):
        (KJS::DateProtoFuncGetUTCMonth::callAsFunction):
        (KJS::DateProtoFuncGetDate::callAsFunction):
        (KJS::DateProtoFuncGetUTCDate::callAsFunction):
        (KJS::DateProtoFuncGetDay::callAsFunction):
        (KJS::DateProtoFuncGetUTCDay::callAsFunction):
        (KJS::DateProtoFuncGetHours::callAsFunction):
        (KJS::DateProtoFuncGetUTCHours::callAsFunction):
        (KJS::DateProtoFuncGetMinutes::callAsFunction):
        (KJS::DateProtoFuncGetUTCMinutes::callAsFunction):
        (KJS::DateProtoFuncGetSeconds::callAsFunction):
        (KJS::DateProtoFuncGetUTCSeconds::callAsFunction):
        (KJS::DateProtoFuncGetMilliSeconds::callAsFunction):
        (KJS::DateProtoFuncGetUTCMilliseconds::callAsFunction):
        (KJS::DateProtoFuncGetTimezoneOffset::callAsFunction):
        (KJS::DateProtoFuncSetTime::callAsFunction):
        (KJS::DateProtoFuncSetMilliSeconds::callAsFunction):
        (KJS::DateProtoFuncSetUTCMilliseconds::callAsFunction):
        (KJS::DateProtoFuncSetSeconds::callAsFunction):
        (KJS::DateProtoFuncSetUTCSeconds::callAsFunction):
        (KJS::DateProtoFuncSetMinutes::callAsFunction):
        (KJS::DateProtoFuncSetUTCMinutes::callAsFunction):
        (KJS::DateProtoFuncSetHours::callAsFunction):
        (KJS::DateProtoFuncSetUTCHours::callAsFunction):
        (KJS::DateProtoFuncSetDate::callAsFunction):
        (KJS::DateProtoFuncSetUTCDate::callAsFunction):
        (KJS::DateProtoFuncSetMonth::callAsFunction):
        (KJS::DateProtoFuncSetUTCMonth::callAsFunction):
        (KJS::DateProtoFuncSetFullYear::callAsFunction):
        (KJS::DateProtoFuncSetUTCFullYear::callAsFunction):
        (KJS::DateProtoFuncSetYear::callAsFunction):
        (KJS::DateProtoFuncGetYear::callAsFunction):
        * kjs/date_object.h:
        * kjs/lookup.cpp:
        (KJS::Lookup::find):
        * kjs/lookup.h:
        (KJS::HashEntry::):
        (KJS::staticFunctionGetter):
        (KJS::staticValueGetter):
        (KJS::getStaticPropertySlot):
        (KJS::getStaticFunctionSlot):
        (KJS::lookupPut):
        * kjs/math_object.cpp:
        (KJS::MathObjectImp::getOwnPropertySlot):
        (KJS::MathProtoFuncAbs::callAsFunction):
        (KJS::MathProtoFuncACos::callAsFunction):
        (KJS::MathProtoFuncASin::callAsFunction):
        (KJS::MathProtoFuncATan::callAsFunction):
        (KJS::MathProtoFuncATan2::callAsFunction):
        (KJS::MathProtoFuncCeil::callAsFunction):
        (KJS::MathProtoFuncCos::callAsFunction):
        (KJS::MathProtoFuncExp::callAsFunction):
        (KJS::MathProtoFuncFloor::callAsFunction):
        (KJS::MathProtoFuncLog::callAsFunction):
        (KJS::MathProtoFuncMax::callAsFunction):
        (KJS::MathProtoFuncMin::callAsFunction):
        (KJS::MathProtoFuncPow::callAsFunction):
        (KJS::MathProtoFuncRandom::callAsFunction):
        (KJS::MathProtoFuncRound::callAsFunction):
        (KJS::MathProtoFuncSin::callAsFunction):
        (KJS::MathProtoFuncSqrt::callAsFunction):
        (KJS::MathProtoFuncTan::callAsFunction):
        * kjs/math_object.h:
        (KJS::MathObjectImp::classInfo):
        (KJS::MathObjectImp::):
        * kjs/string_object.cpp:
        (KJS::StringPrototype::getOwnPropertySlot):
        (KJS::StringProtoFuncToString::callAsFunction):
        (KJS::StringProtoFuncValueOf::callAsFunction):
        (KJS::StringProtoFuncCharAt::callAsFunction):
        (KJS::StringProtoFuncCharCodeAt::callAsFunction):
        (KJS::StringProtoFuncConcat::callAsFunction):
        (KJS::StringProtoFuncIndexOf::callAsFunction):
        (KJS::StringProtoFuncLastIndexOf::callAsFunction):
        (KJS::StringProtoFuncMatch::callAsFunction):
        (KJS::StringProtoFuncSearch::callAsFunction):
        (KJS::StringProtoFuncReplace::callAsFunction):
        (KJS::StringProtoFuncSlice::callAsFunction):
        (KJS::StringProtoFuncSplit::callAsFunction):
        (KJS::StringProtoFuncSubstr::callAsFunction):
        (KJS::StringProtoFuncSubstring::callAsFunction):
        (KJS::StringProtoFuncToLowerCase::callAsFunction):
        (KJS::StringProtoFuncToUpperCase::callAsFunction):
        (KJS::StringProtoFuncToLocaleLowerCase::callAsFunction):
        (KJS::StringProtoFuncToLocaleUpperCase::callAsFunction):
        (KJS::StringProtoFuncLocaleCompare::callAsFunction):
        (KJS::StringProtoFuncBig::callAsFunction):
        (KJS::StringProtoFuncSmall::callAsFunction):
        (KJS::StringProtoFuncBlink::callAsFunction):
        (KJS::StringProtoFuncBold::callAsFunction):
        (KJS::StringProtoFuncFixed::callAsFunction):
        (KJS::StringProtoFuncItalics::callAsFunction):
        (KJS::StringProtoFuncStrike::callAsFunction):
        (KJS::StringProtoFuncSub::callAsFunction):
        (KJS::StringProtoFuncSup::callAsFunction):
        (KJS::StringProtoFuncFontcolor::callAsFunction):
        (KJS::StringProtoFuncFontsize::callAsFunction):
        (KJS::StringProtoFuncAnchor::callAsFunction):
        (KJS::StringProtoFuncLink::callAsFunction):
        * kjs/string_object.h:

2007-11-08  Adam Roben  <aroben@apple.com>

        Windows build fix

        Reviewed by Sam and Ada.

        * wtf/MathExtras.h: Get rid of a circular #include dependency to fix
        the build.

2007-11-08  Adam Roben  <aroben@apple.com>

        Fix a precedence warning on Windows

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::toBoolean):

2007-11-08  Mark Rowe  <mrowe@apple.com>

        Build fix for JavaScriptGlue.

        * wtf/MathExtras.h: Include stdlib.h for srand and RAND_MAX.

2007-11-08  Darin Adler  <darin@apple.com>

        - Windows build fix

        * kjs/JSImmediate.h: Include MathExtras.h rather than math.h since this file uses "signbit".

2007-11-08  Oliver Hunt  <oliver@apple.com>

        Reviewed by Darin.

        Replace the use of floats for immediate values with the use of integers for a 4.5% improvement in SunSpider.

        Unfortunately this change results in NaN, +Inf, -Inf, and -0 being heap allocated now, but
        we should now have faster array access, faster immediate to double conversion, and the 
        potential to further improve bitwise operators in future.

        This also removes the need for unions to avoid strict aliasing problems when extracting 
        a value from immediates.

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::trueImmediate):
        (KJS::JSImmediate::falseImmediate):
        (KJS::JSImmediate::undefinedImmediate):
        (KJS::JSImmediate::nullImmediate):
        (KJS::JSImmediate::toBoolean):
        * kjs/value.h:
        (KJS::jsNaN):

2007-11-07  Eric Seidel  <eric@webkit.org>

        Reviewed by Darin and Oliver.
        
        Add evaluateToNumber parallel evaluation tree to speed up number operations.
        Make ImmediateNumberNode a subclass of NumberNode.
        Share evaluate logic between evaluate and evaluateToNumber using inline functions
        There is still a lot of improvement to be made here.
        
        SunSpider claims this is a 1.0% speedup overall (nbody 7.9%), base64 slowing 2.0%
        Given the huge win that this prepares us for with simple type inferencing I see the small
        regression in base64 being worth the substantial overall improvement.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::Node::evaluateToNumber):
        (KJS::NumberNode::evaluate):
        (KJS::NumberNode::evaluateToNumber):
        (KJS::StringNode::evaluateToNumber):
        (KJS::LocalVarAccessNode::inlineEvaluate):
        (KJS::LocalVarAccessNode::evaluate):
        (KJS::LocalVarAccessNode::evaluateToNumber):
        (KJS::BracketAccessorNode::inlineEvaluate):
        (KJS::BracketAccessorNode::evaluate):
        (KJS::BracketAccessorNode::evaluateToNumber):
        (KJS::NegateNode::evaluate):
        (KJS::NegateNode::evaluateToNumber):
        (KJS::MultNode::inlineEvaluateToNumber):
        (KJS::MultNode::evaluate):
        (KJS::MultNode::evaluateToNumber):
        (KJS::DivNode::inlineEvaluateToNumber):
        (KJS::DivNode::evaluate):
        (KJS::DivNode::evaluateToNumber):
        (KJS::ModNode::inlineEvaluateToNumber):
        (KJS::ModNode::evaluate):
        (KJS::ModNode::evaluateToNumber):
        (KJS::throwOutOfMemoryErrorToNumber):
        (KJS::addSlowCaseToNumber):
        (KJS::add):
        (KJS::addToNumber):
        (KJS::AddNode::evaluateToNumber):
        (KJS::SubNode::inlineEvaluateToNumber):
        (KJS::SubNode::evaluate):
        (KJS::SubNode::evaluateToNumber):
        (KJS::valueForReadModifyAssignment):
        (KJS::ReadModifyLocalVarNode::evaluate):
        (KJS::ReadModifyResolveNode::evaluate):
        (KJS::ReadModifyDotNode::evaluate):
        (KJS::ReadModifyBracketNode::evaluate):
        * kjs/nodes.h:
        (KJS::Node::):
        (KJS::NumberNode::):
        (KJS::ImmediateNumberNode::):
        (KJS::AddNode::precedence):
        * kjs/nodes2string.cpp:
        (KJS::NumberNode::streamTo):

2007-11-07  Mark Rowe  <mrowe@apple.com>

        Reviewed by Eric.

        Fix up initialization after being mangled in r27572, and remove the
        ternary expression as extraCost will always be zero for the numeric
        heap.

        * kjs/collector.cpp:
        (KJS::Collector::heapAllocate):

2007-11-07  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * kjs/regexp_object.cpp:

2007-11-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth Dakin.
        
        Eliminated a bogus (though compiled-out) branch in the collector.

        * kjs/collector.cpp:
        (KJS::Collector::heapAllocate):

2007-11-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Fixed part of http://bugs.webkit.org/show_bug.cgi?id=15861 
        5.8% of string-validate-input.js is spent creating RegExpImps

        Put RegExpImp properties into a static hashtable to avoid a slew of
        PropertyMap churn when creating a RegExpImp.
        
        Factored important bits of regular expression implementation out of
        RegExpImp (the JS object) and into RegExp (the PCRE wrapper class), 
        making RegExp a ref-counted class. (This will help later.)

        Removed PCRE_POSIX support because I didn't quite know how to test it 
        and keep it working with these changes.
        
        1.1% SunSpider speedup. 5.8% speedup on string-validate-input.js.

        * kjs/regexp.h: A few interface changes:
        1. Renamed "subpatterns()" => "numSubpatterns()"
        2. Made flag enumeration private and replaced it with public getters for
        specific flags.
        3. Made RegExp ref-counted so RegExps can be shared by RegExpImps.
        4. Made RegExp take a string of flags instead of an int, eliminating 
        duplicated flag parsing code elsewhere.

        * kjs/regexp_object.cpp:
        (KJS::RegExpProtoFunc::callAsFunction): For RegExp.compile: 
        - Fixed a bug where compile(undefined) would throw an exception. 
        - Removed some now-redundant code.
        - Used RegExp sharing to eliminate an allocation and a bunch of 
        PropertyMap thrash. (Not a big win since compile is a deprecated 
        function. I mainly did this to test the plubming.)

2007-11-07  Simon Hausmann  <hausmann@kde.org>

        Reviewed by nobody, Qt/Windows build fix.

        JavaScriptCore.pri expects OBJECTS_DIR to be set, so set it in
        testkjs.pro, too, where it's included from.

        * kjs/testkjs.pro:

2007-11-07  Simon Hausmann  <shausman@trolltech.com>

        Reviewed by Lars.

        Fix "nmake clean" for the Qt/Windows build by replacing tmp/ with a variable that ends with the correct type of slash/backslash depending on the choice of compiler/make tool.

        * JavaScriptCore.pri:
        * pcre/pcre.pri:

2007-11-07  Lars Knoll  <lars@trolltech.com>

        Reviewed by Simon.

        fix umemcasecmp
        
        Pretty embarrassing bug. Has the potential to fix quite a few test failures.

        * wtf/unicode/qt4/UnicodeQt4.h:
        (WTF::Unicode::umemcasecmp):

2007-11-06  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.        
        
        - only collect when the heap is full, unless we have lots of extra cost garbage
        
        1.1% SunSpider speedup.
        
        This shouldn't hit memory use much since the extra space in those
        blocks hangs around either way.

        * kjs/collector.cpp:
        (KJS::Collector::heapAllocate):
        (KJS::Collector::collect): Fix logic error that reversed the sense of collect's 
        return value.

2007-11-06  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Avoid unnecessarily boxing the result from post inc/decrement for 0.3% gain in sunspider
        
        We now convert the common 'for (...; ...; <var>++) ...' to the semantically identical
        'for (...; ...; ++<var>) ...'.

        * kjs/nodes.cpp:
        (KJS::PostIncResolveNode::optimizeForUnnecessaryResult):
        (KJS::PostIncLocalVarNode::evaluate):
        (KJS::PostIncLocalVarNode::optimizeForUnnecessaryResult):
        (KJS::PostDecResolveNode::optimizeForUnnecessaryResult):
        (KJS::PostDecLocalVarNode::evaluate):
        (KJS::PostDecLocalVarNode::optimizeForUnnecessaryResult):
        * kjs/nodes.h:
        (KJS::PrePostResolveNode::):
        (KJS::PostIncResolveNode::):
        (KJS::PostIncLocalVarNode::):
        (KJS::PostDecResolveNode::):
        (KJS::PostDecLocalVarNode::):
        (KJS::PreIncResolveNode::):
        (KJS::PreDecResolveNode::):
        (KJS::ForNode::ForNode):

2007-11-06  Eric Seidel  <eric@webkit.org>

        Reviewed by darin.

        This fixes a regressed layout test for string + object
        
        SunSpider claims this was an overall 0.3% speedup, although some individual tests were slower.

        * kjs/nodes.cpp:
        (KJS::add): remove erroneous "fast path" for string + *

2007-11-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Eric Seidel.
        
        Added toJSNumber, a fast path for converting a JSValue to a JS number,
        and deployed it in postfix expressions. In the fast case this 
        eliminates a call to jsNumber.
        
        0.4% speedup on SunSpider.

        * ChangeLog:
        * kjs/nodes.cpp:
        (KJS::PostIncResolveNode::evaluate):
        (KJS::PostIncLocalVarNode::evaluate):
        (KJS::PostDecResolveNode::evaluate):
        (KJS::PostDecLocalVarNode::evaluate):
        (KJS::PostIncBracketNode::evaluate):
        (KJS::PostDecBracketNode::evaluate):
        (KJS::PostIncDotNode::evaluate):
        (KJS::PostDecDotNode::evaluate):
        (KJS::UnaryPlusNode::evaluate):
        * kjs/value.h:
        (KJS::JSValue::toJSNumber):

2007-11-06  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15846
          REGRESSION (r27387): Memory corruption when running fast/js/kde/delete.html

        There was a mistake in the algorithm used to find an empty slot in the property
        map entries vector; when we were putting in a new property value and not overwriting
        an existing deleted sentinel, we would enlarge the entries vector, but would not
        overwrite the stale data that's in the new part. It was easy to pin this down by
        turning on property map consistency checks -- I never would have landed with this
        bug if I had run the regression tests once with consistency checks on!

        * kjs/property_map.cpp: (KJS::PropertyMap::put): Changed logic for the case where
        foundDeletedElement is false to always use the item at the end of the entries vector.
        Also allowed me to merge with the logic for the "no deleted sentinels at all" case.

2007-11-06  Oliver Hunt  <oliver@apple.com>

        RS=Darin.

        Fix previous patch to use a 3 bit shift, a 16 bit shift causes a regression in sunspider.

        * kjs/nodes.cpp:
        (KJS::add):

2007-11-06  Oliver Hunt  <oliver@apple.com>

        Reviewed by Darin.

        Replace boolean comparisons in AddNode with mask
        comparisons for a 0.2% improvement in sunspider.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/nodes.cpp:
        (KJS::add):

2007-11-06  Eric Seidel  <eric@webkit.org>

        Reviewed by darin.
        
        SunSpider claims this is a 1.1% speedup.

        * kjs/nodes.cpp:
        (KJS::throwOutOfMemoryError): Added, non inline.
        (KJS::addSlowCase): renamed from add(), non inline.
        (KJS::add): add fast path for String + String, Number + Number and String + *

2007-11-06  Eric Seidel  <eric@webkit.org>

        Reviewed by mjs.
        
        Avoid more UString creation.
        
        SunSpider claims this is a 0.4% speedup.

        * kjs/regexp_object.cpp:
        (KJS::RegExpObjectImp::construct): use UString::find(UChar)

2007-11-05  Mark Rowe  <mrowe@apple.com>

        Mac build fix.

        * kjs/array_object.cpp:
        (KJS::ArrayProtoFunc::callAsFunction):

2007-11-05  Adam Roben  <aroben@apple.com>

        Windows build fix

        * kjs/list.h:

2007-11-05  Mark Rowe  <mrowe@apple.com>

        Build fix.  Add missing #include.

        * kjs/operations.cpp:

2007-11-05  Eric Seidel  <eric@webkit.org>

        Reviewed by mjs.
        
        Remove another call to toString(exec)
        
        SunSpider claims this is a 0.5% speedup.

        * kjs/operations.cpp:
        (KJS::equal): remove another toString

2007-11-05  Eric Seidel  <eric@webkit.org>

        * kjs/operations.cpp:
        (KJS::equal): correct broken change.

2007-11-05  Eric Seidel  <eric@webkit.org>

        Reviewed by mjs.

        Remove one more call to toString(exec).
        
        SunSpider claims this is a 0.7% speedup.

        * kjs/operations.cpp:
        (KJS::equal): remove a call to toString()

2007-11-05  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * pcre/pcre.pri:

2007-11-05  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * kjs/list.cpp:

2007-11-05  Geoffrey Garen  <ggaren@apple.com>

        Touched a file to test my new HTTP access.

        * kjs/scope_chain.cpp:

2007-11-05  Alp Toker  <alp@atoker.com>

        Unreviewed build fix for qmake-based ports.

        Someone with a better understanding of qmake still needs to sort out
        the INCLUDEPATH/DEPENDPATH mess.

        * JavaScriptCore.pri:

2007-11-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        http://bugs.webkit.org/show_bug.cgi?id=15835

        Switched List implementation from a custom heap allocator to an inline
        Vector, for a disappointing .5% SunSpider speedup.
        
        Also renamed List::slice to List::getSlice because "get" is the 
        conventional prefix for functions returning a value through an out 
        parameter.

        * kjs/array_object.cpp:
        (KJS::ArrayProtoFunc::callAsFunction): Removed some redundant function
        calls and memory accesses.

        * kjs/bool_object.cpp:
        (BooleanObjectImp::construct): Removed questionable use of iterator.

        * kjs/list.cpp:
        * kjs/list.h: New List class, implemented in terms of Vector. Two 
        interesting differences:
            1. The inline capacity is 8, not 5. Many of the Lists constructed 
            during a SunSpider run are larger than 5; almost none are larger
            than 8.

            2. The growth factor is 4, not 2. Since we can guarantee that Lists
            aren't long-lived, we can grow them more aggressively, to avoid
            excessive copying.

        * kjs/regexp_object.cpp:
        (RegExpObjectImp::construct): Removed redundant function calls.

        * kjs/string_object.cpp:
        (KJS::StringObjectImp::construct): Removed questionable use of iterator.

        * wtf/Vector.h:
        (WTF::::uncheckedAppend): Added a fast, unchecked version of append.

2007-11-05  Mark Rowe  <mrowe@apple.com>

        Reviewed by Alp Toker.

        Add DEPENDPATH to JavaScriptCore and pcre to help qmake with dependencies.

        * JavaScriptCore.pri:
        * pcre/pcre.pri:

2007-11-04  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15826
          optimize opcode loop and case insensitive ASCII compares for a 30% speedup

        SunSpider says it's 2.6% faster overall, 32.5% in the regular expression tests.

        * pcre/pcre_internal.h: Added OP_ASCII_CHAR and OP_ASCII_LETTER_NC.

        * pcre/pcre_compile.c:
        (find_fixedlength): Added cases for OP_ASCII_CHAR and OP_ASCII_LETTER_NC. Also
        added OP_NOT since there was no reason it should not be in here.
        (could_be_empty_branch): Ditto.
        (compile_branch): Streamlined all the single-character cases; there was a bit of
        duplicate code. Added cases for OP_ASCII_CHAR and OP_ASCII_LETTER_NC as needed.
        But in particular, compile to those opcodes when the single character match is
        ASCII.
        (find_firstassertedchar): Added cases for OP_ASCII_CHAR and OP_ASCII_LETTER_NC.

        * pcre/pcre_exec.c: (match): Removed the "min", "minimize", and "op" fields from
        the matchframe, after I discovered that none of them needed to be saved and restored
        across recursive match calls. Also eliminated the ignored result field from the
        matchframe, since I discovered that rrc ("recursive result code") was already the
        exact same thing. Moved the handling of opcodes higher than OP_BRA into the default
        statement of the switch instead of doing them before the switch. This removes a
        branch from each iteration of the opcode interpreter, just as removal of "op"
        removed at least one store from each iteration. Last, but not least, add the
        OP_ASCII_CHAR and OP_ASCII_LETTER_NC functions. Neither can ever match a
        surrogate pair and the letter case can be handled efficiently.

2007-11-04  Darin Adler  <darin@apple.com>

        * pcre/pcre_exec.c: (match): Try to fix the Windows build by removing unreachable code.

2007-11-03  Darin Adler  <darin@apple.com>

        - fix non-Mac builds; remove some more unused PCRE stuff

        * pcre/pcre_compile.c:
        (compile_branch): Removed branch chain and some unused ESC values.
        (compile_regex): Ditto.
        (jsRegExpCompile): Ditto.
        * pcre/pcre_exec.c:
        (match): Removed unused branch targets. Don't use macros any more.
        (jsRegExpExecute): More of the same.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Update for removed files.
        * JavaScriptCore.xcodeproj/project.pbxproj: Ditto.
        * pcre/pcre.pri: Ditto.

        * pcre/MERGING: Removed.
        * pcre/pcre_fullinfo.c: Removed.
        * pcre/pcre_get.c: Removed.
        * pcre/pcre_internal.h:
        * pcre/ucp.h: Removed.

2007-11-03  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15821
          remove unused PCRE features for speed

        A first step toward removing the PCRE features we don't use.
        This gives a 0.8% speedup on SunSpider, and a 6.5% speedup on
        the SunSpider regular expression test.

        Replaced the public interface with one that doesn't use the
        name PCRE. Removed code we don't need for JavaScript and various
        configurations we don't use. This is in preparation for still
        more changes in the future. We'll probably switch to C++ and
        make some even more significant changes to the regexp engine
        to get some additional speed.

        There's probably additional unused stuff that I haven't
        deleted yet.

        This does mean that our PCRE is now a fork, but I think that's
        not really a big deal.

        * JavaScriptCore.exp: Remove the 5 old entry points and add
        the 3 new entry points for WebCore's direct use of the regular
        expression engine.

        * kjs/config.h: Remove the USE(PCRE16) define. I decided to flip
        its sense and now there's a USE(POSIX_REGEX) instead, which should
        probably not be set by anyone. Maybe later we'll just get rid of it
        altogether.

        * kjs/regexp.h:
        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp): Switch to new jsRegExp function names and
        defines. Cut down on the number of functions used.
        (KJS::RegExp::~RegExp): Ditto.
        (KJS::RegExp::match): Ditto.

        * pcre/dftables.c: (main): Get rid of ctype_letter and ctype_meta,
        which are unused.

        * pcre/pcre-config.h: Get rid of EBCIDIC, PCRE_DATA_SCOPE, const,
        size_t, HAVE_STRERROR, HAVE_MEMMOVE, HAVE_BCOPY, NEWLINE,
        POSIX_MALLOC_THRESHOLD, NO_RECURSE, SUPPORT_UCP, SUPPORT_UTF8,
        and JAVASCRIPT. These are all no longer configurable in our copy
        of the library.

        * pcre/pcre.h: Remove the macro-based kjs prefix hack, the PCRE
        version macros, PCRE_UTF16, the code to set up PCRE_DATA_SCOPE,
        the include of <stdlib.h>, and most of the constants and
        functions defined in this header. Changed the naming scheme to
        use a JSRegExp prefix rather than a pcre prefix. In the future,
        we'll probably change this to be a C++ header.

        * pcre/pcre_compile.c: Removed all unused code branches,
        including many whole functions and various byte codes.
        Kept changes outside of removal to a minimum.
        (check_escape):
        (first_significant_code):
        (find_fixedlength):
        (find_recurse):
        (could_be_empty_branch):
        (compile_branch):
        (compile_regex):
        (is_anchored):
        (is_startline):
        (find_firstassertedchar):
        (jsRegExpCompile): Renamed from pcre_compile2 and changed the
        parameters around a bit.
        (jsRegExpFree): Added.

        * pcre/pcre_exec.c: Removed many unused opcodes and variables.
        Also started tearing down the NO_RECURSE mechanism since it's
        now the default. In some cases there were things in the explicit
        frame that could be turned into plain old local variables and
        other small like optimizations.
        (pchars):
        (match_ref):
        (match): Changed parameters quite a bit since it's now not used
        recursively.
        (jsRegExpExecute): Renamed from pcre_exec.

        * pcre/pcre_internal.h: Get rid of PCRE_DEFINITION, PCRE_SPTR,
        PCRE_IMS, PCRE_ICHANGED, PCRE_NOPARTIAL, PCRE_STUDY_MAPPED,
        PUBLIC_OPTIONS, PUBLIC_EXEC_OPTIONS, PUBLIC_DFA_EXEC_OPTIONS,
        PUBLIC_STUDY_OPTIONS, MAGIC_NUMBER, 16 of the opcodes,
        _pcre_utt, _pcre_utt_size, _pcre_try_flipped, _pcre_ucp_findprop,
        and _pcre_valid_utf8. Also moved pcre_malloc and pcre_free here.

        * pcre/pcre_maketables.c: Changed to only compile in dftables.
        Also got rid of many of the tables that we don't use.

        * pcre/pcre_tables.c: Removed the unused Unicode property tables.

        * pcre/pcre_ucp_searchfuncs.c: Removed everything except for
        _pcre_ucp_othercase.

        * pcre/pcre_xclass.c: (_pcre_xclass): Removed uneeded support
        for classes based on Unicode properties.

        * wtf/FastMallocPCRE.cpp: Removed unused bits. It would be good
        to eliminate this completely, but we need the regular expression
        code to be C++ first.

        * pcre/pcre_fullinfo.c:
        * pcre/pcre_get.c:
        * pcre/ucp.h:
        Files that are no longer needed. I didn't remove them with this
        check-in, because I didn't want to modify all the project files.

2007-11-03  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Sam.
        
        - remove NaN check from JSImmediate::fromDouble for 0.5% SunSpider speedup

        It turns out that doing this check costs more than it saves.
        
        * kjs/JSImmediate.h:
        (KJS::JSImmediate::fromDouble):

2007-11-03  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver.

        Remove dummy variable from ClassInfo reducing the size of the struct by 1 word.
        The variable had been kept around for binary compatibility, but since nothing
        else is there is no point in continuing to keep it around.

        * API/JSCallbackConstructor.cpp:
        * API/JSCallbackFunction.cpp:
        * API/JSCallbackObject.cpp:
        * bindings/objc/objc_runtime.mm:
        * bindings/runtime_array.cpp:
        * bindings/runtime_object.cpp:
        * kjs/array_instance.cpp:
        * kjs/array_object.cpp:
        * kjs/bool_object.cpp:
        * kjs/date_object.cpp:
        * kjs/error_object.cpp:
        * kjs/function.cpp:
        * kjs/internal.cpp:
        * kjs/lookup.h:
        * kjs/math_object.cpp:
        * kjs/number_object.cpp:
        * kjs/object.h:
        * kjs/regexp_object.cpp:
        * kjs/string_object.cpp:

2007-11-03  Kevin McCullough  <kmccullough@apple.com>

        - Updated testkjs results to make the build bots green until we
        can fix the tests that are failing.  The new failures are in DST.

        * tests/mozilla/expected.html:

2007-11-03  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Adam.
        
        - don't print the var twice for ForInNodes with a var declaration

        * kjs/nodes2string.cpp:
        (KJS::ForInNode::streamTo):

2007-11-03  Darin Adler  <darin@apple.com>

        * pcre/pcre_compile.c: (check_escape): Windows build fix. Get rid of
        C-incompatible declaration.

2007-11-03  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * kjs/nodes.cpp:  Add missing include.

2007-11-03  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=15814
          <rdar://problem/5536644> fast/js/kde/encode_decode_uri.html fails

        These changes cause us to match the JavaScript specification and pass the
        fast/js/kde/encode_decode_uri.html test.

        * kjs/function.cpp: (KJS::encode): Call the UTF-8 string conversion in its
        new strict mode, throwing an exception if there are malformed UTF-16 surrogate
        pairs in the text.

        * kjs/ustring.h: Added a strict version of the UTF-8 string conversion.
        * kjs/ustring.cpp:
        (KJS::decodeUTF8Sequence): Removed code to disallow U+FFFE and U+FFFF; while
        those might be illegal in some sense, they aren't supposed to get any special
        handling in the place where this function is currently used.
        (KJS::UString::UTF8String): Added the strictness.

2007-11-03  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15812
          some JavaScript tests (from the Mozilla test suite) are failing

        Two or three fixes get 7 more of the Mozilla tests passing.
        This gets us down from 61 failing tests to 54.

        * kjs/interpreter.h: (KJS::Interpreter::builtinRegExp):
        Made this inline and gave it a more specific type. Some day we should
        probably do that for all of these -- might even get a bit of a speed
        boost from it.
        * kjs/interpreter.cpp: Removed Interpreter::builtinRegExp now that it's
        inline in the header.

        * kjs/regexp_object.h:
        * kjs/regexp_object.cpp:
        (KJS::RegExpProtoFunc::callAsFunction): Moved test and exec out of the
        switch statement into the RegExpImp object, so they can be shared with
        RegExpImp::callAsFunction.
        (KJS::RegExpImp::match): Added. Common code used by both test and exec.
        (KJS::RegExpImp::test): Added.
        (KJS::RegExpImp::exec): Added.
        (KJS::RegExpImp::implementsCall): Added.
        (KJS::RegExpImp::callAsFunction): Added.
        (KJS::RegExpObjectImpPrivate::RegExpObjectImpPrivate): Initialize
        lastInput to null rather than empty string -- we take advantage of the
        difference in RegExpImp::match.
        (KJS::RegExpObjectImp::input): Added. No reason to go through hash tables
        just to get at a field like this.

        * pcre/pcre_compile.c: (check_escape): Changed the \u handling to match
        the JavaScript specification. If there are not 4 hex digits after the \u,
        then it's processed as if it wasn't an escape sequence at all.

        * pcre/pcre_internal.h: Added IS_NEWLINE, with the appropriate definition
        for JavaScript (4 specific Unicode values).
        * pcre/pcre_exec.c:
        (match): Changed all call sites to use IS_NEWLINE.
        (pcre_exec): Ditto.

        * tests/mozilla/expected.html: Updated to expect 7 more successful tests.

2007-11-03  David D. Kilzer  <ddkilzer@webkit.org>

        Sort files(...); sections of Xcode project files.

        Rubber-stamped by Darin.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-11-03  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - remove VarDeclListNode and simplify VarDeclNode evaluation for 0.4% SunSpider speedup

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::VarDeclNode::optimizeVariableAccess):
        (KJS::VarDeclNode::getDeclarations):
        (KJS::VarDeclNode::handleSlowCase):
        (KJS::VarDeclNode::evaluateSingle):
        (KJS::VarDeclNode::evaluate):
        (KJS::VarStatementNode::execute):
        * kjs/nodes.h:
        (KJS::VarDeclNode::):
        (KJS::VarStatementNode::):
        * kjs/nodes2string.cpp:
        (KJS::VarDeclNode::streamTo):

2007-11-03  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=15800
        REGRESSION (r27303): RegExp leaks

        * kjs/regexp_object.h:
        (KJS::RegExpImp::setRegExp):
        (KJS::RegExpImp::regExp):
        (KJS::RegExpImp::classInfo):
        * kjs/regexp_object.cpp:
        (RegExpImp::RegExpImp):
        (RegExpImp::~RegExpImp):
        Renamed reg member variable to m_regExp, changed it to use OwnPtr.

2007-11-02  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - add SourceElements as a typedef for Vector<RefPtr<StatementNode> >.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::statementListPushFIFO):
        (KJS::statementListGetDeclarations):
        (KJS::statementListInitializeDeclarationStacks):
        (KJS::statementListInitializeVariableAccessStack):
        (KJS::statementListExecute):
        (KJS::BlockNode::BlockNode):
        (KJS::FunctionBodyNode::FunctionBodyNode):
        (KJS::ProgramNode::ProgramNode):
        * kjs/nodes.h:
        (KJS::CaseClauseNode::):

2007-11-02  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15791
          change property map data structure for less memory use, better speed

        The property map now has an array of indices and a separate array of
        property map entries. This slightly slows down lookup because of a second
        memory acess, but makes property maps smaller and faster to iterate in
        functions like mark().

        SunSpider says this is 1.2% faster, although it makes the bitwise-end test
        more than 10% slower. To fix that we'll need to optimize global variable lookup.

        * kjs/property_map.cpp:
        (KJS::PropertyMapEntry::PropertyMapEntry):
        (KJS::PropertyMapHashTable::entries):
        (KJS::PropertyMapHashTable::allocationSize):
        (KJS::SavedProperties::SavedProperties):
        (KJS::SavedProperties::~SavedProperties):
        (KJS::PropertyMap::checkConsistency):
        (KJS::PropertyMap::~PropertyMap):
        (KJS::PropertyMap::clear):
        (KJS::PropertyMap::get):
        (KJS::PropertyMap::getLocation):
        (KJS::PropertyMap::put):
        (KJS::PropertyMap::insert):
        (KJS::PropertyMap::createTable):
        (KJS::PropertyMap::rehash):
        (KJS::PropertyMap::remove):
        (KJS::PropertyMap::mark):
        (KJS::comparePropertyMapEntryIndices):
        (KJS::PropertyMap::containsGettersOrSetters):
        (KJS::PropertyMap::getEnumerablePropertyNames):
        (KJS::PropertyMap::save):
        (KJS::PropertyMap::restore):
        * kjs/property_map.h:

2007-11-02  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15807
          HashMap needs a take() function that combines get and remove

        * wtf/HashMap.h: Added take function. Simplistic implementation for now,
        but still does only one hash table lookup.

        * kjs/array_instance.cpp: (KJS::ArrayInstance::put): Use take rather than
        a find followed by a remove.

2007-11-02  David Carson  <dacarson@gmail.com>

        Reviewed by Darin.

        Fix compiler warning "warning: suggest parentheses around && within ||"
        http://bugs.webkit.org/show_bug.cgi?id=15764

        * kjs/value.h: (KJS::JSValue::isNumber): Add parentheses.

2007-11-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        In preparation for making List a simple stack-allocated Vector:

        Removed all instances of List copying and/or assignment, and made List 
        inherit from Noncopyable.
        
        Functions that used to return a List by copy now take List& out 
        parameters.
        
        Layout tests and JS tests pass.

        * kjs/list.cpp:
        (KJS::List::slice): Replaced copyTail with a more generic slice 
        alternative. (JavaScriptCore only calls slice(1), but WebCore calls 
        slice(2)).

2007-11-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.

        Fixed http://bugs.webkit.org/show_bug.cgi?id=15785
        REGRESSION(r27344): Crash on load at finance.yahoo.com
        
        Reverted a small portion of my last check-in. (The speedup and the List 
        removal are still there, though.)
        
        ActivationImp needs to hold a pointer to its function, and mark that 
        pointer (rather than accessing its function through its ExecState, and 
        counting on the active scope to mark its function) because a closure 
        can cause an ActivationImp to outlive its ExecState along with any 
        active scope.

        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        * kjs/function.cpp:
        (KJS::FunctionImp::~FunctionImp):
        (KJS::ActivationImp::ActivationImp):
        * kjs/function.h:
        (KJS::ActivationImp::ActivationImpPrivate::ActivationImpPrivate):

        Also made HashTable a little more crash-happy in debug builds, so 
        problems like this will show up earlier:
        
        * wtf/HashTable.h:
        (WTF::HashTable::~HashTable):

2007-11-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Adam Roben.
        
        Addressed some of Darin's review comments.
        
        Used perl -p, which is the shorthand while(<>) {}.
        
        Made sure not to suppress bison's output.
        
        Added line to removed bison_out.txt, since this script removes other 
        intermediate files, too.

        * DerivedSources.make:

2007-11-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Removed List from ActivationImp, in preparation for making all lists
        stack-allocated.
        
        Tests pass.
        
        1.0% speedup on SunSpider, presumably due to reduced List refcount thrash.

        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        (KJS::ExecState::~ExecState):
        * kjs/function.cpp:
        (KJS::ActivationImp::ActivationImp):
        (KJS::ActivationImp::createArgumentsObject):
        * kjs/function.h:
        (KJS::ActivationImp::ActivationImpPrivate::ActivationImpPrivate):

2007-11-01  Adam Roben  <aroben@apple.com>

        Use jsNumberCell instead of jsNumber when converting double constants to JSValues

        This fixes fast/js/math.html, ecma/Date/15.9.5.10-1.js, and
        ecma/Date/15.9.5.12-1.js, which were suffering from a bug in MSVC.

        It also gets rid of an MSVC warning that we previously had to silence.

        Reviewed by Geoff.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Turn
        back on the "overflow in constant arithmetic" warning.
        * kjs/number_object.cpp:
        (NumberObjectImp::getValueProperty): Use jsNumberCell instead of
        jsNumber.

2007-10-31  Adam Roben  <aroben@apple.com>

        Windows build fix

        * kjs/ExecState.h:

2007-10-31  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - shave some cycles off of local storage access for a 1% SunSpider speedup
        
        Keep the LocalStorage pointer in the ExecState, instead of getting
        it from the ActivationImp all the time.

        * kjs/ExecState.cpp:
        (KJS::ExecState::updateLocalStorage):
        * kjs/ExecState.h:
        (KJS::ExecState::localStorage):
        * kjs/nodes.cpp:
        (KJS::LocalVarAccessNode::evaluate):
        (KJS::LocalVarFunctionCallNode::evaluate):
        (KJS::PostIncLocalVarNode::evaluate):
        (KJS::PostDecLocalVarNode::evaluate):
        (KJS::LocalVarTypeOfNode::evaluate):
        (KJS::PreIncLocalVarNode::evaluate):
        (KJS::PreDecLocalVarNode::evaluate):
        (KJS::ReadModifyLocalVarNode::evaluate):
        (KJS::AssignLocalVarNode::evaluate):
        (KJS::FunctionBodyNode::processDeclarationsForFunctionCode):

2007-10-31  Adam Roben  <aroben@apple.com>

        Fix a crash on launch due to a static initializer race

        We now use fast inline assembler spinlocks which can be statically
        initialized at compile time.

        As a side benefit, this speeds up SunSpider by 0.4%.

        Reviewed by Oliver.

        * wtf/FastMalloc.cpp:
        * wtf/TCSpinLock.h:
        (TCMalloc_SpinLock::Lock):
        (TCMalloc_SpinLock::Unlock):
        (TCMalloc_SlowLock):
        * wtf/TCSystemAlloc.cpp:

2007-10-31  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam.

        - Corrected spelling.

        * wtf/HashTraits.h:

2007-10-31  Mark Rowe  <mrowe@apple.com>

        Further Gtk build fixage.

        * kjs/regexp_object.cpp:

2007-10-31  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * kjs/regexp.h:

2007-10-31  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=15749
          RegExp/RegExpObjectImp cause needless UString creation

        Speeds things up 0.4% according to SunSpider.

        * kjs/config.h: Define USE(PCRE16) instead of HAVE(PCREPOSIX),
        because this library doesn't use the real PCRE -- it uses its
        own PCRE that works on UTF-16.

        * kjs/regexp.h: Removed a few unused functions. Changed the ifdef.
        Use Noncopyable. Change the return value of match.
        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp): Call pcre_compile2, for a slight speed boost.
        (KJS::RegExp::~RegExp): PCRE16 rather than PCREPOSIX.
        (KJS::RegExp::match): Change to return the position as an int and the
        ovector as a OwnArrayPtr<int> for efficiency and clearer storage management.

        * kjs/regexp_object.h: Change performMatch and arrayOfMatches to no longer
        require a result string.
        * kjs/regexp_object.cpp:
        (RegExpProtoFunc::callAsFunction): Update for new signature of performMatch.
        (RegExpObjectImp::performMatch): Change so it doesn't return a string.
        (RegExpObjectImp::arrayOfMatches): Simplify by unifying the handling of
        the main result with the backreferences; now it doesn't need to take
        a result parameter.
        (RegExpObjectImp::getBackref): Minor tweaks.
        (RegExpObjectImp::getLastParen): Ditto.
        (RegExpObjectImp::getLeftContext): Ditto.
        (RegExpObjectImp::getRightContext): Ditto.
        (RegExpObjectImp::getValueProperty): Change LastMatch case to call
        getBackref(0) so we don't need a separate getLastMatch function.

        * kjs/string_object.cpp:
        (KJS::replace): Update to use new performMatch, including merging the
        matched string section with the other substrings.
        (KJS::StringProtoFunc::callAsFunction): Update functions to use the
        new performMatch and match. Also change to use OwnArrayPtr.

2007-10-31  Oliver Hunt  <oliver@apple.com>

        * kjs/nodes.h: include OwnPtr.h

2007-10-31  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Remove SourceCodeElement class and replaced with a Vector for a 0.8% gain on sunspider

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::statementListPushFIFO):
        (KJS::statementListGetDeclarations):
        (KJS::statementListInitializeDeclarationStacks):
        (KJS::statementListInitializeVariableAccessStack):
        (KJS::statementListExecute):
        (KJS::BlockNode::optimizeVariableAccess):
        (KJS::BlockNode::BlockNode):
        (KJS::BlockNode::getDeclarations):
        (KJS::BlockNode::execute):
        (KJS::CaseClauseNode::optimizeVariableAccess):
        (KJS::CaseClauseNode::getDeclarations):
        (KJS::CaseClauseNode::evalStatements):
        (KJS::FunctionBodyNode::initializeDeclarationStacks):
        (KJS::FunctionBodyNode::optimizeVariableAccess):
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:
        (KJS::statementListStreamTo):
        (KJS::BlockNode::streamTo):
        (KJS::CaseClauseNode::streamTo):

2007-10-30  Mark Rowe  <mrowe@apple.com>

        * kjs/property_map.cpp: Added a missing using directive to fix the build
        for non-Mac ports. Mac worked only because it does the AllInOneFile compile.

2007-10-31  Maciej Stachowiak  <mjs@apple.com>

        * kjs/property_map.cpp: Include HashTable.h the right way to fix the build
        for non-Mac ports.

2007-10-31  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=11001
        WebKit doesn't support RegExp.compile method

        Test: fast/js/regexp-compile.html

        * kjs/regexp_object.cpp:
        (RegExpPrototype::RegExpPrototype):
        (RegExpProtoFunc::callAsFunction):
        * kjs/regexp_object.h:
        (KJS::RegExpProtoFunc::):
        Added RegExp.compile.

        * tests/mozilla/expected.html: js1_2/regexp/compile.js now passes.

2007-10-31  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - get rid of integer divide in PropertyMap and HashTable for 1% SunSpider speedup
        
        Integer divide sucks. Fortunately, a bunch of shifts and XORs
        biased towards the high bits is sufficient to provide a good
        double hash. Besides the SunSpider win, I used the dump statistics
        mode for both to verify that collisions did not increase and that
        the longest collision chain is not any longer.

        * kjs/property_map.cpp:
        (KJS::doubleHash):
        (KJS::PropertyMap::get):
        (KJS::PropertyMap::getLocation):
        (KJS::PropertyMap::put):
        (KJS::PropertyMap::insert):
        (KJS::PropertyMap::remove):
        (KJS::PropertyMap::checkConsistency):
        * wtf/HashTable.h:
        (WTF::doubleHash):
        (WTF::::lookup):
        (WTF::::lookupForWriting):
        (WTF::::fullLookupForWriting):
        (WTF::::add):

2007-10-30  Adam Roben  <aroben@apple.com>

        * kjs/collector.h: Make HeapType public so it can be used for non-member
        things like the HeapConstants struct template. Fixes the build on Windows.

2007-10-30  Adam Roben  <aroben@apple.com>

        Change ALWAYS_INLINE and WTF_PRIVATE_INLINE to use __forceinline on Windows

        Speeds up SunSpider by 0.4%.

        Reviewed by Steve and Maciej.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Disable
        a warning during LTCG in release builds about double -> float
        conversion.
        * wtf/AlwaysInline.h:
        * wtf/FastMalloc.h:

2007-10-30  Adam Roben  <aroben@apple.com>

        Use GetCurrentThreadId instead of pthread_self in FastMalloc

        Speeds up SunSpider by 0.3%.

        Reviewed by Steve.

        * wtf/FastMalloc.cpp:
        (WTF::TCMalloc_ThreadCache::InitTSD):
        (WTF::TCMalloc_ThreadCache::CreateCacheIfNecessary):

2007-10-30  Adam Roben  <aroben@apple.com>

        Switch to a Win32 critical section implementation of spinlocks
        
        Speeds up SunSpider by 0.4%.
        
        Reviewed by Steve.
        
        * wtf/FastMalloc.cpp:
        * wtf/TCSpinLock.h:
        (TCMalloc_SpinLock::TCMalloc_SpinLock):
        (TCMalloc_SpinLock::Init):
        (TCMalloc_SpinLock::Finalize):
        (TCMalloc_SpinLock::Lock):
        (TCMalloc_SpinLock::Unlock):
        * wtf/TCSystemAlloc.cpp:

2007-10-30  Adam Roben  <aroben@apple.com>

        Fix Bug 15586: REGRESSION (r26759-r26785): Windows nightly builds crash with Safari 3 Public Beta

        http://bugs.webkit.org/show_bug.cgi?id=15586

        Also fixes: <rdar://5565303> Cannot use regsvr32.exe to register WebKit.dll

        Use Win32 TLS functions instead of __declspec(thread), which breaks
        delay-loading.

        Reviewed by Steve.

        * wtf/FastMalloc.cpp:
        (WTF::getThreadHeap):
        (WTF::TCMalloc_ThreadCache::InitModule):

2007-10-30  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - allocate numbers in half-size cells, for an 0.5% SunSpider speedup
        http://bugs.webkit.org/show_bug.cgi?id=15772
        
        We do this by using a single mark bit per two number cells, and
        tweaking marking.
        
        Besides being an 0.5% win overall, this is a 7.1% win on morph.

        * kjs/collector.cpp:
        (KJS::Collector::heapAllocate):
        (KJS::Collector::markStackObjectsConservatively):
        (KJS::Collector::sweep):
        * kjs/collector.h:
        (KJS::SmallCollectorCell::):

2007-10-30  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Adam Roben, Sam Weinig.
        
        Made conflicts in grammar.y a persistent build failure.

        * DerivedSources.make:

2007-10-30  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Adam and Geoff.

        - Added a new cast so all the casts are in the same place.

        * API/APICast.h:
        (toGlobalRef):

2007-10-30  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.

        Fixed <rdar://problem/5567504> shift/reduce conflict introduced in r24457
        
        JS tests, including 

            ecma_2/Statements/dowhile-001.js
            ecma_2/Statements/dowhile-002.js
            ecma_2/Statements/dowhile-003.js
            ecma_2/Statements/dowhile-004.js
            ecma_2/Statements/dowhile-005.js
            ecma_2/Statements/dowhile-006.js
            ecma_2/Statements/dowhile-007.js
            js1_2/statements/do_while.js

        and layout tests, including

            do-while-expression-value.html
            do-while-semicolon.html
            do-while-without-semicolon.html
        
        pass.
        
        * kjs/grammar.y: Use the explicit "error" production, as we do with other
        automatic semicolon insertions, to disambiguate "do { } while();" from
        "do { } while()" followed by ";" (the empty statement).

2007-10-29  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Debranching remaining assignment nodes, and miscellaneous cleanup
        
        Split read-modify code paths out of AssignBracketNode and AssignDotNode
        Removed now unnecessary check for write-only assignment in ReadModifyLocalVarNode 
        and ReadModifyResolveNode evaluate methods

        Leads to a 1% gain in SunSpider.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::ReadModifyLocalVarNode::evaluate):
        (KJS::ReadModifyResolveNode::evaluate):
        (KJS::AssignDotNode::evaluate):
        (KJS::ReadModifyDotNode::optimizeVariableAccess):
        (KJS::ReadModifyDotNode::evaluate):
        (KJS::AssignBracketNode::evaluate):
        (KJS::ReadModifyBracketNode::optimizeVariableAccess):
        (KJS::ReadModifyBracketNode::evaluate):
        * kjs/nodes.h:
        (KJS::AssignBracketNode::):
        (KJS::AssignBracketNode::precedence):
        (KJS::AssignDotNode::):
        (KJS::AssignDotNode::precedence):
        * kjs/nodes2string.cpp:
        (KJS::ReadModifyBracketNode::streamTo):
        (KJS::AssignBracketNode::streamTo):
        (KJS::ReadModifyDotNode::streamTo):
        (KJS::AssignDotNode::streamTo):

2007-10-29  Oliver Hunt  <oliver@apple.com>

        Debranching various Node::evaluate implementations
        
        Reviewed by Maciej.
        
        Split the read-modify-write assignment cases out of AssignResolveNode and into ReadModifyResolveNode
        Split the increment and decrement cases for Prefix- and Postfix- ResolveNode, BracketNode, and DotNode
        
        Gains 1.6% on SunSpider

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::PostIncResolveNode::optimizeVariableAccess):
        (KJS::PostIncResolveNode::evaluate):
        (KJS::PostIncLocalVarNode::evaluate):
        (KJS::PostDecResolveNode::optimizeVariableAccess):
        (KJS::PostDecResolveNode::evaluate):
        (KJS::PostDecLocalVarNode::evaluate):
        (KJS::PostIncBracketNode::evaluate):
        (KJS::PostDecBracketNode::evaluate):
        (KJS::PostIncDotNode::evaluate):
        (KJS::PostDecDotNode::evaluate):
        (KJS::PreIncResolveNode::optimizeVariableAccess):
        (KJS::PreIncLocalVarNode::evaluate):
        (KJS::PreIncResolveNode::evaluate):
        (KJS::PreDecResolveNode::optimizeVariableAccess):
        (KJS::PreDecLocalVarNode::evaluate):
        (KJS::PreDecResolveNode::evaluate):
        (KJS::PreIncBracketNode::evaluate):
        (KJS::PreDecBracketNode::evaluate):
        (KJS::PreIncDotNode::evaluate):
        (KJS::PreDecDotNode::evaluate):
        (KJS::ReadModifyResolveNode::optimizeVariableAccess):
        (KJS::AssignResolveNode::optimizeVariableAccess):
        (KJS::AssignLocalVarNode::evaluate):
        (KJS::AssignResolveNode::evaluate):
        * kjs/nodes.h:
        (KJS::PostDecResolveNode::):
        (KJS::PostDecResolveNode::precedence):
        (KJS::PostDecLocalVarNode::):
        (KJS::PostfixBracketNode::):
        (KJS::PostfixBracketNode::precedence):
        (KJS::PostIncBracketNode::):
        (KJS::PostIncBracketNode::isIncrement):
        (KJS::PostDecBracketNode::):
        (KJS::PostDecBracketNode::isIncrement):
        (KJS::PostfixDotNode::):
        (KJS::PostfixDotNode::precedence):
        (KJS::PostIncDotNode::):
        (KJS::PostIncDotNode::isIncrement):
        (KJS::PostDecDotNode::):
        (KJS::PreIncResolveNode::):
        (KJS::PreDecResolveNode::):
        (KJS::PreDecResolveNode::precedence):
        (KJS::PreDecLocalVarNode::):
        (KJS::PrefixBracketNode::):
        (KJS::PrefixBracketNode::precedence):
        (KJS::PreIncBracketNode::):
        (KJS::PreIncBracketNode::isIncrement):
        (KJS::PreDecBracketNode::):
        (KJS::PreDecBracketNode::isIncrement):
        (KJS::PrefixDotNode::):
        (KJS::PrefixDotNode::precedence):
        (KJS::PreIncDotNode::):
        (KJS::PreIncDotNode::isIncrement):
        (KJS::PreDecDotNode::):
        (KJS::ReadModifyResolveNode::):
        (KJS::ReadModifyLocalVarNode::):
        (KJS::AssignResolveNode::):
        (KJS::AssignResolveNode::precedence):
        * kjs/nodes2string.cpp:
        (KJS::PostIncResolveNode::streamTo):
        (KJS::PostDecResolveNode::streamTo):
        (KJS::PostfixBracketNode::streamTo):
        (KJS::PostfixDotNode::streamTo):
        (KJS::PreIncResolveNode::streamTo):
        (KJS::PreDecResolveNode::streamTo):
        (KJS::ReadModifyResolveNode::streamTo):
        (KJS::AssignResolveNode::streamTo):

2007-10-29  Maciej Stachowiak  <mjs@apple.com>

        Not reviewed, build fix.
        
        - Include Vector.h in a way that actually works.

        * kjs/LocalStorage.h:

2007-10-29  Maciej Stachowiak  <mjs@apple.com>

        Not reviewed, build fix.
        
        - Install LocalStorage.h as a private header.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-10-29  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - Define good VectorTraits for LocalStorage entry for 0.5% speed improvement on SunSpider.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/LocalStorage.h: Added.
        (KJS::LocalStorageEntry::LocalStorageEntry):
        (WTF::):
        * kjs/function.h:
        * kjs/nodes.cpp:
        (KJS::FunctionBodyNode::processDeclarationsForFunctionCode):

2007-10-29  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Some small tweaks that I notice while reviewing Oliver's last patch.
        
        Includes removal of an unnecessary KJS_CHECKEXCEPTIONVALUE.
        
        No change in SunSpider because SunSpider doesn't take the code path that
        would execute the unnecessary KJS_CHECKEXCEPTIONVALUE much.

        * kjs/nodes.cpp:
        (KJS::LocalVarPostfixNode::evaluate):
        (KJS::TypeOfResolveNode::optimizeVariableAccess):
        (KJS::LocalVarTypeOfNode::evaluate):
        (KJS::PrefixResolveNode::optimizeVariableAccess):
        (KJS::LocalVarPrefixNode::evaluate):
        (KJS::AssignResolveNode::optimizeVariableAccess):
        (KJS::LocalVarAssignNode::evaluate):
        * kjs/nodes.h:
        (KJS::LocalVarTypeOfNode::):
        (KJS::PrefixResolveNode::):
        (KJS::LocalVarPrefixNode::):
        (KJS::AssignResolveNode::):
        (KJS::LocalVarAssignNode::):

2007-10-29  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.
        
        SunSpider claims this was a 0.7% speedup.

        * kjs/string_object.cpp:
        (KJS::StringProtoFunc::callAsFunction): avoid mallocing a jsString in the common case

2007-10-29  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Mark.
        
        - re-enable asserts for access to empty or deleted keys

        * wtf/HashTable.h:
        (WTF::::lookup):
        (WTF::::lookupForWriting):
        (WTF::::fullLookupForWriting):
        (WTF::::add):

2007-10-29  Eric Seidel  <eric@webkit.org>

        Build fix only, no review.

        * JavaScriptCore.exp: Export symbol for new StringInstance::getOwnPropertySlot

2007-10-29  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.  Move struct declarations into nodes.h.

        * kjs/grammar.y:
        * kjs/nodes.h:

2007-10-29  Eric Seidel  <eric@webkit.org>

        Reviewed by darin.
        
        Give StringInstance a getOwnPropertySlot(ExecState, unsigned, PropertySlot) fastpath, just like Arrays.
        Make it a compile time error to use toString(ExecState) on a StringInstance
        
        SunSpider claims this was a 6.6% speedup overall (22% on string-base64)

        * kjs/internal.h:
        (KJS::StringImp::getLength):
        * kjs/string_object.cpp:
        (KJS::StringInstance::lengthGetter):
        (KJS::StringInstance::inlineGetOwnPropertySlot):
        (KJS::StringInstance::getOwnPropertySlot):
        * kjs/string_object.h:

2007-10-28  Oliver Hunt  <oliver@apple.com>

        Reviewed by Darin.

        Add nodes to allow Assignment, TypeOf, and prefix operators to 
        make use of the new optimised local variable look up.

        5% gain on sunspider

        * kjs/nodes.cpp:
        (KJS::TypeOfResolveNode::optimizeVariableAccess):
        (KJS::LocalTypeOfAccessNode::evaluate):
        (KJS::PrefixResolveNode::optimizeVariableAccess):
        (KJS::PrefixLocalAccessNode::evaluate):
        (KJS::AssignResolveNode::optimizeVariableAccess):
        (KJS::AssignLocalAccessNode::evaluate):
        * kjs/nodes.h:
        (KJS::TypeOfResolveNode::):
        (KJS::TypeOfResolveNode::precedence):
        (KJS::LocalTypeOfAccessNode::):
        (KJS::PrefixResolveNode::):
        (KJS::PrefixResolveNode::precedence):
        (KJS::PrefixLocalAccessNode::):
        (KJS::AssignResolveNode::):
        (KJS::AssignLocalAccessNode::):

2007-10-28  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - avoid creating and then breaking circular lists in the parser, instead track head and tail pointers at parse time
        http://bugs.webkit.org/show_bug.cgi?id=15748
        
        Not a significant speedup or slowdown on SunSpider.

        * kjs/Parser.cpp:
        (KJS::clearNewNodes):
        * kjs/Parser.h:
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::BlockNode::BlockNode):
        (KJS::CaseBlockNode::CaseBlockNode):
        (KJS::FunctionBodyNode::FunctionBodyNode):
        (KJS::SourceElementsNode::SourceElementsNode):
        (KJS::ProgramNode::ProgramNode):
        * kjs/nodes.h:
        (KJS::ElementNode::):
        (KJS::ArrayNode::):
        (KJS::PropertyListNode::):
        (KJS::ObjectLiteralNode::):
        (KJS::ArgumentListNode::):
        (KJS::ArgumentsNode::):
        (KJS::VarDeclListNode::):
        (KJS::VarStatementNode::):
        (KJS::ForNode::):
        (KJS::ParameterNode::):
        (KJS::FuncExprNode::):
        (KJS::FuncDeclNode::):
        (KJS::SourceElementsNode::):
        (KJS::CaseClauseNode::):
        (KJS::ClauseListNode::):

2007-10-28  Mark Rowe  <mrowe@apple.com>

        Disable assertions in a manner that doesn't break the Qt Windows build.

        * wtf/HashTable.h:
        (WTF::::lookup):
        (WTF::::lookupForWriting):
        (WTF::::fullLookupForWriting):

2007-10-28  Geoffrey Garen  <ggaren@apple.com>

        Temporarily disabling some ASSERTs I introduced in my last check-in 
        because of http://bugs.webkit.org/show_bug.cgi?id=15747
        Lots of layout tests fail the !HashTranslator::equal(KeyTraits::emptyValue() ASSERT

        * wtf/HashTable.h:
        (WTF::::lookup):
        (WTF::::lookupForWriting):
        (WTF::::fullLookupForWriting):
        (WTF::::add):

2007-10-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Fixed http://bugs.webkit.org/show_bug.cgi?id=15746
        #ifndef ASSERT_DISABLED is no good!
        
        Replaced with #if !ASSERT_DISABLED.

        * wtf/HashTable.h:
        (WTF::::lookup):
        (WTF::::lookupForWriting):
        (WTF::::fullLookupForWriting):
        (WTF::::add):

2007-10-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Added FunctionCallResolveNode, PostfixResolveNode, and DeleteResolveNode
        to the AST transfom that replaces slow resolve nodes with fast local 
        variable alternatives.
        
        2.5% speedup on SunSpider.
        
        Also added some missing copyright notices.
        
        * kjs/nodes.cpp:
        (KJS::FunctionCallResolveNode::optimizeVariableAccess):
        (KJS::FunctionCallResolveNode::evaluate):
        (KJS::LocalVarFunctionCallNode::evaluate):
        (KJS::PostfixResolveNode::optimizeVariableAccess):
        (KJS::PostfixResolveNode::evaluate):
        (KJS::LocalVarPostfixNode::evaluate):
        (KJS::DeleteResolveNode::optimizeVariableAccess):
        (KJS::DeleteResolveNode::evaluate):
        (KJS::LocalVarDeleteNode::evaluate):
        * kjs/nodes.h:
        (KJS::FunctionCallResolveNode::):
        (KJS::LocalVarFunctionCallNode::LocalVarFunctionCallNode):
        (KJS::PostfixResolveNode::):
        (KJS::LocalVarPostfixNode::LocalVarPostfixNode):
        (KJS::DeleteResolveNode::):
        (KJS::LocalVarDeleteNode::LocalVarDeleteNode):

2007-10-28  Eric Seidel  <eric@webkit.org>

        Reviewed by darin.
        
        Inline UString::Rep::deref() for a 0.8% improvement in SunSpider
        Add virtual keyword to a few virtual functions previously unmarked.

        * kjs/internal.h:
        (KJS::StringImp::type):
        (KJS::NumberImp::type):
        * kjs/ustring.h:
        (KJS::UString::Rep::deref):

2007-10-28  Darin Adler  <darin@apple.com>

        - fix "broken everything" from the storage leak fix

        * wtf/RefPtr.h: (WTF::RefPtr::RefPtr): Added a PlacementNewAdopt constructor.
        * kjs/ustring.h: (KJS::UString::UString): Pass PlacementNewAdopt along to RefPtr.

2007-10-28  Darin Adler  <darin@apple.com>

        Reviewed by Adam.

        - turn on unused parameter waring on Mac OS X because it's already on elsewhere

        * Configurations/Base.xcconfig: Took out -wno-unused-parameter.

        * API/JSNode.c:
        * API/JSNodeList.c:
        * API/minidom.c:
        * API/testapi.c:
        Fixed unused variables by using them or marked them with UNUSED_PARAM.

        * kjs/CollectorHeapIntrospector.h: (KJS::CollectorHeapIntrospector::zoneCalloc):
        Removed parameter names to indicate they are unused.

2007-10-28  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix a storage leak where we ref the UString every time we replace
          a ResolveNode with a LocalVarAccessNode

        * kjs/identifier.h: (KJS::Identifier::Identifier): Added a constructor
        that takes PlacementNewAdopt.

        * kjs/nodes.h: (KJS::ResolveNode::ResolveNode): Initialize the ident
        with PlacementNewAdopt instead of the old value of ident.

        * kjs/ustring.h: (KJS::UString::UString): Added a constructor that
        takes PlacementNewAdopt.

2007-10-28  Darin Adler  <darin@apple.com>

        - Windows build fix; get rid of unused parameter

        * kjs/nodes.cpp: (KJS::ResolveNode::optimizeVariableAccess): Don't pass it.
        * kjs/nodes.h: (KJS::LocalVarAccessNode::LocalVarAccessNode): Remove it.
        The assertions weren't all that helpful.

2007-10-28  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.  Add include of MathExtras.h.

        * kjs/string_object.cpp:

2007-10-28  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej and Tim.

        Replace uses of isNaN and isInf with isnan and isinf, and
        remove isNaN and isInf.

        * kjs/config.h: Remove unused HAVE_'s.
        * kjs/date_object.cpp:
        (KJS::DateInstance::getTime):
        (KJS::DateInstance::getUTCTime):
        (KJS::DateProtoFunc::callAsFunction):
        (KJS::DateObjectImp::construct):
        (KJS::DateObjectFuncImp::callAsFunction):
        * kjs/function.cpp:
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/math_object.cpp:
        (MathFuncImp::callAsFunction):
        * kjs/nodes2string.cpp:
        (KJS::isParserRoundTripNumber):
        * kjs/number_object.cpp:
        (NumberProtoFunc::callAsFunction):
        * kjs/operations.cpp:
        * kjs/operations.h:
        * kjs/string_object.cpp:
        (KJS::StringProtoFunc::callAsFunction):
        * kjs/ustring.cpp:
        (KJS::UString::from):
        * kjs/value.cpp:
        (KJS::JSValue::toInteger):
        (KJS::JSValue::toInt32SlowCase):
        (KJS::JSValue::toUInt32SlowCase):

2007-10-28  Geoffrey Garen  <ggaren@apple.com>

        Build fix: use the new-fangled missingSymbolMarker().

        * kjs/nodes.cpp:
        (KJS::ResolveNode::optimizeVariableAccess):
        * kjs/nodes.h:
        (KJS::LocalVarAccessNode::LocalVarAccessNode):

2007-10-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak, Darin Adler.
        
        Much supporting work done by Maciej Stachowiak, Maks Orlovich, and 
        Cameron Zwarich.
        
        AST transfom to replace slow resolve nodes with fast local variable
        alternatives that do direct memory access. Currently, only ResolveNode
        provides a fast local variable alternative. 6 others are soon to come.
        
        16.7% speedup on SunSpider.
        
        Most of this patch is just scaffolding to support iterating all the 
        resolve nodes in the AST through optimizeResolveNodes(). In 
        optimizeResolveNodes(), most classes just push their child nodes onto 
        the processing stack, while ResolveNodes actually replace themselves in 
        the tree with more optimized alternatives, if possible.

        Here are the interesting bits:

        * kjs/nodes.h: Added PlacementNewAdoptTag, along with implementations 
        in Node and ResolveNode. This tag allows you to use placement new to 
        swap out a base class Node in favor of a subclass copy that holds the
        same data. (Without this tag, default initialization would NULL out
        RefPtrs, change line numbers, etc.)

        * kjs/nodes.cpp:
        (KJS::ResolveNode::evaluate): Since we're taking the slow path, ASSERT
        that the fast path is impossible, to make sure we didn't leave anything
        on the table.

        (KJS::FunctionBodyNode::optimizeResolveNodes): Here's where the AST 
        transformation happens.
        
        (KJS::ResolveNode::optimizeResolveNodes): Here's where the ResolveNode
        optimization happens.

        * kjs/function.h: Added symbolTable() accessor for, for the sake of 
        an ASSERT.

2007-10-28  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej.

        Fix "AllInOneFile.o has a global initializer in it".

        Some versions of gcc generate a global initializer for std::numeric_limits<size_t>::max().
        We can avoid this by moving it inside an inline function.

        * kjs/SymbolTable.h:
        (KJS::missingSymbolMarker):
        * kjs/function.cpp:
        (KJS::ActivationImp::getOwnPropertySlot):
        (KJS::ActivationImp::put):

2007-10-28  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Mark.
        
        - Added assertions to protect against adding empty or deleted keys to a HashTable

        * wtf/HashTable.h:
        (WTF::HashTable::lookup):
        (WTF::HashTable::lookupForWriting):
        (WTF::HashTable::fullLookupForWriting):
        (WTF::HashTable::add):

2007-10-28  Darin Adler  <darin@apple.com>

        - fix GTK build

        * kjs/nodes2string.cpp: (KJS::isParserRoundTripNumber):
        Use isNaN and isInf instead of isnan and isinf.

2007-10-28  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15735
          remove GroupNode to simplify AST and possibly get a modest speedup

        This patch removes 4 node types: GroupNode, PropertyNameNode,
        FunctionCallParenBracketNode, and FunctionCallParenDotNode.

        To remove GroupNode, we add knowledge of precedence to the tree nodes,
        and use that when serializing to determine where parentheses are needed.
        This means we no longer have to represent parentheses in the tree.

        The precedence values are named after productions in the grammar from the
        JavaScript standard.

        SunSpider says this is an 0.4% speedup.

        * kjs/function.h:
        * kjs/function.cpp: Removed escapeStringForPrettyPrinting -- it's part of
        serialization, so I moved it to the file that takes care of that.

        * kjs/grammar.y: Changed makeGetterOrSetterPropertyNode to use 0 to
        indicate failure instead of a separate boolean. Got rid of PropertyNameNode
        by merging the PropertyName rule into the Property rule (which was easier
        than figuring out how to pass the Identifier from one node to another).
        Got rid of GroupNode, nodeInsideAllParens(), FunctionCallParenBracketNode,
        and FunctionCallParenDotNode.

        * kjs/nodes.h: Removed unused forward declarations and Operator values.
        Added Precedence enum, and precedence function to all nodes. Removed
        nodeInsideAllParens. Added streamBinaryOperator function for serialization.
        Removed GroupNode and PropertyNameNode. Made PropertyNode store an Identifier.
        Removed FunctionCallParenBracketNode and FunctionCallParenDotNode.

        * kjs/nodes.cpp: Removed Node::nodinsideAllParens, GroupNode, and PropertyNameNode.
        (KJS::PropertyListNode::evaluate): Changed code to get name directly instead
        of converting it from an Identifier to a jsString then back to a UString
        then into an Identifier again!

        * kjs/nodes2string.cpp: Changed special-token implementation to use a separate
        function for each of Endl, Indent, Unindent, and DotExpr instead of using a
        single function with a switch. Added a precedence that you can stream in, to
        cause the next node serialized to add parentheses based on that precedence value.
        (KJS::operatorString): Moved to the top of the file.
        (KJS::escapeStringForPrettyPrinting): Moved here from function.cpp. Removed old
        workaround for snprintf, since StringExtras.h takes care of that.
        (KJS::operator<<): Made the char and char* versions faster by using UString's
        character append functions instead of constructing a UString. Added the logic
        to the Node* version to add parentheses if needed.
        (KJS::Node::streamLeftAssociativeBinaryOperator): Added helper function.
        (KJS::ElementNode::streamTo): Use PrecAssignment for the elements.
        (KJS::BracketAccessorNode::streamTo): Use PrecCall for the expression before
        the bracket.
        (KJS::DotAccessorNode::streamTo): Use PrecCall for the expression before the dot.
        (KJS::ArgumentListNode::streamTo): Use PrecAssignment for the arguments.
        (KJS::NewExprNode::streamTo): Use PrecMember for the expression.
        (KJS::FunctionCallValueNode::streamTo): Use PrecCall.
        (KJS::FunctionCallBracketNode::streamTo): Ditto.
        (KJS::FunctionCallDotNode::streamTo): Ditto.
        (KJS::PostfixBracketNode::streamTo): Ditto.
        (KJS::PostfixDotNode::streamTo): Ditto.
        (KJS::PostfixErrorNode::streamTo): Use PrecLeftHandSide.
        (KJS::DeleteBracketNode::streamTo): Use PrecCall.
        (KJS::DeleteDotNode::streamTo): Ditto.
        (KJS::DeleteValueNode::streamTo): Use PrecUnary.
        (KJS::VoidNode::streamTo): Ditto.
        (KJS::TypeOfValueNode::streamTo): Ditto.
        (KJS::PrefixBracketNode::streamTo): Use PrecCall.
        (KJS::PrefixDotNode::streamTo): Ditto.
        (KJS::PrefixErrorNode::streamTo): Use PrecUnary.
        (KJS::UnaryPlusNode::streamTo): Ditto.
        (KJS::NegateNode::streamTo): Ditto.
        (KJS::BitwiseNotNode::streamTo): Ditto.
        (KJS::LogicalNotNode::streamTo): Ditto.
        (KJS::MultNode::streamTo): Use streamLeftAssociativeBinaryOperator.
        (KJS::DivNode::streamTo): Ditto.
        (KJS::ModNode::streamTo): Ditto.
        (KJS::AddNode::streamTo): Ditto.
        (KJS::SubNode::streamTo): Ditto.
        (KJS::LeftShiftNode::streamTo): Ditto.
        (KJS::RightShiftNode::streamTo): Ditto.
        (KJS::UnsignedRightShiftNode::streamTo): Ditto.
        (KJS::LessNode::streamTo): Ditto.
        (KJS::GreaterNode::streamTo): Ditto.
        (KJS::LessEqNode::streamTo): Ditto.
        (KJS::GreaterEqNode::streamTo): Ditto.
        (KJS::InstanceOfNode::streamTo): Ditto.
        (KJS::InNode::streamTo): Ditto.
        (KJS::EqualNode::streamTo): Ditto.
        (KJS::NotEqualNode::streamTo): Ditto.
        (KJS::StrictEqualNode::streamTo): Ditto.
        (KJS::NotStrictEqualNode::streamTo): Ditto.
        (KJS::BitAndNode::streamTo): Ditto.
        (KJS::BitXOrNode::streamTo): Ditto.
        (KJS::BitOrNode::streamTo): Ditto.
        (KJS::LogicalAndNode::streamTo): Ditto.
        (KJS::LogicalOrNode::streamTo): Ditto.
        (KJS::ConditionalNode::streamTo): Ditto.
        (KJS::AssignResolveNode::streamTo): Use PrecAssignment for the right side.
        (KJS::AssignBracketNode::streamTo): Use PrecCall for the expression before
        the bracket and PrecAssignment for the right side.
        (KJS::AssignDotNode::streamTo): Ditto.
        (KJS::AssignErrorNode::streamTo): Use PrecLeftHandSide for the left side
        and PrecAssignment for the right side.
        (KJS::CommaNode::streamTo): Use PrecAssignment for both expressions.
        (KJS::AssignExprNode::streamTo): Use PrecAssignment.

2007-10-28  Kevin Ollivier  <kevino@theolliviers.com>

        Define wx port and set wx port USE options.

        Reviewed by Adam Roben.

        * wtf/Platform.h:

2007-10-28  Mark Rowe  <mrowe@apple.com>

        We don't include "config.h" in headers.

        * bindings/jni/jni_instance.h:
        * kjs/regexp.h:
        * wtf/TCPageMap.h:
        * wtf/TCSpinLock.h:

2007-10-28  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Mark.
        
        - avoid using non-portable SIZE_T_MAX in favor of std::numeric_limits

        * kjs/SymbolTable.h:
        (KJS::SymbolTableIndexHashTraits::emptyValue):
        * kjs/function.cpp:
        (KJS::ActivationImp::getOwnPropertySlot):
        (KJS::ActivationImp::put):

2007-10-28  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.
        
        - switch SymbolTable to be a HashMap instead of a PropertyMap for 3% SunSpider speedup

        * kjs/SymbolTable.h:
        (KJS::IdentifierRepHash::hash): Special hash function for identifier reps.
        (KJS::IdentifierRepHash::equal): ditto
        (KJS::SymbolTableIndexHashTraits::emptyValue): Special HashTraits for the index value.
        (KJS::SymbolTable): change to a typedef for a HashMap.
        * kjs/function.cpp:
        (KJS::ActivationImp::getOwnPropertySlot): Adjusted for new SymbolTable API.
        (KJS::ActivationImp::deleteProperty): ditto
        (KJS::ActivationImp::put): ditto

        * kjs/nodes.cpp:
        (KJS::FunctionBodyNode::initializesymbolTable): Adjusted, since
        you now have to store a UString::rep, not an identifier.

2007-10-27  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - numerous HashTable performance improvements
        
        This does not quite add up to a measurable win on SunSpider, but it allows a
        follow-on > 3% improvement and probably helps WebCore too.
        
        I made the following improvements, among others:
        
        - Made HashFunctions note whether it is ok to compare a real value with the equal() function
        to the empty or deleted value, and used this to optimize the comparisons done in hash lookup.
        
        - Specialized lookup so it doesn't have to do so many extra branches and build so many extra
        std::pairs for cases that don't need them. There are now four versions, one for read-only access,
        two for writing, and one folded directly into add() (these all were improvments).
        
        - Made HashMap::get() use lookup() directly instead of find() to avoid having to build iterators.
        
        - Made a special constructor for iterators that knows it points to
        a valid filled cell and so skips updating itself.

        - Reordered memory accesses in the various lookup functions for better code generation
        
        - Made simple translators avoid passing a hash code around
        
        - Other minor tweaks
        
        * wtf/HashTable.h:
        (WTF::):
        (WTF::HashTableConstIterator::HashTableConstIterator):
        (WTF::HashTableIterator::HashTableIterator):
        (WTF::IdentityHashTranslator::translate):
        (WTF::HashTable::end):
        (WTF::HashTable::lookup):
        (WTF::HashTable::lookupForWriting):
        (WTF::HashTable::makeKnownGoodIterator):
        (WTF::HashTable::makeKnownGoodConstIterator):
        (WTF::::lookup):
        (WTF::::lookupForWriting):
        (WTF::::fullLookupForWriting):
        (WTF::::add):
        (WTF::::addPassingHashCode):
        (WTF::::reinsert):
        (WTF::::find):
        (WTF::::contains):
        * kjs/identifier.cpp:
        (WTF::):
        * wtf/HashFunctions.h:
        (WTF::):
        * wtf/HashMap.h:
        (WTF::):
        (WTF::::get):
        * wtf/HashSet.h:
        (WTF::):
        (WTF::::add):
        * wtf/ListHashSet.h:
        (WTF::ListHashSetTranslator::translate):

2007-10-27  Darin Adler  <darin@apple.com>

        Reviewed by Eric.

        - fix ASCIICType.h for some Windows compiles

        * wtf/ASCIICType.h: Check the compiler, not the OS, since it's the
        compiler/library that has the wchar_t that is just a typedef.

2007-10-27  Kevin McCullough  <kmccullough@apple.com>

        - BuildFix
        - Forgot to change the build step when I changed the filename.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2007-10-27  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Fixed the rest of "ASSERTION FAILED: _hash in KJS::UString::Rep::
        computedHash()"
        http://bugs.webkit.org/show_bug.cgi?id=15718

        * kjs/identifier.cpp: Fixed more cases where an Identifier didn't get a 
        hash value. Also changed O(n) strlen to O(1) check for empty string.
        (KJS::Identifier::add):

        * kjs/ustring.cpp: Changed O(n) strlens to O(1) checks for empty string.
        (KJS::UString::UString):
        (KJS::UString::operator=):

2007-10-27  Darin Adler  <darin@apple.com>

        Reviewed by Eric.

        - fix pow on Windows

        * wtf/MathExtras.h: (wtf_pow): Add a special case for MSVC, which has
        a "pow" function that does not properly handle the case where arg1 is
        NaN and arg2 is 0.

        * kjs/math_object.cpp: (MathFuncImp::callAsFunction): Don't explicity
        specify "::pow" -- just "pow" is fine.

2007-10-27  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15711
          force JSImmediate to be inlined for roughly 1.2% SunSpider speedup

        * kjs/JSImmediate.h: Put ALWAYS_INLINE on everything.

        * kjs/object.h: Removed redundant includes.
        * kjs/value.h: Ditto.

2007-10-27  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Mark.
        
        - fixed "ASSERTION FAILED: _hash in KJS::UString::Rep::computedHash()"
        http://bugs.webkit.org/show_bug.cgi?id=15718

        * kjs/identifier.cpp:
        (KJS::Identifier::addSlowCase): Ensure that empty Identifiers have a hash computed,
        now that we count on all Identifiers already having one.

2007-10-27  Mark Rowe  <mrowe@apple.com>

        Silence a warning.

        * kjs/SymbolTable.h:

2007-10-27  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * kjs/function.h:

2007-10-26  Kevin McCullough  <kmccullough@apple.com>

       Rubber stamp by Adam. 

        - Renamed JSStringRefCOM to JSStringRefBSTR since it he only thing the
        files contain are functions that operate on BSTRs.

        * API/JSStringRefBSTR.cpp: Copied from API/JSStringRefCOM.cpp.
        * API/JSStringRefBSTR.h: Copied from API/JSStringRefCOM.h.
        * API/JSStringRefCOM.cpp: Removed.
        * API/JSStringRefCOM.h: Removed.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2007-10-26  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Adam.

        - Made JSStringCreateWithBSTR capable of handling null BSTRs.

        * API/JSStringRefCOM.cpp:
        (JSStringCreateWithBSTR):

2007-10-26  Sam Weinig  <sam@webkit.org>

        Windows build fix.

        * kjs/SymbolTable.h: Add header gaurd.
        * kjs/nodes.h: #include "SymbolTable.h"

2007-10-26  Geoffrey Garen  <ggaren@apple.com>

        Suggested by Anders Carlsson.
        
        Fixed tyop.

        * kjs/function.cpp:
        (KJS::ActivationImp::getOwnPropertySlot):

2007-10-26  Geoffrey Garen  <ggaren@apple.com>

        Suggested by Darin Adler.
        
        Use computedHash(), which is safer than just directly accessing _hash.

        * kjs/lookup.cpp:
        (KJS::Lookup::findEntry):
        (KJS::Lookup::find):

2007-10-26  Geoffrey Garen  <ggaren@apple.com>

        Build fix: svn add SymbolTable.h

        * kjs/SymbolTable.h: Added.
        (KJS::SymbolTable::set):
        (KJS::SymbolTable::get):

2007-10-26  Geoffrey Garen  <ggaren@apple.com>

        Build fix: export SymbolTable.h to WebCore.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-10-26  Geoffrey Garen  <ggaren@apple.com>

        Comment tweak suggested by Maciej.

        * kjs/function.cpp:
        (KJS::ActivationImp::getOwnPropertySlot):

2007-10-26  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Tweaked property maps to remove 2 branches. 2.5% speedup on SunSpider.

        * kjs/property_map.cpp: Use a special no branch accessor to the UString's
        hash value. Also, return immediately instead of branching to the end
        of the loop if the value is not found.
        (KJS::PropertyMap::get):
        (KJS::PropertyMap::getLocation):
        (KJS::PropertyMap::put):
        (KJS::PropertyMap::insert):
        (KJS::PropertyMap::remove):
        (KJS::PropertyMap::checkConsistency):

        * kjs/ustring.h:
        (KJS::UString::Rep::computedHash): Special no branch accessor to the
        UString's hash value. Used when the caller knows that the hash value
        has already been computed. (For example, if the caller got the UString
        from an Identifier.)

2007-10-26  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Switched ActivationImp to using a symbol table. For now, though, all
        clients take the slow path.
        
        Net .6% speedup on SunSpider.
        
        Slowdowns:
            - ActivationImp now mallocs in its constructor
            - Local variable hits use an extra level of indirection to retrieve 
            data
            - Local variable misses do two lookups

        Speedups:
            - Fast initialization of local variables upon function entry

        * JavaScriptCore.xcodeproj/project.pbxproj: Added SymbolTable.h
        
        * kjs/function.cpp:
        (KJS::ActivationImp::ActivationImp): Malloc a private structure to hold
        data that won't fit in a JSCell.
        (KJS::ActivationImp::argumentsGetter): Use slow symbol table path for 
        lookup.
        (KJS::ActivationImp::getOwnPropertySlot): ditto
        (KJS::ActivationImp::deleteProperty): ditto
        (KJS::ActivationImp::put): ditto
        (KJS::ActivationImp::createArgumentsObject): ditto

        (KJS::ActivationImp::mark): Call JSObject::mark first so that one of
        our properties doesn't try to recursively mark us. (This caused a crash
        in earlier testing. Not sure why we haven't run into it before.)

        * kjs/nodes.cpp: Functions now build a symbol table the first time 
        they're called.
        (KJS::VarDeclNode::evaluate):
        (KJS::FunctionBodyNode::FunctionBodyNode):
        (KJS::FunctionBodyNode::initializeSymbolTable):
        (KJS::FunctionBodyNode::processDeclarations):
        (KJS::FunctionBodyNode::processDeclarationsForFunctionCode):
        (KJS::FunctionBodyNode::processDeclarationsForProgramCode):

        * kjs/nodes.h:
        (KJS::FunctionBodyNode::symbolTable):

        * wtf/Forward.h: Added Vector.

2007-10-26  Kevin McCullough  <kmccullough@apple.com>

        - Corrected function name mistake in this changelog.

2007-10-26  Kevin McCullough  <kmccullough@apple.com>
        Reviewed by Sam and Steve.

        - Added convenience methods for converting between BSTR and JSStringRefs

        * API/JSStringRefCOM.cpp: Added.
        (JSStringCreateWithBSTR):
        (JSStringCopyBSTR):
        * API/JSStringRefCOM.h: Added.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2007-10-26  Mark Rowe  <mrowe@apple.com>

        Windows build fix.

        * kjs/collector.cpp:
        (KJS::Collector::collect):

2007-10-26  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Make the JSC GC use a separate heap for JSNumbers to get a 0.7-1.4% progression in SunSpider.

        * kjs/CollectorHeapIntrospector.cpp:
        (KJS::CollectorHeapIntrospector::init):
        (KJS::CollectorHeapIntrospector::enumerate):
        * kjs/CollectorHeapIntrospector.h:
        * kjs/collector.cpp:
        (KJS::Collector::recordExtraCost):
        (KJS::Collector::heapAllocate):
        (KJS::Collector::allocate):
        (KJS::Collector::allocateNumber):
        (KJS::Collector::registerThread):
        (KJS::Collector::markStackObjectsConservatively):
        (KJS::Collector::markMainThreadOnlyObjects):
        (KJS::Collector::sweep):
        (KJS::Collector::collect):
        * kjs/collector.h:
        * kjs/internal.h:
        (KJS::NumberImp::operator new):
          Force numbers to be allocated in the secondary heap.

2007-10-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - encourage GCC a little harder to inline a few hot functions for 1.5% improvement on SunSpider.

        * kjs/value.h:
        (KJS::JSValue::getUInt32):
        (KJS::JSValue::getTruncatedInt32):
        (KJS::JSValue::toNumber):
        * wtf/PassRefPtr.h:
        (WTF::PassRefPtr::~PassRefPtr):
        * wtf/RefPtr.h:
        (WTF::RefPtr::operator->):

2007-10-26  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * kjs/ExecState.h:

2007-10-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Mark.

        - Merge Context class fully into ExecState, since they are always created and used together.

        No measurable performance impact but this is a useful cleanup.

        * JavaScriptCore.pri:
        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        (KJS::ExecState::~ExecState):
        (KJS::ExecState::mark):
        (KJS::ExecState::lexicalInterpreter):
        * kjs/ExecState.h:
        (KJS::ExecState::dynamicInterpreter):
        (KJS::ExecState::setException):
        (KJS::ExecState::clearException):
        (KJS::ExecState::exception):
        (KJS::ExecState::exceptionSlot):
        (KJS::ExecState::hadException):
        (KJS::ExecState::scopeChain):
        (KJS::ExecState::callingExecState):
        (KJS::ExecState::propertyNames):
        * kjs/collector.cpp:
        (KJS::Collector::reportOutOfMemoryToAllInterpreters):
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        (KJS::FunctionImp::argumentsGetter):
        (KJS::FunctionImp::callerGetter):
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/interpreter.cpp:
        (KJS::Interpreter::Interpreter):
        (KJS::Interpreter::init):
        (KJS::Interpreter::evaluate):
        (KJS::Interpreter::mark):
        * kjs/interpreter.h:
        (KJS::Interpreter::setCurrentExec):
        (KJS::Interpreter::currentExec):
        * kjs/nodes.cpp:
        (KJS::currentSourceId):
        (KJS::currentSourceURL):
        (KJS::ThisNode::evaluate):
        (KJS::ResolveNode::evaluate):
        (KJS::FunctionCallResolveNode::evaluate):
        (KJS::PostfixResolveNode::evaluate):
        (KJS::DeleteResolveNode::evaluate):
        (KJS::TypeOfResolveNode::evaluate):
        (KJS::PrefixResolveNode::evaluate):
        (KJS::AssignResolveNode::evaluate):
        (KJS::VarDeclNode::evaluate):
        (KJS::DoWhileNode::execute):
        (KJS::WhileNode::execute):
        (KJS::ForNode::execute):
        (KJS::ForInNode::execute):
        (KJS::ContinueNode::execute):
        (KJS::BreakNode::execute):
        (KJS::ReturnNode::execute):
        (KJS::WithNode::execute):
        (KJS::SwitchNode::execute):
        (KJS::LabelNode::execute):
        (KJS::TryNode::execute):
        (KJS::FunctionBodyNode::processDeclarationsFunctionCode):
        (KJS::FunctionBodyNode::processDeclarationsProgramCode):
        (KJS::FunctionBodyNode::processDeclarations):
        (KJS::FuncDeclNode::makeFunction):
        (KJS::FuncExprNode::evaluate):

2007-10-26  Mark Rowe  <mrowe@apple.com>

        Windows build fix.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2007-10-26  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * JavaScriptCore.pri:
        * kjs/ExecState.cpp:

2007-10-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - moved Context class into ExecState.{h,cpp} in preparation for merging 
        ExecState and Context classes.

        * kjs/ExecState.h: Moved CodeType enum and Context class here in
        preparation for merging ExecState and Context.
        * kjs/ExecState.cpp: Moved Context class here from Context.cpp.
        (KJS::Context::Context):
        (KJS::Context::~Context):
        (KJS::Context::mark):
        * kjs/context.h: Removed.
        * kjs/Context.cpp: Removed.
        * kjs/function.h: Removed CodeType enum.
        * kjs/LabelStack.h: Added. Pulled LabelStack class out of internal.h.
        * kjs/internal.h: Removed LabelStack.
        * JavaScriptCore.xcodeproj/project.pbxproj: Added new file, removed ones that are gone.
        * kjs/collector.cpp: Fixed includes.
        * kjs/function.cpp: ditto
        * kjs/internal.cpp: ditto
        * kjs/interpreter.cpp: ditto
        * kjs/lookup.h: ditto
        * kjs/nodes.cpp: ditto

2007-10-26  Mark Rowe  <mrowe@apple.com>

        Windows build fix.

        * kjs/string_object.cpp:
        (KJS::StringObjectFuncImp::callAsFunction):

2007-10-25  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15703
          fix numeric functions -- improve correctness and speed

        Gives about 1% gain on SunSpider.

        * kjs/value.h: Added toIntegerPreserveNan, removed toUInt16.
        (KJS::JSValue::toInt32): Changed to call getTruncatedInt32 in a way that works
        with both immediate and number values.
        (KJS::JSValue::toUInt32): Ditto.
        * kjs/value.cpp:
        (KJS::JSValue::toInteger): Moved the logic from roundValue here, with a couple
        differences. One is that it now correctly returns 0 for NaN, and another is that
        there's no special case for 0 or infinity, since the general case already handles
        those correctly.
        (KJS::JSValue::toIntegerPreserveNaN): Added. Like toInteger, but without the
        check for NaN.
        (KJS::JSValue::toInt32SlowCase): Call toNumber instead of roundValue. The
        truncation done by the typecast already does the necessary truncation that
        roundValue was doing.
        (KJS::JSValue::toUInt32SlowCase): Ditto.
        (KJS::JSValue::toUInt16): Removed.

        * kjs/internal.h: Removed roundValue.
        * kjs/internal.cpp: Ditto.

        * kjs/array_object.cpp: (KJS::ArrayProtoFunc::callAsFunction): Remove unneeded
        code to handle NaN in Array.slice; toInteger now never returns NaN as specified.

        * kjs/date_object.cpp:
        (KJS::fillStructuresUsingTimeArgs): Replaced call to roundValue with a call to
        toNumber as specified.
        (KJS::DateProtoFunc::callAsFunction): In SetTime case, replaced call to roundValue
        with a call to toNumber and timeClip as specified.
        (KJS::DateObjectImp::construct): Removed unnecessary checks of numArgs in cases
        where the default behavior of toInt32 (returning 0) was already correct. Replaced
        call to roundValue with a call to toNumber as specified.
        (KJS::DateObjectFuncImp::callAsFunction): Ditto.

        * kjs/math_object.cpp: (MathFuncImp::callAsFunction): Removed unnecessary special
        cases for the pow function that the library already handles correctly.

        * kjs/number_object.cpp: (NumberProtoFunc::callAsFunction): Changed ToString to
        call toIntegerPreserveNaN, so we can continue to handle the NaN case differently.
        The real toInteger now returns 0 for NaN. Took out unneeded special case in
        ToFixed for undefined; was only needed because our toInteger was wrong. Same
        thing in ToExponential. Changed ToPrecision to call toIntegerPreserveNaN.

        * kjs/string_object.cpp:
        (KJS::StringProtoFunc::callAsFunction): Took out CharAt and CharCodeAt special
        cases for undefined that were only needed because toInteger was wrong. Same in
        IndexOf, and was able to remove some special cases. In LastIndexOf, used
        toIntegerPreserveNaN, but was able to remove some special cases there too.
        Changed Substr implementation to preserve correct behavior with the change
        to toInteger and match the specification. Also made sure we weren't converting
        an out of range double to an int.
        (KJS::StringObjectFuncImp::callAsFunction): Changed constructor to just use
        toUInt32, because truncating toUInt32 to 16 bits is the same thing and there's
        no reason to have toUInt16 as a second, less-optimized function that's only
        called at this one call site.

        * wtf/MathExtras.h: Added trunc function for Windows.

2007-10-25  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Tweaked the inner hashtable lookup loop to remove a branch in the "not 
        found" case. .5% speedup on SunSpider.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * wtf/HashTable.h:
        (WTF::::lookup):

2007-10-25  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.

        - fold together toPrimitive() and toNumber() conversions for 0.5% gain on SunSpider

        * kjs/nodes.cpp:
        (KJS::SubNode::evaluate): Subtract directly, since toPrimitive() is not
        adding any value over toNumber() here.
        (KJS::valueForReadModifyAssignment): Ditto.
        (KJS::lessThan): Use new getPrimitiveNumber() method to avoid some virtual calls
        and branches.
        (KJS::lessThanEq): Ditto.
        * JavaScriptCore.exp: Export new functions as needed.
        * kjs/value.h:
        (KJS::JSValue::toPrimitive): Fixed formatting.
        (KJS::JSValue::getPrimitiveNumber): New method - this simultaneously converts
        to number and tells you whether a toPrimitive() conversion with a Number hint
        would have given a string.
        * kjs/internal.cpp:
        (KJS::StringImp::getPrimitiveNumber): Implemented. 
        (KJS::NumberImp::getPrimitiveNumber): ditto
        (KJS::GetterSetterImp::getPrimitiveNumber): ditto
        (KJS::StringImp::toPrimitive): Fixed formatting.
        (KJS::NumberImp::toPrimitive): ditto
        (KJS::GetterSetterImp::toPrimitive): ditto
        * kjs/internal.h:
        * kjs/object.cpp:
        (KJS::JSObject::getPrimitiveNumber): Implemented.
        * kjs/object.h:

2007-10-25  Sam Weinig  <sam@webkit.org>

        Reviewed by Adam Roben.

        Remove JSStringRefCFHack from windows as it is no longer needed.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2007-10-25  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Rolled out my last patch. It turns out that I needed 2 words, not 1,
        so it didn't help.

2007-10-25  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed http://bugs.webkit.org/show_bug.cgi?id=15694
        Shrink the size of an activation object by 1 word
        
        This is in preparation for adding a symbol table to the activation 
        object.
        
        The basic strategy here is to rely on the mutual exclusion between
        the arguments object pointer and the function pointer (you only need
        the latter in order to create the former), and store them in the same 
        place. The LazyArgumentsObject class encapsulates this strategy.
        
        Also inlined the ArgumentsImp constructor, for good measure.
        
        SunSpider reports no regression. Regression tests pass.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/Context.cpp:
        (KJS::Context::~Context):
        * kjs/function.cpp:
        (KJS::ActivationImp::LazyArgumentsObject::createArgumentsObject):
        (KJS::ActivationImp::LazyArgumentsObject::mark):
        (KJS::ActivationImp::argumentsGetter):
        (KJS::ActivationImp::mark):
        * kjs/function.h:
        (KJS::ActivationImp::LazyArgumentsObject::LazyArgumentsObject):
        (KJS::ActivationImp::LazyArgumentsObject::getOrCreate):
        (KJS::ActivationImp::LazyArgumentsObject::resetArguments):
        (KJS::ActivationImp::LazyArgumentsObject::setArgumentsObject):
        (KJS::ActivationImp::LazyArgumentsObject::argumentsObject):
        (KJS::ActivationImp::LazyArgumentsObject::setFunction):
        (KJS::ActivationImp::LazyArgumentsObject::function):
        (KJS::ActivationImp::LazyArgumentsObject::createdArgumentsObject):
        (KJS::ActivationImp::LazyArgumentsObject::):
        (KJS::ActivationImp::ActivationImp::ActivationImp):
        (KJS::ActivationImp::resetArguments):

2007-10-25  Adam Roben  <aroben@apple.com>

        Change JavaScriptCore.vcproj to use DerivedSources.make

        We were trying to emulate the logic of make in
        build-generated-files.sh, but we got it wrong. We now use a
        build-generated-files very much like the one that WebCore uses to
        invoke make.

        We also now only have a Debug configuration of dftables which we build
        even when doing a Release build of JavaScriptCore. dftables also no
        longer has the "_debug" name suffix.

        Changes mostly made by Darin, reviewed by me.

        * DerivedSources.make: Add a variable to set the extension used for
        the dftables executable.
        * JavaScriptCore.vcproj/JavaScriptCore.sln: Updated to use Debug
        dftables in Release configurations.
        * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: Ditto.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
           - Updated include path to point to the new location of the derived
             sources.
           - Modified pre-build event to pass the right arguments to
             build-generated-files.sh and not call dftables directly.
           - Added the derived source files to the project.
           - Removed grammarWrapper.cpp, which isn't needed now that we're
             compiling grammar.cpp directly.
        * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh:
        Slightly modified from the WebCore version.
        * JavaScriptCore.vcproj/JavaScriptCore/grammarWrapper.cpp: Removed.
        * JavaScriptCore.vcproj/dftables/dftables.vcproj:
            - Changed the output location to match Mac.
            - Removed the Release configuration.
            - Removed the _debug suffix.

2007-10-25  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Eric Seidel.
        
        Slightly elaborated the differences between declaration procesing in 
        Function Code and Program Code.
        
        .3% speedup on SunSpider.

        * kjs/nodes.cpp:
        (KJS::FunctionBodyNode::processDeclarationsFunctionCode): 
        (KJS::FunctionBodyNode::processDeclarationsProgramCode): Store a 
        minimum set of attributes instead of recomputing all the time. Also,
        ignore m_parameters, since programs don't have arguments.

2007-10-25  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.
        
        More preparation work before adding long-running mode to testkjs.

        * kjs/testkjs.cpp:
        (TestFunctionImp::callAsFunction):
        (prettyPrintScript):
        (runWithScripts):
        (parseArguments):
        (kjsmain):
        (fillBufferWithContentsOfFile):

2007-10-25  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.
        
        Bring testkjs code out of the dark ages in preparation for more
        radical improvements (like long-running testing support!)

        * kjs/testkjs.cpp:
        (TestFunctionImp::callAsFunction):
        (setupInterpreter):
        (doIt):
        (fillBufferWithContentsOfFile):

2007-10-25  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Make a fast path for declaration processing inside Function Code.
        
        Lifted declaration processing code up from individual declaration nodes
        and into processDeclarations.
        
        Broke out processDeclarations into two cases, depending on the type of 
        code. This eliminates 2 branches, and facilitates more radical 
        divergeance in the future.
        
        2.5% SunSpider speedup.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/nodes.cpp:
        (KJS::FunctionBodyNode::initializeDeclarationStacks):
        (KJS::FunctionBodyNode::processDeclarationsFunctionCode):
        (KJS::FunctionBodyNode::processDeclarationsProgramCode):
        (KJS::FunctionBodyNode::execute):
        (KJS::FuncDeclNode::makeFunction):
        * kjs/nodes.h:

2007-10-25  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Adam.
        
        - add header includes needed on platforms that don't use AllInOneFile.cpp

        * API/JSCallbackObject.cpp:
        * kjs/Context.cpp:
        * kjs/ExecState.cpp:
        * kjs/array_instance.cpp:
        * kjs/function_object.cpp:
        * kjs/interpreter.cpp:
        * kjs/nodes.cpp:

2007-10-25  Eric Seidel  <eric@webkit.org>

        Reviewed by Geoff.

        * JavaScriptCore.xcodeproj/project.pbxproj: re-mark JSGlobalObject.h as private

2007-10-25  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed http://bugs.webkit.org/show_bug.cgi?id=15683
        Re-order declaration initialization to avoid calling hasProperty inside
        VarDeclNode::processDeclaration
        
        .7% speedup on SunSpider.

        * kjs/function.h:
        * kjs/function.cpp: Merged parameter processing into FunctionBodyNode's
        other processing of declared symbols, so the order of execution could 
        change.

        * kjs/nodes.cpp:
        (KJS::VarDeclNode::getDeclarations): Added special case for the 
        "arguments" property name, explained in the comment.

        (KJS::VarDeclNode::processDeclaration): Removed call to hasProperty
        in the case of function code, since we know the declared symbol
        management will resolve conflicts between symbols. Yay!

        (KJS::VarDeclListNode::getDeclarations): Now that VarDeclNode's 
        implementation of getDeclarations is non-trivial, we can't take a 
        short-cut here any longer -- we need to put the VarDecl node on the 
        stack so it gets processed normally.

        (KJS::FunctionBodyNode::processDeclarations): Changed the order of 
        processing to enforce mutual exclusion rules.

        * kjs/nodes.h:
        (KJS::DeclarationStacks::DeclarationStacks): Structure includes an 
        ExecState now, for fast access to the "arguments" property name.

2007-10-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.
        
        Add a JSGlobalObject class and remove the InterpreterMap
        http://bugs.webkit.org/show_bug.cgi?id=15681
        
        This required making JSCallbackObject a template class to allow for
        JSGlobalObjects with JSCallbackObject functionality.
        
        SunSpider claims this was a 0.5% speedup.

        * API/JSCallbackObject.cpp:
        * API/JSCallbackObject.h:
        * API/JSCallbackObjectFunctions.h: Copied from API/JSCallbackObject.cpp.
        (KJS::::JSCallbackObject):
        (KJS::::init):
        (KJS::::~JSCallbackObject):
        (KJS::::initializeIfNeeded):
        (KJS::::className):
        (KJS::::getOwnPropertySlot):
        (KJS::::put):
        (KJS::::deleteProperty):
        (KJS::::implementsConstruct):
        (KJS::::construct):
        (KJS::::implementsHasInstance):
        (KJS::::hasInstance):
        (KJS::::implementsCall):
        (KJS::::callAsFunction):
        (KJS::::getPropertyNames):
        (KJS::::toNumber):
        (KJS::::toString):
        (KJS::::setPrivate):
        (KJS::::getPrivate):
        (KJS::::inherits):
        (KJS::::cachedValueGetter):
        (KJS::::staticValueGetter):
        (KJS::::staticFunctionGetter):
        (KJS::::callbackGetter):
        * API/JSClassRef.cpp:
        (OpaqueJSClass::prototype):
        * API/JSContextRef.cpp:
        (JSGlobalContextCreate):
        * API/JSObjectRef.cpp:
        (JSObjectMake):
        (JSObjectGetPrivate):
        (JSObjectSetPrivate):
        * API/JSValueRef.cpp:
        (JSValueIsObjectOfClass):
        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertValueToNPVariant):
        * bindings/jni/jni_jsobject.cpp:
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        * kjs/Context.cpp:
        (KJS::Context::Context):
        * kjs/ExecState.cpp:
        (KJS::ExecState::lexicalInterpreter):
        * kjs/JSGlobalObject.h: Added.
        (KJS::JSGlobalObject::JSGlobalObject):
        (KJS::JSGlobalObject::isGlobalObject):
        (KJS::JSGlobalObject::interpreter):
        (KJS::JSGlobalObject::setInterpreter):
        * kjs/array_instance.cpp:
        * kjs/context.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/interpreter.cpp:
        (KJS::Interpreter::Interpreter):
        (KJS::Interpreter::init):
        (KJS::Interpreter::~Interpreter):
        (KJS::Interpreter::globalObject):
        (KJS::Interpreter::initGlobalObject):
        (KJS::Interpreter::evaluate):
        * kjs/interpreter.h:
        * kjs/lookup.h:
        (KJS::cacheGlobalObject):
        * kjs/object.h:
        (KJS::JSObject::isGlobalObject):
        * kjs/testkjs.cpp:

2007-10-24  Eric Seidel  <eric@webkit.org>

        Build fix for Gtk, no review.

        * kjs/collector.cpp: #include "context.h"

2007-10-24  Eric Seidel  <eric@webkit.org>

        Reviewed by Maciej.
        
        Stop checking isOutOfMemory after every allocation, instead let the collector
        notify all ExecStates if we ever hit this rare condition.
        
        SunSpider claims this was a 2.2% speedup.

        * kjs/collector.cpp:
        (KJS::Collector::collect):
        (KJS::Collector::reportOutOfMemoryToAllInterpreters):
        * kjs/collector.h:
        * kjs/nodes.cpp:
        (KJS::TryNode::execute):

2007-10-24  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * kjs/identifier.h:  Remove extra qualification.

2007-10-24  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Disable ALWAYS_INLINE in debug builds, since it drives the debugger
        crazy.

        * wtf/AlwaysInline.h:

2007-10-24  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Inlined the fast path for creating an Identifier from an Identifier. 
        
        This is a .4% speedup on SunSpider overall, but as big as a 2.5% 
        speedup on certain individual tests. 65% of the Identifiers creating 
        by SunSpider are already Identifiers.
        
        (The main reason I'm making this change is that it resolves a large
        regression in a patch I haven't checked in yet.)

        * JavaScriptCore.exp:
        * kjs/identifier.cpp:
        (KJS::Identifier::addSlowCase):
        * kjs/identifier.h:
        (KJS::Identifier::Identifier::add):

2007-10-24  Lars Knoll  <lars@trolltech.com>

        Reviewed by Simon.

        some changes to the way JS values are converted to Qt values in the script bindings. Added support for converting JS arrays into QStringList's.

        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtInstance::invokeMethod):
        * bindings/qt/qt_runtime.cpp:
        (KJS::Bindings::convertValueToQVariant):
        (KJS::Bindings::QtField::setValueToInstance):

2007-10-24  Oliver Hunt  <oliver@apple.com>

        Reviewed by Darin.

        Remove old relation method, replace with specialised LessThan and lessThenEq functions for a 0.5-0.6% improvement in SunSpider

        * kjs/nodes.cpp:
        (KJS::lessThan):
        (KJS::lessThanEq):
        (KJS::LessNode::evaluate):
        (KJS::GreaterNode::evaluate):
        (KJS::LessEqNode::evaluate):
        (KJS::GreaterEqNode::evaluate):
        * kjs/operations.cpp:
        * kjs/operations.h:

2007-10-24  Eric Seidel  <eric@webkit.org>

        Reviewed by darin.

        * kjs/nodes.h:
        (KJS::ImmediateNumberNode::): Fix ASSERT correctness (and debug build!)

2007-10-24  Darin Adler  <darin@apple.com>

        Reviewed by Eric.

        * kjs/object.cpp: (KJS::JSObject::defaultValue): Get rid of a little
        Identifier ref/deref for what SunSpider claims is a 0.4% speedup.

2007-10-24  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - separate out the code to create a hash table the first time from the code
          to rehash

        SunSpider claims this was a 0.7% speedup.

        * kjs/property_map.cpp:
        (KJS::PropertyMap::expand): Changed to call either createTable or rehash.
        (KJS::PropertyMap::createTable): Added. For the case where we had no table.
        (KJS::PropertyMap::rehash): Removed code needed only in the case where we
        had no table.
        * kjs/property_map.h: Added createTable.

2007-10-24  Eric Seidel  <eric@webkit.org>

        Reviewed by darin.
        
        Add ImmediateNumberNode to hold a JSValue* instead of a double for numbers
        which can be represented by JSImmediate.
        
        SunSpider claims this was a 0.6% speedup.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::NumberNode::evaluate):
        (KJS::ImmediateNumberNode::evaluate):
        * kjs/nodes.h:
        (KJS::Node::):
        (KJS::ImmediateNumberNode::):
        * kjs/nodes2string.cpp:
        (ImmediateNumberNode::streamTo):

2007-10-24  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15657
          change static hash tables to use powers of two for speed

        Seems to give 0.7% SunSpider speedup.

        * kjs/create_hash_table: Updated to generate new format.
        * kjs/lookup.cpp:
        (KJS::keysMatch): Took out unneeded typecast.
        (KJS::findEntry): Updated to expect table type 3 -- changed the printf to a plain old assert.
        Replaced the modulus with a bit mask.
        (KJS::Lookup::findEntry): Get the hash directly, since we know identifiers already have computed
        their hash -- saves a branch.
        (KJS::Lookup::find): Ditto.
        * kjs/lookup.h: Changed attr from 2-byte value to one-byte value. Replaced hashSize with hashSizeMask.

2007-10-24  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - remove KJS_CHECKEXCEPTIONs in places where exceptions can't happen for 0.6% SunSpider speedup

        * kjs/nodes.cpp:
        (KJS::DoWhileNode::execute):
        (KJS::WhileNode::execute):
        (KJS::ForNode::execute):
        (KJS::ForInNode::execute):
        (KJS::SourceElementsNode::execute):

2007-10-23  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        * kjs/JSImmediate.h: (KJS::JSImmediate::getUInt32):
        Changed an && to an & for a 1% gain in SunSpider.

2007-10-23  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Reduce branching in implementations of some operator implementations, yielding 1.3% boost to SunSpider.

        * kjs/nodes.cpp:
        (KJS::MultNode::evaluate):
        (KJS::DivNode::evaluate):
        (KJS::ModNode::evaluate):
        (KJS::add):
        (KJS::sub):
        (KJS::AddNode::evaluate):
        (KJS::SubNode::evaluate):
        (KJS::valueForReadModifyAssignment):
        * kjs/operations.cpp:
        * kjs/operations.h:

2007-10-23  Oliver Hunt  <oliver@apple.com>

        Reviewed by Maciej.

        Separating all of the simple (eg. non-read-modify-write) binary operators
        into separate classes in preparation for further JS optimisations.
        
        Happily this produces a 0.8% to 1.0% performance increase in SunSpider with
        no further work.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (KJS::MultNode::evaluate):
        (KJS::DivNode::evaluate):
        (KJS::ModNode::evaluate):
        (KJS::AddNode::evaluate):
        (KJS::SubNode::evaluate):
        (KJS::LeftShiftNode::evaluate):
        (KJS::RightShiftNode::evaluate):
        (KJS::UnsignedRightShiftNode::evaluate):
        (KJS::LessNode::evaluate):
        (KJS::GreaterNode::evaluate):
        (KJS::LessEqNode::evaluate):
        (KJS::GreaterEqNode::evaluate):
        (KJS::InstanceOfNode::evaluate):
        (KJS::InNode::evaluate):
        (KJS::EqualNode::evaluate):
        (KJS::NotEqualNode::evaluate):
        (KJS::StrictEqualNode::evaluate):
        (KJS::NotStrictEqualNode::evaluate):
        (KJS::BitAndNode::evaluate):
        (KJS::BitXOrNode::evaluate):
        (KJS::BitOrNode::evaluate):
        (KJS::LogicalAndNode::evaluate):
        (KJS::LogicalOrNode::evaluate):
        * kjs/nodes.h:
        (KJS::MultNode::):
        (KJS::DivNode::):
        (KJS::ModNode::):
        (KJS::AddNode::):
        (KJS::SubNode::):
        (KJS::LeftShiftNode::):
        (KJS::RightShiftNode::):
        (KJS::UnsignedRightShiftNode::):
        (KJS::LessNode::):
        (KJS::GreaterNode::):
        (KJS::LessEqNode::):
        (KJS::GreaterEqNode::):
        (KJS::InstanceOfNode::):
        (KJS::InNode::):
        (KJS::EqualNode::):
        (KJS::NotEqualNode::):
        (KJS::StrictEqualNode::):
        (KJS::NotStrictEqualNode::):
        (KJS::BitAndNode::):
        (KJS::BitOrNode::):
        (KJS::BitXOrNode::):
        (KJS::LogicalAndNode::):
        (KJS::LogicalOrNode::):
        * kjs/nodes2string.cpp:
        (MultNode::streamTo):
        (DivNode::streamTo):
        (ModNode::streamTo):
        (AddNode::streamTo):
        (SubNode::streamTo):
        (LeftShiftNode::streamTo):
        (RightShiftNode::streamTo):
        (UnsignedRightShiftNode::streamTo):
        (LessNode::streamTo):
        (GreaterNode::streamTo):
        (LessEqNode::streamTo):
        (GreaterEqNode::streamTo):
        (InstanceOfNode::streamTo):
        (InNode::streamTo):
        (EqualNode::streamTo):
        (NotEqualNode::streamTo):
        (StrictEqualNode::streamTo):
        (NotStrictEqualNode::streamTo):
        (BitAndNode::streamTo):
        (BitXOrNode::streamTo):
        (BitOrNode::streamTo):
        (LogicalAndNode::streamTo):

2007-10-23  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=15639
          fix Math.abs(0), Math.ceil(-0), and Math.floor(-0)

        Test: fast/js/math.html

        * kjs/math_object.cpp: (MathFuncImp::callAsFunction):
        Fix abs to look at the sign bit. Add a special case for values in the range
        between -0 and -1 and a special case for ceil and for -0 for floor.

2007-10-23  Darin Adler  <darin@apple.com>

        Reviewed by Eric.

        - streamline exception handling code for a >1% speed-up of SunSpider

        * kjs/nodes.cpp: Changed macros to use functions for everything that's not
        part of normal execution. We'll take function call overhead when propagating
        an exception or out of memory.
        (KJS::createOutOfMemoryCompletion): Added.
        (KJS::substitute): Use append instead of the relatively inefficient + operator.
        (KJS::Node::rethrowException): Added.
        * kjs/nodes.h: Added rethrowException.

2007-10-22  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=15636
          some JavaScriptCore regression tests are failing due to numeric conversion

        This should restore correctness and make speed better too, restoring some
        of the optimization we lost in my last check-in.

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::getTruncatedInt32): Added. Uses the range checking idiom
        I used in my patch yesterday.
        (KJS::JSImmediate::getTruncatedUInt32): Ditto.

        * kjs/internal.h: Removed getInt32 and added getTruncatedInt/UInt32.
        * kjs/internal.cpp:
        (KJS::NumberImp::getUInt32): Changed to always use double, since I can't find
        a way to write this more efficiently for float.
        (KJS::NumberImp::getTruncatedInt32): Added.
        (KJS::NumberImp::getTruncatedUInt32): Added.

        * kjs/value.h: Removed getInt32 and added getTruncatedInt/UInt32.
        (KJS::JSValue::getUInt32):
        (KJS::JSValue::getTruncatedInt32): Added.
        (KJS::JSValue::getTruncatedUInt32): Added.
        (KJS::JSValue::toInt32): Changed getInt32 call to getTruncatedInt32.
        (KJS::JSValue::toUInt32): Changed getUInt32 call to getTruncatedUInt32.
        * kjs/value.cpp:
        (KJS::JSCell::getTruncatedInt32): Added.
        (KJS::JSCell::getTruncatedUInt32): Added.
        (KJS::JSValue::toInteger): Changed getUInt32 call to getTruncatedInt32.
        (KJS::JSValue::toInt32SlowCase): Removed extra getInt32 call I accidentally
        had left in here.
        (KJS::JSValue::toUInt32SlowCase): Ditto.
        (KJS::JSValue::toUInt16): Changed getUInt32 call to getTruncatedUInt32.

        * JavaScriptCore.exp: Updated.

2007-10-22  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix http://bugs.webkit.org/show_bug.cgi?id=15632
          js1_5/Array/array-001.js test failing

        One of the JavaScriptCore tests was failing; it failed because of
        my change to NumberImp::getUInt32. The incorrect code I copied was
        from JSImmediate::getUInt32, and was a pre-existing bug.

        This patch fixes correctness, but will surely slow down SunSpider.
        We may be able to code this tighter and get the speed back.

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::getInt32): Renamed from toInt32 to more accurately
        reflect the fact that this function only returns true if the value is
        accurate (no fractional part, etc.). Changed code so that it returns
        false when the value has a fraction.
        (KJS::JSImmediate::getUInt32): Ditto.

        * kjs/internal.cpp:
        (KJS::NumberImp::getInt32): Changed code so that it returns false when
        the value has a fraction. Restores the old behavior.
        (KJS::NumberImp::getUInt32): Ditto.

        * kjs/value.h:
        (KJS::JSValue::getInt32): Updated for name change.
        (KJS::JSValue::getUInt32): Ditto.
        (KJS::JSValue::toInt32): Ditto.
        (KJS::JSValue::toUInt32): Ditto.

2007-10-22  Darin Adler  <darin@apple.com>

        Reviewed by Brady.

        - fix crash seen when running JavaScriptCore tests

        * kjs/array_instance.cpp: (KJS::ArrayInstance::mark):
        Copy and paste error: I accidentally had code here that was
        making a copy of the HashMap -- that's illegal inside a mark
        function and was unnecessary. The other callsite was modifying
        the map as it iterated it, but this function is not.

2007-10-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - Avoid moving floats into integer registers in jsNumber() for 3% speedup on SunSpider
        http://bugs.webkit.org/show_bug.cgi?id=15627

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::fromDouble): Avoid moving floats to integer
        registers since this is very slow.

2007-10-22  Darin Adler  <darin@apple.com>

        Reviewed by Eric Seidel.

        - http://bugs.webkit.org/show_bug.cgi?id=15617
          improve speed of integer conversions

        Makes SunSpider 6% faster.

        * kjs/JSImmediate.h: Added toInt32 and toUInt32, with separate versions for
        32-bit and 64-bit.
        * kjs/value.h:
        (KJS::JSValue::getUInt32): Call JSImmediate::toUInt32.

        * kjs/internal.h: Added getInt32.
        * kjs/internal.cpp:
        (KJS::NumberImp::getInt32): Added.
        (KJS::NumberImp::getUInt32): Replaced with more-optimal implementation
        stolen from JSValue.

        * kjs/value.h:
        (KJS::jsNumber): Marked ALWAYS_INLINE, because this wasn't getting
        inlined.
        (KJS::JSValue::getInt32): Added.
        (KJS::JSValue::getUInt32): Changed to call the new JSImmediate::toUInt32
        to avoid converting from float to double.
        (KJS::JSValue::toInt32): Made inline, separated out the slow case.
        (KJS::JSValue::toUInt32): Ditto.
        * kjs/value.cpp:
        (KJS::JSCell::getInt32): Added.
        (KJS::JSValue::toInt32SlowCase): Renamed from toInt32. Changed to use the
        new getInt32. Added a faster case for in-range numbers.
        (KJS::JSValue::toUInt32SlowCase): Ditto.
        (KJS::JSValue::toUInt16): Added a faster case for in-range numbers.

        * JavaScriptCore.exp: Updated for changes.

2007-10-22  Adam Roben  <aroben@apple.com>

        Windows build fix

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Turn off
        warning about implicit conversion to bool.

2007-10-22  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * kjs/array_instance.cpp:

2007-10-22  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15606
          make cut-off for sparse vs. dense arrays smarter for speed with large arrays

        Makes the morph test in SunSpider 26% faster, and the overall
        benchmark 3% faster.

        This also fixes some small problems we had with the distinction
        between nonexistent and undefined values in arrays.

        * kjs/array_instance.h: Tweaked formatting and naming.
        * kjs/array_instance.cpp: Copied from kjs/array_object.cpp.
        (KJS::storageSize): Added. Computes the size of the storage given a vector length.
        (KJS::increasedVectorLength): Added. Implements the rule for resizing the vector.
        (KJS::isDenseEnoughForVector): Added.
        (KJS::ArrayInstance::ArrayInstance): Initialize the new fields.
        (KJS::ArrayInstance::~ArrayInstance): Since m_storage is now never 0, delete it.
        (KJS::ArrayInstance::getItem): Updated for name changes.
        (KJS::ArrayInstance::lengthGetter): Ditto.
        (KJS::ArrayInstance::inlineGetOwnPropertySlot): Added. Allows both versions of
        getOwnPropertySlot to share more code.
        (KJS::ArrayInstance::getOwnPropertySlot): Just refactored, no code change.
        (KJS::ArrayInstance::put): Added logic for extending the vector as long as the
        array is dense enough. Also keep m_numValuesInVector up to date.
        (KJS::ArrayInstance::deleteProperty): Added code to keep m_numValuesInVector
        up to date.
        (KJS::ArrayInstance::getPropertyNames): Fixed bug where this would omit names
        for array indices with undefined values.
        (KJS::ArrayInstance::increaseVectorLength): Renamed from resizeStorage. Also
        simplified to only handle getting larger.
        (KJS::ArrayInstance::setLength): Added code to update m_numValuesInVector, to
        zero out the unused part of the vector and to delete the map if it's no longer
        needed.
        (KJS::ArrayInstance::mark): Tweaked formatting.
        (KJS::compareByStringForQSort): Ditto.
        (KJS::ArrayInstance::sort): Ditto.
        (KJS::CompareWithCompareFunctionArguments::CompareWithCompareFunctionArguments):
        Ditto.
        (KJS::compareWithCompareFunctionForQSort): Ditto.
        (KJS::ArrayInstance::compactForSorting): Fixed bug where this would turn
        undefined values into nonexistent values in some cases.

        * kjs/array_object.h: Removed MAX_ARRAY_INDEX.
        * kjs/array_object.cpp: Removed ArrayInstance. Moved to a separate file.

        * JavaScriptCore.pri: Added array_instance.cpp.
        * JavaScriptCore.xcodeproj/project.pbxproj: Ditto.
        * kjs/AllInOneFile.cpp: Ditto.

2007-10-22  Andrew Wellington  <proton@wiretapped.net>

        Reviewed by Mark Rowe.
        
        Fix for local database support after r26879
        Ensure that ENABLE_DATABASE and ENABLE_ICONDATABASE are correctly set

        * Configurations/JavaScriptCore.xcconfig:

2007-10-22  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Alp.

        Build fix for the non-qmake builds.

        * wtf/Platform.h: Default to enabling the database features unless
        otherwise specified. (similar to ENABLE_ICONDATABASE)

2007-10-22  Holger Freyther  <zecke@selfish.org>

        Reviewed by Simon Hausmann <hausmann@kde.org>.

        * Do not build testkjs as an application bundle. This is
        needed for run-javascriptcore-tests on OSX.
        * Also, based on r26633, allow to test the WebKit/Qt port on OSX.
        * Set DYLD_LIBRARY_PATH if it was set in the environment. It must be set
        as we do not have -rpath on OSX.

        * kjs/testkjs.pro:

2007-10-21  Mark Rowe  <mrowe@apple.com>

        Reviewed by Alp.

        http://bugs.webkit.org/show_bug.cgi?id=15575
        Bug 15575: [GTK] Implement threading using GThread

        * wtf/Platform.h: Do not enable pthreads for Gtk.

2007-10-21  Mark Rowe  <mrowe@apple.com>

        Reviewed by Mitz.

        Fix http://bugs.webkit.org/show_bug.cgi?id=15603
        Bug 15603: Regression(r26847): Crash when sorting an empty array from JavaScript

        * kjs/array_object.cpp:
        (KJS::freeStorage): Reinstate null-check that was removed in r26847.

2007-10-21  Darin Adler  <darin@apple.com>

        - fix Windows build

        * kjs/array_instance.h: Removed unused ExecState parameter.
        * kjs/array_object.cpp:
        (KJS::ArrayInstance::put): Ditto.
        (KJS::ArrayInstance::setLength): Ditto.

2007-10-21  Darin Adler  <darin@apple.com>

        * kjs/array_object.cpp: (KJS::ArrayInstance::put):
        Add missing assignment that was causing regression test crash.

2007-10-21  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15585
          speed up sparse arrays by using a custom map
    
        Speeds up SunSpider by 10%.

        * kjs/array_object.cpp:
        (allocateStorage): Leave room for an additional pointer.
        (reallocateStorage): Ditto.
        (freeStorage): Ditto.
        (ArrayInstance::~ArrayInstance): Delete the overflow map if present.
        (ArrayInstance::getItem): Read values from the overflow map if present.
        Removed the check of length, since it slows down the common case.
        (ArrayInstance::getOwnPropertySlot): Ditto. Also removed the fallback
        to the property map.
        (ArrayInstance::put): Write values into the overflow map as needed.
        Also create overflow map when needed.
        (ArrayInstance::deleteProperty): Remove values from the overflow map
        as appropriate.
        (ArrayInstance::getPropertyNames): Add a name for each identifier in
        the property map. This is extremely inefficient.
        (ArrayInstance::setLength): Remove any values in the overflow map
        that are past the new length, as we formerly did with the property map.
        (ArrayInstance::mark): Mark any values in the overflow map.
        (compareByStringForQSort): Removed unneeded undefined case, since
        compactForSorting guarantees we will have no undefined values.
        (compareWithCompareFunctionForQSort): Ditto.
        (ArrayInstance::compactForSorting): Copy all the values out of the
        overflow map and destroy it.

        * kjs/property_map.h: Removed now-unused getSparseArrayPropertyNames.
        * kjs/property_map.cpp: Ditto.

2007-10-20  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=15579
          stop churning identifier reference counts copying Completion objects

        * kjs/completion.h: Replace the Identifier with an Identifier*.
        * kjs/nodes.cpp:
        (ForInNode::execute): Update for change to Completion constructor.
        (ContinueNode::execute): Ditto.
        (BreakNode::execute): Ditto.

2007-10-20  Mark Rowe  <mrowe@apple.com>

        Reviewed by Alp.

        Gtk changes needed to enable HTML 5 client-side database storage.

        * wtf/Platform.h: Have Gtk use pthreads for now.

2007-10-20  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.

        Fixed http://bugs.webkit.org/show_bug.cgi?id=15570
        Store gathered declaration nodes in the function body node.
        
        This means that you only have to gather the declaration nodes the first 
        time the function executes. Performance gain of 2.10% on SunSpider, 
        0.90% on command-line JS iBench.

        * kjs/nodes.cpp: Split declaration stack initialization code off into 
        initializeDeclarationStacks().
        (FunctionBodyNode::FunctionBodyNode):
        (FunctionBodyNode::initializeDeclarationStacks):
        (FunctionBodyNode::processDeclarations):

        * kjs/nodes.h: Changed DeclarationStacks structure to hold references, 
        since the actual Vectors are now stored either on the stack or in the 
        function body node.

2007-10-19  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        http://bugs.webkit.org/show_bug.cgi?id=15559
        Moved processDeclarations call into FunctionBodyNode::execute

        To improve encapsulation, moved processDeclarations call into
        FunctionBodyNode::execute. Also marked processDeclarations 
        ALWAYS_INLINE, since it has only 1 caller now. This is a .71% speedup 
        on command-line JS iBench.

        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/function.h:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):
        * kjs/nodes.cpp:
        (FunctionBodyNode::execute):
        * kjs/nodes.h:

2007-10-19  Brady Eidson  <beidson@apple.com>

        Reviewed by Sam

        Queue -> Deque! and small style tweaks

        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
        * wtf/Deque.h: Added.
        (WTF::DequeNode::DequeNode):
        (WTF::Deque::Deque):
        (WTF::Deque::~Deque):
        (WTF::Deque::size):
        (WTF::Deque::isEmpty):
        (WTF::Deque::append):
        (WTF::Deque::prepend):
        (WTF::Deque::first):
        (WTF::Deque::last):
        (WTF::Deque::removeFirst):
        (WTF::Deque::clear):
        * wtf/Queue.h: Removed.


2007-10-19  Brady Eidson <beidson@apple.com>

        Reviewed by Oliver

        Added a simple LinkedList based Queue to wtf
        We can make a better, more sophisticated an efficient one later, but have
        needed one for some time, now!

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * wtf/Queue.h: Added.
        (WTF::QueueNode::QueueNode):
        (WTF::Queue::Queue):
        (WTF::Queue::~Queue):
        (WTF::Queue::size):
        (WTF::Queue::isEmpty):
        (WTF::Queue::append):
        (WTF::Queue::prepend):
        (WTF::Queue::first):
        (WTF::Queue::last):
        (WTF::Queue::removeFirst):
        (WTF::Queue::clear):

2007-10-19  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by Anders.

        Try to fix Qt/Win build slave, by including windows.h also on Qt/Win.

        * kjs/testkjs.cpp: Change PLATFORM(WIN) to PLATFORM(WIN_OS)

2007-10-19  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Lars.

        Fix compilation on Windows when wchar_t is a typedef instead of a native type (triggered by -Zc:wchar_t-).
        Don't provide the wchar_t overloads then as they conflict with the unsigned short ones.

        * wtf/ASCIICType.h:
        (WTF::isASCIIAlpha):
        (WTF::isASCIIAlphanumeric):
        (WTF::isASCIIDigit):
        (WTF::isASCIIHexDigit):
        (WTF::isASCIILower):
        (WTF::isASCIISpace):
        (WTF::toASCIILower):
        (WTF::toASCIIUpper):

2007-10-19  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Lars.

        Another build fix for the windows/qt build: Apply the same fix as in revision 26686 also to kjs/config.h to disable the disallowctype feature.

        * kjs/config.h:

2007-10-18  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Adam.
        
        - use __declspec(thread) for fast thread-local storage on Windows
        
        - 2.2% speedup on sunspider (on Windows)
        - 7% speedup on the string section
        - 6% speedup on JS iBench
        
        - fixed <rdar://problem/5473084> PLT on Windows got 2.5% slower between r25406 and r25422
        - fixed at least some of <rdar://5527965? i-Bench JS was 14% slower in 310A11 than 310A10
        
        
        * wtf/FastMalloc.cpp:
        (WTF::getThreadHeap):
        (WTF::setThreadHeap):
        (WTF::TCMalloc_ThreadCache::GetCache):
        (WTF::TCMalloc_ThreadCache::GetCacheIfPresent):
        (WTF::TCMalloc_ThreadCache::CreateCacheIfNecessary):

2007-10-17  Darin Adler  <darin@apple.com>

        Reviewed by Mark Rowe.

        - fix http://bugs.webkit.org/show_bug.cgi?id=15543
          <rdar://problem/5545639> REGRESSION (r26697):
          GoogleDocs: Can't create new documents or open existing ones

        Test: fast/js/regexp-non-character.html

        * pcre/pcre_compile.c: (check_escape): Take out the checks for valid characters
        in the \u sequences -- not needed and actively harmful.

2007-10-17  Anders Carlsson  <andersca@apple.com>

        Reviewed by Oliver.

        * wtf/Platform.h:
        #define USE_PTHREADS on Mac.

2007-10-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Merged DeclaredFunctionImp into FunctionImp (the base class) because 
        the distinction between the two was unused.
        
        Removed codeType() from FunctionImp because FunctionImp and its 
        subclasses all returned FunctionCode, so it was unused, practically 
        speaking.
        
        Removed a different codeType() from GlobalFuncImp because it was unused.
        (Perhaps it was vestigial from a time when GlobalFuncImp used to 
        inherit from FunctionImp.)

        * bindings/runtime_method.cpp:
        * bindings/runtime_method.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::FunctionImp):
        (KJS::FunctionImp::callAsFunction):
        (KJS::FunctionImp::construct):
        (KJS::FunctionImp::execute):
        (KJS::FunctionImp::processVarDecls):
        * kjs/function.h:
        (KJS::FunctionImp::implementsConstruct):
        (KJS::FunctionImp::scope):
        * kjs/function_object.cpp:
        (FunctionProtoFunc::callAsFunction):
        (FunctionObjectImp::construct):
        * kjs/nodes.cpp:
        (FuncDeclNode::processFuncDecl):
        (FuncExprNode::evaluate):

2007-10-17  Adam Roben  <aroben@apple.com>

        Windows build fix part 2.

        Fix was by Darin, reviewed by Anders and Adam.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add
        FastMallocPCRE.cpp to the project, and let Visual Studio have its way
        with the post-build step.
        * pcre/pcre.h: Don't DLL export the entry points just because this
        is Win32 -- this is an internal copy of PCRE and should be private.
        * pcre/pcre_compile.c: Fix an uninitialized variable warning --
        there's no real problem but it's better to quiet the compiler by
        tweaking the code slightly than turn off the warning entirely.

2007-10-17  Adam Roben  <aroben@apple.com>

        Windows build fix.

        Reviewed by Anders.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Disable
        some mismatched signed/unsigned comparison warnings.
        * pcre/pcre_exec.c:
        (match): #if-out some labels that don't seem to exist.

2007-10-17  Mark Rowe  <mrowe@apple.com>

        Gtk build fix.

        * JavaScriptCore.pri: Add FastMallocPCRE.cpp.
        * pcre/pcre_get. #if out two functions that depend on pcre_get_stringnumber, which
        is currently unavailable for UTF-16.

2007-10-16  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - merged PCRE changes between 6.4 and 6.5

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        Removed pcre_config.c, pcre_globals.c, pcre_info.c, pcre_maketables.c,
        pcre_printint.src, pcre_refcount.c, pcre_study.c, pcre_try_flipped.c,
        pcre_ucp_findchar.c, pcre_version.c, and ucptable.c. Added pcre_ucp_searchfuncs.c.

        * pcre/AUTHORS:
        * pcre/LICENCE:
        * pcre/MERGING:
        * pcre/dftables.c:
        * pcre/pcre-config.h:
        * pcre/pcre.h:
        * pcre/pcre.pri:
        * pcre/pcre_compile.c:
        * pcre/pcre_exec.c:
        * pcre/pcre_fullinfo.c:
        * pcre/pcre_get.c:
        * pcre/pcre_internal.h:
        * pcre/pcre_maketables.c:
        * pcre/pcre_ord2utf8.c:
        * pcre/pcre_tables.c:
        * pcre/pcre_ucp_searchfuncs.c: Copied from pcre/pcre_ucp_findchar.c.
        * pcre/pcre_xclass.c:
        * pcre/ucp.h:
        * pcre/ucpinternal.h:
        * pcre/ucptable.c:
        Updated with new versions from the PCRE 6.5 release, merged with changes.

        * pcre/pcre_config.c: Removed.
        * pcre/pcre_globals.c: Removed.
        * pcre/pcre_info.c: Removed.
        * pcre/pcre_printint.src: Removed.
        * pcre/pcre_refcount.c: Removed.
        * pcre/pcre_study.c: Removed.
        * pcre/pcre_try_flipped.c: Removed.
        * pcre/pcre_ucp_findchar.c: Removed.
        * pcre/pcre_version.c: Removed.

2007-10-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.

        Removed KJS_VERBOSE because it was getting in the way of readability, 
        and the messages didn't seem very helpful.

        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        (KJS::FunctionImp::passInParameters):
        * kjs/lookup.h:
        (KJS::lookupPut):
        * kjs/object.cpp:
        (KJS::JSObject::put):
        * kjs/value.h:

2007-10-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Removed the Parameter class because it was a redundant wrapper around 
        Identifier.

        * kjs/function.cpp:
        (KJS::FunctionImp::passInParameters):
        (KJS::FunctionImp::getParameterName):
        * kjs/nodes.cpp:
        (FunctionBodyNode::addParam):
        * kjs/nodes.h:
        (KJS::FunctionBodyNode::):

2007-10-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Global replace of assert with ASSERT.

2007-10-16  Adam Roben  <aroben@apple.com>

        Make testkjs not delay-load WebKit

        Soon, delay-loading WebKit will be impossible (because we will be
        using __declspec(thread) for thread-local storage). This change
        prepares testkjs for the future.

        Reviewed by Sam.

        * JavaScriptCore.vcproj/JavaScriptCore.sln: Removed WebKitInitializer,
        added FindSafari.
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Don't link against
        WebKitInitializer, don't delay-load WebKit.
        * kjs/testkjs.cpp: Don't use WebKitInitializer.

2007-10-16  Adam Roben  <aroben@apple.com>

        Updated testkjs for the rename of WebKit_debug.dll to WebKit.dll for the Debug configuration

        Reviewed by Kevin McCullough.

        * JavaScriptCore.vcproj/debug.vsprops: Added WebKitDLLConfigSuffix.
        * JavaScriptCore.vcproj/debug_internal.vsprops: Ditto.
        * JavaScriptCore.vcproj/release.vsprops: Ditto.
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Use
        WebKitDLLConfigSuffix when referring to WebKit.dll, and fixed a typo
        in the name of icuuc36[_debug].dll.

2007-10-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Re-structured variable and function declaration code.
        
        Command-line JS iBench shows no regression.
        
        Here are the changes:

        1. Function declarations are now processed at the same time as var 
        declarations -- namely, immediately upon entry to an execution context. 
        This does not match Firefox, which waits to process a function
        declaration until the declaration's containing block executes, but it 
        does match IE and the ECMA spec. (10.1.3 states that var and function 
        declarations should be processed at the same time -- namely, "On 
        entering an execution context." 12.2 states that "A Block does not 
        define a new execution scope.")

        2. Declaration processing proceeds iteratively now, rather than 
        recursively, storing the nodes is finds in stacks. This will later 
        facilitate an optimization to hold on to the gathered declaration nodes, 
        rather than re-fetching them in every function call. 
        [ http://bugs.webkit.org/show_bug.cgi?id=14868 ]

        Modified these tests because they expected the incorrect Mozilla 
        behavior described above:

        * tests/mozilla/ecma_3/Function/scope-001.js:
        * tests/mozilla/js1_5/Scope/regress-184107.js:

2007-10-16  Darin Adler  <darin@apple.com>

        - try to fix the GTK build

        * kjs/ustring.cpp: Include ASCIICType.h, not ASCIICtype.h.

2007-10-16  Darin Adler  <darin@apple.com>

        - try to fix the Windows build

        * kjs/date_object.cpp: (KJS::parseDate): A couple instances of isspace were
        in here. Not sure why it wasn't failing elsewhere. Changed to isASCIISpace.

2007-10-16  Darin Adler  <darin@apple.com>

        - try to fix the GTK build

        * kjs/ustring.cpp: Include ASCIICType.h.

2007-10-16  Darin Adler  <darin@apple.com>

        Reviewed by Maciej and Geoff (and looked over by Eric).

        - http://bugs.webkit.org/show_bug.cgi?id=15519
          eliminate use of <ctype.h> for processing ASCII

        * wtf/ASCIICType.h: Added.
        * wtf/DisallowCType.h: Added.

        * kjs/config.h: Include DisallowCType.h.

        * kjs/date_object.cpp:
        (KJS::skipSpacesAndComments):
        (KJS::findMonth):
        (KJS::parseDate):
        * kjs/function.cpp:
        (KJS::decode):
        * kjs/ustring.cpp:
        (KJS::UString::toDouble):
        Use ASCIICType.h functions instead of ctype.h ones.

2007-10-14  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - fixes for "New JavaScript benchmark"
        http://bugs.webkit.org/show_bug.cgi?id=15515
        
        * kjs/testkjs.cpp:
        (TestFunctionImp::callAsFunction): Implement "load" for compatibility
        with SpiderMonkey.
        (TestFunctionImp::): ditto
        (doIt): ditto
        (kjsmain): Drop useless --> from output.

2007-10-15  Geoffrey Garen  <ggaren@apple.com>

        Removed unnecessary #include.

        * API/JSObjectRef.cpp:

2007-10-15  Geoffrey Garen  <ggaren@apple.com>

        Double-reverse build fix. My tree was out of date.

        * kjs/nodes.cpp:
        (NumberNode::evaluate):

2007-10-15  Geoffrey Garen  <ggaren@apple.com>

        Build fix.

        * kjs/nodes.cpp:
        (NumberNode::evaluate):

2007-10-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Removed surprising self-named "hack" that made nested functions 
        available as named properties of their containing functions, and placed
        containing function objects in the scope chains of nested functions.
        
        There were a few reasons to remove this "hack:"

        1. It contradicted FF, IE, and the ECMA spec.

        2. It incurred a performance penalty, since merely parsing a function 
        required parsing its body for nested functions (and so on).

        3. SVN history contains no explanation for why it was added. It was just
        legacy code in a large merge a long, long time ago.

        [ Patch broken off from http://bugs.webkit.org/show_bug.cgi?id=14868 ]

        * kjs/nodes.cpp:
        (FuncDeclNode::processFuncDecl):

2007-10-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Removed the concept of AnonymousCode. It was unused, and it doesn't
        exist in the ECMA spec.
        
        [ Patch broken off from http://bugs.webkit.org/show_bug.cgi?id=14868 ]

        * kjs/Context.cpp:
        (KJS::Context::Context):
        * kjs/function.h:
        * kjs/nodes.cpp:
        (ReturnNode::execute):

2007-10-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Made function parameters DontDelete. This matches FF and the vague
        description in ECMA 10.1.3. It's also required in order to make
        symbol table based lookup of function parameters valid. (If the 
        parameters aren't DontDelete, you can't guarantee that you'll find
        them later in the symbol table.)

        [ Patch broken off from http://bugs.webkit.org/show_bug.cgi?id=14868 ]

        * kjs/function.cpp:
        (KJS::FunctionImp::passInParameters):

2007-10-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Some Vector optimizations. These are especially important when using
        Vector as a stack for implementing recursive algorithms iteratively.
        
        [ Broken off from http://bugs.webkit.org/show_bug.cgi?id=14868 ]

        1. Added shrink(), which is a version of resize() that you can call
        to save a branch / improve code generation and inlining when you know 
        that the vector is not getting bigger.
        
        2. Changed subclassing relationship in VectorBuffer to remove a call to
        fastFree() in the destructor for the inlineCapacity != 0 template
        specialization. This brings inline Vectors one step closer to true
        stack-allocated arrays.
        
        Also changed abort() to CRASH(), since the latter works better.

        * wtf/Vector.h:
        (WTF::VectorBufferBase::allocateBuffer):
        (WTF::VectorBufferBase::deallocateBuffer):
        (WTF::VectorBufferBase::VectorBufferBase):
        (WTF::VectorBufferBase::~VectorBufferBase):
        (WTF::):
        (WTF::VectorBuffer::VectorBuffer):
        (WTF::VectorBuffer::~VectorBuffer):
        (WTF::VectorBuffer::deallocateBuffer):
        (WTF::VectorBuffer::releaseBuffer):
        (WTF::Vector::clear):
        (WTF::Vector::removeLast):
        (WTF::::operator):
        (WTF::::fill):
        (WTF::::shrink):

2007-10-12  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed http://bugs.webkit.org/show_bug.cgi?id=15490
        Iteration statements sometimes incorrectly evaluate to the empty value 
        (KDE r670547). 
        
        [ Broken off from http://bugs.webkit.org/show_bug.cgi?id=14868 ]
        
        This patch is a merge of KDE r670547, with substantial modification 
        for performance.
        
        It fixes do-while statements to evaluate to a value. (They used
        to evaluate to the empty value in all cases.) 

        It also fixes SourceElementsNode to maintain the value of abnormal 
        completions like "break" and "continue."
        
        It also re-works the main execution loop in SourceElementsNode so that
        it (1) makes a little more sense and (2) avoids unnecessary work. This 
        is a .28% speedup on command-line JS iBench.

        * kjs/nodes.cpp:
        (DoWhileNode::execute):
        (SourceElementsNode::execute):

2007-10-15  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Lars.

        Fix compilation with gcc 4.3 by including 'limits' due to the use of std::numeric_limits.

        * wtf/HashTraits.h:

2007-10-5  Kevin Ollivier  <kevino@theolliviers.com>
 
        Reviewed by Adam.
        
        Add support for MSVC7, and fix cases where PLATFORM(WIN) should
        be PLATFORM(WIN_OS) for other ports building on Windows.
 
        * kjs/DateMath.cpp:
        (KJS::getDSTOffsetSimple):
        * kjs/JSImmediate.h:
        * wtf/Assertions.cpp:
        * wtf/Assertions.h:
        * wtf/Platform.h:
        * wtf/StringExtras.h:
        (snprintf):
        (vsnprintf):

2007-10-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Darin.

        Adds NegateNode optimization from KJS. The relevant revision in KDE
        is 666736.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (NumberNode::evaluate):
        * kjs/nodes.h:
        (KJS::Node::):
        (KJS::NumberNode::):
        * kjs/nodes2string.cpp:
        (NumberNode::streamTo):

2007-10-14  Jason Foreman  <jason@threeve.org>

        Reviewed by Maciej.

        Fix http://bugs.webkit.org/show_bug.cgi?id=15145
        
        Ensure that if adjusting n to minimize the difference of n*intPow10(e-p+1) to x,
        that the property n < intPow10(p) is maintained.

        * kjs/number_object.cpp:
        (NumberProtoFunc::callAsFunction):

== Rolled over to ChangeLog-2007-10-14 ==
