=== Start merge of feature-branch 2007-10-12 ===

2007-10-11  Andrew Wellington  <proton@wiretapped.net>

        Reviewed by Eric Seidel.
        
        Fix for http://bugs.webkit.org/show_bug.cgi?id=15076
        "deg2rad has multiple definitions"
        
        Define deg2rad, rad2deg, deg2grad, grad2deg, rad2grad, grad2rad
        These are used through WebKit.
        
        Change based on original patch by Rob Buis.

        * wtf/MathExtras.h:
        (deg2rad):
        (rad2deg):
        (deg2grad):
        (grad2deg):
        (rad2grad):
        (grad2rad):

2007-10-10  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.
        
        - fix assertion failures on quit.

        * kjs/array_object.cpp:
        (ArrayProtoFunc::callAsFunction): Dynamically alocate function-scope static
        UStrings to avoid the static destructor getting called later.
        * kjs/lookup.h: Dynamically alocate function-scope static
        Identifiers to avoid the static destructor getting called later.

2007-10-07  Ed Schouten  <ed@fxq.nl>

        Reviewed and landed by Alexey Proskuryakov.

        Add PLATFORM(FREEBSD), so we can fix the build on FreeBSD-like
        systems by including <pthread_np.h>. Also fix some (disabled)
        regcomp()/regexec() code; it seems some variable names have
        changed.

        * kjs/config.h:
        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp):
        * wtf/Platform.h:

2007-10-02  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=10370
        RegExp fails to match non-ASCII characters against [\S\s]

        Test: fast/js/regexp-negative-special-characters.html

        * pcre/pcre_compile.c:
        (compile_branch): Adjust opcode and bitmap as necessary to include (or exclude)
        character codes >255. Fix suggested by Philip Hazel.

        * pcre/pcre_exec.c:
        (match): Merged fix for PCRE bug 580 (\S\S vs. \S{2}).

        * tests/mozilla/expected.html: One test was fixed.
        * pcre/MERGING: Added information about this fix.

2007-10-02  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - skip extra hash lookup and avoid converting char* to UString for 19% speedup on CK JS array test 
        http://bugs.webkit.org/show_bug.cgi?id=15350

        * kjs/array_object.cpp:
        (ArrayProtoFunc::callAsFunction): Implement the two mentioned optimizations.

2007-10-02  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Mark.
        
        - Efficiently handle regexp property identifiers for 19% speedup on Celtic Kane regexp test
        http://bugs.webkit.org/show_bug.cgi?id=15337

        * kjs/CommonIdentifiers.h:
        * kjs/regexp_object.cpp:
        (RegExpProtoFunc::callAsFunction):
        (RegExpObjectImp::arrayOfMatches):
        (RegExpObjectImp::construct):

2007-10-02  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Mark.
        
        - Cache global prorotypes more efficiently for 10% speedup on CK AJAX benchmark
        http://bugs.webkit.org/show_bug.cgi?id=15335

        * kjs/lookup.h:

2007-10-01  Oliver Hunt  <oliver@apple.com>

        Reviewed by Mark.

        Enable Experimental SVG features by default when building from Xcode

        * Configurations/JavaScriptCore.xcconfig:

2007-09-29  Rob Buis  <buis@kde.org>

        Reviewed by Adam.

        http://bugs.webkit.org/show_bug.cgi?id=13472
        Misparsing date in javascript leads to year value of -1
        http://bugs.webkit.org/show_bug.cgi?id=14176
        Some date values not handled consistently with IE/Firefox

        Allow an optional comma between month and year, and year and time.

        * kjs/date_object.cpp:
        (KJS::parseDate):

2007-07-11  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by Mark.

        Forwardport the hash table fix from CodeGeneratorJS.pm to create_hash_table.
        Reran run-jsc-tests, couldn't find any regressions. Suggested by Darin.

        * kjs/create_hash_table:

2007-06-25  Antti Koivisto  <antti@apple.com>

        Reviewed by Maciej.
        
        Use intHash to hash floats and doubles too.

        * ChangeLog:
        * wtf/HashFunctions.h:
        (WTF::FloatHash::hash):
        (WTF::FloatHash::equal):
        (WTF::):
        * wtf/HashTraits.h:
        (WTF::FloatHashTraits::emptyValue):
        (WTF::FloatHashTraits::deletedValue):
        (WTF::):

=== End merge of feature-branch 2007-10-12 ===

2007-10-11  Mark Rowe  <mrowe@apple.com>

        Reviewed by Tim Hatcher.

        Fix for <rdar://problem/5488678>.  Disable debugging symbols in production builds for 10.4
        PowerPC to prevent a huge STABS section from being generated.

        * Configurations/Base.xcconfig:

2007-10-08  George Staikos  <staikos@kde.org>

        Reviewed by Adam Roben.

        Fix Qt build on Win32.

        * kjs/testkjs.cpp:
        (main):

2007-10-10  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Lars.

        Fix compilation using gcc 4.3. Header files have been reorganized and as a result some extra
        includes are needed for INT_MAX, std::auto_ptr and the like.

        * kjs/collector.cpp:
        * kjs/collector.h:
        * kjs/lexer.cpp:
        * kjs/scope_chain.cpp:
        * kjs/ustring.cpp:
        * wtf/Vector.h:

2007-10-09  Lars Knoll  <lars@trolltech.com>

        Reviewed by Simon.

        fix the invokation of slots with return types. Add a JSLock around the conversion from QVariant to JSValue.

        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtInstance::invokeMethod):
        * bindings/qt/qt_runtime.cpp:
        (KJS::Bindings::convertValueToQVariant):
        (KJS::Bindings::convertQVariantToValue):

2007-10-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Added JSObject::removeDirect, to support the fix for 
        <rdar://problem/5522487> REGRESSION: With JavaScript disabled, any 
        page load causes a crash in PropertyMap::put

        * kjs/object.cpp:
        (KJS::JSObject::removeDirect):
        * kjs/object.h:

2007-10-04  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver.

        Switch to default level of debugging symbols to resolve <rdar://problem/5488678>.
        The "full" level appears to offer no observable benefits even though the documentation
        suggests it be used for dead code stripping.  This should also decrease link times.

        * Configurations/Base.xcconfig:

2007-10-03  Lars Knoll  <lars@trolltech.com>

        Reviewed by Rob.

        Fix a stupid bug in Unicode::toUpper/toLower.
        Fixes all three test failures in the JavaScriptCore test
        suite.

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

2007-10-02  Darin Adler  <darin@apple.com>

        Reviewed by Adam.

        - add support for GDI objects to OwnPtr; I plan to use this
          to fix some GDI handle leaks

        * kjs/grammar.y: Change parser to avoid macros that conflict
        with macros defined in Windows system headers: THIS, DELETE,
        VOID, IN, and CONST. This is needed because OwnPtr.h will now
        include <windows.h>.
        * kjs/keywords.table: Ditto.

        * wtf/OwnPtr.h: For PLATFORM(WIN), add support so that OwnPtr can be
        a GDI handle, and it will call DeleteObject. Also change to use the
        RemovePointer technique used by RetainPtr, so you can say OwnPtr<HBITMAP>
        rather than having to pass in the type pointed to by HBITMAP.

        * wtf/OwnPtrWin.cpp: Added.
        (WebCore::deleteOwnedPtr): Put this in a separate file so that we
        don't have to include <windows.h> in OwnPtr.h.

        * JavaScriptCore.vcproj/WTF/WTF.vcproj: Added OwnPtrWin.cpp.

2007-09-29  Holger Hans Peter Freyther  <zecke@selfish.org>

        Reviewed by Mark.

        -Fix http://bugs.webkit.org/show_bug.cgi?id=13226.
        Remove Bakefiles from svn.

        * JavaScriptCoreSources.bkl: Removed.
        * jscore.bkl: Removed.

2007-09-27  Kevin Decker  <kdecker@apple.com>

        Rubber stamped by John Sullivan.

        <rdar://problem/5493093>
        
        * JavaScriptCore.order: Added.
        * JavaScriptCore.xcodeproj/project.pbxproj: We're changing from using an order file built by
         another team to using one we actually check into our project repository. Linker settings for
         Symbol Ordering Flags have been updated accordingly.

2007-09-26  Adam Roben  <aroben@apple.com>

        Make testkjs delay-load WebKit.dll so WebKitInitializer can work its magic

        Rubberstamped by Anders.

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2007-09-25  Adam Roben  <aroben@apple.com>

        Make testkjs delay-load its dependencies

        This lets WebKitInitializer re-route the dependencies to be loaded out
        of the Safari installation directory.

        Rubberstamped by Sam.

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2007-09-25  David Kilzer  <ddkilzer@webkit.org>

        Reviewed by Adam.

        - Fix http://bugs.webkit.org/show_bug.cgi?id=14885
          LGPL'ed files contain incorrect FSF address

        * COPYING.LIB:
        * bindings/testbindings.cpp:
        * kjs/AllInOneFile.cpp:
        * kjs/DateMath.cpp:
        * kjs/PropertyNameArray.cpp:
        * kjs/PropertyNameArray.h:
        * kjs/config.h:

2007-09-25  Sam Weinig  <sam@webkit.org>

        Fix location for build products for Debug_Internal.

        Reviewed by Adam Roben.

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2007-09-25  Adam Roben  <aroben@apple.com>

        Make testkjs use WebKitInitializer

        Reviewed by Sam.

        * JavaScriptCore.vcproj/JavaScriptCore.sln: Add WebKitInitializer and
        make testkjs depend on it.
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Link against
        WebKitInitializer.lib.
        * kjs/testkjs.cpp:
        (main): Call initializeWebKit.

2007-09-24  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam.

        - Continued to update project files to not use Edit and Continue for Debug Information since it doesn't work and breaks some functionality.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/WTF/WTF.vcproj:

2007-09-21  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam.

        - Updated project files to not use Edit and Continue for Debug Information since it doesn't work and breaks some functionality.

        * JavaScriptCore.vcproj/dftables/dftables.vcproj:
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2007-09-20  Holger Hans Peter Freyther  <zecke@selfish.org>

        Rubber stamped by Adam.

        Renamed files from *Gdk to *Gtk (see #14732) using the
        work of Juan A. Suarez Romero as a base.

        GDK -> GTK 

        * JavaScriptCore.pri:
        * kjs/testkjs.pro:
        * pcre/dftables.pro:
        * wtf/Platform.h: PLATFORM(GDK) to PLATFORM(GTK)

2007-09-21  Mark Rowe  <mrowe@apple.com>

        Reviewed by Antti Koivisto.

        http://bugs.webkit.org/show_bug.cgi?id=15250
        <rdar://problem/5496942> REGRESSION: Reproducible crash in Safari when evaluating script in Drosera console (15250)

        * kjs/function.cpp:
        (KJS::GlobalFuncImp::callAsFunction): Null-check thisObj before passing it to interpreterForGlobalObject.

2007-09-19  Holger Hans Peter Freyther  <zecke@selfish.org>

        Rubber stamped by Adam.

        Make the guard/#if use the same name (ENABLE_FTPDIR) as the #define. This follows
        the ENABLE_ICONDATABASE example from a couple of lines above.

        * wtf/Platform.h:

2007-09-19  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej.

        <rdar://problem/5487107> NULL dereference crash in FastMallocZone::enumerate when running leaks against Safari

        Storing remote pointers to their local equivalents in mapped memory was leading to the local pointer being
        interpreted as a remote pointer.  This caused a crash when using the result of mapping this invalid remote pointer.
        The fix is to follow the pattern used elsewhere in FastMallocZone by always doing the mapping after reading and
        never storing the mapped pointer.

        * wtf/FastMalloc.cpp:
        (WTF::FastMallocZone::enumerate):

2007-09-15  Darin Adler  <darin@apple.com>

        - fix Mac build

        * JavaScriptCore.exp: Export WTFLogVerbose.

2007-09-14  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Sam.

        - Copy JSRetainPtr to include folder.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2007-09-13  Geoffrey Garen  <ggaren@apple.com>

        Try to fix GDK build.

        * wtf/MathExtras.h:
        (wtf_random_init):

2007-09-12  Geoff Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Fixed <rdar://problem/5429064> 141885 Safari JavaScript: Math.random() slightly less randomly distributed than on Safari / Mac

        Math.random was skewed slightly upward because it assumed that RAND_MAX was outside the range of
        values that rand() might return. This problem was particularly pronounced on Windows because
        the range of values returned by rand() on Windows is 2^16 smaller than the range of values
        return by rand() on Mac.
        
        Fixed by accounting for RAND_MAX return values. Also, switched Windows over to rand_s, which has
        a range that's equal to rand()'s range on Mac.
        
        * kjs/config.h:

        * kjs/math_object.cpp:
        (MathFuncImp::callAsFunction): Use the new new thing.

        * wtf/MathExtras.h: Platform abstraction for random numbers, to cover over differences on Windows.
        (wtf_random_init):
        (wtf_random):

2007-09-13  Antti Koivisto  <antti@apple.com>

        Reviewed by Maciej.
        
        Small addition to previous path to cover
        http://bugs.webkit.org/show_bug.cgi?id=11399
        window.eval runs in the global scope of the calling window
        
        Switch variable scope as well.

        * kjs/function.cpp:
        (KJS::GlobalFuncImp::callAsFunction):

2007-09-12  Antti Koivisto  <antti@apple.com>

        Reviewed by Geoff, Maciej.
        
        Fix <rdar://problem/5445058>
        REGRESSION: Unable to upload picture to eBay auction due to domain security check
        
        eBay uses window.eval() between windows. In Firefox window.eval() switches execution
        and security context to the target window, something WebKit did not do. With WebKit
        security tightening in r24781, this broke picture uploads.
        
        Fix by making WebKit switch context in window.eval().
        
        * kjs/Context.cpp:
        (KJS::Context::Context):
        (KJS::Context::~Context):
        * kjs/context.h:
        Save and restore interpreter context independently from calling context.
        
        * kjs/function.cpp:
        (KJS::GlobalFuncImp::callAsFunction):
        If eval is called for global object different than current one, switch execution context
        to that object and push it to scope.

2007-09-12  Sam Weinig  <sam@webkit.org>

        Reviewed by Geoffrey Garen.

        <rdar://problem/5478717> JSStringCreateWithCFString leaks when passed a zero length CFStringRef

        * API/JSStringRefCF.cpp:
        (JSStringCreateWithCFString): Special case the zero length string and remove the
        UTF16 optimized path since it will always leak due to the fact that we won't be 
        able to free the backing store that the CFStringRef provides.

2007-09-10  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin Adler.

        <rdar://problem/5456224> CrashTracer: [USER] 2 crashes in Toast Titanium at com.apple.CoreServices.CarbonCore: CSMemDisposePtr + 37

        Removed the implementation of these malloc zone functions. We do not have the ability to 
        check if a pointer is valid or not, so we can't correctly implement them. The system free 
        does not fail if you pass in a bad pointer.

        * wtf/FastMalloc.cpp:
        (WTF::FastMallocZone::size):
        (WTF::FastMallocZone::zoneMalloc):
        (WTF::FastMallocZone::zoneCalloc):
        (WTF::FastMallocZone::zoneFree):
        (WTF::FastMallocZone::zoneRealloc):

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

        Reviewed by Steve Falkenburg.

        - fix crash seen on Windows release builds

        * wtf/FastMalloc.cpp: Change pthread_getspecific optimization to be done only
        on the DARWIN platform. Also correct a couple reinterpret_cast that should be
        static_cast instead.

2007-09-06  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Maciej.

        - Moved JSRetainPtr to the API.

        * API/JSRetainPtr.h: Copied from kjs/JSRetainPtr.h.
        (JSRetain):
        (JSRelease):
        (JSRetainPtr::JSRetainPtr):
        (JSRetainPtr::~JSRetainPtr):
        (JSRetainPtr::get):
        (JSRetainPtr::releaseRef):
        (JSRetainPtr::operator->):
        (JSRetainPtr::operator!):
        (JSRetainPtr::operator UnspecifiedBoolType):
        (::operator):
        (::adopt):
        (::swap):
        (swap):
        (operator==):
        (operator!=):
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/JSRetainPtr.h: Removed.

2007-09-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - Remove single-threaded optimization for FastMalloc. 
        
        It does not appear to help anywhere but Mac OS X on PPC, due to
        pthread_getspecific being slow there. On Intel, removing the
        optimization results in a ~1.5% PLT speedup, a ~1-5% JS iBench
        speedup, and a ~1.5% HTML iBench speedup. On PPC this change is a
        speedup on some benchmarks, a slight hit on others.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/collector.cpp:
        (KJS::Collector::registerThread):
        * wtf/FastMalloc.cpp:
        (WTF::TCMalloc_ThreadCache::GetCache):
        (WTF::TCMalloc_ThreadCache::GetCacheIfPresent):
        (WTF::TCMalloc_ThreadCache::CreateCacheIfNecessary):
        (WTF::do_malloc):
        * wtf/FastMallocInternal.h: Removed.

2007-09-05  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Adam, Sam, Darin.

        - Created a JSRetainPtr specifically for JSStringRefs so they can be automatically refed and derefed.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/JSRetainPtr.h: Copied from wtf/RetainPtr.h.
        (KJS::JSRetain):
        (KJS::JSRelease):
        (KJS::):
        (KJS::JSRetainPtr::JSRetainPtr):
        (KJS::JSRetainPtr::~JSRetainPtr):
        (KJS::JSRetainPtr::get):
        (KJS::JSRetainPtr::releaseRef):
        (KJS::JSRetainPtr::operator->):
        (KJS::JSRetainPtr::operator UnspecifiedBoolType):
        (KJS::::operator):
        (KJS::::adopt):
        (KJS::::swap):
        (KJS::swap):
        (KJS::operator==):
        (KJS::operator!=):

2007-09-05  Mark Rowe  <mrowe@apple.com>

        Unreviewed Qt build fix.

        * wtf/unicode/qt4/UnicodeQt4.h: Fix the constness of the src argument to toUpper to prevent build failures.

2007-09-04  Maciej Stachowiak  <mjs@apple.com>

        Back out accidentally committed change.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/collector.cpp:
        (KJS::Collector::registerThread):
        * wtf/FastMalloc.cpp:
        (WTF::fastMallocSetIsMultiThreaded):
        (WTF::TCMalloc_ThreadCache::GetCache):
        (WTF::TCMalloc_ThreadCache::GetCacheIfPresent):
        (WTF::TCMalloc_ThreadCache::CreateCacheIfNecessary):
        (WTF::do_malloc):
        * wtf/FastMallocInternal.h: Added.

2007-09-04  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - Added Vector::appendRange(), which appends to a vector based on a given start and end iterator
        - Added keys() and values() functions to HashMap iterators, which give keys-only and values-only iterators
        
        Together, these allow easy copying of a set, or the keys or values of a map, into a Vector. Examples:
        
        HashMap<int, int> map;
        HashSet<int> set;
        Vector<int> vec;
        // ...
        vec.appendRange(set.begin(), set.end());
        vec.appendRange(map.begin().keys(), map.end().keys());
        vec.appendRange(map.begin().values(), map.end().values());

        This also allows for a slightly nicer syntax when iterating a map. Instead of saying 
        (*it)->first, you can say *it.values(). Similarly for keys. Example:
        
        HashMap<int, int>::const_iterator end = map.end();
        for (HashMap<int, int>::const_iterator it = map.begin(); it != end; ++it)
        printf(" [%d => %d]", *it.keys(), *it.values());

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * wtf/HashIterators.h: Added.
        (WTF::):
        (WTF::HashTableConstKeysIterator::HashTableConstKeysIterator):
        (WTF::HashTableConstKeysIterator::get):
        (WTF::HashTableConstKeysIterator::operator*):
        (WTF::HashTableConstKeysIterator::operator->):
        (WTF::HashTableConstKeysIterator::operator++):
        (WTF::HashTableConstValuesIterator::HashTableConstValuesIterator):
        (WTF::HashTableConstValuesIterator::get):
        (WTF::HashTableConstValuesIterator::operator*):
        (WTF::HashTableConstValuesIterator::operator->):
        (WTF::HashTableConstValuesIterator::operator++):
        (WTF::HashTableKeysIterator::HashTableKeysIterator):
        (WTF::HashTableKeysIterator::get):
        (WTF::HashTableKeysIterator::operator*):
        (WTF::HashTableKeysIterator::operator->):
        (WTF::HashTableKeysIterator::operator++):
        (WTF::HashTableKeysIterator::operator HashTableConstKeysIterator<HashTableType, KeyType, MappedType>):
        (WTF::HashTableValuesIterator::HashTableValuesIterator):
        (WTF::HashTableValuesIterator::get):
        (WTF::HashTableValuesIterator::operator*):
        (WTF::HashTableValuesIterator::operator->):
        (WTF::HashTableValuesIterator::operator++):
        (WTF::HashTableValuesIterator::operator HashTableConstValuesIterator<HashTableType, KeyType, MappedType>):
        (WTF::operator==):
        (WTF::operator!=):
        * wtf/HashTable.h:
        * wtf/Vector.h:
        (WTF::::appendRange):

2007-09-04  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - Remove single-threaded optimization for FastMalloc. 
        
        It does not appear to help anywhere but Mac OS X on PPC, due to
        pthread_getspecific being slow there. On Intel, removing the
        optimization results in a 1% PLT speedup, a 2% JS iBench speedup,
        and no measurable effect on HTML iBench (maybe a slight speedup).

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/collector.cpp:
        (KJS::Collector::registerThread):
        * wtf/FastMalloc.cpp:
        (WTF::TCMalloc_ThreadCache::GetCache):
        (WTF::TCMalloc_ThreadCache::GetCacheIfPresent):
        (WTF::TCMalloc_ThreadCache::CreateCacheIfNecessary):
        (WTF::do_malloc):
        * wtf/FastMallocInternal.h: Removed.

2007-09-03  Mark Rowe  <mrowe@apple.com>

        Reviewed by Tim Hatcher.

        <rdar://problem/5452164> Production build with in symbols directory has no debug info

        Enable debug symbol generation on all build configurations.  Production builds are stripped
        of symbols by Xcode during deployment post-processing.

        * Configurations/Base.xcconfig:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-08-30  Riku Voipio  <riku.voipio@iki.fi>

        Reviewed by Dave Kilzer.

        Better ARM defines.

        * kjs/ustring.h: Update comments to reflect the change and update test
        to fit changes to Platform.h.
        * wtf/Platform.h: Forced packing is only needed on oldabi ARM.
        Set middle-endian floats only for little-endian oldabi ARM.
        Set big-endian define for big-endian ARM.

2007-08-29  Ryan Leavengood <leavengood@gmail.com>

        Reviewed by Maciej.

        http://bugs.webkit.org/show_bug.cgi?id=15043
        - posix_memalign takes a void** as its first parameter. My port makes use of this function call.

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

2007-08-26  Darin Adler  <darin@apple.com>

        - quick follow on to that last check-in

        * API/JSCallbackObject.cpp: (KJS::JSCallbackObject::JSCallbackObject):
        Need to initialize m_class to 0.

2007-08-26  Mark Rowe  <mrowe@apple.com>

        Reviewed by Darin Adler.

        <rdar://problem/4949002> JSGlobalContextCreate can cause crashes because it passes a NULL JSContextRef to the globalObjectClass's initialize callback

        JSCallbackObject now tracks whether it was constructed with a null ExecState.  This will happen when the object is being used as the global object,
        as the Interpreter needs to be created after the global object.  In this situation the initialization is deferred until after the Interpreter's
        ExecState is available to be passed down to the initialize callbacks.

        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::init): Track whether we successfully initialized.
        (KJS::JSCallbackObject::initializeIfNeeded): Attempt to initialize with the new ExecState.
        * API/JSCallbackObject.h:
        * API/JSContextRef.cpp:
        (JSGlobalContextCreate): Initialize the JSCallbackObject with the Interpreter's ExecState.
        * API/testapi.c:
        (testInitializeOfGlobalObjectClassHasNonNullContext):
        (main): Verify that the context passed to the initialize callback is non-null.

2007-08-26  Mark Rowe  <mrowe@apple.com>

        Reviewed by Darin Adler.

        <rdar://problem/5438496> JSGlobalContextCreate crashes when passed a custom class

        * API/JSContextRef.cpp:
        (JSGlobalContextCreate): Specify jsNull() as the prototype and let Interpreter's constructor fix it up to point at builtinObjectPrototype().
        * API/testapi.c:
        (main): Use an instance of a custom class as the global object to ensure the code path is exercised in the test.

2007-08-26  Mike Hommey  <glandium@debian.org>

        Reviewed by Mark Rowe and David Kilzer.

        Fix build failure on arm.

        * wtf/Platform.h: Also test if __arm__ is defined.

2007-08-25  Peter Kasting <zerodpx@gmail.org>

        Reviewed by Maciej Stachowiak.

        Part 3 of http://bugs.webkit.org/show_bug.cgi?id=14967
        Bug 14967: Reduce wtf::Vector::operator[]() overloads

        * wtf/Vector.h:
        (WTF::Vector::operator[]): Only provide versions of operator[] that takes a size_t argument.

2007-08-25  Peter Kasting <zerodpx@gmail.org>

        Reviewed by Sam Weinig.

        Part 2 of http://bugs.webkit.org/show_bug.cgi?id=14967.
        Eliminate all remaining implicit conversions of wtf::Vector<T> to T*.  Where code was
        previously checking that the Vector's data pointer was non-NULL, check !Vector::isEmpty()
        instead.

        * wtf/Vector.h:
        (WTF::Vector::data):

2007-08-16  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geoff and Adam.

        - Changing stack depth to 500 (from 100 on mac and win) to help out some apps specifically gmail.  <rdar://problem/3590522> JavaScript call stack limit of 99 is too small for some applications; needs to be closer to 500 (4045)

        * kjs/object.cpp:

2007-08-15  Peter Kasting  <zerodpx@gmail.org>

        Reviewed by Darin.
        
        http://bugs.webkit.org/show_bug.cgi?id=14967 part 1 - Eliminate most implicit
        conversions of wtf::Vector<T> to T* by explicitly calling .data()

        * API/JSCallbackConstructor.cpp:
        (KJS::JSCallbackConstructor::construct):
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::callAsFunction):
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::construct):
        (KJS::JSCallbackObject::callAsFunction):
        * bindings/c/c_instance.cpp:
        (KJS::Bindings::CInstance::invokeMethod):
        (KJS::Bindings::CInstance::invokeDefaultMethod):
        * kjs/number_object.cpp:
        (integer_part_noexp):
        (char_sequence):
        * kjs/ustring.cpp:
        (KJS::UString::UTF8String):

2007-08-14  Darin Adler  <darin@apple.com>

        Reviewed by Sam.

        - fix <rdar://problem/5410570> Global initializer introduced by use of std::numeric_limits in r24919

        * kjs/ustring.cpp:
        (KJS::overflowIndicator): Turned into a function.
        (KJS::maxUChars): Ditto.
        (KJS::allocChars): Use the functions.
        (KJS::reallocChars): Ditto.
        (KJS::UString::expandedSize): Ditto.

2007-08-12  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=14931
          <rdar://problem/5403816> JavaScript regular expression non-participating capturing parentheses
          fail in 3 different ways

        Test: fast/js/regexp-non-capturing-groups.html

        * kjs/string_object.cpp:
        (KJS::replace): Add missing code to handle undefined backreferences; before we'd get the empty string
        instead of a JavaScript "undefined" value.
        (KJS::StringProtoFunc::callAsFunction): Implemented backreference support for split.
        * pcre/pcre_exec.c: (match): Made backreferences to undefined groups match the empty string instead
        of always failing. Only in JAVASCRIPT mode.

        * tests/mozilla/expected.html: Add a new expected test success, since this fixed one test result.

2007-08-10  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Adam.

        <rdar://problem/5394449> Stop using some Carbon UI APIs for 64 bit

        Disable the NPAPI for 64-bit on Mac OS X.

        * Configurations/JavaScriptCore.xcconfig: Use the 64-bit export file.
        * JavaScriptCore.xcodeproj/project.pbxproj: Create a 64-bit export file
        that filters out the NPN fnctions.
        * bindings/NP_jsobject.cpp: #ifdef out this for 64-bit on Mac OS X
        * bindings/NP_jsobject.h: Ditto.
        * bindings/c/c_class.cpp: Ditto.
        * bindings/c/c_class.h: Ditto.
        * bindings/c/c_instance.cpp: Ditto.
        * bindings/c/c_instance.h: Ditto.
        * bindings/c/c_runtime.cpp: Ditto.
        * bindings/c/c_runtime.h: Ditto.
        * bindings/c/c_utility.cpp: Ditto.
        * bindings/c/c_utility.h: Ditto.
        * bindings/npapi.h: Ditto.
        * bindings/npruntime.cpp: Ditto.
        * bindings/npruntime.h: Ditto.
        * bindings/npruntime_impl.h: Ditto.
        * bindings/npruntime_priv.h: Ditto.
        * bindings/runtime.cpp:
        (KJS::Bindings::Instance::createBindingForLanguageInstance):
         don't creat an NPObject on Mac OS X in 64-bit.

2007-08-09  Mark Rowe  <mrowe@apple.com>

        Reviewed by Antti.

        <rdar://problem/5400709> Versioning in debug and release builds should include minor and tiny version before +

        * Configurations/Version.xcconfig:
        * JavaScriptCore.xcodeproj/project.pbxproj: Add a shell script phase to make to dependency between
        Version.xcconfig and Info.plist explicit to Xcode.

2007-08-08  George Staikos  <staikos@kde.org>

        Make it compile with Qt again.

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

2007-08-07  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver.

        Fix for http://bugs.webkit.org/show_bug.cgi?id=14897
        Decompilation of double negation fails and produces invalid or incorrect code

        Test: fast/js/function-decompilation-operators.html

        * kjs/nodes2string.cpp:
        (UnaryPlusNode::streamTo): Put space after unary operator.  Matches Firefox.
        (NegateNode::streamTo): Diito.
        (MultNode::streamTo): Put spaces around binary operator.  Matches Firefox.
        (AddNode::streamTo): Ditto.

2007-08-07  Darin Adler  <darin@apple.com>

        Reviewed by Adele.

        - fix <rdar://problem/5383104> REGRESSION: XHR.responseText is null instead of empty string
          in http/tests/xmlhttprequest/zero-length-response.html

        The new code to handle out of memory conditions was turning a "" into a null string.

        * kjs/ustring.h: Removed UCharReference, which has long been obsolete and unused.
        Removed copyForWriting, which was only used for the upper/lowercasing code and for
        UCharReference.
        * kjs/ustring.cpp:
        (KJS::allocChars): Removed special case that made this fail (return 0) when passed 0.
        Instead assert that we're not passed 0. Also added an overflow check for two reasons:
        1) for sizes that aren't checked this prevents us from allocating a buffer that's too
        small, and 2) for sizes where we overflowed in the expandedSize function and returned
        overflowIndicator, it guarantees we fail.
        (KJS::reallocChars): Ditto.
        (KJS::UString::expandedSize): Return a large number, overflowIndicator, rather than 0
        for cases where we overflow.
        (KJS::UString::spliceSubstringsWithSeparators): Added a special case for empty string so
        we don't call allocChars with a length of 0.
        (KJS::UString::operator=): Added special characters for both 0 and empty string so we
        match the behavior of the constructor. This avoids calling allocChars with a length of 0
        and making a null string rather than an empty string in that case, and also matches the
        pattern used in the rest of the functions.
        (KJS::UString::operator[]): Made the return value const so code that tries to use the
        operator to modify the string will fail.

        * kjs/string_object.cpp: (KJS::StringProtoFunc::callAsFunction): Rewrote uppercasing and
        lowercasing functions so they don't need copyForWriting any more -- it wasn't really doing
        any good for optimization purposes. Instead use a Vector and releaseBuffer.

        * wtf/unicode/icu/UnicodeIcu.h: Eliminate one of the versions of toLower/toUpper -- we now
        only need the version where both a source and destination buffer is passed in, not the one
        that works in place.
        * wtf/unicode/qt4/UnicodeQt4.h: Ditto.

2007-08-06  Sam Weinig  <sam@webkit.org>

        Reviewed by Oliver.

        Fix for http://bugs.webkit.org/show_bug.cgi?id=14891
        Decompilation of try block immediately following "else" fails

        Test: fast/js/toString-try-else.html

        * kjs/nodes2string.cpp:
        (TryNode::streamTo): Add newline before "try".

2007-08-07  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej.

        <rdar://problem/5388774> REGRESSION: Hang occurs after clicking "Attach a file " link in a new .Mac message

        Attempting to acquire the JSLock inside CollectorHeap::forceLock can lead to a deadlock if the thread currently
        holding the lock is waiting on the thread that is forking.  It is not considered safe to use system frameworks
        after a fork without first execing[*] so it is not particularly important to ensure that the collector and
        fastMalloc allocators are unlocked in the child process.  If the child process wishes to use JavaScriptCore it
        should exec after forking like it would to use any other system framework.
        [*]: <http://lists.apple.com/archives/Cocoa-dev/2005/Jan/msg00676.html>

        * kjs/CollectorHeapIntrospector.cpp: Remove forceLock and forceUnlock implementations.
        * kjs/CollectorHeapIntrospector.h: Stub out forceLock and forceUnlock methods.
        * wtf/FastMalloc.cpp: Ditto.

2007-08-06  Darin Adler  <darin@apple.com>

        Rubber stamped by Geoff.

        * kjs/ustring.h: Added an assertion which would have helped us find the
        previous bug more easily.

2007-08-06  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - fix <rdar://problem/5387589> 9A514: Quartz Composer crash on launch in KJS::jsString

        * API/JSBase.cpp:
        (JSEvaluateScript): Turn NULL for sourceURL into UString::null(), just as JSObjectMakeFunction already does.
        (JSCheckScriptSyntax): Ditto.

2007-08-06  Matt Lilek  <pewtermoose@gmail.com>

        Not reviewed, build fix.

        * kjs/string_object.cpp:
        (KJS::StringProtoFunc::callAsFunction):

2007-08-04  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix <rdar://problem/5371862> crash in Dashcode due to Quartz Composer JavaScript garbage collector reentrancy

        * API/JSBase.cpp: (JSGarbageCollect): Don't call collector() if isBusy() returns true.

        * kjs/collector.h: Added isBusy(), removed the unused return value from collect()
        * kjs/collector.cpp: Added an "operation in progress" flag to the allocator.
        (KJS::Collector::allocate): Call abort() if an operation is already in progress. Set the new flag instead
        of using the debug-only GCLock.
        (KJS::Collector::collect): Ditto.
        (KJS::Collector::isBusy): Added.

2007-08-04  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin and Adam.
        
        <rdar://problem/5368990> REGRESSION: newsgator.com sign-on 6x slower than Safari 3 beta due to GC changes (14808)

        * kjs/string_object.cpp:
        (KJS::replace): if the string didn't change (very common in some cases) reuse the original string value.
        (KJS::StringProtoFunc::callAsFunction): Pass in the StringImp* when replacing, not just the UString.
        * kjs/string_object.h:
        (KJS::StringInstance::internalValue): covariant override to return StringImp for convenience

2007-08-04  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver Hunt.

        <rdar://problem/5385145> r24843 introduces a crash on calling fork() (14878)
        http://bugs.webkit.org/show_bug.cgi?id=14878

        Provide no-op functions for all members of the malloc_zone_t and malloc_introspection_t structures that we
        register to avoid crashes in system code that assumes they will be non-null.

        * kjs/CollectorHeapIntrospector.cpp:
        (KJS::CollectorHeapIntrospector::CollectorHeapIntrospector):
        (KJS::CollectorHeapIntrospector::forceLock): Grab the lock.
        (KJS::CollectorHeapIntrospector::forceUnlock): Release the lock.
        * kjs/CollectorHeapIntrospector.h:
        (KJS::CollectorHeapIntrospector::goodSize):
        (KJS::CollectorHeapIntrospector::check):
        (KJS::CollectorHeapIntrospector::print):
        (KJS::CollectorHeapIntrospector::log):
        (KJS::CollectorHeapIntrospector::statistics):
        (KJS::CollectorHeapIntrospector::size):
        (KJS::CollectorHeapIntrospector::zoneMalloc):
        (KJS::CollectorHeapIntrospector::zoneCalloc):
        (KJS::CollectorHeapIntrospector::zoneFree):
        * wtf/FastMalloc.cpp:
        (WTF::FastMallocZone::goodSize):
        (WTF::FastMallocZone::check):
        (WTF::FastMallocZone::print):
        (WTF::FastMallocZone::log):
        (WTF::FastMallocZone::forceLock): Grab the TCMalloc locks.
        (WTF::FastMallocZone::forceUnlock): Release the TCMalloc locks.
        (WTF::FastMallocZone::FastMallocZone):

2007-08-04  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Anders.

        * pcre/pcre_compile.c: Remove non-ASCII character from a comment.

2007-08-02  Mark Rowe  <mrowe@apple.com>

        Reviewed by Geoff Garen.

        <rdar://problem/4212199> 'leaks' reports false leaks in WebKit (because the WTF allocator uses mmap?)

        Implement malloc zone introspection routines to allow leaks, heap, and friends to request information
        about specific memory regions that were allocated by FastMalloc or the JavaScriptCore collector.

        This requires tool-side support before the regions will be displayed.  The addition of that support is
        tracked by <rdar://problems/5353057&5353060>.

        * JavaScriptCore.exp: Export the two variables that are used by leaks to introspect the allocators.
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/AllInOneFile.cpp:
        * kjs/CollectorHeapIntrospector.cpp: Added.
        (KJS::):
        (KJS::CollectorHeapIntrospector::init): 
        (KJS::CollectorHeapIntrospector::CollectorHeapIntrospector): Create and register our zone with the system.
        (KJS::CollectorHeapIntrospector::enumerate): Iterate over the CollectorBlocks that are in use and report them to the caller as being used.
        * kjs/CollectorHeapIntrospector.h: Added.
        (KJS::CollectorHeapIntrospector::size): Return zero to indicate the specified pointer does not belong to this zone.
        * kjs/collector.cpp:
        (KJS::Collector::registerThread): Register the CollectorHeapIntrospector with the system when the first thread is registered with the collector.
        * wtf/FastMalloc.cpp:
        (WTF::TCMalloc_PageHeap::GetDescriptorEnsureSafe):
        (WTF::TCMalloc_ThreadCache_FreeList::enumerateFreeObjects): Enumerate the objects on the free list.
        (WTF::TCMalloc_ThreadCache::enumerateFreeObjects): Ditto.
        (WTF::TCMalloc_Central_FreeList::enumerateFreeObjects): Ditto.
        (WTF::TCMalloc_ThreadCache::InitModule): Register the FastMallocZone with the system when initializing TCMalloc.
        (WTF::FreeObjectFinder::FreeObjectFinder):
        (WTF::FreeObjectFinder::visit): Add an object to the free list.
        (WTF::FreeObjectFinder::isFreeObject):
        (WTF::FreeObjectFinder::freeObjectCount):
        (WTF::FreeObjectFinder::findFreeObjects): Find the free objects within a thread cache or free list.
        (WTF::PageMapFreeObjectFinder::PageMapFreeObjectFinder): Find the free objects within a TC_PageMap.
        (WTF::PageMapFreeObjectFinder::visit): Called once per allocated span.  Record whether the span or any subobjects are free.
        (WTF::PageMapMemoryUsageRecorder::PageMapMemoryUsageRecorder):
        (WTF::PageMapMemoryUsageRecorder::visit): Called once per allocated span.  Report the range of memory as being allocated, and the span or
        its subobjects as being used if they do not appear on the free list.
        (WTF::FastMallocZone::enumerate): Map the key remote TCMalloc data structures into our address space.  We then locate all free memory ranges
        before reporting the other ranges as being in use.
        (WTF::FastMallocZone::size): Determine whether the given pointer originates from within our allocation zone.  If so,
        we return its allocation size.
        (WTF::FastMallocZone::zoneMalloc):
        (WTF::FastMallocZone::zoneCalloc):
        (WTF::FastMallocZone::zoneFree):
        (WTF::FastMallocZone::zoneRealloc):
        (WTF::):
        (WTF::FastMallocZone::FastMallocZone): Create and register our zone with the system.
        (WTF::FastMallocZone::init):
        * wtf/MallocZoneSupport.h: Added.
        (WTF::RemoteMemoryReader::RemoteMemoryReader): A helper class to ease the process of mapping memory in a different process into
        our local address space
        (WTF::RemoteMemoryReader::operator()):
        * wtf/TCPageMap.h:
        (TCMalloc_PageMap2::visit): Walk over the heap and visit each allocated span.
        (TCMalloc_PageMap3::visit): Ditto.

2007-08-02  Mark Rowe  <mrowe@apple.com>

        Build fix.

        * kjs/ustring.cpp:
        (KJS::UString::expandedSize):  Use std::numeric_limits<size_t>::max() rather than the non-portable SIZE_T_MAX.

2007-08-02  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej.

        <rdar://problem/5352887> "Out of memory" error during repeated JS string concatenation leaks hundreds of MBs of RAM

        A call to fastRealloc was failing which lead to UString::expandCapacity leaking the buffer it was trying to reallocate.
        It also resulted in the underlying UString::rep having both a null baseString and buf field, which meant that attempting
        to access the contents of the string after the failed memory reallocation would crash.

        A third issue is that expandedSize size was calculating the new length in a way that led to an integer overflow occurring.
        Attempting to allocate a string more than 190,000,000 characters long would fail a the integer overflow would lead to a
        memory allocation of around 3.6GB being attempted rather than the expected 390MB.  Sizes that would lead to an overflow
        are now  returned as zero and callers are updated to treat this as though the memory allocation has failed.

        * kjs/array_object.cpp:
        (ArrayProtoFunc::callAsFunction): Check whether the append failed and raise an "Out of memory" exception if it did.
        * kjs/ustring.cpp:
        (KJS::allocChars): Wrapper around fastMalloc that takes a length in characters.  It will return 0 when asked to allocate a zero-length buffer.
        (KJS::reallocChars): Wrapper around fastRealloc that takes a length in characters.  It will return 0 when asked to allocate a zero-length buffer.
        (KJS::UString::expandedSize): Split the size calculation in two and guard against overflow during each step.
        (KJS::UString::expandCapacity): Don't leak r->buf if reallocation fails.  Instead free the memory and use the null representation.
        (KJS::UString::expandPreCapacity): If fastMalloc fails then use the null representation rather than crashing in memcpy.
        (KJS::UString::UString): If calls to expandCapacity, expandPreCapacity or fastMalloc fail then use the null representation rather than crashing in memcpy.
        (KJS::UString::append): Ditto.
        (KJS::UString::operator=): Ditto.
        * kjs/ustring.h: Change return type of expandedSize from int to size_t.

2007-08-01  Darin Adler  <darin@apple.com>

        Reviewed by Kevin McCullough.

        - fix <rdar://problem/5375186> pointers to pieces of class definition passed to JSClassCreate should all be const

        * API/JSObjectRef.h: Added const.

        * API/JSClassRef.cpp:
        (OpaqueJSClass::OpaqueJSClass): Added const.
        (OpaqueJSClass::create): Added const.
        * API/JSObjectRef.cpp:
        (JSClassCreate): Added const.

2007-08-01  Steve Falkenburg  <sfalken@apple.com>

        Build mod: Fix sln to match configs in vcproj.
        
        Reviewed by Adam.

        * JavaScriptCore.vcproj/JavaScriptCore.make:
        * JavaScriptCore.vcproj/JavaScriptCore.sln:

2007-07-30  Simon Hausmann  <hausmann@kde.org>

        Done with and reviewed by Lars.

        Removed the __BUILDING_QT ifdef in JSStringRef.h and changed UChar for the Qt build to use wchar_t on Windows.

        * API/JSStringRef.h:
        * wtf/unicode/qt4/UnicodeQt4.h:

2007-07-27  Simon Hausmann  <hausmann@kde.org>

        Done with and reviewed by Lars and Zack.

        Always define JSChar to be unsigned short for the Qt builds, to ensure compatibility with UChar.

        * API/JSStringRef.h:

2007-07-27  Simon Hausmann  <hausmann@kde.org>

        Done with and reviewed by Lars and Zack.

        Fix compilation with Qt on Windows with MingW: Implemented currentThreadStackBase() for this platform.

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

2007-07-27  Simon Hausmann  <hausmann@kde.org>

        Done with and reviewed by Lars and Zack.

        Fix compilation with Qt on Windows with MingW: The MingW headers do not provide a prototype for a reentrant version of localtime. But since we don't use multiple threads for the Qt build we can use the plain localtime() function.

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

2007-07-27  Simon Hausmann  <hausmann@kde.org>

        Done with and reviewed by Lars and Zack.

        Use $(MOVE) instead of mv to eliminated the shell dependency and replaced the long shell line to call bison and modify the css grammar file with a few lines of portable perl code.

        * JavaScriptCore.pri:

2007-07-27  Simon Hausmann  <hausmann@kde.org>

        Done with and reviewed by Lars and Zack.

        Implemented currentTime() in the interpreter by using QDateTime, so that we don't need timeGetTime() on Windows and therefore also don't need to link against Winmm.dll.

        * kjs/interpreter.cpp:
        (KJS::getCurrentTime):
        * kjs/testkjs.cpp:
        (StopWatch::start):
        (StopWatch::stop):

2007-07-27  Simon Hausmann  <hausmann@kde.org>

        Done with and reviewed by Lars and Zack.

        Replace the use of snprintf with QByteArray to compile under msvc 2005 express.

        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtInstance::stringValue):

2007-07-27  Simon Hausmann  <hausmann@kde.org>

        Done with and reviewed by Lars and Zack.

        Don't use pthread.h unless thread support is enabled.

        * kjs/collector.cpp:
        (KJS::Collector::registerAsMainThread):
        (KJS::onMainThread):

2007-07-27  Simon Hausmann  <hausmann@kde.org>

        Done with and reviewed by Lars and Zack.

        Removed TCSystemMalloc from the Qt build, it's not necessary it seems.

        * JavaScriptCore.pri:

2007-07-27  Simon Hausmann  <hausmann@kde.org>

        Done with and reviewed by Lars and Zack.

        Added os-win32 to the include search path for the Qt windows build in order to provide the fake stdint.h header file.

        * JavaScriptCore.pri:

2007-07-25  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Mark.

        - follow-up to previous change
        
        * kjs/ustring.cpp:
        (KJS::UString::operator=): Make sure to reset the length when
        replacing the buffer contents for a single-owned string.

2007-07-25  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - JavaScriptCore part of fix for <rdar://problem/5300291> Optimize GC to reclaim big, temporary objects (like XMLHttpRequest.responseXML) quickly
        
        Also, as a side effect of optimizations included in this patch:
        - 7% speedup on JavaScript iBench
        - 4% speedup on "Celtic Kane" JS benchmark
        
        The basic idea is explained in a big comment in collector.cpp. When unusually 
        large objecs are allocated, we push the next GC closer on the assumption that
        most objects are short-lived.
        
        I also did the following two optimizations in the course of tuning
        this not to be a performance regression:

        1) Change UString::Rep to hold a self-pointer as the baseString in
        the unshared case, instead of a null pointer; this removes a
        number of null checks in hot code because many places already
        wanted to use the rep itself or the baseString as appropriate.
        
        2) Avoid creating duplicate StringImpls when creating a
        StringInstance (the object wrapper for a JS string) or calling
        their methods. Since a temporary wrapper object is made every time
        a string method is called, this resulted in two useless extra
        StringImpls being allocated for no reason whenever a String method
        was invoked on a string value. Now we bypass those.
        
        * kjs/collector.cpp:
        (KJS::):
        (KJS::Collector::recordExtraCost): Basics of the extra cost mechanism.
        (KJS::Collector::allocate): ditto
        (KJS::Collector::collect): ditto
        * kjs/collector.h:
        (KJS::Collector::reportExtraMemoryCost): ditto
        * kjs/array_object.cpp:
        (ArrayInstance::ArrayInstance): record extra cost
        * kjs/internal.cpp:
        (KJS::StringImp::toObject): don't create a whole new StringImpl just
        to be the internal value of a StringInstance! StringImpls are immutable
        so there's no point tot his.
        * kjs/internal.h:
        (KJS::StringImp::StringImp): report extra cost
        * kjs/string_object.cpp:
        (KJS::StringInstance::StringInstance): new version that takes a StringImp
        (KJS::StringProtoFunc::callAsFunction): don't create a whole new StringImpl
        just to convert self to string! we already have one in the internal value
        * kjs/string_object.h: report extra cost        
        * kjs/ustring.cpp: All changes to handle baseString being self instead of null in the 
        unshared case.
        (KJS::):
        (KJS::UString::Rep::create):
        (KJS::UString::Rep::destroy):
        (KJS::UString::usedCapacity):
        (KJS::UString::usedPreCapacity):
        (KJS::UString::expandCapacity):
        (KJS::UString::expandPreCapacity):
        (KJS::UString::UString):
        (KJS::UString::append):
        (KJS::UString::operator=):
        (KJS::UString::copyForWriting):
        * kjs/ustring.h:
        (KJS::UString::Rep::baseIsSelf): new method, now that baseString is
        self instead of null in the unshared case we can't just null check.
        (KJS::UString::Rep::data): adjusted as mentioned above
        (KJS::UString::cost): new method to compute the cost for a UString, for
        use by StringImpl.

        * kjs/value.cpp:
        (KJS::jsString): style fixups.
        (KJS::jsOwnedString): new method, use this for strings allocated from UStrings
        held by the parse tree. Tracking their cost as part of string cost is pointless,
        because garbage collecting them will not actually free the relevant string buffer.
        * kjs/value.h: prototyped jsOwnedString.
        * kjs/nodes.cpp:
        (StringNode::evaluate): use jsOwnedString as appropriate
        (RegExpNode::evaluate): ditto
        (PropertyNameNode::evaluate): ditto
        (ForInNode::execute): ditto
        
        * JavaScriptCore.exp: Exported some new symbols.

2007-07-23  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff.

        <rdar://problem/5121461> REGRESSION: Unable to load JigZone puzzle
        
        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::createNative):
        
        Call RootObject::gcProtect on the global object, thereby putting it in the
        "protect count" set which is used for checking if a native handle is valid.
        
2007-07-23  Darin Adler  <darin@apple.com>

        * pcre/pcre_compile.c: Roll back a tiny accidental change in the unused !JAVASCRIPT
        side of an #ifdef. This has no effect when using PCRE in JAVASCRIPT mode as we do,
        but seems worth rolling back.

2007-07-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fix remaining problems with Window shadowing

        * kjs/nodes.cpp:
        (VarDeclNode::evaluate): Tweak the special case a little.

2007-07-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - fix Window shadowing regressions caused by the previous commit.

        * kjs/nodes.cpp:
        (VarDeclNode::evaluate): Handle the case of global scope specially.

2007-07-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        -fixed <rdar://problem/5353293> REGRESSION (r24287): 1% i-Bench JS slowdown from JavaScript compatibility fix (14719)
        http://bugs.webkit.org/show_bug.cgi?id=14719
        
        My fix for this actually resulted in JS iBench being 1% faster than before the regression
        and the Celtic Kane benchmark being 5% faster than before the regression.
        
        * kjs/nodes.cpp:
        (VarDeclNode::handleSlowCase): factored out the slow code path to be out of line.
        (VarDeclNode::evaluate): I did a couple of things:
        (1) Don't check if the variable is already declared by looking for the property in
        the variable object, that code path was dead code.
        (2) Special-case the common case where the top of the scope and the variable object
        are the same; in that case the variable must always be in the variable object.
        (3) Don't return a jsString() of the variable name, nothing uses the return value
        from this node types evaluate method.
        * kjs/nodes.h:

2007-07-22  Darin Adler  <darin@apple.com>

        Reviewed by Kevin Decker.

        - fix <rdar://problem/5126394> REGRESSION: Crash after clicking back button in test application (13250)
          http://bugs.webkit.org/show_bug.cgi?id=13250

        * bindings/objc/objc_utility.mm: (KJS::Bindings::convertObjcValueToValue):
        If the object returns 0 for _imp, convert that to "undefined", since callers
        can't cope with a JSValue of 0.

2007-07-19  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Fixed http://bugs.webkit.org/show_bug.cgi?id=10880 | <rdar://problem/5335694>
        REGRESSION: JavaScript menu doesn't appear on pricepoint.com (14595)
        
        Though the ECMA spec says auto-semicolon insertion should not occur
        without a newline or '}', Firefox treats do-while specially, and the
        library used by pricepoint.com requires that special treatment.
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/grammar.y:

2007-07-19  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix <rdar://problem/5345440> PCRE computes wrong length for expressions with quantifiers
          on named recursion or subexpressions

        It's challenging to implement proper preflighting for compiling these advanced features.
        But we don't want them in the JavaScript engine anyway.

        Turned off the following features of PCRE (some of these are simply parsed and not implemented):

            \C \E \G \L \N \P \Q \U \X \Z
            \e \l \p \u \z
            [::] [..] [==]
            (?#) (?<=) (?<!) (?>)
            (?C) (?P) (?R)
            (?0) (and 1-9)
            (?imsxUX)

        Added the following:

            \u \v

        Because of \v, the js1_2/regexp/special_characters.js test now passes.

        To be conservative, I left some features that JavaScript doesn't want, such as
        \012 and \x{2013}, in place. We can revisit these later; they're not directly-enough
        related to avoiding the incorrect preflighting.

        I also didn't try to remove unused opcodes and remove code from the execution engine.
        That could save code size and speed things up a bit, but it would require more changes.

        * kjs/regexp.h:
        * kjs/regexp.cpp: (KJS::RegExp::RegExp): Remove the sanitizePattern workaround for
        lack of \u support, since the PCRE code now has \u support.

        * pcre/pcre-config.h: Set JAVASCRIPT to 1.
        * pcre/pcre_internal.h: Added ESC_v.

        * pcre/pcre_compile.c: Added a different escape table for when JAVASCRIPT is set that
        omits all the escapes we don't want interpreted and includes '\v'.
        (check_escape): Put !JAVASCRIPT around the code for '\l', '\L', '\N', '\u', and '\U',
        and added code to handle '\u2013' inside JAVASCRIPT.
        (compile_branch): Put !JAVASCRIPT if around all the code implementing the features we
        don't want.
        (pcre_compile2): Ditto.

        * tests/mozilla/expected.html: Updated since js1_2/regexp/special_characters.js now
        passes.

2007-07-18  Darin Adler  <darin@apple.com>

        Reviewed by Oliver Hunt.

        - fix <rdar://problem/5345432> PCRE computes length wrong for expressions such as "[**]"

        Test: fast/js/regexp-charclass-crash.html

        * pcre/pcre_compile.c: (pcre_compile2): Fix the preflight code that calls
        check_posix_syntax to match the actual regular expression compilation code;
        before it was missing the check of the first character.

2007-07-19  Holger Hans Peter Freyther  <zecke@selfish.org>

        Reviewed by Mark.

        Define __BUILDING_GDK when building for Gdk to fix building testkjs on OSX.

        * JavaScriptCore.pri:

2007-07-18  Simon Hausmann  <hausmann@kde.org>

        * Fix the Qt build, call dftables from the right directory.

        Reviewed by Adam Treat.

        * pcre/pcre.pri:

2007-07-18  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Zack.

        Don't call gcc directly when building the dftables tool but use a separate .pro file for the Qt build.

        * pcre/dftables.pro: Added.
        * pcre/pcre.pri:

2007-07-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Darin, Maciej, and Adam.

        Fixes <http://bugs.webkit.org/show_bug.cgi?id=9697>,
              the failure of ecma/GlobalObject/15.1.2.2-2.js,
              the failure of ecma/LexicalConventions/7.7.3-1.js,
              and most of the failures of tests in ecma/TypeConversion/9.3.1-3.js.

        Bug 9697: parseInt results may be inaccurate for numbers greater than 2^53

        This patch also fixes similar issues in the lexer and UString::toDouble().

        * kjs/function.cpp:
        (KJS::parseIntOverflow):
        (KJS::parseInt):
        * kjs/function.h:
        * kjs/lexer.cpp:
        (KJS::Lexer::lex):
        * kjs/ustring.cpp:
        (KJS::UString::toDouble):
        * tests/mozilla/expected.html:

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

        Reviewed by Oliver.

        Turn off -Wshorten-64-to-32 warning for 64-bit builds.

        * Configurations/Base.xcconfig:

2007-07-14  Brady Eidson  <beidson@apple.com>

        Reviewed by Sam Weinig

        Initial check-in for <rdar://problem/3154486> - Supporting FTP directory listings in the browser

        * wtf/Platform.h: Add ENABLE_FTPDIR feature to handle building on platforms that don't have the
          proper network-layer support

2007-07-14  Cameron Zwarich  <cwzwarich@uwaterloo.ca>

        Reviewed by Darin.

        Fixes http://bugs.webkit.org/show_bug.cgi?id=13517,
              http://bugs.webkit.org/show_bug.cgi?id=14237, and
              the failure of test js1_5/Scope/regress-185485.js

        Bug 13517: DOM Exception 8 in finance.aol.com sub-page
        Bug 14237: Javascript "var" statement interprets initialization in the topmost function scope

        * kjs/nodes.cpp:
        (VarDeclNode::evaluate):
        * tests/mozilla/expected.html:

2007-07-12  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Mitz.

        http://bugs.webkit.org/show_bug.cgi?id=14596
        Fix JSC compilation with KJS_VERBOSE.

        * kjs/function.cpp:
        (KJS::FunctionImp::passInParameters):

2007-07-11  George Staikos  <staikos@kde.org>

        Make it compile.

        * ForwardingHeaders: Added.
        * ForwardingHeaders/JavaScriptCore: Added.
        * ForwardingHeaders/JavaScriptCore/APICast.h: Added.
        * ForwardingHeaders/JavaScriptCore/JSBase.h: Added.
        * ForwardingHeaders/JavaScriptCore/JSContextRef.h: Added.
        * ForwardingHeaders/JavaScriptCore/JSLock.h: Added.
        * ForwardingHeaders/JavaScriptCore/JSObjectRef.h: Added.
        * ForwardingHeaders/JavaScriptCore/JSStringRef.h: Added.
        * ForwardingHeaders/JavaScriptCore/JSStringRefCF.h: Added.
        * ForwardingHeaders/JavaScriptCore/JSValueRef.h: Added.
        * ForwardingHeaders/JavaScriptCore/JavaScriptCore.h: Added.

2007-07-11  Holger Hans Peter Freyther  <zecke@selfish.org>

        Reviewed by Darin.

        As of http://bugs.webkit.org/show_bug.cgi?id=14527 move the
        WebCore/ForwardingHeader/JavaScriptCore to JavaScriptCore

        * ForwardingHeaders: Added.
        * ForwardingHeaders/JavaScriptCore: Copied from WebCore/ForwardingHeaders/JavaScriptCore.

2007-07-11  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by Mark.

        Forwardport the hash table fix from CodeGeneratorJS.pm to create_hash_table.
        Reran run-jsc-tests, couldn't find any regressions. Suggested by Darin.

        * kjs/create_hash_table:

2007-07-09  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - JavaScriptCore part of fix for: <rdar://problem/5295734> Repro crash closing tab/window @ maps.google.com in WTF::HashSet<KJS::RuntimeObjectImp*, WTF::PtrHash<KJS::RuntimeObjectImp*>, WTF::HashTraits<KJS::RuntimeObjectImp*> >::add + 11
        
        * JavaScriptCore.exp: Added needed export.

2007-07-06  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Antti.

        - <rdar://problem/5311093> JavaScriptCore fails to build with strict-aliasing warnings
        
        * Configurations/Base.xcconfig: Re-enable -Wstrict-aliasing
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::getJNIEnv): Type-pun via a union instead of a pointer cast.
        * wtf/HashMap.h:
        (WTF::): Instead of doing type-punned assignments via pointer cast, do one of three things:
        (1) assign directly w/o cast if storage type matches real type; (2) assign using cast
        via union if type does not need reffing; (3) copy with memcpy and ref/deref manually if type
        needs reffing. This is ok peref-wise because memcpy of a constant length gets optomized.
        HashTraits are now expected to make ref()/deref() take the storage type, not the true type.
        * wtf/HashSet.h:
        (WTF::): Same basic idea.
        * wtf/HashTable.h:
        (WTF::): Added Assigner template for use by HashMap/HashSet. Change RefCounter to call ref()
        and deref() via storage type, avoiding the need to
        type-pun.
        (WTF::RefCounter::ref): ditto
        (WTF::RefCounter::deref): ditto
        * wtf/HashTraits.h:
        (WTF::): Change ref() and deref() for RefPtr HashTraits to take the storage type; cast
        via union to pointer type.
        * wtf/FastMalloc.cpp:
        (WTF::TCMalloc_PageHeap::init): Changed from constructor to init function so this can go in a union.
        (WTF::): redefine pageheap macro in terms of getPageHeap().
        (WTF::getPageHeap): new inline function, helper for pageheap macro. This hides the cast in a union.
        (WTF::TCMalloc_ThreadCache::InitModule): Call init() instead of using placement new to initialize page
        heap.
        * wtf/TCPageMap.h:
        (TCMalloc_PageMap1::init): Changed from constructor to init function.
        (TCMalloc_PageMap2::init): ditto
        (TCMalloc_PageMap3::init): ditto


2007-07-06  George Staikos  <staikos@kde.org>

        Reviewed by Maciej.

        Switch USE(ICONDATABASE) to ENABLE(ICONDATABASE)

        * wtf/Platform.h:

2007-07-03  Sam Weinig  <sam@webkit.org>

        Reviewed by Darin.

        Eleventh round of fixes for implicit 64-32 bit conversion errors.
        <rdar://problem/5292262>

        - Fixes a real bug where where we were setting long long and unsigned long long
          values to a long field.

        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):

2007-07-03  Sam Weinig  <sam@webkit.org>

        Reviewed by Brady Eidson.

        Tenth round of fixes for implicit 64-32 bit conversion errors.
        <rdar://problem/5292262>

        - Add explicit casts.

        * kjs/dtoa.cpp:
        (Bigint::):

2007-07-02  Sam Weinig  <sam@webkit.org>

        Reviewed by Kevin McCullough.

        Fourth round of fixes for implicit 64-32 bit conversion errors.
        <rdar://problem/5292262>

        Add custom piDouble and piFloat constants to use instead of M_PI.

        * kjs/math_object.cpp:
        (MathObjectImp::getValueProperty):
        * wtf/MathExtras.h:
        (wtf_atan2):

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

        Reviewed by Darin.

        Second pass at fixing implicit 64-32 bit conversion errors.
        <rdar://problem/5292262>

        - Add a toFloat() method to JSValue for float conversion.

        * JavaScriptCore.exp:
        * kjs/value.cpp:
        (KJS::JSValue::toFloat):
        * kjs/value.h:

2007-06-27  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Darin.

        - <rdar://problem/5271937> REGRESSION: Apparent WebKit JavaScript memory smasher when submitting comment to iWeb site (crashes in kjs_pcre_compile2)
        - Correctly evaluate the return value of _pcre_ucp_findchar.

        * pcre/pcre_compile.c:
        (compile_branch):
        * pcre/pcre_exec.c:
        (match):

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

        Reviewed by Darin.

        First pass at fixing implicit 64-32 bit conversion errors.
        <rdar://problem/5292262>

        - Add 'f' suffix where necessary.

        * kjs/testkjs.cpp:
        (StopWatch::getElapsedMS):

2007-06-26  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed <rdar://problem/5296627> JSGarbageCollect headerdoc suggests that 
        using JavaScriptCore requires leaking memory

        * API/JSBase.h: Changed documentation to explain that you can pass NULL
        to JSGarbageCollect.

2007-06-26  Adam Treat  <adam@staikos.net>

        Reviewed by Adam Roben.

        Make the SQLite icon database optional.

        * wtf/Platform.h:

2007-06-15  George Staikos  <staikos@kde.org>

        More missing files for Qt.

        * JavaScriptCore.pri:
        * kjs/testkjs.pro:

2007-06-15  George Staikos  <staikos@kde.org>

        Another Qt build fix.

        * JavaScriptCore.pri:
        * kjs/testkjs.pro:

2007-06-15  George Staikos  <staikos@kde.org>

        Fixing Qt build.

        * JavaScriptCore.pri:

2007-06-20  Mark Rowe  <mrowe@apple.com>

        Reviewed by Mitz.

        Fix http://bugs.webkit.org/show_bug.cgi?id=14244
        Bug 14244: Data corruption when using a replace() callback function with data containing "$"

        * kjs/string_object.cpp:
        (KJS::replace):  When 'replacement' is a function, do not replace $n placeholders in its return value.
        This matches the behaviour described in ECMA 262 3rd Ed section 15.5.4.1, and as implemented in Firefox.

2007-06-14  Anders Carlsson  <andersca@apple.com>

        Fix Windows build.
        
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::canPut):

2007-06-14  Anders Carlsson  <andersca@apple.com>

        Reviewed by Darin.

        <rdar://problem/5103077> 
        Crash at _NPN_ReleaseObject when quitting page at http://eshop.macsales.com/shop/ModBook
        
        <rdar://problem/5183692>
        http://bugs.webkit.org/show_bug.cgi?id=13547
        REGRESSION: Crash in _NPN_ReleaseObject when closing Safari on nba.com (13547)
        
        <rdar://problem/5261499>
        CrashTracer: [USER] 75 crashes in Safari at com.apple.JavaScriptCore: KJS::Bindings::CInstance::~CInstance + 40
        
        Have the root object track all live instances of RuntimeObjectImp. When invalidating 
        the root object, also invalidate all live runtime objects by zeroing out their instance ivar.
        This prevents instances from outliving their plug-ins which lead to crashes.
        
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertValueToNPVariant):
        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::convertValueToJObject):
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::convertValueToJValue):
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::callAsFunction):
        * bindings/runtime_array.cpp:
        (RuntimeArray::RuntimeArray):
        * bindings/runtime_array.h:
        (KJS::RuntimeArray::getConcreteArray):
        * bindings/runtime_method.cpp:
        (RuntimeMethod::callAsFunction):
        * bindings/runtime_method.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::RuntimeObjectImp):
        (RuntimeObjectImp::~RuntimeObjectImp):
        (RuntimeObjectImp::invalidate):
        (RuntimeObjectImp::fallbackObjectGetter):
        (RuntimeObjectImp::fieldGetter):
        (RuntimeObjectImp::methodGetter):
        (RuntimeObjectImp::getOwnPropertySlot):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::canPut):
        (RuntimeObjectImp::defaultValue):
        (RuntimeObjectImp::implementsCall):
        (RuntimeObjectImp::callAsFunction):
        (RuntimeObjectImp::getPropertyNames):
        (RuntimeObjectImp::throwInvalidAccessError):
        * bindings/runtime_object.h:
        * bindings/runtime_root.cpp:
        (KJS::Bindings::RootObject::invalidate):
        (KJS::Bindings::RootObject::addRuntimeObject):
        (KJS::Bindings::RootObject::removeRuntimeObject):
        * bindings/runtime_root.h:

2007-06-14  Anders Carlsson  <andersca@apple.com>

        Reviewed by Mitz.

        <rdar://problem/5244948>
        Safari keeps on complaining about slow script playing NBC TV video (14133)

        http://bugs.webkit.org/show_bug.cgi?id=14133
        Runaway JavaScript timer fires when spinning around in Google Maps street view

        Make sure to start and stop the timeout checker around calls to JS.
        
        * bindings/NP_jsobject.cpp:
        (_NPN_InvokeDefault):
        (_NPN_Invoke):
        (_NPN_Evaluate):
        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::call):
        (JavaJSObject::eval):

2007-06-13  Darin Adler  <darin@apple.com>

        Reviewed by Mark Rowe.

        - fix http://bugs.webkit.org/show_bug.cgi?id=14132
          array sort with > 10000 elements sets elements > 10000 undefined

        Test: fast/js/sort-large-array.html

        * kjs/array_instance.h: Replaced pushUndefinedObjectsToEnd with
        compactForSorting, and removed ExecState parameters.

        * kjs/array_object.cpp:
        (ArrayInstance::sort): Changed to call compactForSorting.
        (ArrayInstance::compactForSorting): Do the get and delete of the
        properties directly on the property map instead of using public
        calls from JSObject. The public calls would just read the undefined
        values from the compacted sort results array!

2007-06-13  George Staikos  <staikos@kde.org>

        Reviewed by Lars.

        Fix Mac OS X build after last checkin.

        * wtf/FastMalloc.h:

2007-06-14  Lars Knoll <lars@trolltech.com>

        Reviewed by Maciej.

        Disable FastMalloc for the Qt build and make sure we
        don't reimplement the global new/delete operators
        when using the system malloc.

        * wtf/FastMalloc.cpp:
        * wtf/FastMalloc.h:
        * wtf/Platform.h:

2007-06-13  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff.

        Make sure that bindings instances get correct root objects.
        
        * JavaScriptCore.exp:
        * bindings/NP_jsobject.cpp:
        (listFromVariantArgs):
        (_NPN_InvokeDefault):
        (_NPN_Invoke):
        (_NPN_SetProperty):
        * bindings/c/c_instance.cpp:
        (KJS::Bindings::CInstance::invokeMethod):
        (KJS::Bindings::CInstance::invokeDefaultMethod):
        * bindings/c/c_runtime.cpp:
        (KJS::Bindings::CField::valueFromInstance):
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertNPVariantToValue):
        * bindings/c/c_utility.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):
        (ObjcInstance::invokeDefaultMethod):
        (ObjcInstance::getValueOfUndefinedField):
        * bindings/objc/objc_runtime.mm:
        (ObjcField::valueFromInstance):
        (ObjcArray::valueAt):
        * bindings/objc/objc_utility.h:
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertObjcValueToValue):
        * bindings/runtime.h:

2007-06-13  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Lars.

        * kjs/testkjs.pro: WebKitQt is now called QtWebKit.

2007-06-12  Anders Carlsson  <andersca@apple.com>

        Another build fix.
        
        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtInstance::invokeMethod):

2007-06-12  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff.

        Move the notion of field type to the JNI runtime since that's the only 
        one that was actually using it.
        
        * bindings/c/c_runtime.h:
        (KJS::Bindings::CField::CField):
        * bindings/jni/jni_runtime.h:
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        * bindings/qt/qt_runtime.h:
        * bindings/runtime.h:
        * bindings/runtime_method.cpp:

2007-06-12  Anders Carlsson  <andersca@apple.com>

        Build fix.
        
        * bindings/qt/qt_class.cpp:
        (KJS::Bindings::QtClass::methodsNamed):
        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtInstance::invokeMethod):

2007-06-12  Anders Carlsson  <andersca@apple.com>

        Reviewed by Oliver.
        
        Get rid of the MethodList class and use a good ol' Vector instead.

        * bindings/c/c_class.cpp:
        (KJS::Bindings::CClass::methodsNamed):
        * bindings/c/c_instance.cpp:
        (KJS::Bindings::CInstance::invokeMethod):
        * bindings/jni/jni_class.cpp:
        (JavaClass::JavaClass):
        (JavaClass::~JavaClass):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/objc/objc_class.mm:
        (KJS::Bindings::ObjcClass::methodsNamed):
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::callAsFunction):
        * bindings/runtime.cpp:
        * bindings/runtime.h:
        * bindings/runtime_method.cpp:
        (RuntimeMethod::lengthGetter):
        (RuntimeMethod::callAsFunction):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::getOwnPropertySlot):

2007-06-12  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff.

        Make RuntimeMethod's method list a pointer so that the object size doesn't
        grow beyond 32 bytes when we later will replace MethodList with a Vector.
        
        * bindings/runtime_method.cpp:
        (RuntimeMethod::RuntimeMethod):
        (RuntimeMethod::lengthGetter):
        (RuntimeMethod::callAsFunction):
        * bindings/runtime_method.h:

2007-06-12  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff.

        Get rid of the Parameter class.
        
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_runtime.cpp:
        (JavaMethod::signature):
        * bindings/jni/jni_runtime.h:
        (KJS::Bindings::JavaParameter::JavaParameter):
        (KJS::Bindings::JavaParameter::~JavaParameter):
        (KJS::Bindings::JavaParameter::type):
        (KJS::Bindings::JavaMethod::parameterAt):
        (KJS::Bindings::JavaMethod::numParameters):
        * bindings/runtime.h:

2007-06-12  Anders Carlsson  <andersca@apple.com>

        Build fix.
        
        * bindings/qt/qt_class.h:

2007-06-12  Mark Rowe  <mrowe@apple.com>

        Build fix.

        * bindings/objc/objc_runtime.h:

2007-06-12  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff.

        Get rid of Constructor and its only subclass JavaConstructor.
        
        * bindings/c/c_class.h:
        * bindings/jni/jni_class.cpp:
        (JavaClass::JavaClass):
        (JavaClass::~JavaClass):
        * bindings/jni/jni_class.h:
        * bindings/jni/jni_runtime.cpp:
        * bindings/jni/jni_runtime.h:
        * bindings/objc/objc_class.h:
        * bindings/runtime.h:

2007-06-12  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff.

        Use RetainPtr throughout the bindings code.
        
        * bindings/objc/objc_class.h:
        * bindings/objc/objc_class.mm:
        (KJS::Bindings::ObjcClass::ObjcClass):
        (KJS::Bindings::ObjcClass::methodsNamed):
        (KJS::Bindings::ObjcClass::fieldNamed):
        * bindings/objc/objc_instance.h:
        (KJS::Bindings::ObjcInstance::getObject):
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::ObjcInstance):
        (ObjcInstance::~ObjcInstance):
        (ObjcInstance::implementsCall):
        (ObjcInstance::invokeMethod):
        (ObjcInstance::invokeDefaultMethod):
        (ObjcInstance::defaultValue):
        * bindings/objc/objc_runtime.h:
        (KJS::Bindings::ObjcMethod::setJavaScriptName):
        (KJS::Bindings::ObjcMethod::javaScriptName):
        (KJS::Bindings::ObjcArray::getObjcArray):
        * bindings/objc/objc_runtime.mm:
        (ObjcField::name):
        (ObjcArray::ObjcArray):
        (ObjcArray::setValueAt):
        (ObjcArray::valueAt):
        (ObjcArray::getLength):
        * wtf/RetainPtr.h:

2007-06-12  Anders Carlsson  <andersca@apple.com>

        Reviewed by Maciej.

        Have JSCell inherit from Noncopyable.
        
        * bindings/objc/objc_runtime.h:
        * bindings/runtime_object.h:
        * kjs/value.h:

2007-06-12  Anders Carlsson  <andersca@apple.com>

        Reviewed by Darin and Maciej.

        More cleanup. Use our Noncopyable WTF class, add a root object member
        to the Array class.
        
        * bindings/c/c_class.h:
        * bindings/jni/jni_class.h:
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_runtime.cpp:
        (JavaArray::JavaArray):
        * bindings/jni/jni_runtime.h:
        * bindings/objc/objc_class.h:
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcArray::ObjcArray):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertObjcValueToValue):
        * bindings/runtime.cpp:
        (KJS::Bindings::Array::Array):
        (KJS::Bindings::Array::~Array):
        * bindings/runtime.h:
        * bindings/runtime_object.h:
        * bindings/runtime_root.h:

2007-06-08  Zack Rusin  <zrusin@trolltech.com>

        Fix the Qt build

        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtInstance::QtInstance):
        * bindings/qt/qt_instance.h:

2007-06-07  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff.

        Get rid of Instance::setRootObject and pass the root object to the instance constructor instead.
        
        * bindings/c/c_instance.cpp:
        (KJS::Bindings::CInstance::CInstance):
        * bindings/c/c_instance.h:
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::JavaInstance):
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::convertJObjectToValue):
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::ObjcInstance):
        * bindings/runtime.cpp:
        (KJS::Bindings::Instance::Instance):
        (KJS::Bindings::Instance::createBindingForLanguageInstance):
        * bindings/runtime.h:

2007-06-07  Anders Carlsson  <andersca@apple.com>

        Reviewed by Adam.

        Don't use a JavaInstance to store the field when all we want to do is to keep the field
        from being garbage collected. Instead, use a JObjectWrapper.
        
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_runtime.cpp:
        (JavaField::JavaField):
        (JavaField::dispatchValueFromInstance):
        (JavaField::dispatchSetValueToInstance):
        * bindings/jni/jni_runtime.h:
        (KJS::Bindings::JavaField::JavaField):
        (KJS::Bindings::JavaField::operator=):

2007-05-30  Alp Toker  <alp.toker@collabora.co.uk>

        Reviewed by Brady.

        Enable logging in the Gdk port.
        http://bugs.webkit.org/show_bug.cgi?id=13936

        * wtf/Assertions.cpp:
        * wtf/Assertions.h: Add WTFLogVerbose which also logs
        the file, line number and function.

2007-05-30  Mark Rowe  <mrowe@apple.com>

        Mac build fix.  Update #include.

        * API/JSCallbackFunction.h:

2007-05-30  Luciano Montanaro  <mikelima@cirulla.net>

        Reviewed by Maciej.

        - cross-port Harri Porten's commits 636099 and 636108 from KJS: 
        "publish a class anyway public already" and "class is being used from
        outside for quite some time" in preparation for further syncronizations

        * kjs/context.h:
        * kjs/date_object.cpp:
        * kjs/date_object.h:
        * kjs/function.h:
        (KJS::):
        (KJS::InternalFunctionImp::classInfo):
        (KJS::InternalFunctionImp::functionName):
        * kjs/function_object.h:
        * kjs/internal.h:
        * kjs/lookup.h:
        (KJS::getStaticPropertySlot):
        (KJS::getStaticFunctionSlot):
        (KJS::getStaticValueSlot):
        * kjs/object_object.h:

2007-05-29  Sam Weinig  <sam@webkit.org>

        Reviewed by Adam Roben.

        Cleanup function and fix to match comparison API.

        * kjs/string_object.cpp:
        (KJS::substituteBackreferences):
        (KJS::localeCompare):

2007-05-28  Geoffrey Garen  <ggaren@apple.com>

        Slight clarification to an exception message.

        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::put):

2007-05-27  Holger Freyther  <zecke@selfish.org>

        Reviewed by Mark Rowe.

        * wtf/Platform.h: Move Gdk up to allow building WebKit/Gdk on Darwin

2007-05-27  Darin Adler  <darin@apple.com>

        - fix a couple ifdefs that said WIN instead of WIN_OS

        * kjs/collector.cpp:
        (KJS::allocateBlock): WIN -> WIN_OS
        (KJS::freeBlock): Ditto.

2007-05-26  Sam Weinig  <sam@webkit.org>

        Reviewed by Darin.

        Patch for http://bugs.webkit.org/show_bug.cgi?id=13854
        Port of commit 667785 from kjs

        - special case calling String.localeCompare() with no parameters to return 0.

        * kjs/string_object.cpp:
        (KJS::StringProtoFunc::callAsFunction):

2007-05-25  Kimmo Kinnunen  <kimmok@iki.fi>

        Reviewed by Darin.

        - Fix for http://bugs.webkit.org/show_bug.cgi?id=13456
        REGRESSION: setTimeout "arguments" object gets shadowed by a local variable

        - Add a explicit check for arguments. Previously check was done with getDirect,
        but since the arguments is created on-demand in ActivationImp, it doesn't
        show up in the test. 'arguments' should always be in the VarDeclNode's
        evaluation scope.

        * kjs/nodes.cpp:
        (VarDeclNode::evaluate): Additional check if the var decl identifier is 'arguments'

2007-05-25  George Staikos  <staikos@kde.org>

        Reviewed by Maciej.

        - Use COMPILER(GCC), not PLATFORM(GCC) - as Platform.h defines

        * wtf/FastMalloc.h:

2007-05-25  Kimmo Kinnunen  <kimmok@iki.fi>

        Reviewed by Darin.

        - http://bugs.webkit.org/show_bug.cgi?id=13623 (Decompilation of function
          doesn't compile with "++(x,y)")
        - Create the error node based on the actual node, not the node inside
          parenthesis
        - Fix applies to postfix, prefix and typeof operators
        - Produces run-time ReferenceError like other non-lvalue assignments etc.

        * kjs/grammar.y: Create {Prefix,Postfix}ErrorNode based on the actual node,
        not the based on the node returned by "nodeInsideAllParens()". Same for
        TypeOfValueNode.

2007-05-25  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Zack.

        Fix crash in Qt JavaScript bindings when the arguments used on the Qt side are not
        registered with QMetaType.

        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtInstance::invokeMethod):
        * bindings/qt/qt_runtime.cpp:

2007-05-24  Luciano Montanaro  <mikelima@cirulla.net>

        Reviewed by Darin

        Patch for http://bugs.webkit.org/show_bug.cgi?id=13855
        Port patch 666176 to JavaScriptCore

        - Renamed JSValue::downcast() to JSValue::asCell() which makes the
        function meaning cleaner. It's modeled after Harri Porten change in 
        KDE trunk.

        * kjs/collector.cpp:
        (KJS::Collector::protect):
        (KJS::Collector::unprotect):
        (KJS::Collector::collectOnMainThreadOnly):
        * kjs/object.h:
        (KJS::JSValue::isObject):
        * kjs/string_object.cpp:
        (KJS::StringProtoFunc::callAsFunction):
        * kjs/value.h:
        (KJS::JSValue::asCell):
        (KJS::JSValue::isNumber):
        (KJS::JSValue::isString):
        (KJS::JSValue::isObject):
        (KJS::JSValue::getNumber):
        (KJS::JSValue::getString):
        (KJS::JSValue::getObject):
        (KJS::JSValue::getUInt32):
        (KJS::JSValue::mark):
        (KJS::JSValue::marked):
        (KJS::JSValue::type):
        (KJS::JSValue::toPrimitive):
        (KJS::JSValue::toBoolean):
        (KJS::JSValue::toNumber):
        (KJS::JSValue::toString):
        (KJS::JSValue::toObject):

2007-05-18  Holger Hans Peter Freyther  <zecke@selfish.org>

        Reviewed by Mark Rowe.

        * kjs/testkjs.pro: Make the Gdk port link to icu

2007-05-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Adele Peterson.
        
        It helps if you swap the right variable.

        * wtf/HashSet.h:
        (WTF::::operator):

2007-05-15  Lars Knoll <lars@trolltech.com>

        Reviewed by Zack

        Extend the QObject JavaScript bindings to work for slots with
        arguments.

        * bindings/qt/qt_instance.cpp:
        (KJS::Bindings::QtInstance::invokeMethod):

2007-05-14  Kimmo Kinnunen  <kimmok@iki.fi>

        Reviewed by Darin.

        - Fixes http://bugs.webkit.org/show_bug.cgi?id=13622 (Decompiler
          omits trailing comma in array literal)

         * kjs/nodes2string.cpp:
         (ArrayNode::streamTo): print extra ',' in case there was elision
         commas (check opt member var) and array elements present
         in the array expression

2007-05-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Added HashMap::swap and HashSet::swap. WebCore now uses HashSet::swap.
        I figured while I was in the neighborhood I might as well add HashMap::swap,
        too.

        * wtf/HashMap.h:
        (WTF::::operator):
        (WTF::::swap):
        * wtf/HashSet.h:
        (WTF::::operator):
        (WTF::::swap):

2007-05-11  Kimmo Kinnunen  <kimmok@iki.fi>

        Reviewed by Darin.

        - Fix for bug http://bugs.webkit.org/show_bug.cgi?id=13620
          Bogus decompilation of "for (var j = 1 in [])"
        - ForInNode toString()'ed to syntax error if there was var decl
          and initializer
        - ForNode toStringed()'ed lost 'var ' if it was present

        * kjs/nodes2string.cpp:
        (VarDeclListNode::streamTo): Print "var " here
        (VarStatementNode::streamTo): Don't print "var " here
        (ForNode::streamTo): Remove TODO comment, VarDeclListNode will
        stream the "var "
        (ForInNode::streamTo): ForIn initializer is printed by VarDeclNode

2007-05-11  Kimmo Kinnunen  <kimmok@iki.fi>

        Reviewed by Darin.

        - Fixes http://bugs.webkit.org/show_bug.cgi?id=10878
          (Incorrect decompilation for "4..x")
        - Group numbers in dotted expressions in toString() output, so we
          avoid the 4.x constructs  when the original input is 4..x.
          4..x means the same as 4. .x or (4).x or Number(4).x

        * kjs/nodes2string.cpp:
        (KJS::SourceStream::):
        Add boolean flag to indicate that if next item is a number, it should be grouped.
        Add new formatting enum which turns on the boolean flag.
        (KJS::SourceStream::SourceStream): Added. Initialize the flag.
        (SourceStream::operator<<): Added. New overloaded operator with double value as parameter.
        (NumberNode::streamTo): Use the double operator
        (ArrayNode::streamTo):
        (DotAccessorNode::streamTo):
        (FunctionCallDotNode::streamTo):
        (FunctionCallParenDotNode::streamTo):
        (PostfixDotNode::streamTo):
        (DeleteDotNode::streamTo):
        (PrefixDotNode::streamTo):
        (AssignDotNode::streamTo): Use the new formatting enum to turn on the grouping flag.

2007-05-10  Lars Knoll <lars@trolltech.com>

        Reviewed by Zack

        Fix our last three test failures in the JavaScript
        tests.

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

2007-05-08  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Fixed #includes of JSStringRefCF.h and use of CF datatypes. I think I 
        misunderstood this issue before.

        * API/JavaScriptCore.h: #include JSStringRefCF.h. Platforms that don't
        want this behavior can just #include individual headers, instead of the
        umbrella framework header. But we definitely want Mac OS X clients to
        get the #include of JSStringRefCF.h "for free."
        * API/minidom.c: Don't #include JSStringRefCF.h. (Don't need to #include
        JavaScriptCore.h, either.)
        * API/testapi.c: Don't #include JSStringRefCF.h. Do use CF datatypes
        regardless of whether __APPLE__ is defined. Platforms that don't support
        CF just shouldn't compile this file.
        (main):

2007-05-09  Eric Seidel  <eric@webkit.org>

        Reviewed by mjs.
        
        http://bugs.webkit.org/show_bug.cgi?id=6985
        Cyclic __proto__ values cause WebKit to hang

        * kjs/object.cpp:
        (KJS::JSObject::put): do a cycle check before setting __proto__

2007-05-08  Kimmo Kinnunen  <kimmok@iki.fi>

        Reviewed by darin.  Landed by eseidel.

        - http://bugs.webkit.org/show_bug.cgi?id=10880 (Do..while loop gains 
        a semicolon each time it is toStringed)
        Grammar in Ecma-66262, 12.6: "do Statement while ( Expression );"
        EmptyStatement was created after every do..while(expr) which
        had semicolon at the end.

        * kjs/grammar.y: Require semicolon at the end of do..while

2007-05-08  Geoffrey Garen  <ggaren@apple.com>

        Build fix -- this time for sure.
        
        APICast.h, being private, ends up in a different folder than JSValueRef.h,
        so we can't include one from the other using "". Instead, just forward
        declare the relevant data types.

        * API/APICast.h:

2007-05-08  Geoffrey Garen  <ggaren@apple.com>

        Build fix: export APICast.h for WebCore and WebKit.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-05-04  Darin Adler  <darin@apple.com>

        Reviewed by Adele.

        - fix http://bugs.webkit.org/show_bug.cgi?id=12821
          <rdar://problem/5007921> Number.toExponential doesn't work for negative numbers

        * kjs/number_object.cpp: (NumberProtoFunc::callAsFunction):
        Added a call to fabs before calling log10.

2007-05-03  Holger Freyther <freyther@kde.org>

        Reviewed by Zack, landed by Simon.
        This is bugzilla bug 13499.

        * JavaScriptCore.pri: Place Qt into the qt-port scope
        * bindings/testbindings.pro: Place Qt into the qt-port scope
        * kjs/testkjs.pro: Place Qt into the qt-port scope
        * pcre/pcre.pri: Place Qt into the qt-port scope

2007-05-02  David Harrison  <harrison@apple.com>

        Reviewed by Antti.

        <rdar://problem/5174862> Crash resulting from DeprecatedString::insert()

        Added insertion support for more than one value.
        
        * wtf/Vector.h:
        (WTF::::insert):
        Added support for inserting multiple values.
        
        (WTF::::prepend):
        New. Insert at the start of vectors. Convenient for vectors used as strings.

2007-05-01  Jungshik Shin  <jungshik.shin@gmail.com>

        Reviewed by Alexey.

        - get rid of non-ASCII lteral characters : suppress compiler warnings
        http://bugs.webkit.org/show_bug.cgi?id=13551
         
        * kjs/testkjs.cpp:
        * pcre/pcre_compile.c:

2007-04-28  Jungshik Shin  <jungshik.shin@gmail.com>

        Reviewed by Sam Weinig.

        - Replace copyright sign in Latin-1 (0xA9) with '(C)'
        http://bugs.webkit.org/show_bug.cgi?id=13531

        * bindings/npruntime.h:
    
2007-04-28  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix <rdar://problem/5154144> Hamachi test fails: assertion failure in ListHashSet

        Test: fast/forms/add-remove-form-elements-stress-test.html

        * wtf/ListHashSet.h:
        (WTF::ListHashSetNodeAllocator::ListHashSetNodeAllocator): Initialize
        m_isDoneWithInitialFreeList to false.
        (WTF::ListHashSetNodeAllocator::allocate): Added assertions based on a debug-only
        m_isAllocated flag that make sure we don't allocate a block that's already allocated.
        These assertions helped pinpoint the bug. Set m_isDoneWithInitialFreeList when we
        allocate the last block of the initial free list. Once we're done with the initial
        free list, turn off the rule that says that the next node in the pool after the last
        node in the free list is also free. This rule works because any free nodes are added
        to the head of the free list, so a node that hasn't been allocated even once is always
        at the tail of the free list and all the nodes after it also haven't been allocated
        even once. But it doesn't work any longer once the entire pool has been used at least
        once, because there's nothing special about the last node on the free list any more.
        (WTF::ListHashSetNodeAllocator::deallocate): Set the node's m_isAllocated to false.
        (WTF::ListHashSetNodeAllocator::pastPool): Added. Used above.
        (WTF::ListHashSetNodeAllocator::inPool): Changed to use the pastPool function.
        (WTF::ListHashSetNode::ListHashSetNode): Initialize m_isAllocated to true.
        (WTF::ListHashSetNode::operator new): Removed variable name for unused size
        parameter.
        (WTF::ListHashSetNode::destroy): Changed to call the destructor rather than
        delete -- this gets rid of the need to define an operator delete.

2007-04-27  Christopher Brichford  <chrisb@adobe.com>

        Reviewed by Timothy Hatcher.

        Fix for: Bug 13211: Move JavaScriptCore mac project files for apollo port
        http://bugs.webkit.org/show_bug.cgi?id=13211

        * JavaScriptCore.apolloproj/mac/JavaScriptCore.Debug.xcconfig: Added.
        * JavaScriptCore.apolloproj/mac/JavaScriptCore.Release.xcconfig: Added.
        * JavaScriptCore.apolloproj/mac/JavaScriptCore.xcconfig: Added.
        * JavaScriptCore.apolloproj/mac/JavaScriptCore.xcodeproj/project.pbxproj: Added.
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.Debug.xcconfig: Removed.
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.Release.xcconfig: Removed.
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.xcconfig: Removed.
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj: Removed.

2007-04-27  Holger Freyther <freyther@kde.org>

        Reviewed by Maciej.

        Remove unmaintained CMake build system.

        * CMakeLists.txt: Removed.
        * pcre/CMakeLists.txt: Removed.

2007-04-27  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver.

        * JavaScriptCore.xcodeproj/project.pbxproj: Improve dependencies in Xcode project
        by marking dftables as a dependency of Generate Derived Sources rather than of
        JavaScriptCore itself.

2007-04-26  Geoffrey Garen  <ggaren@apple.com>

        Build fix -- added #includes that we used to get implicitly through
        JSStringRef.h.

        * API/JSNode.c:
        * API/JSNodeList.c:
        * API/minidom.c:
        * API/testapi.c:

2007-04-26  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak, Adam Roben.
        
        Fixed 
        <rdar://problem/4885130> Remove #include of JSStringRefCF.h from JSStringRef.h
        <rdar://problem/4885123> JavaScriptCore is not cross-platform -- JSStringRef.h references CF datatypes

        * API/JSStringRef.h: Removed #include -- no clients need it anymore.

2007-04-25  David Kilzer  <ddkilzer@apple.com>

        Reviewed by Maciej.

        Add assertions for debug builds.

        * kjs/JSLock.cpp:
        (KJS::JSLock::lock): Assert the return value of pthread_mutex_lock() in debug builds.
        (KJS::JSLock::unlock): Assert the return value of pthread_mutex_unlock() in debug builds.

2007-04-25  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Anders.
        
        - fix build problems

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Disable warning that
        gives often downright incorrect results based on guessing what will happen in 64-bit.

2007-04-25  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - tweak the allocator for a small speedup -- Shark showed this was a win, but I can't
          measure an improvement right now, but it's also clear these changes do no harm

        * wtf/FastMalloc.cpp:
        (WTF::LgFloor): Use ALWAYS_INLINE here; in testing I did a while back this was necessary
        to get this single-instruction function to be inlined.
        (WTF::SizeClass): Use ALWAYS_INLINE here too for the same reason. Also change the special
        case for a size of 0 to work without a branch for a bit of extra speed.
        (WTF::ByteSizeForClass): Use ALWAYS_INLINE here too for the same reason.

2007-04-24  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - use custom calling convention for everything in nodes.cpp on intel gcc for 1.5% speed boost

        Nearly all functions in nodes.cpp were marked up to use the
        regparm(3) calling convention under GCC for x86, since this is
        faster and they are all guaranteed to be called only internally to
        kjs.
        
        The only exception is destructors, since delete doesn't know how to use a custom calling convention.
        
        * kjs/nodes.cpp:
        (dotExprDoesNotAllowCallsString):
        * kjs/nodes.h:
        (KJS::Node::):
        (KJS::StatementNode::):
        (KJS::NullNode::):
        (KJS::BooleanNode::):
        (KJS::NumberNode::):
        (KJS::StringNode::):
        (KJS::RegExpNode::):
        (KJS::ThisNode::):
        (KJS::ResolveNode::):
        (KJS::GroupNode::):
        (KJS::ElementNode::):
        (KJS::ArrayNode::):
        (KJS::PropertyNameNode::):
        (KJS::PropertyNode::):
        (KJS::PropertyListNode::):
        (KJS::ObjectLiteralNode::):
        (KJS::BracketAccessorNode::):
        (KJS::DotAccessorNode::):
        (KJS::ArgumentListNode::):
        (KJS::ArgumentsNode::):
        (KJS::NewExprNode::):
        (KJS::FunctionCallValueNode::):
        (KJS::FunctionCallResolveNode::):
        (KJS::FunctionCallBracketNode::):
        (KJS::FunctionCallParenBracketNode::):
        (KJS::FunctionCallDotNode::):
        (KJS::FunctionCallParenDotNode::):
        (KJS::PostfixResolveNode::):
        (KJS::PostfixBracketNode::):
        (KJS::PostfixDotNode::):
        (KJS::PostfixErrorNode::):
        (KJS::DeleteResolveNode::):
        (KJS::DeleteBracketNode::):
        (KJS::DeleteDotNode::):
        (KJS::DeleteValueNode::):
        (KJS::VoidNode::):
        (KJS::TypeOfResolveNode::):
        (KJS::TypeOfValueNode::):
        (KJS::PrefixResolveNode::):
        (KJS::PrefixBracketNode::):
        (KJS::PrefixDotNode::):
        (KJS::PrefixErrorNode::):
        (KJS::UnaryPlusNode::):
        (KJS::NegateNode::):
        (KJS::BitwiseNotNode::):
        (KJS::LogicalNotNode::):
        (KJS::MultNode::):
        (KJS::AddNode::):
        (KJS::ShiftNode::):
        (KJS::RelationalNode::):
        (KJS::EqualNode::):
        (KJS::BitOperNode::):
        (KJS::BinaryLogicalNode::):
        (KJS::ConditionalNode::):
        (KJS::AssignResolveNode::):
        (KJS::AssignBracketNode::):
        (KJS::AssignDotNode::):
        (KJS::AssignErrorNode::):
        (KJS::CommaNode::):
        (KJS::AssignExprNode::):
        (KJS::VarDeclListNode::):
        (KJS::VarStatementNode::):
        (KJS::EmptyStatementNode::):
        (KJS::ExprStatementNode::):
        (KJS::IfNode::):
        (KJS::DoWhileNode::):
        (KJS::WhileNode::):
        (KJS::ForNode::):
        (KJS::ContinueNode::):
        (KJS::BreakNode::):
        (KJS::ReturnNode::):
        (KJS::WithNode::):
        (KJS::LabelNode::):
        (KJS::ThrowNode::):
        (KJS::TryNode::):
        (KJS::ParameterNode::):
        (KJS::Parameter::):
        (KJS::FunctionBodyNode::):
        (KJS::FuncExprNode::):
        (KJS::FuncDeclNode::):
        (KJS::SourceElementsNode::):
        (KJS::CaseClauseNode::):
        (KJS::ClauseListNode::):
        (KJS::SwitchNode::):

2007-04-24  Oliver Hunt  <oliver@apple.com>

        GTK Build fix, ::findEntry->KJS::findEntry

        * kjs/lookup.cpp:
        (KJS::Lookup::findEntry):
        (KJS::Lookup::find):

2007-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - compile most of JavaScriptCore as one file for 4% JS iBench speed improvement 

        * JavaScriptCore.xcodeproj/project.pbxproj: Add AllInOneFile.cpp, and remove files it includes
        from the build.
        * kjs/AllInOneFile.cpp: Added.
        * kjs/dtoa.cpp: Renamed CONST to CONST_ to avoid conflict.
        (Bigint::):
        (Bigint::nrv_alloc):
        * kjs/lookup.cpp: Use "namspace KJS { ... }" instead of "using namespace KJS;" 

2007-04-23  Maciej Stachowiak  <mjs@apple.com>

        Build fix, not reviewed.

        * kjs/collector.h: Fix struct/class mismatch.

2007-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - raise ALLOCATIONS_PER_COLLECTION to 4000, for 3.7% iBench speed improvement
         
        Now that the cell size is smaller and the block size is bigger, we can fit 4000 objects in
        the two spare cells the collector is willing to keep around, so collect a bit less often.
        
        * kjs/collector.cpp:

2007-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin and Geoff.
        
        - move mark and collectOnMainThreadOnly bits into separate bitmaps
        
        This saves 4 bytes per cell, allowing shrink of cell size to 32,
        which leads to a .8% speed improvement on iBench.
        
        This is only feasible because of all the previous changes on the branch.

        * kjs/collector.cpp:
        (KJS::allocateBlock): Adjust for some renames of constants. 
        (KJS::Collector::markStackObjectsConservatively): Now that cells are 32 bytes (64 
        bytes on 64-bit) the cell alignment check can be made much more strict, and also
        obsoletes the need for a % sizeof(CollectorCell) check. Also, we can mask off the low
        bits of the pointer to have a potential block pointer to look for.
        (KJS::Collector::collectOnMainThreadOnly): Use bitmap.
        (KJS::Collector::markMainThreadOnlyObjects): Use bitmap.
        (KJS::Collector::collect): When sweeping, use bitmaps directly to find mark bits.
        * kjs/collector.h:
        (KJS::): Move needed constants and type declarations here.
        (KJS::CollectorBitmap::get): Bit twiddling to get a bitmap value.
        (KJS::CollectorBitmap::set): Bit twiddling to set a bitmap bit to true.
        (KJS::CollectorBitmap::clear): Bit twiddling to set a bitmap bit to false.
        (KJS::CollectorBitmap::clearAll): Clear whole bitmap at one go.
        (KJS::Collector::cellBlock): New operation, compute the block pointer for
        a cell by masking off low bits.
        (KJS::Collector::cellOffset): New operation, compute the cell offset for a
        cell by masking off high bits and dividing (actually a shift).
        (KJS::Collector::isCellMarked): Check mark bit in bitmap
        (KJS::Collector::markCell): Set mark bit in bitmap.
        * kjs/value.h:
        (KJS::JSCell::JSCell): No more bits.
        (KJS::JSCell::marked): Let collector handle it.
        (KJS::JSCell::mark): Let collector handle it.

2007-04-23  Anders Carlsson  <andersca@apple.com>

        Build fix.
        
        * kjs/regexp_object.h:
        RegExpObjectImpPrivate is a struct, not a class.
        
2007-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - shrink FunctionImp / DeclaredFunctionImp by 4 bytes, by moving parameter list to function body
        
        I reconciled this with a similar change in KDE kjs by Maks Orlovich <maksim@kde.org>.

        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        (KJS::FunctionImp::passInParameters):
        (KJS::FunctionImp::lengthGetter):
        (KJS::FunctionImp::getParameterName):
        * kjs/function.h:
        * kjs/function_object.cpp:
        (FunctionProtoFunc::callAsFunction):
        (FunctionObjectImp::construct):
        * kjs/nodes.cpp:
        (FunctionBodyNode::addParam):
        (FunctionBodyNode::paramString):
        (FuncDeclNode::addParams):
        (FuncDeclNode::processFuncDecl):
        (FuncExprNode::addParams):
        (FuncExprNode::evaluate):
        * kjs/nodes.h:
        (KJS::Parameter::Parameter):
        (KJS::FunctionBodyNode::numParams):
        (KJS::FunctionBodyNode::paramName):
        (KJS::FunctionBodyNode::parameters):
        (KJS::FuncExprNode::FuncExprNode):
        (KJS::FuncDeclNode::FuncDeclNode):
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Disable 64-bit warnings because
        they handle size_t badly.

2007-04-23  Maciej Stachowiak  <mjs@apple.com>
 
        Reviewed by Darin.

        - shrink RegexpObjectImp by 4 bytes
        
        Somewhat inexplicably, this seems to be a .33% speedup on JS iBench.
        
        * kjs/regexp_object.cpp:
        (KJS::RegExpObjectImpPrivate::RegExpObjectImpPrivate):
        (RegExpObjectImp::RegExpObjectImp):
        (RegExpObjectImp::performMatch):
        (RegExpObjectImp::arrayOfMatches):
        (RegExpObjectImp::getBackref):
        (RegExpObjectImp::getLastMatch):
        (RegExpObjectImp::getLastParen):
        (RegExpObjectImp::getLeftContext):
        (RegExpObjectImp::getRightContext):
        (RegExpObjectImp::getValueProperty):
        (RegExpObjectImp::putValueProperty):
        * kjs/regexp_object.h:

2007-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver.
        
        - change to 1-bit bitfields instead of 8-bit, this turns out to lead to a .51% speedup on JS iBench
        
        The 1-bit bitfields are actually faster than just plain bools, at least on Intel (go figure).

        * kjs/property_map.h:

2007-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
       
        - shrink ArrayInstance objects by 4 bytes
        http://bugs.webkit.org/show_bug.cgi?id=13386
        
        I did this by storing the capacity before the beginning of the storage array. It turns out
        it is rarely needed and is by definition 0 when the storage array is null.
 
        * kjs/array_instance.h:
        (KJS::ArrayInstance::capacity): Get it from the secret stash
        * kjs/array_object.cpp:
        (allocateStorage): New function to encapsulate allocating the storage with extra space ahead
        for the capacity.
        (reallocateStorage): ditto for realloc
        (ArrayInstance::ArrayInstance):
        (ArrayInstance::~ArrayInstance):
        (ArrayInstance::resizeStorage):

2007-04-23  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix <rdar://problem/4840688> REGRESSION (r10588, r10621): JavaScript won't parse
          modifications of non-references (breaks 300themovie.warnerbros.com, fedex.com)

        Despite the ECMAScript specification's claim that you can treat these as syntax
        errors, doing so creates some website incompatibilities. So this patch turns them back
        into evaluation errors instead.

        Test: fast/js/modify-non-references.html

        * kjs/grammar.y: Change makeAssignNode, makePrefixNode, and makePostfixNode so that they
        never fail to parse. Update rules that use them. Fix a little bit of indenting. Use
        new PostfixErrorNode, PrefixErrorNode, and AssignErrorNode classes.

        * kjs/nodes.h: Added an overload of throwError that takes a char* argument.
        Replaced setExceptionDetailsIfNeeded and debugExceptionIfNeeded with handleException,
        which does both. Added PostfixErrorNode, PrefixErrorNode, and AssignErrorNode classes.

        * kjs/nodes.cpp: Changed exception macros to use handleException; simpler and smaller
        code size than the two functions that we used before.
        (Node::throwError): Added the overload mentioned above.
        (Node::handleException): Added. Contains the code from both setExceptionDetailsIfNeeded
        and debugExceptionIfNeeded.
        (PostfixErrorNode::evaluate): Added. Throws an exception.
        (PrefixErrorNode::evaluate): Ditto.
        (AssignErrorNode::evaluate): Ditto.
        (ThrowNode::execute): Call handleException instead of debugExceptionIfNeeded; this
        effectively adds a call to setExceptionDetailsIfNeeded, which may help with getting
        the correct file and line number for these exceptions.

        * kjs/nodes2string.cpp:
        (PostfixErrorNode::streamTo): Added.
        (PrefixErrorNode::streamTo): Added.
        (AssignErrorNode::streamTo): Added.

2007-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - fix test failures / crashes on PPC

        * kjs/property_map.h: Make the bool fields explicitly 8-bit bitfields, since bool is a full
        word there otherwise :-(

2007-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - fix more test case failures

        * bindings/runtime_array.cpp:
        (RuntimeArray::RuntimeArray): inherit from JSObject instead of ArrayInstance; it turns
        out that this class only needs the prototype and classInfo from ArrayInstance, not the
        actual class itself, and it was too big otherwise.
        (RuntimeArray::getOwnPropertySlot):
        * bindings/runtime_array.h:

2007-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - fix some test failures

        * bindings/runtime_method.cpp:
        (RuntimeMethod::RuntimeMethod): inherit from InternalFunctionImp instead of FunctionImpl,
        otherwise this is too big
        (RuntimeMethod::getOwnPropertySlot):
        * bindings/runtime_method.h:

2007-04-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - discard the arguments List for an ActivationImp when the corresponding Context is destroyed (1.7% speedup)
        http://bugs.webkit.org/show_bug.cgi?id=13385

        Based an idea by Christopher E. Hyde <C.Hyde@parableuk.force9.co.uk>. His patch to do 
        this also had many other List changes and I found this much simpler subset of the changes
        was actually a hair faster.
        
        This optimization is valid because the arguments list is only kept around to
        lazily make the arguments object. If it's not made by the time the function
        exits, it never will be, since any function that captures the continuation will
        have its own local arguments variable in scope.
        
        Besides the 1.7% speed improvement, it shrinks List by 4 bytes
        (which in turn shrinks ActivationImp by 4 bytes).
        
        * kjs/Context.cpp:
        (KJS::Context::~Context): Clear the activation's arguments list.
        * kjs/function.cpp:
        (KJS::ActivationImp::ActivationImp): Adjusted for list changes.
        (KJS::ActivationImp::mark): No need to mark, lists are always protected (this doesn't
        cause a ref-cycle for reasons stated above).
        (KJS::ActivationImp::createArgumentsObject): Clear arguments list.
        * kjs/function.h:
        * kjs/list.cpp:
        (KJS::List::List): No more needsMarking boolean
        (KJS::List::operator=): ditto
        * kjs/list.h:
        (KJS::List::List): ditto
        (KJS::List::reset): ditto
        (KJS::List::deref): ditto

2007-04-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - shrink PropertyMap by 8 bytes and therefore shrink CELL_SIZE to 40 (for 32-bit; 
        similar shrinkage for 64-bit)
        http://bugs.webkit.org/show_bug.cgi?id=13384

        Inspired by similar changes by Christopher E. Hyde <C.Hyde@parableuk.force9.co.uk>
        done in the kjs-tweaks branch of KDE's kjs. However, this version is somewhat 
        cleaner style-wise and avoids some of the negative speed impact (at least on gcc/x86) 
        of his version.
        
        This is nearly a wash performance-wise, maybe a slight slowdown, but worth doing
        to eventually reach cell size 32.
        
        * kjs/collector.cpp:
        (KJS::):
        * kjs/property_map.cpp:
        (KJS::PropertyMap::~PropertyMap):
        (KJS::PropertyMap::clear):
        (KJS::PropertyMap::get):
        (KJS::PropertyMap::getLocation):
        (KJS::PropertyMap::put):
        (KJS::PropertyMap::insert):
        (KJS::PropertyMap::expand):
        (KJS::PropertyMap::rehash):
        (KJS::PropertyMap::remove):
        (KJS::PropertyMap::mark):
        (KJS::PropertyMap::containsGettersOrSetters):
        (KJS::PropertyMap::getEnumerablePropertyNames):
        (KJS::PropertyMap::getSparseArrayPropertyNames):
        (KJS::PropertyMap::save):
        (KJS::PropertyMap::checkConsistency):
        * kjs/property_map.h:
        (KJS::PropertyMap::hasGetterSetterProperties):
        (KJS::PropertyMap::setHasGetterSetterProperties):
        (KJS::PropertyMap::):
        (KJS::PropertyMap::PropertyMap):

2007-04-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - change blocks to 64k in size, and use various platform-specific calls to allocate at 64k-aligned addresses
        http://bugs.webkit.org/show_bug.cgi?id=13383
        
        * kjs/collector.cpp:
        (KJS::allocateBlock): New function to allocate 64k of 64k-aligned memory
        (KJS::freeBlock): Corresponding free
        (KJS::Collector::allocate):
        (KJS::Collector::collect):

2007-04-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin and Geoff.
        
        - remove the concept of oversize objects, now that there aren't any (for now
        only enforced with an assert).
        http://bugs.webkit.org/show_bug.cgi?id=13382

        This change is a .66% speedup on JS iBench for 32-bit platforms, probably much more
        for 64-bit since it finally gives a reasonable cell size, but I did not test that.
        
        * kjs/collector.cpp:
        (KJS::): Use different cell size for 32-bit and 64-bit, now that there is no
        oversize allocation.
        (KJS::Collector::allocate): Remove oversize allocator.
        (KJS::Collector::markStackObjectsConservatively): Don't check oversize objects.
        (KJS::Collector::markMainThreadOnlyObjects): Ditto.
        (KJS::Collector::collect): Ditto.

2007-04-21  Mitz Pettel  <mitz@webkit.org>

        Reviewed by Adam.

        - fix http://bugs.webkit.org/show_bug.cgi?id=13428
          REGRESSION (r20973-r20976): Failing ecma/Array/15.4.4.5-3.js

        - fix http://bugs.webkit.org/show_bug.cgi?id=13429
          REGRESSION (r20973-r20976): Crashing in fast/dom/plugin-attributes-enumeration.html

        * kjs/array_object.cpp:
        (ArrayInstance::sort): Free the old storage, not the new one.

2007-04-20  Maciej Stachowiak  <mjs@apple.com>

        Not reviewed, build fix.

        - fix build problem with last change - -O3 complains more about uninitialized variables
        
        * pcre/pcre_compile.c:
        (compile_branch):
        (pcre_compile2):

2007-04-20  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - <rdar://problem/5149915> use mergesort when possible, since it leads to fewer compares (2% JS iBench speedup)

        * kjs/array_object.cpp:
        (ArrayInstance::sort): Use mergesort(3) on platforms that have it, since it tends
        to do fewer compares than qsort; but avoid it very on large arrays since it uses extra
        memory. Also added comments identifying possibly even better sorting algorithms
        for sort by string value and sort by compare function.
        * kjs/config.h:

2007-04-20  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - bump optimization flags up to -O3 for 1% JS iBench speed improvement 

        * Configurations/Base.xcconfig:

2007-04-20  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej.

        Fix bogus optimisation in the generic pthread code path.

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

2007-04-20  Mark Rowe  <mrowe@apple.com>

        Reviewed by Anders.

        Improve FreeBSD compatibility, as suggested by Alexander Botero-Lowry.

        * kjs/collector.cpp:
        (KJS::currentThreadStackBase): FreeBSD requires that pthread_attr_t's are
        initialized via pthread_attr_init before being used in any context.

2007-04-19  Mark Rowe  <mrowe@apple.com>

        Reviewed by Darin.

        Fix http://bugs.webkit.org/show_bug.cgi?id=13401
        Bug 13401: Reproducible crash calling myArray.sort(compareFn) from within
        a sort comparison function

        * kjs/array_object.cpp:
        (ArrayInstance::sort): Save/restore the static variables around calls to qsort
        to ensure nested calls to ArrayInstance::sort behave correctly.

2007-04-12  Deneb Meketa  <dmeketa@adobe.com>

        Reviewed by Darin Adler.

        http://bugs.webkit.org/show_bug.cgi?id=13029
        rdar://problem/4994849
        Bug 13029: Permit NPAPI plug-ins to see HTTP response headers.
        This doesn't actually change JavaScriptCore, but that's where npapi.h is.

        * bindings/npapi.h:
        Add headers member to NPStream struct.  Also increase NP_VERSION_MINOR to 18.
        Increasing to >= 17 allows plug-ins to safely detect whether to look for
        NPStream::headers.  Increasing from 17 to 18 reflects presence of NPObject
        enumeration, which was added in a prior patch, and which has been agreed to
        constitute version 18 by the plugin-futures list.  Also add other missing
        bits of npapi.h to catch up from 14 to 18.  This includes features that are
        not implemented in WebKit, but those are safely stubbed.

2007-04-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Mark Rowe.
        
        Fixed last check-in to print in release builds, too.

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

2007-04-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by John Sullivan, Darin Adler.
        
        Fixed <rdar://problem/5121899> JavaScript garbage collection leads to 
        later crash under Rosetta (should abort or leak instead?)
        
        Log an error message and crash if the kernel reports failure during GC.
        We decided to do this instead of just leaking because we don't want people
        to get the mistaken impression that running in Rosetta is a supported
        configurtion.
        
        The CRASH macro will also hook into CrashReporter, which will tell us if 
        many (any?) users run into this issue.

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

2007-04-06  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by darin.

        Coverity fix. Coverity says:
        "Event var_deref_model: Variable "sourceRanges" tracked as NULL was passed to a
        function that dereferences it"

        * kjs/string_object.cpp:
        (KJS::replace):

2007-04-06  Geoffrey Garen  <ggaren@apple.com>

        Rubber stamped by Adele Peterson.

        * kjs/ExecState.h: Removed obsolete forward/friend declaration of 
        RuntimeMethodImp.

2007-04-05  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by darin.

        Coverity fix. Coverity says:
        "Event check_after_deref: Pointer "dateString" dereferenced before NULL check"

        * kjs/date_object.cpp:
        (KJS::parseDate):

2007-04-05  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by darin.

        Coverity fix. Coverity says:
        "Event check_after_deref: Pointer "re" dereferenced before NULL check"

        * pcre/pcre_study.c:
        (pcre_study):

2007-04-05  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by darin.

        Coverity fixes. Coverity says:
        "Event leaked_storage: Returned without freeing storage "buffer""
        and:
        "Event leaked_storage: Returned without freeing storage "script""

        * kjs/testkjs.cpp:
        (doIt):
        (createStringWithContentsOfFile):

2007-04-05  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by darin.

        Coverity fix: in single-threaded case currentThreadIsMainThread is always true
        so the code in if (!currentThreadIsMainThread) cannot possibly be reached
        and Coverity complains about dead code.

        * kjs/collector.cpp:
        (KJS::Collector::collect):

=== Safari-5522.6 ===

2007-04-03  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Adam.

        - Testing a post-commit hook.

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2007-04-03  Anders Carlsson  <andersca@apple.com>

        Reviewed by Adam.

        <rdar://problem/5107534>
        http://bugs.webkit.org/show_bug.cgi?id=13265
        REGRESSION: Crash in KJS::Bindings::convertValueToNPVariant
        
        * bindings/NP_jsobject.cpp:
        (_NPN_InvokeDefault):
        Return false if the object isn't a function. Set the return value to undefined by default
        (to match Firefox).
        
2007-03-30  Anders Carlsson <andersca@apple.com>

        Build fix.
        
        * bindings/NP_jsobject.cpp:
        (_NPN_Enumerate):

2007-03-30  Anders Carlsson  <andersca@apple.com>

        Reviewed by Geoff.

        Implement _NPN_Enumerate support.
        
        * JavaScriptCore.exp:
        * bindings/NP_jsobject.cpp:
        (_NPN_Enumerate):
        * bindings/c/c_instance.cpp:
        (KJS::Bindings::CInstance::getPropertyNames):
        * bindings/c/c_instance.h:
        * bindings/npapi.h:
        * bindings/npruntime.h:
        * bindings/npruntime_impl.h:
        * bindings/runtime.h:
        (KJS::Bindings::Instance::getPropertyNames):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::getPropertyNames):
        * bindings/runtime_object.h:
        (KJS::RuntimeObjectImp::getInternalInstance):

2007-03-28  Jeff Walden  <jwalden+code@mit.edu>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=12963
        Fix some inconsistencies in the Mozilla JS Array extras implementations
        with respect to the Mozilla implementation:

          - holes in arrays should be skipped, not treated as undefined,
            by all such methods
          - an element with value undefined is not a hole
          - Array.prototype.forEach should return undefined

        * kjs/array_object.cpp:
        (ArrayInstance::getOwnPropertySlot):
        (ArrayProtoFunc::callAsFunction):

2007-03-27  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Geoff.

        * bindings/NP_jsobject.cpp:
        (_NPN_InvokeDefault):
        Call JSObject:call for native JavaScript objects.

2007-03-26  David Carson  <dacarson@gmail.com>

        Reviewed by Darin, landed by Anders.

        Fix for: REGRESSION (r19559): Java applet crash
        http://bugs.webkit.org/show_bug.cgi?id=13142
        <rdar://problem/5080340>

        The previous fix http://bugs.webkit.org/show_bug.cgi?id=12636 
        introduced new JNIType to enum in jni_utility.h This is a 
        problem on the Mac as it seems that the JNIType enum is also
        used in the JVM, it is used to specify the return type in
        jni_objc.mm
        Corrected the fix by moving type to the end, and changing
        jni_objc.mm to convert the new type to an old compatible
        type.

        * bindings/jni/jni_objc.mm:
        (KJS::Bindings::dispatchJNICall):
        * bindings/jni/jni_utility.h:

2007-03-26  Christopher Brichford  <chrisb@adobe.com>

        Reviewed/landed by Adam.

        Bug 13198: Move build settings from project file to xcconfig file for apollo
        port JSCore
        http://bugs.webkit.org/show_bug.cgi?id=13198

        - Moving build settings from xcode project file to xcconfig files.

        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.Debug.xcconfig:
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.Release.xcconfig:
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.xcconfig:
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj:

2007-03-26  Brady Eidson  <beidson@apple.com>

        Rubberstamped by Anders and Maciej aand Geoff (oh my!)
        
        Since CFTypeRef is really void*, a RetainPtr couldn't be used. 
        RefType was "void", which doesn't actually exist as a type.
        Since RefType only existed for operator*(), and since that operator
        doesn't make any sense for RetainPtr, I removed them!

        * kjs/nodes.cpp: Touch this to force a rebuild and (hopefully) help the
          compiler with dependencies
        * wtf/RetainPtr.h: Nuke RefType and operator*()

2007-03-26  Geoffrey Garen  <ggaren@apple.com>

        Touched a file to (hopefully) help the compiler with RetainPtr dependencies.

        * kjs/nodes.cpp:
        (Node::deref):

2007-03-24  Brady Eidson  <beidson@apple.com>

        Reviewed by Adam

        Whoops, RetainPtr should be in the WTF namespace

        * wtf/RetainPtr.h:

2007-03-24  Brady Eidson  <beidson@apple.com>

        Reviewed by Adam
        
        <rdar://problem/5086210> - Move RetainPtr to WTF

        * wtf/RetainPtr.h: Added
        * JavaScriptCore.xcodeproj/project.pbxproj: Add it to the project file
        * JavaScriptCore.vcproj/WTF/WTF.vcproj: Ditto


2007-03-23  Christopher Brichford  <chrisb@adobe.com>

        Reviewed/landed by Adam.

        Bug 13175: Make apollo mac project files for JavaScriptCore actually
        build something
        http://bugs.webkit.org/show_bug.cgi?id=13175

        - Changing apollo mac project files for JavaScriptCore such that they actually build
        JavaScriptCore source code.

        * JavaScriptCore.apolloproj/ForwardingSources/grammar.cpp: Added.
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.xcconfig:
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj:

2007-03-24  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Darin.

        * Configurations/JavaScriptCore.xcconfig: Remove unnecessary INFOPLIST_PREPROCESS.

2007-03-22  Christopher Brichford  <chrisb@adobe.com>

        Reviewed/landed by Adam.

        Bug 13164: Initial version of mac JavaScriptCore project files for
        apollo port 
        http://bugs.webkit.org/show_bug.cgi?id=13164

        - Adding mac project files for apollo port of JavaScriptCore. Currently project
        just builds dftables.

        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.Debug.xcconfig: Added.
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.Release.xcconfig: Added.
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.xcconfig: Added.
        * JavaScriptCore.apolloproj/mac/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj: Added.

2007-03-21  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin.

        <rdar://problem/5076599> JavaScriptCore has a weak export (vtable for KJS::JSCell)

        * JavaScriptCore.exp: Remove __ZTVN3KJS6JSCellE.

2007-03-21  Adele Peterson  <adele@apple.com>

        Reviewed by Geoff.

        * API/JSStringRef.cpp: (JSStringIsEqual): Added JSLock.

2007-03-21  Zack Rusin  <zrusin@trolltech.com>

        Fix the compile when USE(MULTIPLE_THREADS) isn't
        defined

        * kjs/JSLock.cpp:
        (KJS::JSLock::currentThreadIsHoldingLock):

2007-03-20  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff and Adam.
        
        - make USE(MULTIPLE_THREADS) support more portable
        http://bugs.webkit.org/show_bug.cgi?id=13069
        
        - fixed a threadsafety bug discovered by testing this
        
        - enhanced threadsafety assertions in collector

        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::~JSCallbackObject): This destructor can't
        DropAllLocks around the finalize callback, because it gets called
        from garbage collection and we can't let other threads collect!

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * kjs/JSLock.cpp:
        (KJS::JSLock::currentThreadIsHoldingLock): Added new function
        to allow stronger assertions than just that the lock is held
        by some thread (you can now assert that the current thread is
        holding it, given the new JSLock design).
        * kjs/JSLock.h:
        * kjs/collector.cpp: Refactored for portability plus added some
        stronger assertions.
        (KJS::Collector::allocate):
        (KJS::currentThreadStackBase):
        (KJS::Collector::registerAsMainThread):
        (KJS::onMainThread):
        (KJS::PlatformThread::PlatformThread):
        (KJS::getCurrentPlatformThread):
        (KJS::Collector::Thread::Thread):
        (KJS::destroyRegisteredThread):
        (KJS::Collector::registerThread):
        (KJS::Collector::markCurrentThreadConservatively):
        (KJS::suspendThread):
        (KJS::resumeThread):
        (KJS::getPlatformThreadRegisters):
        (KJS::otherThreadStackPointer):
        (KJS::otherThreadStackBase):
        (KJS::Collector::markOtherThreadConservatively):
        (KJS::Collector::markStackObjectsConservatively):
        (KJS::Collector::protect):
        (KJS::Collector::unprotect):
        (KJS::Collector::collectOnMainThreadOnly):
        (KJS::Collector::markMainThreadOnlyObjects):
        (KJS::Collector::collect):
        * kjs/collector.h:
        * wtf/FastMalloc.cpp:
        (WTF::fastMallocSetIsMultiThreaded):
        * wtf/FastMallocInternal.h:
        * wtf/Platform.h:

2007-03-19  Darin Adler  <darin@apple.com>

        * kjs/value.h: Roll ~JSValue change out. It was causing problems. I'll do it right later.

2007-03-19  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by John Sullivan.

        Fixed <rdar://problem/5073380> REGRESSION: Crash occurs at WTF::fastFree() 
        when reloading liveconnect page (applet)
        
        Best to use free when you use malloc, especially when malloc and delete
        use completely different libraries.

        * bindings/jni/jni_runtime.cpp:
        (JavaMethod::~JavaMethod):

2007-03-19  Andrew Wellington  <proton@wiretapped.net>

        Reviewed by Maciej.

        Really set Xcode editor to use 4 space indentation (http://webkit.org/coding/coding-style.html)

        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-03-19  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - Changed list size threshold to 5 based on testing.

        I was testing the i-Bench JavaScript with the list statistics
        dumping on, and discovered that there were many 5-element lists.
        The fast case for lists was for 4 elements and fewer. By changing
        the threshold to 5 elements we get a measurable speedup. I believe
        this will help real web pages too, not just the benchmark.

        * kjs/list.cpp: Change constant from 4 to 5.

2007-03-19  Darin Adler  <darin@apple.com>

        * kjs/value.h: Oops, fix build.

2007-03-19  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - remove ~JSValue; tiny low-risk performance boost

        * kjs/value.h: Remove unneeded empty virtual destructor from JSValue.
        The only class derived from JSValue is JSCell and it already has a
        virtual destructor. Declaring an empty constructor in JSValue had one
        good effect: it marked the destructor private, making it a compile
        time error to try to destroy a JSValue; but that's not a likely
        mistake for someone to make. It had two bad effects: (1) it caused gcc,
        at least, to generate code to fix up the virtual table pointer to
        point to the JSValue version of the virtual table inside the destructor
        of all classes derived from JSValue directly or indirectly; (2) it
        caused JSValue to be a polymorphic class so required a virtual table for
        it. It's cleaner to not have either of those.

2007-03-18  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Mark.
        
        - avoid static construction (and global variable access) in a smarter, more portable way,
        to later enable MUTLI_THREAD mode to work on other platforms and compilers.
        
        * kjs/CommonIdentifiers.cpp: Added. New class to hold all the shared identifiers.
        (KJS::CommonIdentifiers::CommonIdentifiers):
        (KJS::CommonIdentifiers::shared):
        * kjs/CommonIdentifiers.h: Added.

        * kjs/ExecState.h:
        (KJS::ExecState::propertyNames): Hand the CommonIdentifiers instance here for easy access.
        (KJS::ExecState::ExecState):

        * API/JSObjectRef.cpp:
        (JSObjectMakeConstructor):
        * CMakeLists.txt:
        * JavaScriptCore.exp:
        * JavaScriptCore.pri:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCoreSources.bkl:
        * bindings/runtime_array.cpp:
        (RuntimeArray::getOwnPropertySlot):
        (RuntimeArray::put):
        * bindings/runtime_method.cpp:
        (RuntimeMethod::getOwnPropertySlot):
        * kjs/array_object.cpp:
        (ArrayInstance::getOwnPropertySlot):
        (ArrayInstance::put):
        (ArrayInstance::deleteProperty):
        (ArrayProtoFunc::ArrayProtoFunc):
        (ArrayProtoFunc::callAsFunction):
        (ArrayObjectImp::ArrayObjectImp):
        * kjs/bool_object.cpp:
        (BooleanPrototype::BooleanPrototype):
        (BooleanProtoFunc::BooleanProtoFunc):
        (BooleanProtoFunc::callAsFunction):
        (BooleanObjectImp::BooleanObjectImp):
        * kjs/completion.h:
        (KJS::Completion::Completion):
        * kjs/date_object.cpp:
        (KJS::DateProtoFunc::DateProtoFunc):
        (KJS::DateObjectImp::DateObjectImp):
        (KJS::DateObjectFuncImp::DateObjectFuncImp):
        * kjs/error_object.cpp:
        (ErrorPrototype::ErrorPrototype):
        (ErrorProtoFunc::ErrorProtoFunc):
        (ErrorProtoFunc::callAsFunction):
        (ErrorObjectImp::ErrorObjectImp):
        (ErrorObjectImp::construct):
        (NativeErrorPrototype::NativeErrorPrototype):
        (NativeErrorImp::NativeErrorImp):
        (NativeErrorImp::construct):
        (NativeErrorImp::callAsFunction):
        * kjs/function.cpp:
        (KJS::FunctionImp::getOwnPropertySlot):
        (KJS::FunctionImp::put):
        (KJS::FunctionImp::deleteProperty):
        (KJS::FunctionImp::getParameterName):
        (KJS::DeclaredFunctionImp::construct):
        (KJS::IndexToNameMap::unMap):
        (KJS::Arguments::Arguments):
        (KJS::ActivationImp::getOwnPropertySlot):
        (KJS::ActivationImp::deleteProperty):
        (KJS::GlobalFuncImp::GlobalFuncImp):
        * kjs/function_object.cpp:
        (FunctionPrototype::FunctionPrototype):
        (FunctionProtoFunc::FunctionProtoFunc):
        (FunctionProtoFunc::callAsFunction):
        (FunctionObjectImp::FunctionObjectImp):
        (FunctionObjectImp::construct):
        * kjs/grammar.y:
        * kjs/identifier.cpp:
        * kjs/identifier.h:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::init):
        (KJS::Interpreter::initGlobalObject):
        * kjs/interpreter.h:
        * kjs/lookup.h:
        * kjs/math_object.cpp:
        (MathFuncImp::MathFuncImp):
        * kjs/nodes.cpp:
        (ArrayNode::evaluate):
        (FuncDeclNode::processFuncDecl):
        (FuncExprNode::evaluate):
        * kjs/number_object.cpp:
        (NumberPrototype::NumberPrototype):
        (NumberProtoFunc::NumberProtoFunc):
        (NumberObjectImp::NumberObjectImp):
        * kjs/object.cpp:
        (KJS::JSObject::put):
        (KJS::JSObject::defaultValue):
        (KJS::JSObject::hasInstance):
        * kjs/object.h:
        (KJS::JSObject::getOwnPropertySlot):
        * kjs/object_object.cpp:
        (ObjectPrototype::ObjectPrototype):
        (ObjectProtoFunc::ObjectProtoFunc):
        (ObjectObjectImp::ObjectObjectImp):
        * kjs/regexp_object.cpp:
        (RegExpPrototype::RegExpPrototype):
        (RegExpProtoFunc::RegExpProtoFunc):
        (RegExpObjectImp::RegExpObjectImp):
        * kjs/string_object.cpp:
        (KJS::StringInstance::getOwnPropertySlot):
        (KJS::StringInstance::put):
        (KJS::StringInstance::deleteProperty):
        (KJS::StringPrototype::StringPrototype):
        (KJS::StringProtoFunc::StringProtoFunc):
        (KJS::StringProtoFunc::callAsFunction):
        (KJS::StringObjectImp::StringObjectImp):
        (KJS::StringObjectFuncImp::StringObjectFuncImp):
        * kjs/testkjs.cpp:
        (TestFunctionImp::TestFunctionImp):

2007-03-18  Andrew Wellington  <proton@wiretapped.net>

        Reviewed by Mark Rowe
        
        Set Xcode editor to use 4 space indentation (http://webkit.org/coding/coding-style.html) 

        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-03-19  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Brady.

        Update references to bugzilla.opendarwin.org with bugs.webkit.org.

        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertUTF8ToUTF16):
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        * kjs/grammar.y:
        * kjs/keywords.table:
        * kjs/lexer.cpp:
        (KJS::Lexer::shift):

2007-03-18  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Exposed some extra toUInt32 functionality, as part of the fix for
        REGRESSION: Incomplete document.all implementation breaks abtelectronics.com 
        (Style Change Through JavaScript Blanks Content)

        * JavaScriptCore.exp:
        * kjs/identifier.h:
        (KJS::Identifier::toUInt32):

2007-03-18  Geoffrey Garen  <ggaren@apple.com>

        Removed duplicate export name.
        
        * JavaScriptCore.exp:

2007-03-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed <rdar://problem/5064964> Repro ASSERT failure in JS Bindings when 
        closing window @ lowtrades.bptrade.com
        
        Unfortunately, the bindings depend on UString and Identifier as string 
        representations. So, they need to acquire the JSLock when doing something
        that will ref/deref their strings.

        Layout tests, the original site, and Java, Flash, and Quicktime on the 
        web work. No leaks reported. No automated test for this because testing 
        the Java bindings, like math, is hard.
        
        * bindings/runtime.h: Made Noncopyable, just to be sure.
        
        * bindings/c/c_class.cpp: 
        (KJS::Bindings::CClass::~CClass): Acquire the JSLock and explicitly clear the keys
        in our hashtable, since they're UString::Reps, and ref/deref aren't thread-safe.
        (KJS::Bindings::CClass::methodsNamed): Also acquire the JSLock when adding
        keys to the table, since the table ref's them.
        (KJS::Bindings::CClass::fieldNamed): ditto.

        * bindings/c/c_utility.cpp: Removed dead function.
        (KJS::Bindings::convertValueToNPVariant): Acquire the JSLock because doing
        it recursively is pretty cheap, and it's just too confusing to tell whether
        all our callers do it for us.
        (KJS::Bindings::convertNPVariantToValue): ditto
        * bindings/c/c_utility.h:

        * bindings/jni/jni_class.cpp: Same deal as c_class.cpp.
        (JavaClass::JavaClass):
        (JavaClass::~JavaClass):

        * bindings/jni/jni_instance.cpp: Same deal as c_utility.cpp.
        (JavaInstance::stringValue):
        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::convertValueToJObject):

        * bindings/jni/jni_runtime.cpp:
        (JavaMethod::~JavaMethod): Moved from header, for clarity.
        (appendClassName): Made this static, so the set of callers is known, and
        we can assert that we hold the JSLock. Also changed it to take a UString
        reference, which makes the calling code simpler.
        (JavaMethod::signature): Store the ASCII value we care about instead of
        a UString, since UString is so much more hassle. Hold the JSLock while
        building up the temporary UString.

        * bindings/jni/jni_runtime.h: Nixed dead code in JavaMethod.
        (KJS::Bindings::JavaString::JavaString): Hold a UString::Rep instead of
        a UString, so we can acquire the JSLock and explicitly release it.
        (KJS::Bindings::JavaString::_commonInit):
        (KJS::Bindings::JavaString::~JavaString):
        (KJS::Bindings::JavaString::UTF8String):
        (KJS::Bindings::JavaString::uchars):
        (KJS::Bindings::JavaString::length):
        (KJS::Bindings::JavaString::ustring):

        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::convertArrayInstanceToJavaArray): Made this static, so 
        the set of callers is known, and we can assert that we hold the JSLock. 
        (KJS::Bindings::convertValueToJValue): Acquire the JSLock because doing
        it recursively is pretty cheap, and it's just too confusing to tell whether
        all our callers do it for us.

        * bindings/objc/objc_runtime.h: Nixed some dead code.
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertNSStringToString): Same drill as above.

2007-03-18  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff.

        http://bugs.webkit.org/show_bug.cgi?id=13105
        REGRESSION: an exception raised when calculating base value of a dot expression is not returned

        Test: fast/js/dot-node-base-exception.html

        * kjs/nodes.cpp:
        (FunctionCallDotNode::evaluate): Added the necessary KJS_CHECKEXCEPTIONVALUE.

2007-03-18  Steve Falkenburg  <sfalken@apple.com>

        Build fix.

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2007-03-17  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Mark Rowe.

        Made Version.xcconfig smarter when building for different configurations.
        Now uses the 522+ OpenSource version for Debug and Release, while using the
        full 522.4 version for Production builds. The system prefix is also computed
        based on the current system, so 4522.4 on Tiger and 5522.4 on Leopard.

        * Configurations/JavaScriptCore.xcconfig:
        * Configurations/Version.xcconfig:

2007-03-15  Maciej Stachowiak  <mjs@apple.com>

        Not reviewed.
        
        - build fix

        * wtf/TCSystemAlloc.cpp:

2007-03-15  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff and Steve.
        
        - fix some portability issues with TCMalloc.

        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * kjs/config.h:
        * wtf/FastMalloc.cpp:
        (WTF::SizeClass):
        (WTF::InitSizeClasses):
        (WTF::TCMalloc_PageHeap::Split):
        (WTF::TCMalloc_PageHeap::RegisterSizeClass):
        (WTF::TCMalloc_Central_FreeList::length):
        (WTF::TCMalloc_ThreadCache::InitTSD):
        (WTF::TCMalloc_ThreadCache::CreateCacheIfNecessary):
        * wtf/TCSpinLock.h:
        * wtf/TCSystemAlloc.cpp:
        (TryVirtualAlloc):
        (TCMalloc_SystemAlloc):

2007-03-15  Timothy Hatcher  <timothy@apple.com>

        Reviewed by John.

        * Factored out most of our common build settings into .xcconfig files. Anything that was common in
          each build configuration was factored out into the shared .xcconfig file.
        * Adds a Version.xcconfig file to define the current framework version, to be used in other places.
        * Use the new $(BUNDLE_VERSION) (defined in Version.xcconfig) in the preprocessed Info.plist.
        * Use the versions defined in Version.xcconfig to set $(DYLIB_CURRENT_VERSION).

        * Configurations/Base.xcconfig: Added.
        * Configurations/DebugRelease.xcconfig: Added.
        * Configurations/JavaScriptCore.xcconfig: Added.
        * Configurations/Version.xcconfig: Added.
        * Info.plist:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-03-16  Shrikant Gangoda  <shrikant.gangoda@celunite.com>

        Gdk build fix.

        * kjs/DateMath.cpp:  gettimeofday comes from <sys/time.h> on Linux.

2007-03-14  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by .

        - Fixed one more build breakage

        * kjs/date_object.cpp:
        (KJS::formatLocaleDate):

2007-03-14  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by .

        - Fixed a build breakage.

        * kjs/DateMath.cpp:
        * kjs/date_object.cpp:
        (KJS::formatLocaleDate):
        (KJS::DateObjectImp::construct):

2007-03-14  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geoff.

        - rdar://problem/5045720
        - DST changes in US affect JavaScript date calculations (12975)
        This fix was to ensure we properly test for the new changes to DST in the US.
        Also this fixes when we apply DST, now we correctly map most past years to current
        DST rules.  We still have a small issue with years before 1900 or after 2100.
        rdar://problem/5055038

        * kjs/DateMath.cpp: Fix DST to match spec better.
        (KJS::getCurrentUTCTime):
        (KJS::mimimumYearForDST):
        (KJS::maximumYearForDST):
        (KJS::equivalentYearForDST):
        (KJS::getDSTOffset):
        * kjs/DateMath.h: Consolodated common funtionality.
        * kjs/date_object.cpp: Consolodated common functionality.
        (KJS::formatLocaleDate):
        (KJS::DateObjectImp::construct):
        * tests/mozilla/ecma/jsref.js: Added functions for finding the correct days when DST starts and ends.
        * tests/mozilla/ecma/shell.js: Added back in the old DST functions for ease of merging with mozilla if needed.
        * tests/mozilla/ecma_2/jsref.js: Added functions for finding the correct days when DST starts and ends.
        * tests/mozilla/ecma_3/Date/shell.js: Added functions for finding the correct days when DST starts and ends.
        * tests/mozilla/expected.html: Updated to show all date tests passing.

=== Safari-5522.4 ===

2007-03-13  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by .

        - Adding expected failures until the are truly fixed. 
        - rdar://problem/5060302

        * tests/mozilla/expected.html:

2007-03-12  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by .

        - Actually update tests for new DST rules.

        * tests/mozilla/ecma/Date/15.9.3.1-1.js:
        * tests/mozilla/ecma/Date/15.9.3.1-2.js:
        * tests/mozilla/ecma/Date/15.9.3.1-3.js:
        * tests/mozilla/ecma/Date/15.9.3.1-4.js:
        * tests/mozilla/ecma/Date/15.9.3.1-5.js:
        * tests/mozilla/ecma/Date/15.9.3.2-1.js:
        * tests/mozilla/ecma/Date/15.9.3.2-2.js:
        * tests/mozilla/ecma/Date/15.9.3.2-3.js:
        * tests/mozilla/ecma/Date/15.9.3.2-4.js:
        * tests/mozilla/ecma/Date/15.9.3.2-5.js:
        * tests/mozilla/ecma/Date/15.9.3.8-1.js:
        * tests/mozilla/ecma/Date/15.9.3.8-2.js:
        * tests/mozilla/ecma/Date/15.9.3.8-3.js:
        * tests/mozilla/ecma/Date/15.9.3.8-4.js:
        * tests/mozilla/ecma/Date/15.9.3.8-5.js:
        * tests/mozilla/ecma/Date/15.9.5.10-1.js:
        * tests/mozilla/ecma/Date/15.9.5.10-10.js:
        * tests/mozilla/ecma/Date/15.9.5.10-11.js:
        * tests/mozilla/ecma/Date/15.9.5.10-12.js:
        * tests/mozilla/ecma/Date/15.9.5.10-13.js:
        * tests/mozilla/ecma/Date/15.9.5.10-2.js:
        * tests/mozilla/ecma/Date/15.9.5.10-3.js:
        * tests/mozilla/ecma/Date/15.9.5.10-4.js:
        * tests/mozilla/ecma/Date/15.9.5.10-5.js:
        * tests/mozilla/ecma/Date/15.9.5.10-6.js:
        * tests/mozilla/ecma/Date/15.9.5.10-7.js:
        * tests/mozilla/ecma/Date/15.9.5.10-8.js:
        * tests/mozilla/ecma/Date/15.9.5.10-9.js:
        * tests/mozilla/ecma/jsref.js:
        * tests/mozilla/ecma_2/jsref.js:
        * tests/mozilla/ecma_3/Date/shell.js:

2007-03-12  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by .

        - Update tests for new DST rules.

        * tests/mozilla/ecma/shell.js:

2007-03-11  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        Fixed <rdar://problem/4681051> Installer crashes in KJS::Collector::
        markOtherThreadConservatively(KJS::Collector::Thread*) trying to install 
        iLife 06 using Rosetta on an Intel Machine
        
        The problem was that our thread-specific data destructor would modify the
        list of active JavaScript threads without holding the JSLock, corrupting
        the list. Corruption was especially likely if one JavaScript thread exited 
        while another was starting up.

        * JavaScriptCore.exp:
        * kjs/JSLock.cpp: Don't conflate locking the JSLock with registering a
        thread, since the thread-specific data destructor needs to lock
        without registering a thread. Instead, treat thread registration as a
        part of the convenience of the JSLock object, and whittle down JSLock::lock()
        to just the bits that actually do the locking.
        (KJS::JSLock::lock):
        (KJS::JSLock::registerThread):
        * kjs/JSLock.h: Updated comments to mention the new behavior above, and
        other recent changes.
        (KJS::JSLock::JSLock):
        * kjs/collector.cpp:
        (KJS::destroyRegisteredThread): Lock here.
        (KJS::Collector::registerThread): To match, assert that we're locked here.

2007-03-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.

        Fixed <rdar://problem/4587763> PAC file: lock inversion between QT and 
        JSCore causes a hang @ www.panoramas.dk
        
        With a PAC file, run-webkit-tests --threaded passes, the reported site
        works, and all the Quicktime/JavaScript and Flash/JavaScript examples
        I found through Google work, too.
        
        Any time JavaScript causes arbitrary non-JavaScript code to execute, it 
        risks deadlock, because that code may block, trying to acquire a lock 
        owned by a thread that is waiting to execute JavaScript. In this case,
        the thread was a networking thread that was waiting to interpret a PAC file.
        
        Because non-JavaScript code may execute in response to, well, anything,
        a perfect solution to this problem is impossible. I've implemented an
        optimistic solution, instead: JavaScript will drop its lock whenever it
        makes a direct call to non-JavaScript code through a bridging/plug-in API,
        but will blissfully ignore the indirect ways it may cause non-JavaScript 
        code to run (resizing a window, for example). 
        
        Unfortunately, this solution introduces significant locking overhead in 
        the bridging APIs. I don't see a way around that.

        This patch includes some distinct bug fixes I saw along the way:
        
        * bindings/objc/objc_instance.mm: Fixed a bug where a nested begin() call
        would leak its autorelease pool, because it would NULL out _pool without
        draining it.

        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::methodGetter): Don't copy an Identifier to ASCII only
        to turn around and make an Identifier from the ASCII. In an earlier 
        version of this patch, the copy caused an assertion failure. Now it's 
        just unnecessary work.
        (RuntimeObjectImp::getOwnPropertySlot): ditto

        * bindings/objc/objc_instance.h: Removed overrides of setVAlueOfField and
        getValueOfField, because they did exactly what the base class versions did.
        Removed overrides of Noncopyable declarations for the same reason.

        * bindings/runtime.h: Inherit from Noncopyable instead of rolling our own.
        * bindings/c/c_instance.h: ditto

        And the actual patch:
        
        * API/JSCallbackConstructor.cpp: Drop all locks when calling out to C.
        (KJS::JSCallbackConstructor::construct):
        * API/JSCallbackFunction.cpp: ditto
        (KJS::JSCallbackFunction::callAsFunction):
        * API/JSCallbackObject.cpp: ditto
        (KJS::JSCallbackObject::init):
        (KJS::JSCallbackObject::~JSCallbackObject):
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::deleteProperty):
        (KJS::JSCallbackObject::construct):
        (KJS::JSCallbackObject::hasInstance):
        (KJS::JSCallbackObject::callAsFunction):
        (KJS::JSCallbackObject::getPropertyNames):
        (KJS::JSCallbackObject::toNumber):
        (KJS::JSCallbackObject::toString):
        (KJS::JSCallbackObject::staticValueGetter):
        (KJS::JSCallbackObject::callbackGetter):
        
        * bindings/c/c_instance.cpp: Drop all locks when calling out to C.
        (KJS::Bindings::CInstance::invokeMethod):
        (KJS::Bindings::CInstance::invokeDefaultMethod):
        * bindings/c/c_runtime.cpp: Drop all locks when calling out to C.
        (KJS::Bindings::CField::valueFromInstance):
        (KJS::Bindings::CField::setValueToInstance):
        * bindings/jni/jni_objc.mm:
        (KJS::Bindings::dispatchJNICall): Drop all locks when calling out to Java.

        * bindings/objc/objc_instance.mm: The changes here are to accomodate the
        fact that C++ unwinding of DropAllLocks goes crazy when you put it inside
        a @try block. I moved all JavaScript stuff outside of the @try blocks, and 
        then prefixed the whole blocks with DropAllLocks objects. This required some
        supporting changes in other functions, which now acquire the JSLock for
        themselves, intead of relying on their callers to do so.
        (ObjcInstance::end):
        (ObjcInstance::invokeMethod):
        (ObjcInstance::invokeDefaultMethod):
        (ObjcInstance::setValueOfUndefinedField):
        (ObjcInstance::getValueOfUndefinedField):
        * bindings/objc/objc_runtime.mm: Same as above, except I didn't want to
        change throwError to acquire the JSLock for itself.
        (ObjcField::valueFromInstance):
        (ObjcField::setValueToInstance):
        * bindings/objc/objc_utility.mm: Supporting changes mentioned above.
        (KJS::Bindings::convertValueToObjcValue):
        (KJS::Bindings::convertObjcValueToValue):

        * kjs/JSLock.cpp: 
        (1) Fixed DropAllLocks to behave as advertised, and drop the JSLock only 
        if the current thread actually acquired it in the first place. This is 
        important because WebKit needs to ensure that the JSLock has been 
        dropped before it makes a plug-in call, even though it doesn't know if 
        the current thread actually acquired the JSLock. (We don't want WebKit
        to accidentally drop a lock belonging to *another thread*.)
        (2) Used the new per-thread code written for (1) to make recursive calls
        to JSLock very cheap. JSLock now knows to call pthread_mutext_lock/ 
        pthread_mutext_unlock only at nesting level 0.
        (KJS::createDidLockJSMutex):
        (KJS::JSLock::lock):
        (KJS::JSLock::unlock):
        (KJS::DropAllLocks::DropAllLocks):
        (KJS::DropAllLocks::~DropAllLocks):
        (KJS::JSLock::lockCount):
        * kjs/JSLock.h: Don't duplicate Noncopyable.
        (KJS::JSLock::~JSLock):

        * wtf/Assertions.h: Blind attempt at helping the Windows build.

2007-03-08  MorganL  <morganl.webkit@yahoo.com>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=13018
        Bug 13018: allow embedders to override the definition of CRASH.

        * wtf/Assertions.h: make it possible to override CRASH.

2007-03-07  Anrong Hu  <huanr@yahoo.com>

        Reviewed by Maciej.

        Fix http://bugs.webkit.org/show_bug.cgi?id=12535
        Bug 12535: Stack-optimizing compilers can trick GC into freeing in-use objects

        * kjs/internal.cpp:
        (KJS::StringImp::toObject): Copy val onto the stack so it is not subject to garbage collection.

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

        Build fix for non-multiple-thread folks.
        
        Use a shared global in the non-multiple-thread case.

        * wtf/FastMalloc.cpp:
        (WTF::isForbidden):
        (WTF::fastMallocForbid):
        (WTF::fastMallocAllow):

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

        Reviewed by Darin Adler.
        
        Fixed ASSERT failure I just introduced.
        
        Made the fastMalloc isForbidden flag per thread. (Oops!) We expect that
        other threads will malloc while we're marking -- we just want to prevent
        our own marking from malloc'ing.

        * wtf/FastMalloc.cpp:
        (WTF::initializeIsForbiddenKey):
        (WTF::isForbidden):
        (WTF::fastMallocForbid):
        (WTF::fastMallocAllow):
        (WTF::fastMalloc):
        (WTF::fastCalloc):
        (WTF::fastFree):
        (WTF::fastRealloc):
        (WTF::do_malloc):

2007-03-07  Shrikant Gangoda  <shrikant.gangoda@celunite.com>

        Reviewed by Maciej.

        http://bugs.webkit.org/show_bug.cgi?id=12997

        Wrap pthread-specific assertion in #if USE(MULTIPLE_THREADS).

        * kjs/collector.cpp:
        (KJS::Collector::markMainThreadOnlyObjects):

2007-03-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed <rdar://problem/4576242> | http://bugs.webkit.org/show_bug.cgi?id=12586
        PAC file: malloc deadlock sometimes causes a hang @ www.apple.com/pro/profiles/ (12586)
        
        This is a modified version of r14752 on the branch.
        
        These changes just add debugging functionality. They ASSERT that we don't 
        malloc during the mark phase of a garbage collection, which can cause a
        deadlock.

        * kjs/collector.cpp:
        (KJS::Collector::collect):
        * wtf/FastMalloc.cpp:
        (WTF::fastMallocForbid):
        (WTF::fastMallocAllow):
        (WTF::fastMalloc):
        (WTF::fastCalloc):
        (WTF::fastFree):
        (WTF::fastRealloc):
        (WTF::do_malloc):
        * wtf/FastMalloc.h:

2007-03-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed all known crashers exposed by run-webkit-tests --threaded. This covers:

        <rdar://problem/4565394> | http://bugs.webkit.org/show_bug.cgi?id=12585 
            PAC file: after closing a window that contains macworld.com, new window 
            crashes (KJS::PropertyMap::mark()) (12585)
        <rdar://problem/4571215> | http://bugs.webkit.org/show_bug.cgi?id=9211
            PAC file: Crash occurs when clicking on the navigation tabs at http://www.businessweek.com/ (9211)
        <rdar://problem/4557926> 
            PAC file: Crash occurs when attempting to view image in slideshow mode 
            at http://d.smugmug.com/gallery/581716 ( KJS::IfNode::execute (KJS::
            ExecState*) + 312) if you use a PAC file

        (1) Added some missing JSLocks, along with related ASSERTs.
        
        (2) Fully implemented support for objects that can only be garbage collected
        on the main thread. So far, only WebCore uses this. We can add it to API
        later if we learn that it's needed. 
        
        The implementation uses a "main thread only" flag inside each object. When 
        collecting on a secondary thread, the Collector does an extra pass through 
        the heap to mark all flagged objects before sweeping. This solution makes
        the common case -- flag lots of objects, but never collect on a secondary 
        thread -- very fast, even though the uncommon case of garbage collecting
        on a secondary thread isn't as fast as it could be. I left some notes 
        about how to speed it up, if we ever care.
        
        For posterity, here are some things I learned about GC while investigating:
        
        * Each collect must either mark or delete every heap object. "Zombie" 
        objects, which are neither marked nor deleted, raise these issues:

            * On the next pass, the conservative marking algorithm might mark a 
            zombie, causing it to mark freed objects.

            * The client might try to use a zombie, which would seem live because 
            its finalizer had not yet run.

        * A collect on the main thread is free to delete any object. Presumably, 
        objects allocated on secondary threads have thread-safe finalizers.

        * A collect on a secondary thread must not delete thread-unsafe objects.

        * The mark function must be thread-safe.
        
        Line by line comments:

        * API/JSObjectRef.h: Added comment specifying that the finalize callback 
        may run on any thread.

        * JavaScriptCore.exp: Nothing to see here.

        * bindings/npruntime.cpp:
        (_NPN_GetStringIdentifier): Added JSLock.

        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::~ObjcInstance): Use an autorelease pool. The other callers 
        to CFRelease needed one, too, but they were dead code, so I removed them 
        instead. (This fixes a leak seen while running run-webkit-tests --threaded,
        although I don't think it's specifically a threading issue.) 
        
        * kjs/collector.cpp:
        (KJS::Collector::collectOnMainThreadOnly): New function. Tells the collector
        to collect a value only if it's collecting on the main thread.
        (KJS::Collector::markMainThreadOnlyObjects): New function. Scans the heap
        for "main thread only" objects and marks them.

        * kjs/date_object.cpp: 
        (KJS::DateObjectImp::DateObjectImp): To make the new ASSERTs happy, allocate 
        our globals on the heap, avoiding a seemingly unsafe destructor call at 
        program exit time.
        * kjs/function_object.cpp:
        (FunctionPrototype::FunctionPrototype): ditto

        * kjs/interpreter.cpp:
        (KJS::Interpreter::mark): Removed boolean parameter, which was an incomplete
        and arguably hackish way to implement markMainThreadOnlyObjects() inside WebCore.
        * kjs/interpreter.h:

        * kjs/identifier.cpp:
        (KJS::identifierTable): Added some ASSERTs to check for thread safety 
        problems.

        * kjs/list.cpp: Added some ASSERTs to check for thread safety problems.
        (KJS::allocateListImp):
        (KJS::List::release):
        (KJS::List::append):
        (KJS::List::empty): Make the new ASSERTs happy.

        * kjs/object.h:
        (KJS::JSObject::JSObject): "m_destructorIsThreadSafe" => "m_collectOnMainThreadOnly".
        I removed the constructor parameter because m_collectOnMainThreadOnly,
        like m_marked, is a Collector bit, so only the Collector should set or get it.

        * kjs/object_object.cpp:
        (ObjectPrototype::ObjectPrototype): Make the ASSERTs happy.
        * kjs/regexp_object.cpp:
        (RegExpPrototype::RegExpPrototype): ditto

        * kjs/ustring.cpp: Added some ASSERTs to check for thread safety problems.
        (KJS::UCharReference::ref): 
        (KJS::UString::Rep::createCopying):
        (KJS::UString::Rep::create):
        (KJS::UString::Rep::destroy):
        (KJS::UString::null): Make the new ASSERTs happy.
        * kjs/ustring.h:
        (KJS::UString::Rep::ref): Added some ASSERTs to check for thread safety problems.
        (KJS::UString::Rep::deref):

        * kjs/value.h:
        (KJS::JSCell::JSCell):

2007-03-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        2% speedup on super accurate JS iBench.

        (KJS::Collector::collect): Removed anti-optimization to call
        pthread_is_threaded_np() before calling pthread_main_np(). Almost all 
        apps have more than one thread, so the extra call is actually worse.
        Interestingly, even the single-threaded testkjs shows a speed gain
        from removing the pthread_is_threaded_np() short-circuit. Not sure why.

2007-03-04  Don Gibson  <dgibson77@gmail.com>

        Reviewed by Nikolas Zimmermann.

        - fix http://bugs.webkit.org/show_bug.cgi?id=12950
          Assertions.cpp should not #define macros that are already defined

        * wtf/Assertions.cpp: Don't #define WINVER and _WIN32_WINNT if they
        are already defined.

2007-03-02  Steve Falkenburg  <sfalken@apple.com>

        Reviewed by Anders.
        
        Add unsigned int hash traits (matches existing unsigned long version)

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

2007-03-02  Adam Roben  <aroben@apple.com>

        Reviewed by Kevin M.

        Try to fix the Qt build.

        * kjs/DateMath.cpp:
        (KJS::msToGregorianDateTime): Removed unnecessary "struct" keyword.
        * kjs/DateMath.h: Moved forward declarations to the top of the file
        before they are used.
        * kjs/date_object.cpp:
        (KJS::formatLocaleDate): Changed to take a const GregorianDateTime&
        since GregorianDateTime is Noncopyable.

2007-03-02  Darin Adler  <darin@apple.com>

        Reviewed by Kevin McCullough.

        - fix http://bugs.webkit.org/show_bug.cgi?id=12867
          REGRESSION: BenchJS test 7 (dates) is 220% slower than in Safari 2.0.4

        * kjs/DateMath.h: Marked GregorianDateTime as noncopyable, since it has a non-trivial
        destructor and not the correspoding copy constructor or assignment operator.
        Changed the GregorianDateTime constructor to use member initialization syntax.
        Fixed the destructor to use the array delete operator, since timeZone is an array.

        * kjs/DateMath.cpp:
        (KJS::daysInYear): Changed to call isLeapYear so the rule is not repeated twice.
        (KJS::getUTCOffset): Added caching on PLATFORM(DARWIN), since we can rely on the
        notify_check function and "com.apple.system.timezone" to let us know when the
        offset has changed.

2007-02-27  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Follow-up to fixing http://bugs.webkit.org/show_bug.cgi?id=12659 | <rdar://problem/4954306>
        JS objects not collected after closing window @ ebay.com/maps.google.com
        
        Changed Interpreter cache of global constructors and prototypes from
        ProtectedPtrs to bare, marked pointers. ProtectedPtrs are inefficient,
        and they increase the risk of reference cycles. Also, Darin said something
        about ProtectedPtrs giving him warts.
        
        Also changed data members to precise types from generic JSObject*'s.
        
        Layout tests and JS tests pass.

        * kjs/SavedBuiltins.h:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::init):
        (KJS::Interpreter::~Interpreter):
        (KJS::Interpreter::initGlobalObject): Moved Identifier::init() call to
        constructor, for clarity.
        (KJS::Interpreter::mark):
        * kjs/interpreter.h:

2007-02-27  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed http://bugs.webkit.org/show_bug.cgi?id=12659 | <rdar://problem/4954306>
        JS objects not collected after closing window @ ebay.com/maps.google.com

        Don't GC in the Interpreter destructor. For that to work, the Interpreter
        would have to NULL out all of its ProtectedPtrs before calling collect(). But 
        we've decided that we don't want things to work that way, anyway. We want the
        client to be in charge of manual GC so that it can optimize cases when
        it will be destroying many interpreters at once
        (e.g., http://bugs.webkit.org/show_bug.cgi?id=12900).
        
        Also removed Interpreter::collect() because it was redundant with 
        Collector::collect().

        * JavaScriptCore.exp:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::~Interpreter):
        * kjs/testkjs.cpp:
        (TestFunctionImp::callAsFunction):

2007-02-26  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by Adam Roben.

        Rename *_SUPPORT defines to ENABLE_*.

        * jscore.bkl:

2007-02-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Lars.
        
        - <rdar://problem/5021698> Disable experimental SVG features (12883)

        * wtf/Platform.h: Add ENABLE() macro similar to HAVE() and USE(), to
        allow nicer handling of optional WebKit features.

2007-02-22  George Staikos  <staikos@kde.org>

        Reviewed by Lars.

        Add return values

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

2007-02-22  Oscar Cwajbaum  <public@oscarc.net>

        Reviewed by Maciej.

        Fix ARM-specific alignment problem in FastMalloc
        http://bugs.webkit.org/show_bug.cgi?id=12841

        * wtf/FastMalloc.cpp:
        Modify how pageheap_memory is declared to ensure proper alignment
        on architectures such as ARM

2007-02-20  Zack Rusin  <zrusin@trolltech.com>

        Reviewed by Lars

        Make sure that non-void methods always return something.

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

2007-02-18  Kevin Ollivier  <kevino@theolliviers.com>

        Reviewed by Adam Roben.

        Fix cases where MSVC-specific code was identified as Win32 platform
        code. (as it should be compiled for e.g. wx port when using MSVC too)
        
        * wtf/Assertions.h: 
        * wtf/MathExtras.h:
        * wtf/StringExtras.h:
        changed PLATFORM(WIN) sections to COMPILER(MSVC) as necessary

2007-02-17  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by Adam Roben.

        Fix crashes on ARM due to different struct packing. Based on a patch
        by Mike Emmel.
        * kjs/ustring.cpp: compile-time assert to make sure sizeof(UChar) == 2
        * kjs/ustring.h: pack UChar struct to ensure that sizeof(UChar) == 2
        * wtf/Assertions.h: add COMPILE_ASSERT macro for compile-time assertions

2007-02-16  George Staikos  <staikos@kde.org>

        Reviewed by Maciej.

        Fix uninitialized variable

        * bindings/testbindings.cpp:
        (myAllocate):

2007-02-16  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Mitz.

        http://bugs.webkit.org/show_bug.cgi?id=12788
        REGRESSION: Going back one page in history has a noticeable delay
        
        Um...if all elements in two vectors are equal, then I guess we could say that
        the two vectors are equal too.
        
        * wtf/Vector.h:
        (WTF::):

2007-02-14  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Darin.

        Add new canCompareWithMemcmp vector trait and use it to determine whether
        operator== can use memcmp.
        
        * wtf/Vector.h:
        (WTF::):
        (WTF::VectorTypeOperations::compare):
        (WTF::operator==):
        * wtf/VectorTraits.h:
        (WTF::):

2007-02-13  Brady Eidson  <beidson@apple.com>

        Reviewed by Darin
        
        Tweaked vector a bit

        * wtf/Vector.h:
        (WTF::operator==):

2007-02-13  Dex Deacon  <occupant4@gmail.com>

        Reviewed by Darin.

        - fix for http://bugs.webkit.org/show_bug.cgi?id=12750
          Vector operator== was not defined correctly. It returned void,
          did not accept const Vectors, and used an int instead of size_t. 

        * wtf/Vector.h: fixed comparison operators
        (WTF::operator==):
        (WTF::operator!=):

2007-02-10  David Carson  <dacarson@gmail.com>

        Reviewed by Maciej.

        - fix for http://bugs.webkit.org/show_bug.cgi?id=12636
        Corrected the generation of method signatures when the parameter
        is an Array. 
        Added support for converting a Javascript array to a Java array.

        * bindings/jni/jni_utility.h: added new type for array, array_type
        * bindings/jni/jni_runtime.cpp: add support for new array type
        (JavaField::valueFromInstance):
        (JavaField::setValueToInstance):
        (JavaMethod::JavaMethod):
        (JavaMethod::signature):
        * bindings/jni/jni_utility.cpp: add support for new array type
        (KJS::Bindings::callJNIMethod):
        (KJS::Bindings::callJNIStaticMethod):
        (KJS::Bindings::callJNIMethodIDA):
        (KJS::Bindings::JNITypeFromClassName):
        (KJS::Bindings::signatureFromPrimitiveType):
        (KJS::Bindings::JNITypeFromPrimitiveType):
        (KJS::Bindings::getJNIField):
        (KJS::Bindings::convertArrayInstanceToJavaArray): new method
        converts the Javascript array to the requested Java array.
        (KJS::Bindings::convertValueToJValue):

2007-02-08  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Geoff.

        <rdar://problem/4930614>
        Safari complains about "Slow Script" if GMail is left open and machine is busy
        
        <rdar://problem/4649516>
        Turn off slow script dialog or crank up time that makes it come up
        
        <rdar://problem/4963589>
        Slow script warning is displayed after closing of PROMPT or PRINT dialog
        
        Re-do the way script timeouts are handled. No longer use a unix timer that sends signals. Instead, add a 
        tick count and increment it in loop bodies. If the tick count reaches a threshold, do a timeout check. If the total time executing
        is higher than the timeout value, (possibly) interrupt the script. The timeout checker also adjusts the threshold dynamically
        to prevent doing the timeout check too often.
         
        * JavaScriptCore.exp:
        Remove pause and resume calls.
        
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        Add winmm.lib.

        * kjs/interpreter.cpp:
        (KJS::Interpreter::init):
        (KJS::Interpreter::~Interpreter):
        (KJS::Interpreter::startTimeoutCheck):
        (KJS::Interpreter::stopTimeoutCheck):
        (KJS::Interpreter::resetTimeoutCheck):
        (KJS::getCurrentTime):
        (KJS::Interpreter::checkTimeout):
        * kjs/interpreter.h:
        (KJS::Interpreter::timedOut):
        * kjs/nodes.cpp:
        (DoWhileNode::execute):
        (WhileNode::execute):
        (ForNode::execute):

2007-02-07  Darin Adler  <darin@apple.com>

        * JavaScriptCore.vcproj/JavaScriptCore.sln: Reenable testkjs.

2007-02-07  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - another build fix; this time for sure

        * pcre/pcre_exec.c: (match):
        The compiler caught an incorrect use of the othercase variable across
        a call to RMATCH in character repeat processing. Local variables can
        change in the crazy NO_RECURSE mode that we use, so we instead need
        the value in othercase to be in one of the special stack frame variables.
        Added a new stack frame variable for this purpose named repeat_othercase.
        Also noted a similar error in the non-UTF-16 side of the #ifdef, but
        didn't try to fix that one. Also removed a SUPPORT_UCP #ifdef from the
        PCRE_UTF16 side; that code doesn't work without the Unicde properties
        table, and we don't try to use it that way.

2007-02-06  Steve Falkenburg  <sfalken@apple.com>

        Disable testkjs in sln until we figure out mysterious compiler warning.

        * JavaScriptCore.vcproj/JavaScriptCore.sln:

2007-02-06  Steve Falkenburg  <sfalken@apple.com>

        Build fix by ggaren

        * pcre/pcre_exec.c:
        (match):

2007-02-06  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix <rdar://problem/4979089> PCRE should avoid setjmp/longjmp even when compiler
          is not GCC

        Added a new code path that's slower and way uglier but doesn't rely on GCC's
        computed gotos.

        * pcre/pcre_exec.c: Added a numeric parameter to the RMATCH function. It must be
        different at every RMATCH call site. Changed the non-GCC NO_RECURSE version of
        the macro to use a label incorporating the number. Changed the RRETURN macro to
        use a goto instead of longjmp.
        (match): Added a different number at each callsite, using a perl script for the
        first-time task. Going forward it should be easy to maintain by hand. Added a
        switch statement at the bottom of the function. We'll get compile time errors
        if we have anything in the switch statement that's never used in an RMATCH,
        but errors in the other direction are silent except at runtime.

2007-02-06  Darin Adler  <darin@apple.com>

        Reviewed by John.

        - fix <rdar://problem/4687840> 9A241: JavaScript RegExp 25-30x slower than on 10.4.7

        I used Shark to figure out what to do. The test case is now 15% faster than with
        stock Safari. Some other regular expression cases might still be a few % slower
        than before, but the >10x slowdown is now completely gone.

        1) Fix slowness caused by setjmp/longjmp by using computed goto instead.

        Use GCC extensions - locally declared labels, labels as values, and computed goto -
        instead of using setjmp/longjmp to implemement non-recursive version of the regular
        expression system. We could probably make this even faster if we reduced the use
        of malloc a bit too.

        2) Fix slowness caused by allocating heapframe objects by allocating the first
           16 of them from the stack.

        3) Speed up use of malloc and free in PCRE by making it use fastMalloc and fastFree.

        4) Speed up the test case by adding a special case to a UString function.

        5) Made a small improvement to the innermost hottest loop of match by hoisting
           the conversion from int to pcre_uchar out of the loop.

        * JavaScriptCore.xcodeproj/project.pbxproj: Compile FastMallocPCRE.cpp, and don't
        compile pcre_globals.c.

        * wtf/FastMallocPCRE.cpp: Added. A copy of pcre_globals.c that uses FastMalloc.h.
        This is better than code that sets the PCRE allocation globals because by doing it
        this way there's guaranteed to be no problem with order of initialization.

        * kjs/ustring.cpp: (KJS::UString::spliceSubstringsWithSeparators): Add a fast
        special case when this is called for only one subrange and no seaprators. This
        was happening a lot in the test case and it seems quite reasonable to optimize this.

        * pcre/pcre_exec.c: Create a copy of the RMATCH and RRETURN macros that use goto
        instead of setjmp/longjmp. Change code that calls pcre_stack_malloc to first use
        storage on the stack inside the match function.
        (match): Move initialization of utf8 up a couple lines to avoid "possibly used
        uninitialized" warning. Use a local variable so we compare with pcre_uchar instead
        of with int inside the inner "find a character" loop.

2007-02-03  George Staikos  <staikos@kde.org>

        Reviewed by Alexey.

        -1 is not a valid point.  We can't handle anything > 0xffff anyway.
        Fixes crash on cases like eval("x");

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

2007-02-02  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - fix copying and assigning a ListHashSet

        No test because the code path with bugs I am fixing is not used yet.

        * wtf/ListHashSet.h: Tweaked ListHashSetNodeAllocator a little bit for clarity.
        Changed m_allocator to be an OwnPtr instead of doing an explicit delete.
        Fixed bug in copy constructor where we'd have an uninitialized m_allocator.
        Fixed bug in assignment operator where it would swap only the hash table, and
        not the head, tail, and allocator pointers.

2007-02-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Use WTFLog instead of fprintf for logging KJS::Node leaks.

        * kjs/nodes.cpp:
        (NodeCounter::~NodeCounter): Changed count to unsigned, updated
        to match style guidelines.

2007-02-02  Maciej Stachowiak  <mjs@apple.com>

        - not reviewed, build fix

        * wtf/ListHashSet.h:
        (WTF::ListHashSetNodeAllocator::ListHashSetNodeAllocator): ummm, use union correctly

2007-02-01  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - use a custom allocator for ListHashSet, to fix ~1% perf regression using it for form control

        * wtf/ListHashSet.h:
        (WTF::ListHashSetNodeAllocator::ListHashSetNodeAllocator):
        (WTF::ListHashSetNodeAllocator::allocate):
        (WTF::ListHashSetNodeAllocator::deallocate):
        (WTF::ListHashSetNode::operator new):
        (WTF::ListHashSetNode::operator delete):
        (WTF::ListHashSetNode::destroy):
        (WTF::ListHashSetTranslator::translate):
        (WTF::::ListHashSet):
        (WTF::::~ListHashSet):
        (WTF::::add):
        (WTF::::unlinkAndDelete):
        (WTF::::deleteAllNodes):

2007-01-31  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Adam.
        
        - fix sporadic crash

        * wtf/ListHashSet.h:
        (WTF::::remove): remove before deleting

2007-01-31  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Mark with help from Lars.
        
        - added new ListHashSet class, which combines a hashtable and a linked list to provide a set
        that keeps elements in inserted order
        
        This is to assist in fixing the following:
        <rdar://problem/4751164> REGRESSION: Safari places text on incorrect button when returning to a page via back [10541]
        http://bugs.webkit.org/show_bug.cgi?id=10541

        * JavaScriptCore.vcproj/WTF/WTF.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * wtf/HashTable.h:
        (WTF::HashTable::find):
        (WTF::HashTable::contains):
        (WTF::::find):
        (WTF::::contains):
        * wtf/ListHashSet.h: Added.
        (WTF::ListHashSetNode::ListHashSetNode):
        (WTF::ListHashSetNodeHashFunctions::hash):
        (WTF::ListHashSetNodeHashFunctions::equal):
        (WTF::ListHashSetIterator::ListHashSetIterator):
        (WTF::ListHashSetIterator::get):
        (WTF::ListHashSetIterator::operator*):
        (WTF::ListHashSetIterator::operator->):
        (WTF::ListHashSetIterator::operator++):
        (WTF::ListHashSetIterator::operator--):
        (WTF::ListHashSetIterator::operator==):
        (WTF::ListHashSetIterator::operator!=):
        (WTF::ListHashSetIterator::operator const_iterator):
        (WTF::ListHashSetIterator::node):
        (WTF::ListHashSetConstIterator::ListHashSetConstIterator):
        (WTF::ListHashSetConstIterator::get):
        (WTF::ListHashSetConstIterator::operator*):
        (WTF::ListHashSetConstIterator::operator->):
        (WTF::ListHashSetConstIterator::operator++):
        (WTF::ListHashSetConstIterator::operator--):
        (WTF::ListHashSetConstIterator::operator==):
        (WTF::ListHashSetConstIterator::operator!=):
        (WTF::ListHashSetConstIterator::node):
        (WTF::ListHashSetTranslator::hash):
        (WTF::ListHashSetTranslator::equal):
        (WTF::ListHashSetTranslator::translate):
        (WTF::::ListHashSet):
        (WTF::::operator):
        (WTF::::~ListHashSet):
        (WTF::::size):
        (WTF::::capacity):
        (WTF::::isEmpty):
        (WTF::::begin):
        (WTF::::end):
        (WTF::::find):
        (WTF::::contains):
        (WTF::::add):
        (WTF::::remove):
        (WTF::::clear):
        (WTF::::unlinkAndDelete):
        (WTF::::appendNode):
        (WTF::::deleteAllNodes):
        (WTF::::makeIterator):
        (WTF::::makeConstIterator):
        (WTF::deleteAllValues):

2007-01-30  Darin Adler  <darin@apple.com>

        * kjs/DateMath.cpp: Fix license header to reflect LGPL as the first license
        mentioned. We still mention the option of using under MPL or GPL since some
        of this code came from the Mozilla project with those license terms.

2007-01-30  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Zack.

        Turned JavaScriptCore from a separate library into an includable
        project, to combine it all into libWebKitQt.

        * JavaScriptCore.pri: Added.
        * JavaScriptCore.pro: Removed.
        * kjs/testkjs.pro:

2007-01-29  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.

        Fixed <rdar://problem/4485644> REGRESSION: JavaScriptCore has init routines
        
        The TCMalloc module now initializes, if needed, inside GetCache() and 
        fastMallocSetIsMultiThreaded(). We leverage the same synchronization 
        technique used for enabling / disabling the single-threaded optimization 
        to synchronize initialization of the library without requiring a lock 
        for every malloc.
        
        1,251 runs of tcmalloc_unittest, 2 runs of a custom, massively multi-threaded 
        tcmalloc_unittest, and my custom version of the PLT show no regressions.
        Super-accurate JS iBench reports a .24% regression, which is right at the
        limit of its error range, so I'm declaring victory.

        * wtf/FastMalloc.cpp:
        (WTF::fastMallocSetIsMultiThreaded): Initialize, if needed. (InitModule()
        checks the "if needed" part.)
        (WTF::TCMalloc_ThreadCache::GetCache): Restored original TCMalloc code
        inside #ifdef, for posterity. Added new initialization logic.
        (WTF::TCMalloc_ThreadCache::InitModule): Call InitTSD(), since we don't
        have a static initializer to call it for us, now. This means that fastMalloc
        is not usable as a general libc allocator, but it never was, and if it were
        the general libc allocator, we wouldn't be here in the first place, so whatever.
        (WTF::TCMalloc_ThreadCache::InitTSD): Don't try to take the pageheap_lock, 
        since InitModule already has it.

2007-01-29  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Geoff and Oliver.

        - rdar://problem/4955561
        - missusing JavaScript shouldn't crash webkit.  Now it doesn't, in this case.

        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::callAsFunction):
        * bindings/runtime_method.cpp:
        (RuntimeMethod::callAsFunction):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::callAsFunction):

2007-01-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        First step in fixing <rdar://problem/4485644> REGRESSION: JavaScriptCore 
        has init routines
        
        Don't rely on a static initializer to store the main thread's ID (which
        we would use to detect allocations on secondary threads). Instead, require 
        the caller to notify fastMalloc if it might allocate on a secondary thread.
        
        Also fixed what seemed like a race condition in do_malloc.
        
        tcmalloc_unittest and my custom versions of JS iBench and PLT show no
        regressions.

        * wtf/FastMalloc.cpp:
        (WTF::fastMallocSetIsMultiThreaded): 
        (1) Renamed from "fastMallocRegisterThread", which was a misleading name because 
        not all threads need to register with fastMalloc -- only secondary threads 
        need to, and only for the purpose of disabling its single-threaded optimization. 

        (2) Use the pageheap_lock instead of a custom one, since we need to synchronize
        with the read of isMultiThreaded inside CreateCacheIfNecessary. This is a new
        requirement, now that we can't guarantee that the first call to CreateCacheIfNecessary
        will occur on the main thread at init time, before any other threads have been created.

        (WTF::TCMalloc_ThreadCache::CreateCacheIfNecessary):
        (WTF::do_malloc): Reverted WTF change only to call GetCache() if size <= kMaxSize.
        The WTF code would read phinited without holding the pageheap_lock, which
        seemed like a race condition. Regardless, calling GetCache reduces the number 
        of code paths to module initialization, which will help in writing the 
        final fix for this bug.

2007-01-28  David Kilzer  <ddkilzer@webkit.org>

        Reviewed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=9815
          JavaScript TypeError loading Dean Edwards' JS compressor/obfuscator

        Creating a function using 'new Function()' was not setting its prototype with the
        same flags as 'function() { }'.

        Test: fast/js/function-prototype.html

        * kjs/function_object.cpp:
        (FunctionObjectImp::construct): Change flags from DontEnum|DontDelete|ReadOnly to
        Internal|DontDelete to match FuncDeclNode::processFuncDecl() and
        FuncExprNode::evaluate() in kjs/nodes.cpp.

2007-01-27  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth Dakin.
        
        Added some missing JSLocks, which might fix <rdar://problem/4889707>.

        We need to lock whenever we might allocate memory because our FastMalloc
        implementation requires clients to register their threads, which we do
        through JSLock. 
        
        We also need to lock whenever modifying ref-counts because they're not 
        thread-safe.

        * API/JSObjectRef.cpp:
        (JSClassCreate): Allocates memory
        (JSClassRetain): Modifies a ref-count
        (JSClassRelease): Modifies a ref-count
        (JSPropertyNameArrayRetain): Modifies a ref-count
        (JSPropertyNameArrayRelease): Modifies a ref-count
        * API/JSStringRef.cpp:
        (JSStringRetain): Modifies a ref-count
        * API/JSValueRef.cpp:
        (JSValueIsInstanceOfConstructor): Might allocate memory if an exception
        is thrown.

2007-01-27  Lars Knoll <lars@trolltech.com>

        Fix the Qt build.

        * bindings/qt/qt_instance.h:

2007-01-25  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed <rdar://problem/4608404> WebScriptObject's _rootObject lack 
        of ownership policy causes crashes (e.g., in Dashcode)
        
        The old model for RootObject ownership was either to (1) leak them or (2) assign
        them to a single owner -- the WebCore::Frame -- which would destroy them 
        when it believed that all of its plug-ins had unloaded.
        
        This model was broken because of (1) and also because plug-ins are not the only 
        RootObject clients. All Bindings clients are RootObjects clients, including 
        applications, which outlive any particular WebCore::Frame.
        
        The new model for RootObject ownership is to reference-count them, with a
        throw-back to the old model: The WebCore::Frame tracks the RootObjects
        it creates, and invalidates them when it believes that all of its plug-ins 
        have unloaded.
        
        We maintain this throw-back to avoid plug-in leaks, particularly from Java.
        Java is completely broken when it comes to releasing JavaScript objects. 
        Comments in our code allege that Java does not always call finalize when 
        collecting objects. Moreoever, my own testing reveals that, when Java does 
        notify JavaScript of a finalize, the data it provides is totally bogus.
        
        This setup is far from ideal, but I don't think we can do better without
        completely rewriting the bindings code, and possibly part of the Java
        plug-in / VM.
        
        Layout tests pass. No additional leaks reported. WebCore/manual-tests/*liveconnect*
        and a few LiveConnect demos on the web also run without a hitch.
        
        const RootObject* => RootObject*, since we need to ref/deref
        
        * bindings/NP_jsobject.cpp:
        (jsDeallocate): deref our RootObjects. Also unprotect or JSObject, instead
        of just relying on the RootObject to do it for us when it's invalidated.
        (_isSafeScript): Check RootObject validity.
        (_NPN_CreateScriptObject): ditto
        (_NPN_Invoke): ditto
        (_NPN_Evaluate): ditto
        (_NPN_GetProperty): ditto
        (_NPN_SetProperty): ditto
        (_NPN_RemoveProperty): ditto
        (_NPN_HasProperty): ditto
        (_NPN_HasMethod): ditto
        (_NPN_SetException): ditto

        * bindings/runtime_root.cpp: 
        Revived bit-rotted LIAR LIAR LIAR comment.
        
        LOOK: Added support for invalidating RootObjects without deleting them, 
        which is the main goal of this patch. 

        Moved protect counting into the RootObject class, to emphasize that 
        the RootObject protects the JSObject, and unprotects it upon being invalidated.
            addNativeReference => RootObject::gcProtect
            removeNativeReference => RootObject::gcUnprotect
            ProtectCountSet::contains => RootObject::gcIsProtected
            
        I know we'll all be sad to see the word "native" go.
        
        * bindings/runtime_root.h: Added ref-counting support to RootObject, with
        all the standard accoutrements.

        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertValueToNPVariant): If we can't find a valid RootObject,
        return void instead of just leaking.

        * bindings/jni/jni_instance.cpp:
        (JavaInstance::JavaInstance): Don't take a RootObject in our constructor;
        be like other Instances and require the caller to call setRootObject. This
        reduces the number of ownership code paths.
        (JavaInstance::invokeMethod): Check RootObject for validity.
        * bindings/jni/jni_instance.h: Removed private no-arg constructor. Having
        an arg constructor accomplishes the same thing.

        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::invoke): No need to call findProtectCountSet, because finalize()
        checks for RootObject validity.
        (JavaJSObject::JavaJSObject): check RootObject for validity
        (JavaJSObject::call): ditto
        (JavaJSObject::eval): ditto
        (JavaJSObject::getMember): ditto
        (JavaJSObject::setMember): ditto
        (JavaJSObject::removeMember): ditto
        (JavaJSObject::getSlot): ditto
        (JavaJSObject::setSlot): ditto
        (JavaJSObject::toString): ditto
        (JavaJSObject::finalize): ditto
        (JavaJSObject::createNative): No need to tell the RootObject to protect 
        the global object, since the RootObject already owns the interpreter.

        * bindings/jni/jni_runtime.cpp:
        (JavaArray::JavaArray): Removed copy construcutor becaue it was unused.
        Dead code is dangerous code.

        * bindings/objc/objc_runtime.mm: Added WebUndefined protocol. Previous use
        of WebScriptObject was bogus, because WebUndefined is not a subclass of
        WebScriptObject.
        (convertValueToObjcObject): If we can't find a valid RootObject,
        return nil instead of just leaking.

        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue): If we can't find a valid RootObject,
        return nil instead of just leaking.

2007-01-27  Andrew Wellington  <proton@wiretapped.net>

        Reviewed by Maciej.
        
        Fix for Repeated string concatenation results in OOM crash
        http://bugs.webkit.org/show_bug.cgi?id=11131

        * kjs/operations.cpp:
        (KJS::add): Throw exception if string addition result is null
        * kjs/ustring.cpp:
        (KJS::UString::UString): Don't call memcpy when malloc failed

2007-01-25  Jan Kraemer  <camel@gmx.de>

        Reviewed by Maciej

        Fix for http://bugs.webkit.org/show_bug.cgi?id=12382

        Fix crash on architectures with 32 bit ints and
        64 bit longs (For example Linux on AMD64)

        * kjs/dtoa.cpp: #define Long int as suggested in comment

2007-01-24  Geoffrey Garen  <ggaren@apple.com>

        Fixed up #include order for style. No review necessary.

        * API/JSStringRef.cpp:

2007-01-24  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        Copy JSStringRefCF, in case anybody wants to use it. (I just added
        it recently.)

2007-01-24  Maciej Stachowiak  <mjs@apple.com>

        Not reviewed, trivial property change.
        
        * JavaScriptCore.vcproj/JavaScriptCore.sln: remove svn:mime-type
        property which made this binary.

2007-01-25  Mark Rowe  <mrowe@apple.com>

        Reviewed by Darin.

        * Info.plist: Update copyright string.

2007-01-24  Darin Adler  <darin@apple.com>

        Reviewed by Mark Rowe.

        * JavaScriptCore.xcodeproj/project.pbxproj: Changed to /usr/sbin/sysctl
        so we don't rely on people's paths.

2007-01-23  Alice Liu  <alice.liu@apple.com>

        release build fix

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        Copy APICasts.h

2007-01-23  Geoffrey Garen  <ggaren@apple.com>

        build fix

        * API/JSStringRef.h:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-01-24  Mark Rowe  <mrowe@apple.com>

        Build fix for DumpRenderTree.

        * JavaScriptCore.xcodeproj/project.pbxproj: Make JSStringRefCF.h public so it's copied into built framework.

2007-01-23  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Darin.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        Copy APICasts.h

2007-01-23  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej Stachowiak.
        
        Fixed <rdar://problem/4885131> Move CFString function declarations from 
        JSStringRef.h to JSStringRefCF.h
        
        Also removed remaining API FIXMEs and changed them into Radars.

        * API/JSClassRef.cpp:
        (OpaqueJSClass::OpaqueJSClass): Added Radar numbers for UTF8 conversion.

        * API/JSContextRef.cpp:
        (JSGlobalContextCreate): Replaced FIXME for NULL JSContextRef with Radar number.

        * API/JSObjectRef.h: Removed FIXME, which is unprofessional in a public header.

        * API/JSStringRef.cpp: Moved CF related implementations to JSStringRefCF.cpp.
        (JSStringCreateWithUTF8CString): Replaced FIXME with Radar number.
        * API/JSStringRef.h: Moved CF related declarations to JSStringRefCF.h. Added
        #include of JSStringRefCF.h as a stopgap until clients start #including
        it as needed by themselves.

        * API/JSStringRefCF.cpp: Added.
        (JSStringCreateWithCFString):
        (JSStringCopyCFString): Replaced JSChar cast with UniChar cast, which is 
        more appropriate for a CF call.
        * API/JSStringRefCF.h: Added.
        * JavaScriptCore.xcodeproj/project.pbxproj:

2007-01-18  Sanjay Madhav  <sanjay12@gmail.com>

        Reviewed by Darin.

        Add JavaScriptCore define to help with tracing of when objects are marked.

        * kjs/object.cpp:
        (KJS::JSObject::mark):

2007-01-18  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Zack.

        * JavaScriptCore.pro: Remove generated files on make clean.
        * pcre/pcre.pri:

2007-01-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Maciej.

        http://bugs.webkit.org/show_bug.cgi?id=12268
        Give object prototypes their own names

        * kjs/lookup.h: Append "Prototype" to ClassName in KJS_IMPLEMENT_PROTOTYPE.

2007-01-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Added re-entrency checking to GC allocation and collection. It is an error
        to allocate or collect from within a collection. We've had at least one 
        case of each bug in the past.
        
        Added a comment to the API header, explaining that API clients must not
        make this mistake, either.
        
        Layout tests and JS tests pass.

        * API/JSObjectRef.h:
        * kjs/collector.cpp:
        (KJS::GCLock::GCLock):
        (KJS::GCLock::~GCLock):
        (KJS::Collector::allocate):
        (KJS::Collector::collect):

2007-01-14  Mark Rowe  <mrowe@apple.com>

        Reviewed by Mitz.

        Minor fixes to JavaScript pretty-printing.

        * JavaScriptCore.exp:
        * kjs/Parser.cpp:
        (KJS::Parser::prettyPrint): Return line number and error message if parsing fails.
        * kjs/Parser.h:
        * kjs/nodes2string.cpp:
        (ElementNode::streamTo): Include comma delimiters in array literals.
        (PropertyNameNode::streamTo): Quote property names in object literals to handle the case when the property name is not a valid identifier.
        * kjs/testkjs.cpp:
        (doIt): Print any errors encountered while pretty-printing.

2007-01-12  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Darin.

        * wtf/HashTraits.h:
        Add hash traits for unsigned long and unsigned long long.

2007-01-12  Geoffrey Garen  <ggaren@apple.com>

        RS by Brady Eidson.
        
        Rolling back in r18786 with leaks fixed, and these renames slightly reworked:

        Because they can return 0:
        rootObjectForImp => findRootObject (overloaded for JSObject* and Interpreter*)
        rootObjectForInterpreter => findRootObject (ditto)
        findReferenceSet => findProtectCountSet

2007-01-11  Geoffrey Garen  <ggaren@apple.com>

        RS by Brady Eidson.
        
        Rolling out r18786 because it caused leaks.

2007-01-11  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Anders Carlsson.

        Even more cleanup in preparation for fixing <rdar://problem/4608404> 
        WebScriptObject's _executionContext lack of ownership policy causes 
        crashes (e.g., in Dashcode)
        
        Layout tests pass.
        
        Renames:
            ReferencesSet | ProtectCounts => ProtectCountSet (because it's a typename for a set of GC protect counts)
            ReferencesByRootMap => RootObjectMap (because RootObjectToProtectCountSetMap would have been confusing)
            pv => protectedValues
            rootObjectForImp => getRootObject (overloaded for JSObject* and Interpreter*)
            rootObjectForInterpreter => getRootObject (ditto)
            findReferenceSet => getProtectCountSet
            imp => jsObject
        
        (KJS::Bindings::getRootObjectMap): Changed to take advantage of built-in
        facility for initializing static variables.

        (KJS::Bindings::getProtectCountSet):
        (KJS::Bindings::destroyProtectCountSet): Added. Helps encapsulate the fact
        that getting a ProtectCountSet entails adding a RootObject to a hash table,
        and destroying one entails the reverse.

        (KJS::Bindings::getRootObject): Removed spurious NULL check.
        
        (KJS::Bindings::findReferenceSet): Renamed. Changed to use getRootObject()
        instead of iterating on its own.

        (KJS::Bindings::addNativeReference): Changed to use an early return instead
        of indenting the whole function.
        (KJS::Bindings::removeNativeReference): Ditto.

2007-01-11  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Anders Carlsson.

        Even more cleanup in preparation for fixing <rdar://problem/4608404> 
        WebScriptObject's _executionContext lack of ownership policy causes 
        crashes (e.g., in Dashcode)
        
        Layout tests pass.
        
        Renames:
            findRootObjectForNativeHandleFunction => createRootObject
            FindRootObjectForNativeHandleFunctionPtr => CreateRootObjectFunction
            
        Also removed unnecessary use of "Bindings::" prefix.

        * JavaScriptCore.exp:
        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::createNative):
        (JavaJSObject::convertValueToJObject):
        (JavaJSObject::convertJObjectToValue):
        * bindings/runtime_root.cpp:
        (KJS::Bindings::RootObject::setCreateRootObject):
        * bindings/runtime_root.h:
        (KJS::Bindings::RootObject::createRootObject):

2007-01-11  George Staikos  <staikos@kde.org>

        Reviewed by Maciej

        Appears to be Mac specific right now.

        * kjs/config.h:

2007-01-10  Lars Knoll <lars@trolltech.com>

        Reviewed by Zack

        Use the new functionality in Qt 4.3, to make
        the methods closer compliant with the Unicode
        spec.

        Keep the old code so that it still compiles against
        Qt 4.2.

        * wtf/unicode/qt4/UnicodeQt4.h:
        (WTF::Unicode::toLower):
        (WTF::Unicode::toUpper):
        (WTF::Unicode::toTitleCase):
        (WTF::Unicode::foldCase):
        (WTF::Unicode::isFormatChar):
        (WTF::Unicode::isPrintableChar):
        (WTF::Unicode::isSeparatorSpace):
        (WTF::Unicode::isPunct):
        (WTF::Unicode::isDigit):
        (WTF::Unicode::isLower):
        (WTF::Unicode::isUpper):
        (WTF::Unicode::digitValue):
        (WTF::Unicode::mirroredChar):
        (WTF::Unicode::combiningClass):
        (WTF::Unicode::decompositionType):
        (WTF::Unicode::umemcasecmp):
        (WTF::Unicode::direction):
        (WTF::Unicode::category):

2007-01-09  Darin Adler  <darin@apple.com>

        - update 2007 Apple copyright for the new company name

        * kjs/DateMath.cpp:

2007-01-09  Darin Adler  <darin@apple.com>

        - fix build

        * kjs/string_object.cpp: (KJS::StringProtoFunc::callAsFunction):
        Actually compile it this time.

2007-01-09  Darin Adler  <darin@apple.com>

        - fix build

        * kjs/string_object.cpp: (KJS::StringProtoFunc::callAsFunction):
        Change types.

2007-01-09  Darin Adler  <darin@apple.com>

        - fix build on platforms where Unicode::UChar is != uint16_t

        * kjs/string_object.cpp: (KJS::StringProtoFunc::callAsFunction):
        Change types.

2007-01-09  Mitz Pettel  <mitz@webkit.org>

        Reviewed by Darin.

        - changes for http://bugs.webkit.org/show_bug.cgi?id=11078
          Forms Don't Submit (ASP Pages)

        * JavaScriptCore.exp:
        * kjs/value.cpp:
        (KJS::JSValue::toInt32): Folded toInt32Inline into this method, which was its
        only caller.
        (KJS::JSValue::toUInt32): Added a variant that reports if the conversion has
        succeeded.
        * kjs/value.h:

2007-01-09  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=12174
          improve Unicode use (less WTF::Unicode:: prefix, centralized character names)

        * wtf/unicode/icu/UnicodeIcu.h: Change parameter and return types
        to UChar32 and UChar. Removed unneeded type casts and added some
        const to functions that lacked it. Removed WTF::Unicode::memcmp.
        (WTF::Unicode::umemcasecmp): Renamed from strcasecmp since this
        doesn't work on 0-terminated strings as the str functions do.
        * wtf/unicode/qt4/UnicodeQt4.h: Ditto.

        - got rid of namespace prefixes from most uses of WTF::Unicode

        * kjs/function.cpp:
        (KJS::isStrWhiteSpace):
        (KJS::escapeStringForPrettyPrinting):
        * kjs/lexer.cpp:
        (KJS::Lexer::isWhiteSpace):
        (KJS::Lexer::isIdentStart):
        (KJS::Lexer::isIdentPart):
        * kjs/string_object.cpp:
        (KJS::StringProtoFunc::callAsFunction):

2007-01-07  David Kilzer  <ddkilzer@webkit.org>

        Reviewed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=11917
          setlocale() can return null

        * kjs/date_object.cpp:
        (KJS::DateProtoFunc::callAsFunction): Removed dead code.

2007-01-07  David Carson  <dacarson@gmail.com>

        Reviewed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=12100
          JNI bindings should be available to non-Mac platforms that have JNI

        Change JNI so that it is not wrapped in the PLATFORM(MAC) ifdef, enabling
        other platforms who have JNI to use it.

        * bindings/jni/jni_instance.h:  
          Removed unnecessary include of <CoreFoundation/CoreFoundation.h>
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::setJavaVM):
        * bindings/jni/jni_utility.h:
          Added new method for clients to set the JavaVM
        * bindings/runtime.cpp:
        (KJS::Bindings::Instance::createBindingForLanguageInstance):
          Changed code to utilize new #if HAVE(JNI)
        * kjs/config.h:
          Added new #define for JNI, ie HAVE_JNI

2007-01-07  David Carson  <dacarson@gmail.com>

        Reviewed by Darin.

        Fix http://bugs.webkit.org/show_bug.cgi?id=11431
        ARM platform has some byte alignment issues

        Fix for NaN being 4 bytes and it must start on a byte boundary
        for ARM architectures.

        * kjs/fpconst.cpp:
        (KJS::):

2007-01-04  David Kilzer  <ddkilzer@webkit.org>

        Reviewed by Kevin McCullough.

        - fix http://bugs.webkit.org/show_bug.cgi?id=12070
          REGRESSION: KJS::getUTCOffset() caches UTC offset but ignores time zone changes

        * kjs/DateMath.cpp:
        (KJS::getUTCOffset): Don't cache UTC offset.

2007-01-02  Darin Adler  <darin@apple.com>

        - minor tweak (hope this doesn't re-break Windows)

        * pcre/pcre_compile.c: Removed use of const pcre_uchar const * -- Mitz probably
        meant const pcre_uchar *const, but I think we can do without the explicit const here.

        * pcre/pcre_internal.h: Re-enabled warning C4114.

2007-01-02  David Kilzer  <ddkilzer@webkit.org>

        Reviewed by NOBODY (Windows build fix).

        The MSVC compiler requires variables to be declared at the top of the enclosing block in C source.

        Disable this warning to prevent MSVC from complaining about the 'const pcre_uchar const *' type:
        warning C4114: same type qualifier used more than once

        * pcre/pcre_compile.c:
        (pcre_compile2): Moved variable declarations to top of their respective enclosing blocks.
        * pcre/pcre_internal.h: Added pragma to disable compiler warning.

2007-01-01  Mitz Pettel  <mitz@webkit.org>

        Reviewed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=11849
          REGRESSION (r18182): Google Calendar is broken (a regular expression containing a null character is not parsed correctly)

        Modified pcre_compile() (and the functions that it calls) to work with patterns
        containing null characters.

        Covered by JavaScriptCore tests ecma_3/RegExp/octal-002.js and ecma_3/RegExp/regress-85721.js

        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp): Changed to not null-terminate the pattern string and instead
        pass its length to pcre_compile.
        * pcre/pcre.h:
        * pcre/pcre_compile.c:
        (check_escape):
        (get_ucp):
        (is_counted_repeat):
        (check_posix_syntax):
        (compile_branch):
        (compile_regex):
        (pcre_compile): Added a parameter specifying the length of the pattern, which
        is no longer required to be null-terminated and may contain null characters. 
        (pcre_compile2):
        * pcre/pcre_internal.h:
        * tests/mozilla/expected.html: Updated for the two tests that this patch
        fixes. Also updated failing results for ecma_3/RegExp/regress-100199.js
        which were not updated after bug 6257 was fixed.

2007-01-01  David Kilzer  <ddkilzer@webkit.org>

        Reviewed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=12057
          REGRESSION: JavaScript Date Is One Day In The Future in GMT time zone

        Because Mac OS X returns geographically and historically accurate time zone information,
        converting Jan 02, 1970 12:00:00 AM to local time then subtracting 24 hours did not work
        in GMT (London - England) since it was in BST (+0100) all year in 1970[1].  Instead, the
        UTC offset is calculated by converting Jan 01, 2000 12:00:00 AM to local time then
        subtracting that from the same date in UTC.

        [1] http://en.wikipedia.org/wiki/British_Summer_Time

        * kjs/DateMath.cpp:
        (KJS::getUTCOffset): Updated UTC offset calculation.
        (KJS::getDSTOffset): Improved comment.

2006-12-31  David Kilzer  <ddkilzer@webkit.org>

        Reviewed by Geoff.

        Update embedded pcre library from version 6.2 to 6.4.  Changes from pcre 6.2 to 6.3
        did not include any files in JavaScriptCore/pcre.

        All changes include renaming EXPORT to PCRE_EXPORT, renaming of ucp_findchar() to
        _pcre_ucp_findchar(), or comment changes.  Additional changes noted below.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Updated source file list.
        * JavaScriptCore.xcodeproj/project.pbxproj: Renamed pcre_printint.c to pcre_printint.src
        and changed it from a source file to a header file.
        * JavaScriptCoreSources.bkl: Updated source file list.
        * pcre/CMakeLists.txt: Updated source file list.
        * pcre/pcre-config.h:
        * pcre/pcre.h: Updated version.
        * pcre/pcre.pri: Updated source file list.
        * pcre/pcre_compile.c: Include pcre_printint.src #if DEBUG.
        (pcre_compile2):
        * pcre/pcre_config.c:
        * pcre/pcre_exec.c:
        (match):
        * pcre/pcre_fullinfo.c:
        * pcre/pcre_info.c:
        * pcre/pcre_internal.h: Added header guard.  Removed export of _pcre_printint().
        * pcre/pcre_ord2utf8.c:
        * pcre/pcre_printint.c: Renamed to pcre_printint.src.
        * pcre/pcre_printint.src: Added.  Renamed _pcre_printint() to pcre_printint().
        * pcre/pcre_refcount.c:
        * pcre/pcre_study.c:
        * pcre/pcre_tables.c:
        * pcre/pcre_try_flipped.c:
        * pcre/pcre_ucp_findchar.c: Added contents of ucp_findchar.c.
        * pcre/pcre_version.c:
        * pcre/pcre_xclass.c:
        (_pcre_xclass):
        * pcre/ucp.h: Removed export of ucp_findchar().
        * pcre/ucp_findchar.c: Removed.  Contents moved to pcre_ucp_findchar.c.

2006-12-29  David Kilzer  <ddkilzer@webkit.org>

        Reviewed by Geoff.

        Update embedded pcre library from version 6.1 to 6.2.  From the pcre ChangeLog:

        3. Added "b" to the 2nd argument of fopen() in dftables.c, for non-Unix-like
           operating environments where this matters.

        5. Named capturing subpatterns were not being correctly counted when a pattern
           was compiled. This caused two problems: (a) If there were more than 100
           such subpatterns, the calculation of the memory needed for the whole
           compiled pattern went wrong, leading to an overflow error. (b) Numerical
           back references of the form \12, where the number was greater than 9, were
           not recognized as back references, even though there were sufficient
           previous subpatterns.

        * pcre/dftables.c: Item 3.
        (main):
        * pcre/pcre.h: Updated version.
        * pcre/pcre_compile.c: Item 5.
        (read_repeat_counts):
        (pcre_compile2):

2006-12-29  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Brian Dash... err... Mark Rowe.

        More cleanup in preparation for fixing <rdar://problem/4608404> 
        WebScriptObject's _executionContext lack of ownership policy causes 
        crashes (e.g., in Dashcode)
        
        The key change here is to RootObject::RootObject().
        
        * JavaScriptCore.exp:

        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertValueToNPVariant): Changed to use new constructor.

        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::createNative): Changed to use new constructor. Replaced
        large 'if' followed by default condition with "if !" and explicit default
        condition.

        * bindings/objc/objc_runtime.mm:
        (convertValueToObjcObject): Changed to use new constructor.

        * bindings/runtime_root.cpp:
        (KJS::Bindings::RootObject::destroy): "removeAllNativeReferences" => "destroy"
        because this function actually destroys the RootObject.

        * bindings/runtime_root.h: Changed Interpreter* to RefPtr<Interpreter>
        to prevent a RootObject from holding a stale Interperter*.
        
        (KJS::Bindings::RootObject::RootObject): Changed constructor to take an 
        Interpreter*, since it's pointless to create a RootObject without one.
        Removed setRootObjectImp() and rootObjectImp() because they were just
        a confusing way of setting and getting the Interpreter's global object.

        (KJS::Bindings::RootObject::nativeHandle): "_nativeHandle" => "m_nativeHandle"
        (KJS::Bindings::RootObject::interpreter): "_interpreter" => "m_interpreter"

2006-12-28  George Staikos  <staikos@kde.org>

        Reviewed by Olliej.

        * bindings/qt/qt_instance.cpp: build
        (KJS::Bindings::QtInstance::QtInstance):

2006-12-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Oliver Hunt.
        
        More cleanup. Layout tests pass.
        
        Use a helper function to initialize and access WebUndefined and WebScriptObject.

        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (KJS::Bindings::webScriptObjectClass):
        (KJS::Bindings::webUndefinedClass):
        (convertValueToObjcObject):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        (KJS::Bindings::convertObjcValueToValue):

2006-12-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Brady Eidson.
        
        Some cleanup in preparation for fixing <rdar://problem/4608404> 
        WebScriptObject's _executionContext lack of ownership policy causes 
        crashes (e.g., in Dashcode)
        
        I'm just trying to make heads or tails of this baffling code.
        
        Renamed "root" | "execContext" | "executionContext" => "rootObject", because
        that's the object's (admittedly vague) type name.
        
        * bindings/runtime.cpp: Removed createLanguageInstanceForValue
        because I'll give you a dollar if you can explain to me what it actually did.
        
        * bindings/runtime_root.cpp: Put everything in the KJS::Bindings namespace,
        removing the KJS::Bindings prefix from individual functions and datatypes.
        This matches the header and eliminates a lot of syntax cruft.
        
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertValueToNPVariant): Replaced use of createLanguageInstanceForValue
        with call to _NPN_CreateScriptObject because that's what createLanguageInstanceForValue
        actually did (but don't ask me for that dollar now; that's cheating.)

        * bindings/objc/objc_utility.h:
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue): Removed. Its only purpose was 
        to call a single function for WebKit, which WebKit can do on its own.

        * kjs/interpreter.h: Removed rtti() because it was unused, and this class
        is scheduled for demolition anyway.
        
        * kjs/interpreter.cpp: Removed createLanguageInstanceForValue because it had
        nothing to do with the Interpreter, and nothing makes Chuck Norris more mad
        than a function whose sole purpose is to call another function of the same
        name. (Really, I asked him.)

2006-12-26  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Eric Seidel.

        Some cleanup in preparation for fixing <rdar://problem/4740328> Safari 
        crash on quit in _NPN_ReleaseObject from KJS::Bindings::CInstance::~CInstance

        * bindings/c/c_instance.cpp:
        * bindings/c/c_instance.h: Removed unused copy constructor and assignment
        operator. They made tracking data flow more difficult. Unused code is also 
        dangerous because it can succumb to bit rot with the stealth of a Ninja.
        
        Replaced #include with forward declaration to reduce header dependency.
        
        * bindings/npruntime.cpp: Sorted #includes.
        (_NPN_GetStringIdentifier): Replaced assert with ASSERT.
        (_NPN_GetStringIdentifiers): ditto
        (_NPN_ReleaseVariantValue): ditto
        (_NPN_CreateObject): ditto
        (_NPN_RetainObject): ditto
        (_NPN_ReleaseObject): ditto
        (_NPN_DeallocateObject): ditto

2006-12-20  Anders Carlsson  <acarlsson@apple.com>

        * kjs/string_object.cpp:
        (localeCompare):
        Another speculative Win32 fix.

2006-12-20  Anders Carlsson  <acarlsson@apple.com>

        * kjs/string_object.cpp:
        (localeCompare):
        Speculative Win32 fix.

2006-12-20  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Darin.

        <rdar://problem/4235733>
        <http://bugs.webkit.org/?show_bug.cgi?id=10193>
        support String.localeCompare.
        
        Implement localeCompare.
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/string_object.cpp:
        (localeCompare):
        (StringProtoFunc::callAsFunction):
        * kjs/string_object.h:
        (KJS::StringProtoFunc::):

2006-12-20  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Mark Rowe.

        * JavaScriptCore.xcodeproj/project.pbxproj: use GCC 4.0 for all the other test targets

2006-12-20  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Mark Rowe.

        <rdar://problem/4871613> JavaScriptCore-421.31's dftables target needs to override default compiler and use gcc-4.0

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-12-20  Lars Knoll <lars@trolltech.com>

        Reviewed by David Hyatt

        Added support to bind QObject's to 
        JavaScript.

        * JavaScriptCore.pro:
        * bindings/qt/qt_class.cpp: Added.
        (KJS::Bindings::QtClass::QtClass):
        (KJS::Bindings::QtClass::~QtClass):
        (KJS::Bindings::QtClass::classForObject):
        (KJS::Bindings::QtClass::name):
        (KJS::Bindings::QtClass::methodsNamed):
        (KJS::Bindings::QtClass::fieldNamed):
        * bindings/qt/qt_class.h: Added.
        (KJS::Bindings::QtClass::constructorAt):
        (KJS::Bindings::QtClass::numConstructors):
        * bindings/qt/qt_instance.cpp: Added.
        (KJS::Bindings::QtInstance::QtInstance):
        (KJS::Bindings::QtInstance::~QtInstance):
        (KJS::Bindings::QtInstance::operator=):
        (KJS::Bindings::QtInstance::getClass):
        (KJS::Bindings::QtInstance::begin):
        (KJS::Bindings::QtInstance::end):
        (KJS::Bindings::QtInstance::implementsCall):
        (KJS::Bindings::QtInstance::invokeMethod):
        (KJS::Bindings::QtInstance::invokeDefaultMethod):
        (KJS::Bindings::QtInstance::defaultValue):
        (KJS::Bindings::QtInstance::stringValue):
        (KJS::Bindings::QtInstance::numberValue):
        (KJS::Bindings::QtInstance::booleanValue):
        (KJS::Bindings::QtInstance::valueOf):
        * bindings/qt/qt_instance.h: Added.
        (KJS::Bindings::QtInstance::getObject):
        * bindings/qt/qt_runtime.cpp: Added.
        (KJS::Bindings::convertValueToQVariant):
        (KJS::Bindings::convertQVariantToValue):
        (KJS::Bindings::QtField::name):
        (KJS::Bindings::QtField::valueFromInstance):
        (KJS::Bindings::QtField::setValueToInstance):
        * bindings/qt/qt_runtime.h: Added.
        (KJS::Bindings::QtField::QtField):
        (KJS::Bindings::QtField::type):
        (KJS::Bindings::QtMethod::QtMethod):
        (KJS::Bindings::QtMethod::name):
        (KJS::Bindings::QtMethod::numParameters):
        * bindings/runtime.cpp:
        (KJS::Bindings::Instance::createBindingForLanguageInstance):
        * bindings/runtime.h:
        (KJS::Bindings::Instance::):
        * bindings/testbindings.pro: Added.
        * bindings/testqtbindings.cpp: Added.
        (MyObject::MyObject):
        (MyObject::setTestString):
        (MyObject::setTestInt):
        (MyObject::testString):
        (MyObject::testInt):
        (MyObject::foo):
        (Global::className):
        (main):

2006-12-19  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Geoff.

        Add -p option to testkjs which pretty prints the files instead of executing them.

        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/Parser.cpp:
        (KJS::Parser::prettyPrint):
        * kjs/Parser.h:
        * kjs/testkjs.cpp:
        (doIt):

2006-12-19  Brady Eidson  <beidson@apple.com>

        Rubberstamped by Lou
        
        Removed unneccessary "else"

        * wtf/Assertions.cpp:

2006-12-19  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin.

        <rdar://problem/4891774> Local WebCore/WebBrowser builds fail in 9A328 due to warning about ObjC-2.0 language features

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-12-17  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Zack.

        * kjs/testkjs.pro: Oops, make it also build on machines other than
        mine :)

2006-12-17  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Rob Buis.

        * kjs/testkjs.pro: Added .pro file to build testkjs.

2006-12-16  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Rob.

        A deleted object was accessed to prepare RegExp construction error messages.

        * kjs/regexp_object.cpp:
        (RegExpObjectImp::construct): Wrap the RegExp into an OwnPtr.

2006-12-16  Mitz Pettel  <mitz@webkit.org>

        Reviewed by Alexey.

        - fix http://bugs.webkit.org/show_bug.cgi?id=11814
          REGRESSION(r18098): Find does not work with capital letters

        Test: editing/execCommand/findString-3.html

        * wtf/unicode/icu/UnicodeIcu.h:
        (WTF::Unicode::foldCase): Changed to not return an error if the result fits
        in the buffer without a null terminator.

2006-12-13  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Anders.
        
        - added equality and inequality operations for HashMap and Vector, useful for comparing more complex types

        * wtf/HashMap.h:
        (WTF::operator==):
        (WTF::operator!=):
        * wtf/Vector.h:
        (WTF::operator==):
        (WTF::operator!=):

2006-12-12  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Geoff. Based on a patch by Maks Orlovich.

        http://bugs.webkit.org/show_bug.cgi?id=6257
        Throw errors on invalid expressions (KJS merge)

        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp):
        (KJS::RegExp::~RegExp):
        (KJS::RegExp::match):
        * kjs/regexp.h:
        (KJS::RegExp::flags):
        (KJS::RegExp::isValid):
        (KJS::RegExp::errorMessage):
        (KJS::RegExp::subPatterns):
        Remember and report RegExp construction failures. Renamed data members not to start with underscores.

        * kjs/regexp_object.cpp:
        (RegExpObjectImp::construct): Raise an exception if RegExp construction fails.
        (RegExpObjectImp::callAsFunction): Removed an obsolete comment.

        * tests/mozilla/ecma_3/RegExp/regress-119909.js: Reduced the number of nested parentheses to 
        a value supported by PCRE.

2006-12-11  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=9673
        Add support for window.atob() and window.btoa()

        * JavaScriptCore.exp: Export UString::is8Bit().
        * JavaScriptCore.xcodeproj/project.pbxproj: Added StringExtras.h as 
        a private header.

2006-12-11  Darin Adler  <darin@apple.com>

        Reviewed by Brady.

        * JavaScriptCore.xcodeproj/project.pbxproj: Let Xcode update this
        (I think Hyatt is using an old Xcode).

2006-12-11  David Hyatt  <hyatt@apple.com>

        Fix the failing layout test.  Just remove Unicode::isSpace and
        revert StringImpl to do the same thing it was doing before.

        Reviewed by darin

        * wtf/unicode/icu/UnicodeIcu.h:
        * wtf/unicode/qt4/UnicodeQt4.h:

2006-12-09  George Staikos  <staikos@kde.org>

        Reviewed by Zack.

        Fix bison again on qmake build.

        * JavaScriptCore.pro:

2006-12-09  Lars Knoll <lars@trolltech.com>

        Reviewed by Zack

        Make it possible to build WebKit with qmake.

        * JavaScriptCore.pro: Added.
        * kjs/kjs.pro: Removed.
        * pcre/pcre.pri: Added.

2006-12-09  Zack Rusin  <zack@kde.org>

        Fixing the compilation with platform kde after the icu changes.

        * CMakeLists.txt:

2006-12-09  Adam Roben  <aroben@apple.com>

        Reviewed by Darin.

        Some updates in reaction to r18098.

        * wtf/unicode/icu/UnicodeIcu.h: Use !! to convert UBool to bool in all
        cases.
        (WTF::Unicode::toLower):
        (WTF::Unicode::toUpper):
        (WTF::Unicode::isDigit):
        (WTF::Unicode::isSpace):
        (WTF::Unicode::isPunct):
        (WTF::Unicode::isLower):
        (WTF::Unicode::isUpper):
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/WTF/WTF.vcproj:

2006-12-09  George Staikos  <staikos@kde.org>

        Patch by Lars Knoll, comment out ICU dependency on Qt platform (unused code).

        Reviewed by Darin.

        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertUTF8ToUTF16):

2006-12-08  David Hyatt  <hyatt@apple.com>

        Land the new ICU abstraction layer.  Patch by Lars.

        Reviewed by me

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * wtf/Platform.h:
        * wtf/unicode/UnicodeCategory.h: Removed.
        * wtf/unicode/UnicodeDecomposition.h: Removed.
        * wtf/unicode/UnicodeDirection.h: Removed.
        * wtf/unicode/icu/UnicodeIcu.h:
        (WTF::Unicode::):
        (WTF::Unicode::foldCase):
        (WTF::Unicode::toLower):
        (WTF::Unicode::toUpper):
        (WTF::Unicode::toTitleCase):
        (WTF::Unicode::isDigit):
        (WTF::Unicode::isSpace):
        (WTF::Unicode::isPunct):
        (WTF::Unicode::mirroredChar):
        (WTF::Unicode::category):
        (WTF::Unicode::direction):
        (WTF::Unicode::isLower):
        (WTF::Unicode::isUpper):
        (WTF::Unicode::digitValue):
        (WTF::Unicode::combiningClass):
        (WTF::Unicode::decompositionType):
        (WTF::Unicode::strcasecmp):
        (WTF::Unicode::memset):
        * wtf/unicode/qt4/UnicodeQt4.cpp: Removed.
        * wtf/unicode/qt4/UnicodeQt4.h:
        (WTF::Unicode::):
        (WTF::Unicode::toLower):
        (WTF::Unicode::toUpper):
        (WTF::Unicode::toTitleCase):
        (WTF::Unicode::foldCase):
        (WTF::Unicode::isPrintableChar):
        (WTF::Unicode::isLower):
        (WTF::Unicode::isUpper):
        (WTF::Unicode::digitValue):
        (WTF::Unicode::combiningClass):
        (WTF::Unicode::decompositionType):
        (WTF::Unicode::strcasecmp):
        (WTF::Unicode::memset):
        (WTF::Unicode::direction):
        (WTF::Unicode::category):

=== Safari-521.32 ===

2006-12-08  Adam Roben  <aroben@apple.com>

        Reviewed by Anders.

        This is a mo' better fix for ensuring we don't use macro definitions
        of min/max.

        * kjs/config.h:
        * wtf/Vector.h:

2006-12-07  Kevin Fyure  <digdog@macports.org>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=11545
        Disable the testcases do not follow the ECMA-262v3 specification.
        
        * tests/mozilla/expected.html: Update Results.
        * tests/mozilla/js1_2/String/concat.js:
        4 tests disabled. The result of concat Array object is not followinig
        ECMA 15.5.4.6
        * tests/mozilla/js1_2/function/Number.js:
        1 test disabled. The result of Array object to Number object conversion 
        is not following ECMA 9.3. And the test was duplicated in 
        ecma/TypeConversion/9.3-1.js
        * tests/mozilla/js1_2/function/String.js:
        2 tests disabled. The result of Object/Array object to String object 
        conversion is not following ECMA 15.5.1.1 and ECMA 9.8

2006-11-30  Steve Falkenburg  <sfalken@apple.com>

        Reviewed by Oliver.
        
        Move WTF from JavaScriptCore project into a new WTF project.

        * JavaScriptCore.vcproj/JavaScriptCore.sln: Add WTF.vcproj to sln
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Remove WTF source files
        * JavaScriptCore.vcproj/WTF/WTF.vcproj: Added.
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Add dependency on WTF.lib

2006-11-30  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth Dakin.
        
        Fixed up garbage collection at window close time.

        * kjs/interpreter.cpp:
        (KJS::Interpreter::~Interpreter): Garbage collect here, since
        destroying the interpreter frees the global object and 
        therefore creates a lot of garbage.

2006-11-20  W. Andy Carrel  <wac@google.com>

        Reviewed by Maciej.

        http://bugs.webkit.org/show_bug.cgi?id=11501
        REGRESSION: \u no longer escapes metacharacters in RegExps
        http://bugs.webkit.org/show_bug.cgi?id=11502
        Serializing RegExps doesn't preserve Unicode escapes

        * kjs/lexer.cpp:
        (Lexer::Lexer):
        (Lexer::setCode):
        (Lexer::shift):
        (Lexer::scanRegExp):
        Push \u parsing back down into the RegExp object rather than in the
        parser. This backs out r17354 in favor of a new fix that better 
        matches the behavior of other browsers.

        * kjs/lexer.h:
        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp):
        (KJS::sanitizePattern):
        (KJS::isHexDigit):
        (KJS::convertHex):
        (KJS::convertUnicode):
        * kjs/regexp.h:
        Translate \u escaped unicode characters for the benefit of pcre.

        * kjs/ustring.cpp:
        (KJS::UString::append):
        Fix failure to increment length on the first UChar appended to a 
        UString that was copy-on-write.

        * tests/mozilla/ecma_2/RegExp/properties-001.js:
        Adjust tests back to the uniform standards.

2006-11-20  Samuel Weinig  <sam@webkit.org>

        Reviewed by Maciej.

        Fix for http://bugs.webkit.org/show_bug.cgi?id=11647
        Fix Win32 build

        * kjs/config.h: define NOMINMAX instead of min/max
        as themselves.
        * wtf/Vector.h: put back hack to ensure that min/max
        are not defined as macros.

2006-11-19  Simon Hausmann  <hausmann@kde.org>

        Reviewed by Zack.

        http://bugs.webkit.org/show_bug.cgi?id=11649
        Fix CMake Qt-only build without KDE CMake files

        * CMakeLists.txt:
        * pcre/CMakeLists.txt:

2006-11-17  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Adam.

        Make sure that we always use std::min and std::max instead of macros.
        
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * kjs/config.h:
        * wtf/Vector.h:

=== Safari-521.31 ===

2006-11-12  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth Dakin.
        
        Added project-wide setting to disable Microsoft's made-up deprecation 
        warnings related to std:: functions. (Doesn't have any affect yet,
        since we currently disable all deprecation warnings.)

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2006-11-12  Mark Rowe  <bdash@webkit.org>

        Reviewed by Mitz.

        Clean up of JavaScriptCore bakefiles.

        * JavaScriptCoreSources.bkl:
        * jscore.bkl:

2006-11-11  Alexey Proskuryakov  <ap@webkit.org>

        Reviewed by Maciej.

        http://bugs.webkit.org/show_bug.cgi?id=11508
        Undisable some warnings for JSImmediate.h

        Fix suggested by Don Gibson.

        * kjs/JSImmediate.h:
        Re-enable all MSVC warnings, move the remaining runtime checks
        to compile-time.

2006-11-10  Zalan Bujtas  <zalan.bujtas@nokia.com>

        Reviewed by Maciej.

        Added s60/symbian platform defines.
        http://bugs.webkit.org/show_bug.cgi?id=11540

        * wtf/Platform.h:

=== Safari-521.30 ===

2006-11-08  Ada Chan  <adachan@apple.com>

        Reviewed by darin.
        
        Added a method to delete all the keys in a HashMap.

        * wtf/HashMap.h:
        (WTF::deleteAllPairFirsts):
        (WTF::deleteAllKeys):

2006-11-07  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Geoff.

        * API/JSClassRef.cpp:
        (OpaqueJSClass::OpaqueJSClass):
        Initialize cachedPrototype to 0.

2006-11-06  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by Maciej.

        Remove warning about garbage after #else. #else clause applies for all
        non-mac platforms, not only win.

        * kjs/date_object.cpp:

2006-11-06  Mark Rowe  <bdash@webkit.org>

        Reviewed by the wonderful Mitz Pettel.

        http://bugs.webkit.org/show_bug.cgi?id=11524
        Bug 11524: REGRESSION(r9842): Array.prototype.join should use ToString operator rather than calling toString on each element

        * kjs/array_object.cpp:
        (ArrayProtoFunc::callAsFunction): Use ToString operator on each element rather than calling their toString method.

2006-11-03  Steve Falkenburg  <sfalken@apple.com>

        Fix build

        * kjs/JSImmediate.h:

2006-11-03  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=11504
        Fix warnings on non 32 bit platforms

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::NanAsBits):
        (KJS::JSImmediate::oneAsBits):
        Rewrite in a way that moves runtime checks to compile-time.

        (KJS::):
        (KJS::JSImmediate::fromDouble):
        (KJS::JSImmediate::toDouble):

2006-11-02  George Staikos <staikos@kde.org>

        Reviewed by Maciej.

        * collector.cpp:
        Remove a deprecated pthreads call.

2006-11-02  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Maciej, landed by Anders.

        * CMakeLists.txt:
        Make KDE support optional.

2006-11-01  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Brady.

        - Fixes many JavaScriptCore tests in other timezones.  The root problem is that on mac localtime() returns historically accurate information for DST, but the JavaScript spec explicitly states to not take into account historical information but rather to interpolate from valid years.

        * kjs/DateMath.cpp:
        (KJS::equivalentYearForDST):
        (KJS::getDSTOffsetSimple):
        (KJS::getDSTOffset):

2006-10-31  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth.
        
        Fixed http://bugs.webkit.org/show_bug.cgi?id=11477
        REGRESSION: GMail crashes in KJS::FunctionImp::callerGetter

        * kjs/function.cpp:
        (KJS::FunctionImp::argumentsGetter): Removed unnecessary braces.
        (KJS::FunctionImp::callerGetter): More logical NULL checking.

2006-10-31  Oliver Hunt  <oliver@apple.com>

        Reviewed by Geoff.

        Adding definition for PLATFORM(CI)

        * wtf/Platform.h:

2006-10-31  Vladimir Olexa  <vladimir.olexa@gmail.com>

        Reviewed by Geoff.

        http://bugs.webkit.org/show_bug.cgi?id=4166
        Function object does not support caller property

        Test: fast/js/caller-property.html

        * kjs/function.cpp: 
        (KJS::FunctionImp::callerGetter): added
        (KJS::FunctionImp::getOwnPropertySlot): added if statement to handle callerGetter()
        * kjs/function.h: added callerGetter() declaration
        * kjs/identifier.h: added caller property macro
        * tests/mozilla/expected.html: 

2006-10-30  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Adam.

        - Fix some timezone issues and JavaScriptCore date tests.  Addresses bugzilla 4930.

        * kjs/DateMath.h:
        (KJS::GregorianDateTime::GregorianDateTime): Here's the fix, to add parenthesis for order of precedence.
        * kjs/date_object.cpp:
        (KJS::DateProtoFunc::callAsFunction): 
        (KJS::DateObjectImp::construct): memset not needed as GregorianDateTime initializes itself.

2006-10-30  Darin Adler  <darin@apple.com>

        Reviewed by John Sullivan.

        * kjs/SavedBuiltins.h: Added needed include.
        * wtf/OwnPtr.h: (WTF::OwnPtr::set): Fixed mistake in assertion.

2006-10-28  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - renamed PassRefPtr::release to releaseRef to make it clearer that
          it's the counterpart of adoptRef, and to make it harder to confuse
          it with the safer-to-use RefPtr::release

        * kjs/identifier.cpp:
        (KJS::CStringTranslator::translate):
        (KJS::UCharBufferTranslator::translate):
        * kjs/ustring.cpp:
        (KJS::UString::Rep::create):
        * wtf/PassRefPtr.h:
        (WTF::PassRefPtr::PassRefPtr):
        (WTF::PassRefPtr::~PassRefPtr):
        (WTF::PassRefPtr::get):
        (WTF::PassRefPtr::releaseRef):
        (WTF::PassRefPtr::operator->):
        (WTF::PassRefPtr::operator=):
        (WTF::adoptRef):
        (WTF::static_pointer_cast):
        (WTF::const_pointer_cast):
        * wtf/RefPtr.h:
        (WTF::RefPtr::RefPtr):
        (WTF::RefPtr::operator=):

2006-10-28  Darin Adler  <darin@apple.com>

        Reviewed by Steve.

        * kjs/grammar.y: Add definitions of YYMALLOC and YYFREE to fix
        a warning some people see (not sure why others don't see it).

        * JavaScriptCore.vcproj/JavaScriptCore/grammarWrapper.cpp: Touch
        this file to force it to re-build grammar.cpp.

2006-10-28  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - made changes so the code compiles with the highest warning level
          under MSVC (disabling some warnings, making some code fixes)

        * API/JSCallbackConstructor.cpp:
        (KJS::JSCallbackConstructor::construct):
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::callAsFunction):
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::init):
        (KJS::JSCallbackObject::construct):
        (KJS::JSCallbackObject::callAsFunction):
        * API/JSObjectRef.cpp:
        (JSPropertyNameArrayGetNameAtIndex):
        * API/JSStringRef.cpp:
        (JSStringCreateWithCharacters):
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertUTF8ToUTF16):
        (KJS::Bindings::coerceValueToNPVariantStringType):
        (KJS::Bindings::convertValueToNPVariant):
        * kjs/DateMath.h:
        (KJS::GregorianDateTime::GregorianDateTime):
        * kjs/ExecState.h:
        (KJS::ExecState::hadException):
        * kjs/JSImmediate.h:
        (KJS::JSImmediate::fromDouble):
        (KJS::JSImmediate::toDouble):
        (KJS::JSImmediate::NanAsBits):
        (KJS::JSImmediate::oneAsBits):
        * kjs/Parser.h:
        * kjs/PropertyNameArray.h:
        (KJS::PropertyNameArray::size):
        * kjs/array_object.cpp:
        (ArrayObjectImp::callAsFunction):
        * kjs/bool_object.cpp:
        (BooleanObjectImp::callAsFunction):
        * kjs/collector.cpp:
        (KJS::Collector::allocate):
        (KJS::Collector::markCurrentThreadConservatively):
        (KJS::Collector::collect):
        * kjs/completion.h:
        (KJS::Completion::isValueCompletion):
        * kjs/date_object.cpp:
        (KJS::findMonth):
        * kjs/debugger.cpp:
        (Debugger::sourceParsed):
        (Debugger::sourceUnused):
        (Debugger::exception):
        (Debugger::atStatement):
        (Debugger::callEvent):
        (Debugger::returnEvent):
        * kjs/dtoa.cpp:
        * kjs/error_object.cpp:
        (ErrorObjectImp::callAsFunction):
        (NativeErrorImp::callAsFunction):
        * kjs/function.cpp:
        (KJS::FunctionImp::processVarDecls):
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/function_object.cpp:
        (FunctionPrototype::callAsFunction):
        * kjs/grammar.y:
        * kjs/identifier.cpp:
        (KJS::CStringTranslator::translate):
        (KJS::Identifier::add):
        * kjs/internal.h:
        * kjs/lexer.cpp:
        (Lexer::lex):
        (Lexer::isIdentStart):
        (Lexer::isIdentPart):
        (isDecimalDigit):
        (Lexer::isHexDigit):
        (Lexer::isOctalDigit):
        (Lexer::matchPunctuator):
        (Lexer::singleEscape):
        (Lexer::convertOctal):
        (Lexer::convertHex):
        (Lexer::convertUnicode):
        (Lexer::record8):
        * kjs/lexer.h:
        * kjs/math_object.cpp:
        (MathFuncImp::callAsFunction):
        * kjs/number_object.cpp:
        (integer_part_noexp):
        (intPow10):
        (NumberProtoFunc::callAsFunction):
        (NumberObjectImp::callAsFunction):
        * kjs/object.cpp:
        (KJS::JSObject::deleteProperty):
        (KJS::JSObject::callAsFunction):
        (KJS::JSObject::toBoolean):
        (KJS::JSObject::toObject):
        * kjs/object.h:
        (KJS::JSObject::getPropertySlot):
        * kjs/property_map.cpp:
        (KJS::isValid):
        (KJS::PropertyMap::put):
        (KJS::PropertyMap::insert):
        (KJS::PropertyMap::containsGettersOrSetters):
        * kjs/property_map.h:
        (KJS::PropertyMap::hasGetterSetterProperties):
        * kjs/property_slot.h:
        * kjs/string_object.cpp:
        (StringInstance::getPropertyNames):
        (StringObjectImp::callAsFunction):
        (StringObjectFuncImp::callAsFunction):
        * kjs/ustring.cpp:
        (KJS::UString::Rep::computeHash):
        (KJS::UString::UString):
        (KJS::UString::from):
        (KJS::UString::append):
        (KJS::UString::ascii):
        (KJS::UString::operator=):
        (KJS::UString::find):
        (KJS::UString::rfind):
        * kjs/ustring.h:
        (KJS::UChar::high):
        (KJS::UChar::low):
        (KJS::UCharReference::low):
        (KJS::UCharReference::high):
        * kjs/value.cpp:
        (KJS::JSValue::toUInt16):
        * kjs/value.h:
        * pcre/pcre_compile.c:
        (get_othercase_range):
        * pcre/pcre_exec.c:
        (match):
        * pcre/pcre_internal.h:
        * wtf/HashFunctions.h:
        (WTF::intHash):
        (WTF::PtrHash::hash):
        * wtf/MathExtras.h:
        (isnan):
        (lround):
        (lroundf):
        * wtf/StringExtras.h:
        (strncasecmp):
        * wtf/unicode/icu/UnicodeIcu.h:
        (WTF::Unicode::isPrintableChar):

2006-10-26  W. Andy Carrel  <wac@google.com>

        Reviewed by Maciej.

        - Fix http://bugs.webkit.org/show_bug.cgi?id=7445 /
          <rdar://problem/4614195> (and 7253 / <rdar://4694011>) by changing
          inline regexps so that they can have \u escaped Unicode sequences and
          still work properly.

        * kjs/lexer.cpp:
        (Lexer::Lexer): 
        (Lexer::setCode):
        (Lexer::shift): Looking ahead one additional character for the benefit
        of scanRegExp
        (Lexer::scanRegExp): Change code to support unicode escapes in inline 
        regexps.
        * kjs/lexer.h: Extra lookahead added.

=== Safari-521.29 ===

2006-10-26  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by Darin.

        Fix build with older gcc 3.3.4.

        * kjs/DateMath.cpp: Remove inline prefix.
        (KJS::equivalentYearForDST):

2006-10-26  Darin Adler  <darin@apple.com>

        Reviewed by John.

        - fix iteration of properties of string objects (found because of a warning
          emitted by the MSVC compiler)

        * kjs/string_object.cpp: (StringInstance::getPropertyNames): Change code that
        wants to format a number as a string to use UString::from. Before it was using
        the UString constructor that makes a string from a character!

        * kjs/ustring.h:
        * kjs/ustring.cpp: Remove the dangerous and not all that helpful UString(char)
        constructor.

        * kjs/grammar.y: Change code to not depend on the UString(char) constructor.
        This is potentially more efficient anyway because we could overload the + operator
        some day to handle char* directly instead of creating a UString.

        * kjs/nodes2string.cpp: (SourceStream::operator<<): Change code to not depend on
        the UString(char) constructor.

2006-10-25  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Steve (rubber stamp).

        - Link against your local build of JavaScriptCore.lib first, this fixes some errors on release builds of testkjs.

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2006-10-25  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Lou.
        
        Removed duplicate symbol declaration.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/grammar.y:

2006-10-24  Steve Falkenburg  <sfalken@apple.com>

        Build config change

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2006-10-24  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Brady.

        - Fixes a date formatting issue on win.  Specifically strftime cannot handle some ranges of time so we shift time call strftime and then manipulate the returned string, if needed.

        * kjs/date_object.cpp:
        (KJS::):
        (KJS::formatLocaleDate):
        (KJS::DateProtoFunc::callAsFunction):

2006-10-23  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by 

       - Build fix

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/grammar.y:

2006-10-23  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Maciej.

        - Makes the toTM function an operator.  Was going to piggy back on a patch but the patch needs more work.

        * kjs/DateMath.cpp:
        (KJS::equivalentYearForDST):
        * kjs/DateMath.h:
        (KJS::GregorianDateTime::operator tm):
        * kjs/date_object.cpp:
        (KJS::formatTime):
        (KJS::DateProtoFunc::callAsFunction):

2006-10-23  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Maciej.

       - Fixes two regressions on win.  Both are stack overflows. For one the number of recursions is capped at 100, and for the other, nested parenthesis pairs are not evaluated (since they would evaluate to whatever is in them anyway).

        * kjs/grammar.y:
        * kjs/object.cpp:

2006-10-21  Steve Falkenburg  <sfalken@apple.com>

        Reviewed by Adam.
        
        Add minimal compatibility with MSVCRT leak checker

        * wtf/FastMalloc.h:

2006-10-23  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Geof.

        - Sets the lowercase range correctly in the test and consolidates a variable to make the test more readable.

       * tests/mozilla/ecma/String/15.5.4.11-2.js:

2006-10-21  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - http://bugs.webkit.org/show_bug.cgi?id=11377
          swap(Vector, Vector) should be O(1) instead of O(n)

        * wtf/Vector.h:
        (WTF::VectorBuffer::swap): Added.
        (WTF::Vector::swap): Added.
        (WTF::swap): Added overload that takes two Vector objects.

2006-10-21  Darin Adler  <darin@apple.com>

        Reviewed by Adam.

        - http://bugs.webkit.org/show_bug.cgi?id=11376
          build scripts should invoke make with "-j" option for multiple processors

        * JavaScriptCore.xcodeproj/project.pbxproj: Pass -j `sysctl -n hw.ncpu` to make.

2006-10-19  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Geof.

        Changed test to make us pass Georgian case changing for Unicode 4.0 and 5.0.  This incorporates changes from the 1.4 revision of the same mozilla test.
        On Tiger we are still using Unicode 4.0 but on win and Leopard we are using Unicode 5.0, so this test currently allows for either answer.

        * tests/mozilla/ecma/String/15.5.4.11-2.js:

2006-10-18  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - remove vestiges of KXMLCore name (former name of WTF).

        * wtf/Assertions.h:
        * wtf/FastMalloc.h:
        (operator new):
        (operator delete):
        (operator new[]):
        (operator delete[]):
        * wtf/FastMallocInternal.h:
        * wtf/Forward.h:
        * wtf/GetPtr.h:
        * wtf/HashCountedSet.h:
        * wtf/HashFunctions.h:
        * wtf/HashMap.h:
        * wtf/HashSet.h:
        * wtf/HashTable.h:
        * wtf/HashTraits.h:
        * wtf/ListRefPtr.h:
        * wtf/MathExtras.h:
        * wtf/Noncopyable.h:
        * wtf/OwnArrayPtr.h:
        * wtf/OwnPtr.h:
        * wtf/PassRefPtr.h:
        * wtf/Platform.h:
        * wtf/RefPtr.h:
        * wtf/StringExtras.h:
        (snprintf):
        * wtf/UnusedParam.h:
        * wtf/Vector.h:
        * wtf/VectorTraits.h:

2006-10-17  Steve Falkenburg  <sfalken@apple.com>

        Reviewed by Maciej.
        
        Adjust include paths

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2006-10-17  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Darin.

        Fixed a date issue where the UTC offset was not set in win.

        * kjs/DateMath.cpp:
        (KJS::getDSTOffsetSimple):
        (KJS::getDSTOffset):
        (KJS::msToGregorianDateTime):
        * kjs/DateMath.h:
        (KJS::):
        (KJS::GregorianDateTime::GregorianDateTime):

2006-10-17  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Brady.

        Fixes a JavaScriptCore math issue on win.

        * kjs/math_object.cpp:
        (MathFuncImp::callAsFunction):
        * wtf/MathExtras.h:
        (wtf_atan2):

2006-10-16  Kevin McCullough  <kmccullough@apple.com>

        Reviewed by Geof.

        Removed unecessary global specifiers.

        * kjs/math_object.cpp:
        (MathFuncImp::callAsFunction):

2006-10-16  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by John.

        Fixes a compile order issue for testkjs on win.

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2006-10-15  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by Anders.

        Remove junk (as gcc calls it) after #else clause.

        * wtf/FastMalloc.cpp:
        (WTF::do_free):

2006-10-14  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by Maciej.

        Define KXMLCORE_USE_CURL for platforms that wish to use CURL as
        networking, and set it for GDK build

        * wtf/Platform.h:

2006-10-13  Marvin Decker  <marv.decker@gmail.com>

        Reviewed by Kevin McCullough.

        Fixes http://bugs.webkit.org/show_bug.cgi?id=11283
        Fixes Qt/Linux and Windows build

        * kjs/DateMath.cpp:
        * kjs/DateMath.h:
        * kjs/date_object.cpp:
        (KJS::DateProtoFunc::callAsFunction):

2006-10-13  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Adam, Geoff, Darin.

       Fixed displaying the UTC offset and time zone string, as well as renamed the GregorianDateTime structure and clean up. 

        * ChangeLog:
        * kjs/DateMath.cpp:
        (KJS::getUTCOffset):
        (KJS::getDSTOffsetSimple):
        (KJS::gregorianDateTimeToMS):
        (KJS::msToGregorianDateTime):
        * kjs/DateMath.h:
        (KJS::GregorianDateTime::GregorianDateTime):
        (KJS::GregorianDateTime::~GregorianDateTime):
        (KJS::GregorianDateTime::toTM):
        * kjs/date_object.cpp:
        (KJS::gmtoffset):
        (KJS::formatDate):
        (KJS::formatDateUTCVariant):
        (KJS::formatTime):
        (KJS::fillStructuresUsingTimeArgs):
        (KJS::fillStructuresUsingDateArgs):
        (KJS::DateInstance::getTime):
        (KJS::DateInstance::getUTCTime):
        (KJS::DateProtoFunc::callAsFunction):
        (KJS::DateObjectImp::construct):
        (KJS::DateObjectImp::callAsFunction):
        (KJS::DateObjectFuncImp::callAsFunction):
        (KJS::parseDate):
        * kjs/date_object.h:

2006-10-13  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Adam.

        Gets JavaScripCore tests running on windows.

        * Scripts/run-javascriptcore-tests:
        * Scripts/webkitdirs.pm:

2006-10-12  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        Removed JSObjectMakeWithPrototype, clarified some comments. We really
        don't want people to manage their own prototypes, so we don't want an
        extra function in the API devoted to just that. People can still manage
        their own prototypes if they really want by using JSObjectSetPrototype.

        * API/JSClassRef.cpp:
        (OpaqueJSClass::createNoAutomaticPrototype):
        (OpaqueJSClass::create):
        * API/JSClassRef.h:
        * API/JSObjectRef.cpp:
        (JSClassCreate):
        (JSObjectMake):
        * API/JSObjectRef.h:
        * API/testapi.c:
        (main):
        * JavaScriptCore.exp:

2006-10-12  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Adam.

        Build breakage fix

        * kjs/DateMath.cpp:
        (KJS::msToTM):
        * kjs/date_object.cpp:
        (KJS::gmtoffset):

2006-10-11  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Geoff.

        Added our own tm struct to have a consistent set of fields, which lets us display the DST offset and timezone strings correctly.  Also there is some code cleanup.

        * kjs/DateMath.cpp:
        (KJS::timeToMS):
        (KJS::getUTCOffset):
        (KJS::getDSTOffsetSimple):
        (KJS::dateToMS):
        (KJS::msToTM):
        (KJS::tmToKJStm):
        (KJS::KJStmToTm):
        * kjs/DateMath.h:
        * kjs/date_object.cpp: 
        (KJS::gmtoffset): 
        (KJS::formatTime): 
        (KJS::DateProtoFunc::callAsFunction): 
        (KJS::DateObjectImp::construct):
        (KJS::DateObjectImp::callAsFunction):
        (KJS::DateObjectFuncImp::callAsFunction):
        (KJS::parseDate):
        * kjs/date_object.h:

2006-10-09  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by Geoff.

        Improve gdk build compiler flags (show warning, no rtti and exceptions).

        * jscore.bkl:

2006-10-06  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Brady.

        DST and TimeZones were wrong in some cases, specifically on some of the dates where DST changes.

        * kjs/DateMath.cpp:
        (KJS::equivalentYearForDST):
        (KJS::getUTCOffset):
        (KJS::getDSTOffsetSimple):
        (KJS::getDSTOffset):
        (KJS::dateToMseconds):
        (KJS::msToTM):
        * kjs/DateMath.h:
        * kjs/date_object.cpp:
        (KJS::gmtoffset):

2006-10-05  Darin Adler  <darin@apple.com>

        Reviewed by Kevin McCullough.

        * wtf/Assertions.cpp: Fix build when _DEBUG is not defined.

2006-10-04  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Adam.

        - Removed an unnecessary assert that was stopping many pages.  tm_gmtoff was not set for UTC time in mozilla but is always set for us.

        * kjs/DateMath.cpp:
        (KJS::getUTCOffset):
        (KJS::msToTM):
        * kjs/date_object.cpp:
        (KJS::gmtoffset):
        (KJS::formatTime):

2006-10-04  Geoffrey Garen  <ggaren@apple.com>

        Patch by Darin and me, reviewed by Maciej.

        Fixed <rdar://problem/4518397> REGRESSION(?): Oft-seen but unrepro crash 
              in JavaScript garbage collection (KJS::Collector::collect())
               <rdar://problem/4752492> Crash in KJS::collect
              
        The issue here was allocating one garbage-collected object in the midst 
        of allocating a second garbage-collected object. In such a case, the
        zeroIfFree word lies.

        * kjs/collector.cpp:
        (KJS::Collector::allocate):
        (KJS::Collector::collect):

2006-10-04  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Adam.

        - Layout test fix

        * kjs/DateMath.cpp:
        (KJS::dateToDayInYear): accept and correctly handle negative months

2006-10-05  Kevin McCullough  <KMcCullough@apple.com>

       build fix

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

2006-10-05  Mark Rowe  <bdash@webkit.org>

        Reviewed by maculloch.

        Gdk build fix.

        * JavaScriptCoreSources.bkl: Add DateMath.cpp to file list.

2006-10-05  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by aroben

        - build fix

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-10-04  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by Mitz.

        Fix Qt/Linux build by adding DateMath.cpp to compilation.

        * CMakeLists.txt: Also replace tabs with spaces.

2006-10-04  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by DethBakin.

        - Apparently the build bot uses an older version of XCode which warns about conversions and the newest version does not.  I hope this fixes the build but I cann't be sure on my system.

        * kjs/DateMath.cpp:
        (KJS::msToYear):
        (KJS::dayInYear):
        (KJS::dateToDayInYear):

2006-10-05  Darin Adler  <darin@apple.com>

        Reviewed by Adam.

        * wtf/Assertions.cpp: Changed assertion formatting to omit the "======"
        lines so you can see more assertions in less space. Also improved format
        of file/line information so it works with more development environments.

2006-10-04  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Tim H.

        - The build machine is more sensitive about automatic conversions.  These fixes exp
licitly cast or change the input and return types of functions to avoid conversions.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/DateMath.cpp:
        (KJS::):
        (KJS::msToDays):
        (KJS::msToYear):
        (KJS::dayInYear):
        (KJS::monthToDayInYear):
        (KJS::dateToDayInYear):
        (KJS::getDSTOffsetSimple):
        (KJS::getDSTOffset):
        (KJS::dateToMseconds):
        (KJS::msToTM):

2006-10-04  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by GGaren

        - This is a big makeover for our Date implemenetation.  This solves many platform specific issues, specifically dates before 1970, and simplifies some ugly code.  The purpose of this was to get us to pass many of the JavaScriptCore tests on windows.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/DateMath.cpp: Added.
        (KJS::):
        (KJS::daysInYear):
        (KJS::daysFrom1970ToYear):
        (KJS::msFrom1970ToYear):
        (KJS::msToDays):
        (KJS::msToYear):
        (KJS::isLeapYear):
        (KJS::isInLeapYear):
        (KJS::dayInYear):
        (KJS::msToMilliseconds):
        (KJS::msToWeekDay):
        (KJS::msToSeconds):
        (KJS::msToMinutes):
        (KJS::msToHours):
        (KJS::msToMonth):
        (KJS::msToDayInMonth):
        (KJS::monthToDayInYear):
        (KJS::timeToMseconds):
        (KJS::dateToDayInYear):
        (KJS::equivalentYearForDST):
        (KJS::getUTCOffset):
        (KJS::getDSTOffsetSimple):
        (KJS::getDSTOffset):
        (KJS::localTimeToUTC):
        (KJS::UTCToLocalTime):
        (KJS::dateToMseconds):
        (KJS::msToTM):
        (KJS::isDST):
        * kjs/DateMath.h: Added.
        (KJS::):
        * kjs/date_object.cpp:
        (KJS::gmtoffset):
        (KJS::formatTime):
        (KJS::DateInstance::getTime):
        (KJS::DateInstance::getUTCTime):
        (KJS::DateProtoFunc::callAsFunction):
        (KJS::DateObjectImp::construct):
        (KJS::DateObjectFuncImp::callAsFunction):
        (KJS::parseDate):
        * kjs/testkjs.cpp:
        * os-win32/stdint.h:

2006-10-02  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed/landed by Adam.

        Build testkjs on Qt/Linux.

        * CMakeLists.txt:

2006-10-02  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by eseidel.  Landed by eseidel.

        Fix win32 build, which has no inttypes.h

        * wtf/Assertions.h:

2006-10-02  Nikolas Zimmermann <zimmermann@kde.org>

        Reviewed by eseidel & mjs.  Landed by eseidel.

        Fix Qt/Linux build with older gcc 3.3.4.
        http://bugs.webkit.org/show_bug.cgi?id=11116
 
        * kjs/lookup.h: Move cacheGlobalObject into KJS namespace.
        (KJS::cacheGlobalObject): Also remove GCC_ROOT_NS_HACK.
        * wtf/Assertions.h: Include inttypes.h for uintptr_t.

2006-09-28  Steve Falkenburg  <sfalken@apple.com>

        Reviewed by Maciej.
        
        Use $(ConfigSuffix) set via vsprops files to add _debug
        to end of debug filenames.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/debug.vsprops: Added.
        * JavaScriptCore.vcproj/dftables/dftables.vcproj:
        * JavaScriptCore.vcproj/release.vsprops: Added.
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2006-09-28  Darin Adler  <darin@apple.com>

        Reviewed by Alice.

        - support for change that should fix <rdar://problem/4733044>
          REGRESSION: XML iBench shows 10% perf. regression (copying
          strings while decoding)

        * wtf/Vector.h: Changed VectorBuffer so that the general case
        contains an instance of the 0 case, since deriving from it
        was violating the Liskov Substitution Principle.
        (WTF::VectorBuffer::releaseBuffer): Added. Releases the buffer so it can
        be adopted by another data structure that uses the FastMalloc.h allocator.
        Returns 0 if the internal buffer was being used.
        (WTF::Vector::releaseBuffer): Added. Releases the buffer as above or creates
        a new one in the case where the internal buffer was being used.

2006-09-28  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - change garbage collection to happen at increments proportional to number of live objects, not always
        every 1000 allocations

        * kjs/collector.cpp:
        (KJS::Collector::allocate):

2006-09-28  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Mitz.

        - fixed REGRESSION (r16606): javascriptCore Crash on website load
        
        Plus style fixes.
        
            - fixed some possible off-by-one bugs
            - use indexing, not iterators, for Vectors
            - store Vector by pointer instead of by value to avoid blowing out FunctionImp size
        
        * kjs/function.cpp:
        (KJS::FunctionImp::addParameter):
        (KJS::FunctionImp::parameterString):
        (KJS::FunctionImp::processParameters):
        (KJS::FunctionImp::lengthGetter):
        (KJS::FunctionImp::getParameterName):
        * kjs/function.h:

2006-09-27  Steve Falkenburg  <sfalken@apple.com>

        Reviewed by Maciej.
        
        More build tweaks

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/JavaScriptCore/dstroot-to-sdk.cmd: Removed.

2006-09-27  John Sullivan  <sullivan@apple.com>

        * kjs/function.cpp:
        (KJS::FunctionImp::getParameterName):
        removed assertion that displeased gcc 4.0.1 (build 5420):
        ASSERT(static_cast<size_t>(index) == index);

2006-09-27  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by GGaren.

        Cleanup of previous fix which was to address Radar: 4752492

        * kjs/function.cpp:
        (KJS::FunctionImp::addParameter):
        (KJS::FunctionImp::parameterString):
        (KJS::FunctionImp::processParameters):
        (KJS::FunctionImp::lengthGetter):
        (KJS::FunctionImp::getParameterName):
        * kjs/function.h:

2006-09-27  Kevin McCullough  <KMcCullough@apple.com>

        Reviewed by Adele.

        Fixes a GC stack overflow crash.
        The change is to move from a linked list implementation of Parameters to a Vector.
        The problem with the linked list is that each one creates it's own stack frame when being destroyed and in extreme cases this caused the stack to overflow. 

        * kjs/function.cpp:
        (KJS::Parameter::Parameter):
        (KJS::FunctionImp::addParameter):
        (KJS::FunctionImp::parameterString):
        (KJS::FunctionImp::processParameters):
        (KJS::FunctionImp::lengthGetter):
        (KJS::FunctionImp::getParameterName):
        * kjs/function.h:

2006-09-27  Steve Falkenburg  <sfalken@apple.com>

        Fix last path fix.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2006-09-27  Steve Falkenburg  <sfalken@apple.com>

        Set path before build.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2006-09-27  Sean Gies  <seangies@apple.com>

        Reviewed by Adam Roben.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Debug config should link to debug runtime.
        * JavaScriptCore.vcproj/dftables/dftables.vcproj: Debug config should link to debug runtime.

2006-09-27  Don Melton  <gramps@apple.com>

        Reviewed by Adam Roben.

        Changed line ending from DOS to UNIX format so it doesn't die running
        on my machine. ;)

        * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh:

2006-09-23  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Maciej.

        http://bugs.webkit.org/show_bug.cgi?id=10183
        REGRESSION: obfuscated JS decoding breaks because of soft hyphen removal
        (Fanfiction.net author pages not listing stories)

        Rolled out the fix for bug 4139.

        * kjs/lexer.cpp:
        (Lexer::setCode):
        (Lexer::shift):
        * tests/mozilla/ecma/Array/15.4.5.1-1.js:
        * tests/mozilla/expected.html:

2006-09-22  Steve Falkenburg  <sfalken@apple.com>

        Build fix.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2006-09-22  Darin Adler  <darin@apple.com>

        Reviewed by Alice.

        * wtf/Vector.h: Add an append that takes a pointer and length.
        Generalize the existing Vector append to work on vectors with
        any value for inlineCapacity. Change the append algorithm so
        it doesn't check capacity each time through the loop.

2006-09-22  Steve Falkenburg  <sfalken@apple.com>

        Fix release build.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2006-09-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        Updated to include the right path.
        * wtf/FastMalloc.h: #include Platform.h, since we use Platform macros.

=== Safari-521.27 ===

2006-09-20  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Dave Hyatt.

        * wtf/MathExtras.h:
        Get rid of lrint.

2006-09-20  Sean Gies  <seangies@apple.com>

        Reviewed by Steve Falkenburg.

        * wtf/Assertions.cpp: Debug messages should go into debugger console.

2006-09-20  David Hyatt  <hyatt@apple.com>

        Add an implementation of lrint for Win32.

        Reviewed by anders

        * wtf/MathExtras.h:
        (lrint):

2006-09-15  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by Adam.

        http://bugs.webkit.org/show_bug.cgi?id=10864
        Bug 10864: Linux\GDK build fixes

        * JavaScriptCoreSources.bkl:
        * jscore.bkl:

2006-09-15  Adam Roben  <aroben@apple.com>

        Windows build fix.

        * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh:

2006-09-15  Anders Carlsson  <acarlsson@apple.com>

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        Fix the release build.

2006-09-15  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Steve.

        Add JavaScriptCore API to the build.
        * API/JSBase.cpp:
        * API/JSCallbackConstructor.cpp:
        * API/JSCallbackFunction.cpp:
        * API/JSCallbackObject.cpp:
        * API/JSClassRef.cpp:
        * API/JSContextRef.cpp:
        * API/JSObjectRef.cpp:
        * API/JSStringRef.cpp:
        * API/JSValueRef.cpp:
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * os-win32/stdbool.h: Added.

2006-09-12  Steve Falkenburg  <sfalken@apple.com>

        Reviewed by Ada.
        
        Build tweaks (doing JavaScriptCore now since it doesn't have
        dependencies).

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh:
        * JavaScriptCore.vcproj/JavaScriptCore/dstroot-to-sdk.cmd: Added.
        * JavaScriptCore.vcproj/dftables/dftables.vcproj:
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:

2006-09-11  Brady Eidson  <beidson@apple.com>

        Build fix - I think Tim's last checkin wasn't tested on Tiger, possibly.  I simply
        commented out the undefined constants until he can have a chance to make the right call

        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::objcValueTypeForType): Commented out undefined symbols

2006-09-11  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Tim O. and Darin.

        Add support for more method signatures affecting ObjC methods called from JavaScript:
        - Added unsigned types and long long.
        - Allow methods that use const, oneway, bycopy and byref type modifiers.

        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):
        * bindings/objc/objc_utility.h:
        (KJS::Bindings::):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        (KJS::Bindings::convertObjcValueToValue):
        (KJS::Bindings::objcValueTypeForType):

2006-09-05  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Tim O.

        <rdar://problem/4715840> SEL is not char*

        * bindings/objc/objc_class.mm:
        (KJS::Bindings::ObjcClass::methodsNamed): use sel_getName instead of a char* cast.
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::callAsFunction): ditto

2006-09-03  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Tim H.

        http://bugs.webkit.org/show_bug.cgi?id=10693
        Convert JavaScript arrays to AppleScript lists

        * JavaScriptCore.exp: Export ArrayInstance::info and ArrayInstance::getItem().
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (ArrayInstance::getItem): Added a method to access array items from C++.

2006-09-02  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed by Tim H.

        Bug 10454: Unix bakefile fixes
        http://bugs.webkit.org/show_bug.cgi?id=10454

        * JavaScriptCoreSources.bkl:

2006-09-01  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by hyatt.  Landed by eseidel.

        Fix build on Linux.

        * pcre/CMakeLists.txt: Add wtf/ include.

2006-09-01  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed and landed by ap.

        Fix build on Linux (C89 without gcc extensions enabled).

        * pcre/pcre_internal.h: Use C style comments.
        * wtf/Assertions.h: Use C style comments.
        * wtf/Platform.h: Use C style comments.

2006-09-01  Steve Falkenburg  <sfalken@apple.com>

        Fix build.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/dftables/dftables.vcproj:

2006-08-31  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Darin.
        
        Add new portability functions to MathExtras.h and add StringExtras.h which is for
        string portability functions.
        
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * bindings/c/c_instance.cpp:
        * kjs/date_object.cpp:
        * wtf/MathExtras.h:
        (copysign):
        (isfinite):
        * wtf/StringExtras.h: Added.
        (snprintf):
        (strncasecmp):

2006-08-31  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Tim H.
        
        Fix Windows build.
        
        * JavaScriptCore.vcproj/dftables/dftables.vcproj:
        * pcre/pcre_internal.h:

2006-08-31  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Geoff.

        Band-aid fix for PCRE to compile for ppc64 and x86_64 now that
        we use -Wshorten-64-to-32. Adds an INT_CAST macro that ASSERTs
        the value <= INT_MAX.

        I filed <rdar://problem/4712064> to track the need to verify
        PCRE's 64-bit compliance.

        * pcre/pcre_compile.c:
        (complete_callout):
        (compile_branch):
        (compile_regex):
        (pcre_compile2):
        * pcre/pcre_exec.c:
        (match):
        (pcre_exec):
        * pcre/pcre_get.c:
        (pcre_get_substring_list):
        * pcre/pcre_internal.h:
        * pcre/pcre_tables.c:
        * pcre/pcre_try_flipped.c:
        (_pcre_try_flipped):

2006-08-30  Darin Adler  <darin@apple.com>

        Reviewed by Tim Hatcher.

        - add WTF::getPtr, a function template that makes it possible to write
          generic code that gets a raw pointer out of any of our pointer types

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * wtf/GetPtr.h: Added.
        * wtf/ListRefPtr.h: (WTF::getPtr): Added.
        * wtf/OwnArrayPtr.h: (WTF::getPtr): Added.
        * wtf/OwnPtr.h: (WTF::getPtr): Added.
        * wtf/PassRefPtr.h: (WTF::getPtr): Added.
        * wtf/RefPtr.h: (WTF::getPtr): Added.

2006-08-29  waylonis  <waylonis@google.com>

        Reviewed, tweaked by ggaren.

        - Added storage and accessor functions for ExecState as a fix for
          http://bugs.webkit.org/show_bug.cgi?id=10114
        
        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        * kjs/ExecState.h:
        * kjs/context.h:
        (KJS::Context::setExecState):
        (KJS::Context::execState):

2006-08-30  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by Tim H.

        Commit KDE related tweaks, to be able to
        differentiate between a Qt-only or a KDE build.

        * CMakeLists.txt: Install wtf-unity library.
        * wtf/Platform.h: Add define for the KDE platform.

2006-08-28  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        * kjs/list.h: Use explicit in constructor (as appropriate).

2006-08-24  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed, tweaked and landed by ap

        http://bugs.webkit.org/show_bug.cgi?id=10467
        WebKit should have Qt platform support (Part II)

        * CMakeLists.txt: Adjust to Anders' build fixes.
        * wtf/Platform.h: Fix define for the Qt platform (we don't use/need Cairo.)

2006-08-23  David Hyatt  <hyatt@apple.com>

        Fix Platform.h to include #defines for graphics features.

        Reviewed by darin

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * wtf/Platform.h:

2006-08-23  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Darin.

        Make the bindings compile without CoreFoundation.
        
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * bindings/c/c_instance.cpp:
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertUTF8ToUTF16):
        * bindings/npapi.h:
        * bindings/runtime.cpp:
        (KJS::Bindings::Instance::createBindingForLanguageInstance):
        (KJS::Bindings::Instance::createLanguageInstanceForValue):
        * bindings/runtime_root.cpp:
        * bindings/runtime_root.h:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::createLanguageInstanceForValue):
        * kjs/interpreter.h:

2006-08-22  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Darin.

        Move the npruntime code over to using HashMap and the runtime_root code over to using 
        HashMap and HashCountedSet.
        
        * bindings/NP_jsobject.cpp:
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::identifierFromNPIdentifier):
        * bindings/c/c_utility.h:
        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::invoke):
        * bindings/npruntime.cpp:
        (getStringIdentifierMap):
        (getIntIdentifierMap):
        (_NPN_GetStringIdentifier):
        (_NPN_GetIntIdentifier):
        * bindings/runtime_root.cpp:
        (getReferencesByRootMap):
        (getReferencesSet):
        (KJS::Bindings::findReferenceSet):
        (KJS::Bindings::rootForImp):
        (KJS::Bindings::rootForInterpreter):
        (KJS::Bindings::addNativeReference):
        (KJS::Bindings::removeNativeReference):
        (RootObject::removeAllNativeReferences):
        * bindings/runtime_root.h:

2006-08-22  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Geoff.
        
        Switch over the NPAPI and Java bindings to using HashMaps instead of dictionaries.
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/c/c_class.cpp:
        (KJS::Bindings::CClass::CClass):
        (KJS::Bindings::CClass::~CClass):
        (KJS::Bindings::CClass::classForIsA):
        (KJS::Bindings::CClass::methodsNamed):
        (KJS::Bindings::CClass::fieldNamed):
        * bindings/c/c_class.h:
        * bindings/jni/jni_class.cpp:
        (JavaClass::JavaClass):
        (JavaClass::~JavaClass):
        (JavaClass::methodsNamed):
        (JavaClass::fieldNamed):
        * bindings/jni/jni_class.h:
        * bindings/objc/objc_class.h:
        * bindings/objc/objc_class.mm:
        (KJS::Bindings::deleteMethod):
        (KJS::Bindings::deleteField):
        (KJS::Bindings::):
        (KJS::Bindings::ObjcClass::methodsNamed):
        (KJS::Bindings::ObjcClass::fieldNamed):
        * bindings/runtime.cpp:
        * bindings/runtime.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::fieldGetter):
        (RuntimeObjectImp::getOwnPropertySlot):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::canPut):

2006-08-21  Vladimir Olexa  <vladimir.olexa@gmail.com>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=6252
        JavaScript 1.6 Array.lastIndexOf

        Test: fast/js/array-lastIndexOf.html

        * kjs/array_object.cpp:
        (ArrayProtoFunc::callAsFunction): Added a LastIndexOf case.
        * kjs/array_object.h:
        (KJS::ArrayProtoFunc::): Added LastIndexOf to enum.
        * tests/mozilla/expected.html: Two more tests now pass.

2006-08-20  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by Maciej. Landed by rwlbuis.

        Fixes parts of: http://bugs.webkit.org/show_bug.cgi?id=10463
        WebKit should have Qt platform support

        Removing obsolete QConstString/QString constructors in kjs code.

        * kjs/identifier.h:
        * kjs/ustring.h:

2006-08-17  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by Maciej. Landed by rwlbuis.

        Fixes: http://bugs.webkit.org/show_bug.cgi?id=10463
        WTF Changes needed for Qt platform code.

        * wtf/Platform.h:
        * wtf/unicode/UnicodeDecomposition.h: Added.
        (WTF::Unicode::):
        * wtf/unicode/UnicodeDirection.h: Added.
        (WTF::Unicode::):
        * wtf/unicode/qt4/UnicodeQt4.cpp: Added.
        (WTF::Unicode::direction):
        (WTF::Unicode::category):
        (WTF::Unicode::decomposition):
        * wtf/unicode/qt4/UnicodeQt4.h:
        (WTF::Unicode::toLower):
        (WTF::Unicode::toUpper):
        (WTF::Unicode::isPrintableChar):
        (WTF::Unicode::isSpace):
        (WTF::Unicode::isPunct):
        (WTF::Unicode::isDigit):
        (WTF::Unicode::mirroredChar):
        (WTF::Unicode::compare):

2006-08-17  Nikolas Zimmermann  <zimmermann@kde.org>

        Reviewed by Eric. Landed by rwlbuis.

        Fixes: http://bugs.webkit.org/show_bug.cgi?id=10464
        Offer a cmake build system for Qt platform.

        * CMakeLists.txt: Added.
        * pcre/CMakeLists.txt: Added.

2006-08-17  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Maciej.

        * bindings/npapi.h:
        Fix ifdef.

2006-08-15  Steve Falkenburg  <sfalken@apple.com>

        Reviewed by mjs.
        
        Build fix.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * wtf/Assertions.h:

2006-08-15  Mark Rowe  <opendarwin.org@bdash.net.nz>

        Reviewed by Tim H.

        Build fix:  DWARF and -gfull are incompatible with symbol separation.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-08-15  Mark Rowe  <opendarwin.org@bdash.net.nz>

        Reviewed by Tim H.

        http://bugs.webkit.org/show_bug.cgi?id=10394
        Bug 10394: WebKit Release and Production configurations should enable dead code stripping

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-08-15  Mark Rowe  <opendarwin.org@bdash.net.nz>

        Reviewed by Tim H.

        http://bugs.webkit.org/show_bug.cgi?id=10384
        Bug 10384: Switch to DWARF for Release configuration

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-08-13  Maks Orlovich  <maksim@kde.org>

        Reviewed (and tweaked a little) by Maciej.
        
        - shrank the size of JSObject by 8 bytes and made the corresponding reduction to the cell size, resulting
        in a 1.2% speed improvement on JS iBench (and probably overall memory savings).

        This was done by removing _scope and _internalValue data members
        from JSObject and moving them only to the subclasses that actually
        make use of them.
        
        * kjs/object.cpp: 
        (KJS::JSObject::mark): No need to mark scope or internal value here.
        * kjs/object.h:
        (KJS::JSObject::JSObject): Don't initialize them.
        * kjs/JSWrapperObject.cpp: Added. New base class for object types that
        wrap primitive values (Number, String, Boolean, Date).
        (KJS::JSWrapperObject::mark): 
        * kjs/JSWrapperObject.h: Added.
        (KJS::JSWrapperObject::JSWrapperObject):
        (KJS::JSWrapperObject::internalValue):
        (KJS::JSWrapperObject::setInternalValue):
        * kjs/array_object.cpp:
        (ArrayPrototype::ArrayPrototype): Don't set useless internal value.
        * kjs/bool_object.cpp:
        (BooleanInstance::BooleanInstance): Inherit from JSWrapperObject.
        (BooleanProtoFunc::callAsFunction): Fixed to account for fact that not all
        JSObjects have an internal value.
        (BooleanObjectImp::construct): ditto.
        * kjs/bool_object.h:
        * kjs/collector.cpp: Lowered cell size to 48.
        (KJS::Collector::allocate): meaningless whitespace change
        * kjs/date_object.cpp:
        (KJS::DateInstance::DateInstance): Inherit from JSWrapperObject.
        (KJS::DateProtoFunc::callAsFunction): adjusted for move of internalValue
        (KJS::DateObjectImp::construct): ditto
        * kjs/date_object.h:
        * kjs/error_object.cpp:
        (ErrorPrototype::ErrorPrototype): don't set internal value
        * kjs/function.cpp: move _scope and related handling here
        (KJS::FunctionImp::mark): mark scope
        * kjs/function.h:
        (KJS::FunctionImp::scope): moved here from JSObject
        (KJS::FunctionImp::setScope): ditto
        * kjs/number_object.cpp:
        (NumberInstance::NumberInstance): inherit from JSWrapperObject
        (NumberProtoFunc::callAsFunction): adjusted
        (NumberObjectImp::construct): adjusted
        * kjs/number_object.h: shring RegExp-related objects a little
        * kjs/regexp_object.cpp:
        (RegExpPrototype::RegExpPrototype): Adjust for size tweaks
        (RegExpObjectImp::RegExpObjectImp): ditto
        * kjs/regexp_object.h:
        * kjs/string_object.cpp:
        (StringInstance::StringInstance): inherit from JSWrapperObject
        (StringProtoFunc::callAsFunction): adjusted
        * kjs/string_object.h:
        * JavaScriptCore.exp: Exported new methods as needed.
        * JavaScriptCore.xcodeproj/project.pbxproj: Added new files to build.

2006-08-04  Brady Eidson  <beidson@apple.com>

        Reviewed by Geoff's rubber stamp

        Fix a build break on Intel hardware causes by adapting stricter
        compiler warnings (-Wshorten-64-to-32)

        * API/testapi.c:
        (assertEqualsAsNumber): manually cast some doubles to floats
        (main): ditto

2006-08-04  Sam Weinig  <sam.weinig@gmail.com>

        Reviewed by Darin.

        - patch for http://bugs.webkit.org/show_bug.cgi?id=10192
          Make WebCore (and friends) compile with -Wshorten-64-to-32

          * Adds -Wshorten-64-to-32 flag to Xcode project.
          * Adds explicit casts where OK.

        * API/JSNodeList.c:
        (JSNodeList_item):
        (JSNodeList_getProperty):
        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-08-04  Adam Roben  <aroben@apple.com>

        Reviewed by Anders.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Convert
        spaces to tabs

2006-08-03  Sam Weinig  <sam.weinig@gmail.com>

        Reviewed by Darin.

        - patch for http://bugs.webkit.org/show_bug.cgi?id=10176
          Make WebCore compile with -Wundef

          * Adds -Wundef flag to Xcode project
          * Converts #ifs to #ifdef and #ifndefs where needed.
          * Added #define YYMAXDEPTH 10000 in kjs/grammar.y
            to fix a warning from within Bison.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::getSlot):
        (JavaJSObject::setSlot):
        * bindings/npapi.h:
        * bindings/objc/objc_class.mm:
        (KJS::Bindings::ObjcClass::methodsNamed):
        (KJS::Bindings::ObjcClass::fieldNamed):
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):
        * bindings/objc/objc_runtime.mm:
        (ObjcMethod::getMethodSignature):
        (ObjcField::name):
        (ObjcField::type):
        * kjs/grammar.y:
        * kjs/identifier.h:

2006-08-03  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by John Sullivan.

       * wtf/HashSet.h:
        (WTF::::operator):
        Return *this in operator=

2006-08-03  Adam Roben  <aroben@apple.com>

        Reviewed by Anders.

        - Fixed Windows build

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * wtf/MathExtras.h: Implement inline versions of these functions
        (nextafter):
        (nextafterf):

2006-08-02  Adam Roben  <aroben@apple.com>

        Reviewed by Darin.

        - Fixed build

        * kjs/date_object.cpp:
        (KJS::formatTime):

2006-07-29  Darin Adler  <darin@apple.com>

        - Removed tabs from these source files that still had them.
          We don't use them; that way source files look fine in editors
          that have tabs set to 8 spaces or to 4 spaces.
        - Removed allow-tabs Subversion property from the files too.

        * bindings/NP_jsobject.cpp:
        * bindings/c/c_utility.cpp:
        * bindings/jni/jni_runtime.cpp:
        * bindings/jni/jni_utility.cpp:
        * bindings/objc/objc_utility.mm:
        * bindings/runtime.cpp:
        * bindings/runtime_method.cpp:
        * bindings/testbindings.cpp:
        * bindings/testbindings.mm:
        * kjs/date_object.cpp:
        * kjs/function.cpp:
        * kjs/list.cpp:
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/string_object.cpp:
        * kjs/ustring.cpp:

2006-07-29  Darin Adler  <darin@apple.com>

        * tests/mozilla/expected.html: Update test results now that regress-185165.js
        is succeeding. I suspect Anders fix for bug 4620655 is the reason.

2006-07-29  Sam Weinig  <sam.weinig@gmail.com>

        Reviewed by Darin.

        - patch for http://bugs.webkit.org/show_bug.cgi?id=10080
          Adopt pedantic changes from the Unity project to improve 
          cross-compiler compatibility

          Changes include:
          * Removing trailing semicolon from namespace braces.
          * Removing trailing comma from last enum declaration.
          * Updating to match style guidelines.
          * Adding missing newline to the end of the file.
          * Turning on gcc warning for missing newline at the end of a source file
            (GCC_WARN_ABOUT_MISSING_NEWLINE in Xcode, -Wnewline in gcc).
          * Alphabetical sorting of Xcode source list files. 
          * Replace use of non-portable variable-size array with Vector.
          * Use C-style comments instead of C++ comments in files that might
            be included by either C or C++ files.

        * API/JSCallbackConstructor.cpp:
        (KJS::JSCallbackConstructor::construct):
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::callAsFunction):
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::construct):
        (KJS::JSCallbackObject::callAsFunction):
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * JavaScriptCorePrefix.h:
        * bindings/jni/jni_class.cpp:
        (JavaClass::fieldNamed):
        * bindings/jni/jni_class.h:
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::JavaInstance):
        (JavaInstance::valueOf):
        * bindings/jni/jni_objc.mm:
        (KJS::Bindings::dispatchJNICall):
        * bindings/jni/jni_runtime.cpp:
        (JavaParameter::JavaParameter):
        (JavaArray::JavaArray):
        * bindings/jni/jni_runtime.h:
        * bindings/jni/jni_utility.h:
        * bindings/objc/objc_instance.h:
        * bindings/runtime_array.h:
        * kjs/collector.h:
        * kjs/config.h:
        * kjs/ustring.cpp:
        * wtf/Platform.h:

2006-07-29  Mike Emmel  <mike.emmel@gmail.com>

        Reviewed by Darin.

        - fixes for Linux build

        * JavaScriptCoreSources.bkl: Added new files to build, kjs/PropertyNameArray.cpp
        and kjs/testkjs.cpp, and removed old files.

2006-07-24  Dan Waylonis  <waylonis@google.com>

        Reviewed and tweaked a bit by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=9902
          jsNull and NSNull not properly converted between JS and ObjC

        * bindings/objc/objc_utility.mm: (KJS::Bindings::convertObjcValueToValue):
        Added case for converting NSNull to jsNull.

2006-07-24  Rob Buis  <buis@kde.org>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=4258
        Date().toString() only includes GMT offset, not timezone string

        Use the info in tm_zone to append timezone abbreviation
        to Date().toString().

        * kjs/date_object.cpp:
        (KJS::formatTime):

2006-07-24  Rob Buis  <buis@kde.org>

        Reviewed by Darin.

        http://bugs.webkit.org/show_bug.cgi?id=5257
        setYear() does not match FireFox/IE behavior

        Make sure the right values end up in tm_year.

        * kjs/date_object.cpp:
        (KJS::formatTime):

2006-07-23  Mark Rowe  <opendarwin.org@bdash.net.nz>

        Reviewed by Maciej.

        Bug 9686: [Drosera] Need the ability to break into Drosera on Javascript exceptions
        http://bugs.webkit.org/show_bug.cgi?id=9686

        JavaScriptCore portion of the fix.

        * JavaScriptCore.exp: Update symbol for change in argument type.
        * kjs/debugger.cpp:
        (Debugger::detach): Clear map of recent exceptions.
        (Debugger::hasHandledException): Track the most recent exception
        thrown by an interpreter.
        (Debugger::exception): Change exception argument to a JSValue.
        * kjs/debugger.h:
        * kjs/nodes.cpp:
        (Node::debugExceptionIfNeeded): Notify the debugger of an exception
        if it hasn't seen it before.
        (ThrowNode::execute): Notify the debugger that an exception is being thrown.
        * kjs/nodes.h:

    2006-07-23  Geoffrey Garen  <ggaren@apple.com>

        Patch by Eric Albert, reviewed by Darin and me.
        
        - Fixed <rdar://problem/4645931> JavaScriptCore stack-scanning code 
        crashes (Collector::markStackObjectsConservatively)
        
        * bindings/jni/jni_jsobject.cpp: On 64bit systems, jint is a long, not an
        int.
        (JavaJSObject::getSlot):
        (JavaJSObject::setSlot):
        * kjs/collector.cpp:
        (KJS::Collector::markCurrentThreadConservatively): Use a pointer instead of
        an int as 'dummy,' because on LP64 systems, an int is not pointer-aligned,
        and we want to scan the stack for pointers.
        * JavaScriptCore.xcodeproj/project.pbxproj: After a tense cease-fire, the 
        XCode war has started up again!

=== Safari-521.20 ===

2006-07-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        <rdar://problem/4507265> REGRESSION: overlays don't work on HousingMaps.com (Google Maps-based site)

        - Added support for strings that masquerade as undefined. Currently used
        by WebCore to implement undetectable style.filter.
        
        The name is a little long, but it's only used in one line of code, so I
        thought clarity should win over brevity.

        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/object.h:
        * kjs/string_object.h:
        (KJS::StringInstanceThatMasqueradesAsUndefined::StringInstanceThatMasqueradesAsUndefined):
        (KJS::StringInstanceThatMasqueradesAsUndefined::masqueradeAsUndefined):
        (KJS::StringInstanceThatMasqueradesAsUndefined::toBoolean):

=== Safari-521.19 ===

2006-07-20  Steve Falkenburg  <sfalken@apple.com>

        Fix the build

        * kjs/function.cpp:
        (KJS::escapeStringForPrettyPrinting):

2006-07-19  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Darin.

        <rdar://problem/4620655> REGRESSION(10.4.7-10.5): preview button for a blogger.com post doesn't work
        
        * kjs/nodes2string.cpp:
        (StringNode::streamTo):
        Return the escaped string.
        
        (RegExpNode::streamTo):
        Use the correct syntax.
        
        * kjs/function.cpp:
        (KJS::escapeStringForPrettyPrinting):
        * kjs/function.h:
        Add escape function which escapes a string for pretty-printing so it can be parsed again.
        
        * wtf/unicode/icu/UnicodeIcu.h:
        (WTF::Unicode::isPrintableChar):
        New function.

2006-07-18  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Adele Peterson.
        
        <rdar://problem/4589530> REGRESSION: null character in JS string causes parse error (works in Tiger and in other browsers)

        * kjs/lexer.cpp:
        (Lexer::shift):
        (Lexer::lex):
        (Lexer::record16):
        (Lexer::scanRegExp):
        * kjs/lexer.h:

2006-07-18  Tim Omernick  <timo@apple.com>

        Reviewed by Tim Hatcher.

        Removed a misleading comment; we recently added support for the NPNVPluginElementNPObject
        variable.

        * bindings/npapi.h:

=== Safari-521.18 ===

2006-07-18  Timothy Hatcher  <timothy@apple.com>

        Made the following headers public:

        * JavaScriptCore.h
        * JSBase.h
        * JSContextRef.h
        * JSObjectRef.h
        * JSStringRef.h
        * JSValueRef.h

        * JavaScriptCore.xcodeproj/project.pbxproj:

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

        Reviewed by Maciej.
        
        - Added automatic prototype creation for classes.
        
        A class stores a weak reference to a prototype, which is cleared when
        the prototype is garbage collected, to avoid a reference cycle.
        
        We now have an attributes field in JSClassDefinition, that currently is
        used only to override automatic prototype creation when you want to manage your
        own prototypes, but can be extended in the future for other nefarious purposes.
        
        Similarly, we have JSObjectMake and JSObjectMakeWithPrototype, the latter
        allowing you to manage your own prototypes.
        
        JSObjectMakeConstructor is more interesting now, able to make a constructor
        on your behalf if you just give it a class.
        
        - Removed bogus old code from minidom.js.
        
        - Tweaked the headerdocs.
        
        - Added more GC testing, which caught some leaks, and tested more funny 
        edge cases in lookup, which caught a lookup bug. Removed some testing 
        we used to do with MyObject because it was redundant with the new, cool 
        stuff.
        
        While fixing the lookup bug I retracted this change:
        
            "If a static setProperty callback returns 'false', to indicate that the
            property was not set, we no longer forward the set request up the class
            chain, because that's almost certainly not what the programmer expected."

        Returning false when setting a static property is a little silly, but you can see
        it being useful when shadowing a base class's static properties, and, regardless
        of usefullness, this is the defined behavior of the setProperty callback.
        
        - Plus a little ASCII art, for the kids.

2006-07-17  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Maciej.

        <rdar://problem/4634874> WebScriptObject and WebUndefined are no longer defined by WebKit

        Moves WebScriptObject and WebUndefined up to WebCore.
        This change does create an upwards-dependancy on WebScriptObject existing
        in the loaded process, but this code path in JavaScriptCore does not get used
        unless it is through WebKit/WebCore. Moving all of the binding code out of
        JavaScriptCore might make sense in the future.

        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/objc/WebScriptObject.h: Replaced.
        * bindings/objc/WebScriptObject.mm: Removed.
        * bindings/objc/WebScriptObjectPrivate.h: Removed.
        * bindings/objc/objc_class.h:
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::~ObjcInstance):
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (convertValueToObjcObject):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        (KJS::Bindings::convertObjcValueToValue):
        (KJS::Bindings::createObjcInstanceForValue):

2006-07-17  Darin Adler  <darin@apple.com>

        * API/JSBase.h: Fix comment formatting where things used to be lined up but
        are now ragged. Got rid of spaces that attempted to line things up.
        * API/JSObjectRef.h: Ditto. Also add missing periods for a couple of comments.

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

        Reviewed by Maciej.
        
        - Removed the exception parameter from the initialize callback and, by extension,
        JSObjectMake. We have never had a need for exceptions when iniitializing,
        so the parameter seemed likely to "get in the way." 
        
        Also, an exception in JavaScript is thrown in response to input -- 
        "invalid URL", "index not a number", etc., so it's the job of the 
        constructor function, not the initialize method, to throw.
        
        If initialize *really* wants to throw, it can communicate the throw to
        the constructor through the constructed object's private data (e.g., set
        it to NULL, signaling to the consntructor that initialization failed.)
        
        - Added JSObjectMakeWithData, which enables a constructor to set private
        data on an object *before* it has been initialized. That way, the initialize
        methods can properly operate on the data. 

        * API/JSNode.c: Moved ref into the initialize method, for better encapsulation,
        now that it's possible.
        * API/JSNodeList.c: ditto
        * API/minidom.c:
        (main): Do more aggressive garbage collection to test ref/deref and 
        initialize/finalize.
        * API/minidom.js: store childNodes in a temporary so it doesn't get re-created
        like a thousand times. This makes debugging ref/deref easier

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

        Reviewed by Maciej.
        
        - Changed the initialize callback to run from least derived class (parent
        class) to most derived class. This enables C++ style initialization,
        and derived class overriding of member data.
        
        - Added excpetion propopgation to JSObjectMake, to support initialize
        exceptions, and generally round out our policy of making function
        signatures as long as possible.

        * API/JSCallbackObject.h: Use ExecState instead of ContextRef, cuz we're
        in C++ land now.

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

        Reviewed by Maciej.
        
        - Changed JSObjectMakeConstructor to JSObjectMakeConstructorWithCallback,
        to match JSObjectMakeFunctionWithCallback.
        
        - Added prototype parameter, so the generated constructor
        automatically works with hasInstance / instanceof
        
        - Moved hasInstance implementation from InternalFunctionImp to JSObject
        so that subclasses can inherit it without inheriting function-related baggage.
        More refactoring here would be good, but this seems like a good short-term
        solution.

        (KJS::JSCallbackFunction::implementsHasInstance): override and return false,
        because callback functions aren't constructors.

2006-07-17  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - add a JSContextRef parameter to all JSValueRef, JSObjectRef, and JSContextRef operations;
        except JSObject{Get,Set}PrivateData which can be assumed to be simple pure accessors.
        
        Also renamed the parameter "context" to "ctx" because it makes the code read better with this pervasive
        but usually uninteresting parameter.

        * API/JSBase.cpp:
        (JSEvaluateScript):
        (JSCheckScriptSyntax):
        (JSGarbageCollect):
        * API/JSBase.h:
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::JSCallbackObject):
        (KJS::JSCallbackObject::init):
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::deleteProperty):
        (KJS::JSCallbackObject::toNumber):
        (KJS::JSCallbackObject::toString):
        * API/JSContextRef.cpp:
        (JSGlobalContextCreate):
        (JSGlobalContextRetain):
        (JSGlobalContextRelease):
        (JSContextGetGlobalObject):
        * API/JSContextRef.h:
        * API/JSNode.c:
        (JSNodePrototype_appendChild):
        (JSNodePrototype_removeChild):
        (JSNodePrototype_replaceChild):
        (JSNode_getNodeType):
        (JSNode_getFirstChild):
        (JSNode_prototype):
        * API/JSNodeList.c:
        (JSNodeListPrototype_item):
        (JSNodeList_length):
        (JSNodeList_getProperty):
        (JSNodeList_prototype):
        * API/JSObjectRef.cpp:
        (JSObjectMake):
        (JSObjectMakeFunctionWithCallback):
        (JSObjectMakeConstructor):
        (JSObjectMakeFunction):
        (JSObjectGetPrototype):
        (JSObjectSetPrototype):
        (JSObjectHasProperty):
        (JSObjectGetProperty):
        (JSObjectSetProperty):
        (JSObjectGetPropertyAtIndex):
        (JSObjectSetPropertyAtIndex):
        (JSObjectDeleteProperty):
        (JSObjectIsFunction):
        (JSObjectCallAsFunction):
        (JSObjectIsConstructor):
        (JSObjectCallAsConstructor):
        (JSObjectCopyPropertyNames):
        * API/JSObjectRef.h:
        * API/JSStringRef.cpp:
        * API/JSValueRef.cpp:
        (JSValueGetType):
        (JSValueIsUndefined):
        (JSValueIsNull):
        (JSValueIsBoolean):
        (JSValueIsNumber):
        (JSValueIsString):
        (JSValueIsObject):
        (JSValueIsObjectOfClass):
        (JSValueIsEqual):
        (JSValueIsStrictEqual):
        (JSValueIsInstanceOfConstructor):
        (JSValueMakeUndefined):
        (JSValueMakeNull):
        (JSValueMakeBoolean):
        (JSValueMakeNumber):
        (JSValueMakeString):
        (JSValueToBoolean):
        (JSValueToNumber):
        (JSValueToStringCopy):
        (JSValueToObject):
        (JSValueProtect):
        (JSValueUnprotect):
        * API/JSValueRef.h:
        * API/minidom.c:
        (print):
        * API/testapi.c:
        (MyObject_getProperty):
        (MyObject_deleteProperty):
        (MyObject_callAsFunction):
        (MyObject_callAsConstructor):
        (MyObject_convertToType):
        (print_callAsFunction):
        (main):

2006-07-16  Geoffrey Garen  <ggaren@apple.com>

        Approved by Maciej, RS by Beth.
        
        JSObjectMakeFunction -> JSObjectMakeFunctionWithCallback
        JSObjectMakeFunctionWithBody -> JSObjectMakeFunction
        
        because the latter is more common, and more fundamental, than the former.

        * API/APICast.h:
        (toJS):
        * API/JSBase.h:
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::deleteProperty):
        (KJS::JSCallbackObject::getPropertyNames):
        (KJS::JSCallbackObject::staticValueGetter):
        (KJS::JSCallbackObject::staticFunctionGetter):
        * API/JSClassRef.cpp:
        (OpaqueJSClass::OpaqueJSClass):
        (OpaqueJSClass::~OpaqueJSClass):
        * API/JSClassRef.h:
        * API/JSObjectRef.cpp:
        (JSClassCreate):
        (JSObjectMakeFunctionWithCallback):
        (JSObjectMakeFunction):
        (OpaqueJSPropertyNameArray::OpaqueJSPropertyNameArray):
        (JSObjectCopyPropertyNames):
        * API/JSObjectRef.h:
        * API/minidom.c:
        (main):
        * API/testapi.c:
        (main):
        * ChangeLog:
        * JavaScriptCore.exp:

2006-07-16  Geoffrey Garen  <ggaren@apple.com>

        Laughed at by Beth.
        
        Replace __JS with OpaqueJS because the former, while used by CF, is
        a prefix that's triply-reserved by the compiler. (_* is reserved in global 
        names, _[A-Z] is reserved in all names, and __ is reserved in all names 
        in C++.)
        
        Opaque is an alternative used by other Mac OS X framewokrs.

        * API/APICast.h:
        (toJS):
        * API/JSBase.h:
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::deleteProperty):
        (KJS::JSCallbackObject::getPropertyNames):
        (KJS::JSCallbackObject::staticValueGetter):
        (KJS::JSCallbackObject::staticFunctionGetter):
        * API/JSClassRef.cpp:
        (OpaqueJSClass::OpaqueJSClass):
        (OpaqueJSClass::~OpaqueJSClass):
        * API/JSClassRef.h:
        * API/JSObjectRef.cpp:
        (JSClassCreate):
        (OpaqueJSPropertyNameArray::OpaqueJSPropertyNameArray):
        (JSObjectCopyPropertyNames):

2006-07-16  Darin Adler  <darin@apple.com>

        - try to fix Windows build

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        Added some recently added files, removed some recently removed.

2006-07-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - Change getProperty* to return undefined, rather than NULL, for missing
        properties, since that's what the spec says. Also added exception out
        parameters to the *Index functions, because they can call through to the
        regular functions, which can throw for custom objects.

        * API/JSObjectRef.cpp:
        (JSObjectGetProperty):
        (JSObjectGetPropertyAtIndex):
        (JSObjectSetPropertyAtIndex):
        * API/JSObjectRef.h:
        * API/testapi.c:
        (main):

2006-07-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - Properly document and handle NULL callbacks for static properties. We
        throw an exception in any case other than a ReadOnly property with a NULL
        setProperty callback, because a NULL callback almost certainly indicates 
        a programming error. Also throw an exception if hasProperty returns true
        for a property that getProperty can't get.
        
        - If a static setProperty callback returns 'false', to indicate that the
        property was not set, we no longer forward the set request up the class
        chain, because that's almost certainly not what the programmer expected.

        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::staticValueGetter):
        (KJS::JSCallbackObject::staticFunctionGetter):
        (KJS::JSCallbackObject::callbackGetter):
        * API/JSObjectRef.h:
        * API/minidom.js:
        * API/testapi.c:
        (MyObject_hasProperty):
        * API/testapi.js:

2006-07-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - Added names to functions.
        
        - Removed GetPrivate/SetPrivate from callbackFunctions and callbackConstructors.
        The private data idiom is that a JS object stores its native implementation
        as private data. For functions and constructors, the native implementation is nothing
        more than the callback they already store, so supporting private data, too,
        confuses the idiom. If you *really* want, you can still create a custom 
        function with private data.

        * API/JSCallbackConstructor.cpp:
        * API/JSCallbackConstructor.h:
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::JSCallbackFunction):
        * API/JSCallbackFunction.h:
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::staticFunctionGetter):
        * API/JSObjectRef.cpp:
        (JSObjectMakeFunction):
        (JSObjectMakeFunctionWithBody):
        (JSObjectGetPrivate):
        (JSObjectSetPrivate):
        * API/JSObjectRef.h:
        * API/minidom.c:
        (main):
        * API/testapi.c:
        (main):

2006-07-15  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - switch property lists to be vector+set of Identifiers instead of list of References
        
        This has the following benefits:
        
        - no duplicates in property lists
        - simplifies API calls
        - probably more efficient, since linked list is gone
        - entirely removed Reference, ReferenceList and ProtectedReference types from the API

        * kjs/PropertyNameArray.cpp: Added.
        (KJS::PropertyNameArray::add): Check set, if not already there, add to
        vector.
        * kjs/PropertyNameArray.h: Added.
        (KJS::PropertyNameArray::PropertyNameArray): Newly added type, combines
        a set and a vector to make a unique but ordered list of identifiers.
        (KJS::PropertyNameArray::begin): ditto
        (KJS::PropertyNameArray::end): ditto
        (KJS::PropertyNameArray::size): ditto
        (KJS::PropertyNameArray::operator[]): ditto
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (ArrayInstance::getPropertyNames): renamed from getPropertyList, updated
        for PropertyNameArray
        (ArrayInstance::setLength): updated for PropertyNameArray
        (ArrayInstance::pushUndefinedObjectsToEnd): ditto
        * kjs/nodes.cpp:
        (ForInNode::execute): updated for PropertyNameArray
        * kjs/nodes.h:
        * kjs/object.cpp:
        (KJS::JSObject::getPropertyNames): renamed from getPropertyList, updated
        for PropertyNameArray
        * kjs/object.h:
        * kjs/property_map.cpp:
        (KJS::PropertyMap::getEnumerablePropertyNames): updated for PropertyNameArray
        (KJS::PropertyMap::getSparseArrayPropertyNames): ditto
        * kjs/property_map.h:
        * kjs/protected_reference.h: Removed.
        * kjs/reference.cpp: Removed.
        * kjs/reference.h: Removed.
        * kjs/reference_list.cpp: Removed.
        * kjs/reference_list.h: Removed.
        * kjs/scope_chain.cpp:
        (KJS::ScopeChain::print): Use PropertyNamesArray instead of ReferenceList.
        * kjs/string_object.cpp:
        (StringInstance::getPropertyNames): Updated for new approach.
        * kjs/string_object.h:
        * kjs/ustring.h:
        * API/APICast.h:
        (toJS): Added overload for PropertyNameAccumulatorRef / PropertyNameArray*
        (toRef): ditto
        * API/JSBase.h:
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::getPropertyNames): Fixed for new API.
        * API/JSCallbackObject.h:
        * API/JSObjectRef.cpp:
        (__JSPropertyNameArray::__JSPropertyNameArray): Type used for a publicly vended
        JSPropertyNameArrayRef.
        (JSObjectCopyPropertyNames): New API call - renamed / refactored from 
        JSObjectCreatePropertyList
        (JSPropertyNameArrayRetain): new retain call for JSPropertyNameArray.
        (JSPropertyNameArrayRelease): new release call for - " -.
        (JSPropertyNameArrayGetCount): Instead of having to use a stateful enumerator you
        can now get the count and items in any order.
        (JSPropertyNameArrayGetNameAtIndex): See above.
        (JSPropertyNameAccumulatorAddName): What you add properties to is now an opaque 
        accumulator object.
        * API/JSObjectRef.h: Prototyped new functions, removed old ones
        * JavaScriptCore.exp: Updated exported symbols.
        * JavaScriptCore.xcodeproj/project.pbxproj: Added new files, removed old.
        * API/testapi.c:
        (MyObject_getPropertyNames): Renamed / fixed callback to fit new paradigm.
        (main): Updated for new API.

2006-07-15  Darin Adler  <darin@apple.com>

        - oops, missed a few more arrays that had to be const

        * API/JSNode.c:
        (JSNodePrototype_appendChild): Added const.
        (JSNodePrototype_removeChild): Ditto.
        (JSNodePrototype_replaceChild): Ditto.
        (JSNode_construct): Ditto.
        * API/JSNodeList.c:
        (JSNodeListPrototype_item): Ditto.
        * API/JSObjectRef.cpp:
        (JSObjectMakeFunctionWithBody): Ditto.
        (JSObjectCallAsFunction): Ditto.
        (JSObjectCallAsConstructor): Ditto.
        * API/minidom.c:
        (print): Ditto.
        * API/testapi.c:
        (MyObject_callAsFunction): Ditto.
        (MyObject_callAsConstructor): Ditto.
        (print_callAsFunction): Ditto.
        (myConstructor_callAsConstructor): Ditto.

2006-07-15  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        * API/JSNode.h: Made an array parameter const.
        * API/JSObjectRef.h: Made array parameters const. Fixed a comment.

2006-07-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - JSObjectMakeFunctionWithBody includes a function name and named parameters now.

        * API/JSObjectRef.cpp:
        (JSObjectMakeFunctionWithBody):
        * API/JSObjectRef.h:
        * API/testapi.c:
        (assertEqualsAsUTF8String): More informative failure reporting.
        (main): Test more function cases.

2006-07-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.

        - Moved the arguments passed to JSClassCreate into a single structure,
        called JSClassDefinition. This will enable easier structure 
        migration/versioning in the future, if necessary.
        
        - Added support for class names.
        
        - kJSClassDefinitionNull replaces kJSObjectCallbacksNone.
        
        - JSClass is becoming a fairly complex struct, so I migrated all of its
        implementation other than reference counting to the sruct.
        
        - Also moved JSClass* functions in the API to JSObjectRef.cpp, since they're
        declared in JSObjectRef.h
        
        - Also added some more informative explanation to the class structure doc.
        
2006-07-15  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix http://bugs.webkit.org/show_bug.cgi?id=8395
          <rdar://problem/4613467>
          REGRESSION: RegEx seems broken for hex escaped non breaking space

        Test: fast/js/regexp-extended-characters-more.html

        * pcre/pcre_exec.c:
        (match): Got rid of utf16Length local variable to guarantee there's no
        extra stack usage in recursive calls. Fixed two places in the PCRE_UTF16
        code that were using the length variable, which is the UTF-8 length of
        a character in the pattern, to move in the UTF-16 subject string. Instead
        they hardcode lengths of 1 and 2 since the code already handles BMP
        characters and surrogate pairs separately. Also fixed some DPRINTF so
        I could compile with DEBUG on.
        (pcre_exec): Changed a place that was checking for multibyte characters
        in the subject string to use ISMIDCHAR. Instead it was using hardcoded
        logic that was right for UTF-8 but wrong for UTF-16.

        * pcre/pcre_compile.c: (pcre_compile2): Fixed a DPRINTF so I could compile
        with DEBUG on.

2006-07-14  Geoffrey Garen  <ggaren@apple.com>

        RS by Maciej.
        
        Global replace in the API of argc/argv with argumentCount/arguments.

2006-07-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - Finalized exception handling in the API.
        
        setProperty can throw because it throws for built-in arrays. getProperty
        and deleteProperty can throw because setProperty can throw and we want
        to be consistent, and also because they seem like "actions." callAsFunction,
        callAsConstructor, and hasInstance can throw, because they caan throw for
        all built-ins.
        
        toBoolean can't throw because it's defined that way in the spec.
        
        - Documented that toBoolean and toObject can't be overridden by custom 
        objects because they're defined that way in the spec.

=== Safari-521.17 ===

2006-07-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - Implemented ref-counting of JSContexts by splitting into two datatypes:
        JSGlobalContext, which you can create/retain/release, and JSContext, which
        you can't.
        
        Internally, you retain a JSGlobalContext/ExecState by retaining its
        interpreter, which, in the case of a global ExecState, owns it.
        
        - Also made ~Interpreter() protected to catch places where Interpreter
        is manually deleted. (Can't make it private because some crazy fool
        decided it would be a good idea to subclass Interpreter in other frameworks.
        I pity da fool.)

        * API/APICast.h: 
        (toJS): Added cast for new JSGlobalContext
        * API/JSStringRef.h: Changed vague "you must" language to more specific
        (but, ultimately, equally vague) "behavior is undefined if you don't" 
        language.
        (KJS::Interpreter::Interpreter): Factored more common initialization into
        init()
        * kjs/interpreter.h:
        (KJS::Interpreter::ref): new
        (KJS::Interpreter::deref): new
        (KJS::Interpreter::refCount): new
        * kjs/testkjs.cpp: 
        (doIt): Ref-count the interpreter.

2006-07-14  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - removed bool return value from JSObjectSetProperty, since it is inefficient and
        also doesn't work quite right
        - added JSObjectGetPropertyAtIndex and JSObjectSetPropertyAtIndex

        * API/JSObjectRef.cpp:
        (JSObjectSetProperty): Removed return value and canPut stuff.
        (JSObjectGetPropertyAtIndex): Added.
        (JSObjectSetPropertyAtIndex): Added.
        * API/JSObjectRef.h: Prototyped and documented new functions.

2006-07-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth.
        
        Moved JSCheckScriptSyntax, JSEvaluateScript, and JSGarbageCollect into
        JSBase.h/.cpp. They don't belong in the value-specific or context-specific 
        files because they're not part of the value or context implementations.

        * API/JSBase.h:
        * API/JSContextRef.cpp:
        (JSContextGetGlobalObject):
        * API/JSContextRef.h:
        * API/JSValueRef.cpp:
        (JSValueUnprotect):
        * API/JSValueRef.h:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-07-13  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Maciej.

        Moved JavaScriptCore to be a public framework.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-07-13  Mark Rowe  <opendarwin.org@bdash.net.nz>

        Reviewed by Geoffrey.

        http://bugs.webkit.org/show_bug.cgi?id=9742
        Bug 9742: REGRESSION: WebKit hangs when loading <http://www.vtbook.com>

        * kjs/value.h:
        (KJS::JSValue::getUInt32): Only types tagged as numeric can be converted to UInt32.

2006-07-13  Geoffrey Garen  <ggaren@apple.com>

        Pleasing to Maciej.
        
        - Renamed JSEvaluate -> JSEvaluateScript, JSCheckSyntax -> JSCheckScriptSyntax
        - Added exception out parameters to JSValueTo* and JSValueIsEqual because
        they can throw
        - Removed JSObjectGetDescription because it's useless and vague, and 
        JSValueToString/JSValueIsObjectOfClass do a better job, anyway
        - Clarified comments about "IsFunction/Constructor" to indicate that they
        are true of all functions/constructors, not just those created by JSObjectMake*

2006-07-12  Geoffrey Garen  <ggaren@apple.com>

        RS by Beth.
        
        Finished previously approved JSInternalString -> JSString conversion 
        by renaming the files.

        * API/JSCallbackObject.cpp:
        * API/JSInternalStringRef.cpp: Removed.
        * API/JSInternalStringRef.h: Removed.
        * API/JSStringRef.cpp: Added.
        * API/JSStringRef.h: Added.
        * API/JavaScriptCore.h:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-07-12  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - Removed context and exception parameters from JSObjectGetPropertyEnumerator,
        removing the spurious use of ExecState inside JavaScriptCore that made
        us think this was necessary in the first place.

        (StringInstance::getPropertyList): Use getString instead of toString because
        we know we're dealing with a string -- we put it there in the first place.
        While we're at it, store the string's size instead of retrieving it each time 
        through the loop, to avoid the unnecessary killing of puppies.
        * kjs/string_object.h:

2006-07-12  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - add handling of hasInstance callback for API objects

        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::implementsHasInstance): Check if callback is present.
        (KJS::JSCallbackObject::hasInstance): Invoke appropriate callback.
        * API/JSCallbackObject.h:
        * API/JSClassRef.cpp:
        * API/JSObjectRef.h:
        * API/testapi.c:
        (MyObject_hasInstance): Test case; should match what construct would do.
        * API/testapi.js:

2006-07-11  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - Implemented a vast number of renames and comment clarifications 
        suggested during API review.
        
        JSInternalString -> JSString
        JS*Make -> JSValueMake*, JSObjectMake*
        JSTypeCode -> JSType
        JSValueIsInstanceOf -> JSValueIsInstanceOfConstructor (reads strangely well in client code)
        JSGC*Protect -> JSValue*Protect
        JS*Callback -> JSObject*Callback
        JSGetPropertyListCallback -> JSObjectAddPropertiesToListCallback
        JSPropertyEnumeratorGetNext -> JSPropertyEnumeratorGetNextName
        JSString* -> 
            JSStringCreateWithUTF8CString, JSStringGetUTF8CString,
            JSStringGetMaximumUTF8CStringSize JSStringIsEqualToUTF8CString, 
            JSStringCreateWithCFString, JSStringCopyCFString, JSStringCreateWithCharacters.
        
        - Changed functions taking a JSValue out arg and returning a bool indicating
        whether it was set to simply return a JSValue or NULL.
        
        - Removed JSStringGetCharacters because it's more documentation than code,
        and it's just a glorified memcpy built on existing API functionality.
        
        - Moved standard library includes into the headers that actually require them.
        
        - Standardized use of the phrase "Create Rule."
        
        - Removed JSLock from make functions that don't allocate.
        
        - Added exception handling to JSValueToBoolean, since we now allow
        callback objects to throw exceptions upon converting to boolean.
        
        - Renamed JSGCCollect to JSGarbageCollect.

2006-07-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.
        
        - Changed public header includes to the <JavaScriptCore/ style.
        - Changed instances of 'buffer' to 'string' since we decided on
        JSInternalString instead of JSStringBuffer.

        * API/JSContextRef.h:
        * API/JSInternalStringRef.cpp:
        (JSStringMake):
        (JSInternalStringRetain):
        (JSInternalStringRelease):
        (JSValueCopyStringValue):
        (JSInternalStringGetLength):
        (JSInternalStringGetCharactersPtr):
        (JSInternalStringGetCharacters):
        (JSInternalStringGetMaxLengthUTF8):
        (JSInternalStringGetCharactersUTF8):
        (CFStringCreateWithJSInternalString):
        * API/JSInternalStringRef.h:
        * API/JSNode.c:
        (JSNodePrototype_appendChild):
        (JSNode_getNodeType):
        * API/JSObjectRef.cpp:
        (JSObjectCallAsConstructor):
        * API/JSValueRef.h:
        * API/JavaScriptCore.h:
        * API/minidom.c:
        (main):
        (print):
        * API/testapi.c:
        (MyObject_getPropertyList):
        (myConstructor_callAsConstructor):
        (main): I noticed that we were prematurely releasing some string buffers,
        so I moved their release calls to the end of main(). I got rid of 'Buf' in *Buf
        (sometimes changing to 'IString', when necessary to differentiate a variable) 
        to match the buffer->string change.

=== Safari-521.16 ===

2006-07-10  Darin Adler  <darin@apple.com>

        * kjs/value.cpp: (KJS::JSValue::toInt32Inline): Added inline keyword one more place.
        Just in case.

2006-07-10  Darin Adler  <darin@apple.com>

        - fix the release build

        * kjs/value.h:
        * kjs/value.cpp:
        (KJS::JSValue::toInt32Inline): Move the code here to an inline.
        (KJS::JSValue::toInt32): Call the inline from both overloaded toInt32 functions.

2006-07-10  David Kilzer  <ddkilzer@kilzer.net>

        Reviewed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=9179
          Implement select.options.add() method

        * JavaScriptCore.exp: Added overloaded KJS::JSValue::toInt32() method.
        * JavaScriptCore.xcodeproj/project.pbxproj: Altered attributes metadata for
        kjs/value.h to make it available as a forwarded header.
        * kjs/lookup.h:
        (KJS::lookupPut): Extracted a lookupPut() method from the existing lookupPut() method.
        The new method returns a boolean value if no entry is found in the lookup table.
        * kjs/value.cpp:
        (KJS::JSValue::toInt32): Overloaded toInt32() method with boolean "Ok" argument.
        * kjs/value.h: Ditto.

2006-07-10  Geoffrey Garen  <ggaren@apple.com>

        No review necessary. Removed bogus file I accidentally checked in before.

        * API/JSInternalSringRef.h: Removed.

2006-07-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.
        
        Added exception out parameter to API object callbacks, removed semi-bogus
        JSContext(.*)Exception functions.
        
        To make these calls syntactically simple, I added an exceptionSlot()
        method to the ExecState class, which provides a JSValue** slot in which to 
        store a JSValue* exception.

        * API/APICast.h:
        (toRef):
        * API/JSCallbackConstructor.cpp:
        (KJS::JSCallbackConstructor::construct):
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::callAsFunction):
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::init):
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::deleteProperty):
        (KJS::JSCallbackObject::construct):
        (KJS::JSCallbackObject::callAsFunction):
        (KJS::JSCallbackObject::getPropertyList):
        (KJS::JSCallbackObject::toBoolean):
        (KJS::JSCallbackObject::toNumber):
        (KJS::JSCallbackObject::toString):
        (KJS::JSCallbackObject::staticValueGetter):
        (KJS::JSCallbackObject::callbackGetter):
        * API/JSContextRef.cpp:
        (JSCheckSyntax):
        * API/JSContextRef.h:
        * API/JSNode.c:
        (JSNodePrototype_appendChild):
        (JSNodePrototype_removeChild):
        (JSNodePrototype_replaceChild):
        (JSNode_getNodeType):
        (JSNode_getChildNodes):
        (JSNode_getFirstChild):
        (JSNode_construct):
        * API/JSNode.h:
        * API/JSNodeList.c:
        (JSNodeListPrototype_item):
        (JSNodeList_length):
        (JSNodeList_getProperty):
        * API/JSObjectRef.h:
        * API/minidom.c:
        (print):
        * API/testapi.c:
        (MyObject_initialize):
        (MyObject_hasProperty):
        (MyObject_getProperty):
        (MyObject_setProperty):
        (MyObject_deleteProperty):
        (MyObject_getPropertyList):
        (MyObject_callAsFunction):
        (MyObject_callAsConstructor):
        (MyObject_convertToType):
        (print_callAsFunction):
        (myConstructor_callAsConstructor):
        (main):
        * JavaScriptCore.exp:
        * kjs/ExecState.h:
        (KJS::ExecState::exceptionHandle):

2006-07-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        Improved type safety by implementing opaque JSValue/JSObject typing through 
        abuse of 'const', not void*. Also fixed an alarming number of bugs
        exposed by this new type safety.
        
        I made one design change in JavaScriptCore, which is that the JSObject
        constructor should take a JSValue* as its prototype argument, not a JSObject*,
        since we allow the prototype to be any JSValue*, including jsNull(), for
        example.
        
        * API/APICast.h:
        (toJS):
        * API/JSBase.h:
        * API/JSCallbackConstructor.cpp:
        (KJS::JSCallbackConstructor::construct):
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::callAsFunction):
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::JSCallbackObject):
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::construct):
        (KJS::JSCallbackObject::callAsFunction):
        (KJS::JSCallbackObject::staticFunctionGetter):
        * API/JSCallbackObject.h:
        * API/JSContextRef.cpp:
        (JSEvaluate):
        * API/JSNode.c:
        (JSNodePrototype_appendChild):
        (JSNodePrototype_removeChild):
        (JSNodePrototype_replaceChild):
        * API/JSObjectRef.cpp:
        (JSObjectMake):
        (JSFunctionMakeWithBody):
        (JSObjectGetProperty):
        (JSObjectCallAsFunction):
        (JSObjectCallAsConstructor):
        * API/JSObjectRef.h:
        * API/testapi.c:
        (main):
        * ChangeLog:
        * kjs/object.h:
        (KJS::JSObject::JSObject):

2006-07-10  Geoffrey Garen  <ggaren@apple.com>

        Approved by Maciej, Darin.
        
        Renamed JSStringBufferRef to JSInternalStringRef. "Internal string" means the 
        JavaScript engine's internal string representation, which is the most 
        low-level and efficient representation to use when interfacing with JavaScript.

        * API/APICast.h:
        (toJS):
        (toRef):
        * API/JSBase.h:
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::deleteProperty):
        (KJS::JSCallbackObject::staticValueGetter):
        (KJS::JSCallbackObject::callbackGetter):
        * API/JSContextRef.cpp:
        (JSEvaluate):
        (JSCheckSyntax):
        * API/JSContextRef.h:
        * API/JSInternalStringRef.cpp: Added.
        (JSStringMake):
        (JSInternalStringCreate):
        (JSInternalStringCreateUTF8):
        (JSInternalStringRetain):
        (JSInternalStringRelease):
        (JSValueCopyStringValue):
        (JSInternalStringGetLength):
        (JSInternalStringGetCharactersPtr):
        (JSInternalStringGetCharacters):
        (JSInternalStringGetMaxLengthUTF8):
        (JSInternalStringGetCharactersUTF8):
        (JSInternalStringIsEqual):
        (JSInternalStringIsEqualUTF8):
        (JSInternalStringCreateCF):
        (CFStringCreateWithJSInternalString):
        * API/JSInternalStringRef.h: Added.
        * API/JSNode.c:
        (JSNodePrototype_appendChild):
        (JSNode_getNodeType):
        (JSNode_getChildNodes):
        (JSNode_getFirstChild):
        * API/JSNodeList.c:
        (JSNodeList_length):
        (JSNodeList_getProperty):
        * API/JSObjectRef.cpp:
        (JSFunctionMakeWithBody):
        (JSObjectGetDescription):
        (JSObjectHasProperty):
        (JSObjectGetProperty):
        (JSObjectSetProperty):
        (JSObjectDeleteProperty):
        (JSPropertyEnumeratorGetNext):
        (JSPropertyListAdd):
        * API/JSObjectRef.h:
        * API/JSStringBufferRef.cpp: Removed.
        * API/JSStringBufferRef.h: Removed.
        * API/JSValueRef.h:
        * API/JavaScriptCore.h:
        * API/minidom.c:
        (main):
        (print):
        * API/testapi.c:
        (assertEqualsAsUTF8String):
        (assertEqualsAsCharactersPtr):
        (assertEqualsAsCharacters):
        (MyObject_hasProperty):
        (MyObject_getProperty):
        (MyObject_setProperty):
        (MyObject_deleteProperty):
        (MyObject_getPropertyList):
        (print_callAsFunction):
        (myConstructor_callAsConstructor):
        (main):
        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-07-08  Tim Omernick  <timo@apple.com>

        Reviewed by Maciej.

        Added an OpenGL drawing model to the Netscape Plug-in API.

        * bindings/npapi.h:

2006-07-08  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Maciej.

        Moved KJS_GetCreatedJavaVMs to jni_utility.cpp.
        Switched KJS_GetCreatedJavaVMs over to use dlopen and dlsym
        now that NSAddImage, NSLookupSymbolInImage and NSAddressOfSymbol
        are deprecated in Leopard.

        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::KJS_GetCreatedJavaVMs):
        * bindings/softlinking.c: Removed.
        * bindings/softlinking.h: Removed.

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

        Reviewed by Anders.
        
        - Make JSObjectGetProperty return a JSValue or NULL, like JSEvaluate does.

        * API/JSObjectRef.cpp:
        (JSObjectGetProperty):
        * API/JSObjectRef.h:
        * API/testapi.c:
        (main):

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

        Style change -- no review necessary.
        
        Use 0 instead of NULL in API .cpp files, to match our style guidelines.

        * API/JSContextRef.cpp:
        (JSEvaluate):
        * API/JSObjectRef.cpp:
        (JSFunctionMakeWithBody):
        (JSObjectCallAsFunction):
        (JSObjectCallAsConstructor):
        * API/JSValueRef.cpp:
        (JSValueToObject):

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

        Reviewed by TimO.

        - Added ability to pass NULL for thisObject when calling JSObjectCallAsFunction,
        to match JSEvaluate.
        
        * API/JSObjectRef.cpp:
        (JSObjectCallAsFunction):
        * API/JSObjectRef.h:
        * API/testapi.c:
        (main):

=== Safari-521.15 ===

2006-07-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - Standardized which functions take a JSContext as an argument. The rule is:
        if you might execute JavaScript, you take a JSContext, otherwise you don't.
        
        The FIXME in JSObjectRef.h requires refactoring some parts of Interpreter,
        but not API changes, so I'm putting it off until later.

        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::JSCallbackObject):
        (KJS::JSCallbackObject::init):
        * API/JSCallbackObject.h:
        * API/JSContextRef.cpp:
        (JSContextCreate):
        * API/JSContextRef.h:
        * API/JSObjectRef.cpp:
        (JSObjectMake):
        (JSPropertyEnumeratorGetNext):
        * API/JSObjectRef.h:
        * API/testapi.c:
        (MyObject_initialize):
        (main):
        * JavaScriptCore.exp:
        * kjs/array_object.cpp:
        (ArrayInstance::setLength):
        (ArrayInstance::pushUndefinedObjectsToEnd):
        * kjs/nodes.cpp:
        (ForInNode::execute):
        * kjs/reference.cpp:
        (KJS::Reference::getPropertyName):
        (KJS::Reference::getValue):
        * kjs/reference.h:
        * kjs/scope_chain.cpp:
        (KJS::ScopeChain::print):

2006-07-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        More API action.
        
        - Headerdoc finished

        Semantic Changes:
        - Added a JSContextRef argument to many functions, because you need a 
        JSContextRef for doing virtually anything. I expect to add this argument
        to even more functions in a future patch.
        
        - Removed the globalObjectPrototype argument to JSContextCreate because
        you can't create an object until you have a context, so it's impossible
        to pass a prototype object to JSContextCreate. That's OK because (1) there's
        no reason to give the global object a prototype and (2) if you really want
        to, you can just use a separate call to JSObjectSetPrototype.
        
        - Removed the JSClassRef argument to JSClassCreate because it was unnecessary,
        and you need to be able to make the global object's class before you've
        created a JSContext.
        
        - Added an optional exception parameter to JSFunctionMakeWithBody because anything
        less would be uncivilized.
        
        - Made the return value parameter to JSObjectGetProperty optional to match
        all other return value parameters in the API.
        
        - Made JSObjectSetPrivate/JSObjectGetPrivate work on JSCallbackFunctions
        and JSCallbackConstructors. You could use an abstract base class or strategic
        placement of m_privateData in the class structure to implement this, but 
        the former seemed like overkill, and the latter seemed too dangerous.
        
        - Fixed a bug where JSPropertyEnumeratorGetNext would skip the first property.

        Cosmetic Changes:
        - Reversed the logic of the JSChar #ifdef to avoid confusing headerdoc
        
        - Removed function names from @function declarations because headeroc
        can parse them automatically, and I wanted to rule out manual mismatch.

        - Changed Error::create to take a const UString& instead of a UString*
        because it was looking at me funny.
        
        - Renamed JSStringBufferCreateWithCFString to JSStringBufferCreateCF
        because the latter is more concise and it matches JSStringBufferCreateUTF8.
        
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::deleteProperty):
        (KJS::JSCallbackObject::getPropertyList):
        (KJS::JSCallbackObject::toBoolean):
        (KJS::JSCallbackObject::toNumber):
        (KJS::JSCallbackObject::toString):
        * API/JSClassRef.cpp:
        (JSClassCreate):
        * API/JSContextRef.cpp:
        (JSContextCreate):
        (JSContextSetException):
        * API/JSContextRef.h:
        * API/JSNode.c:
        (JSNodePrototype_class):
        (JSNode_class):
        * API/JSNodeList.c:
        (JSNodeListPrototype_class):
        (JSNodeList_class):
        * API/JSObjectRef.cpp:
        (JSObjectGetProperty):
        (JSObjectGetPrivate):
        (JSObjectSetPrivate):
        (JSObjectCallAsFunction):
        (JSObjectCallAsConstructor):
        (JSPropertyEnumeratorGetNext):
        * API/JSObjectRef.h:
        * API/JSStringBufferRef.cpp:
        (JSStringBufferCreateCF):
        * API/JSStringBufferRef.h:
        * API/JSValueRef.cpp:
        (JSValueIsInstanceOf):
        * API/JSValueRef.h:
        * API/minidom.c:
        (main):
        * API/minidom.js:
        * API/testapi.c:
        (MyObject_hasProperty):
        (MyObject_setProperty):
        (MyObject_deleteProperty):
        (MyObject_getPropertyList):
        (MyObject_convertToType):
        (MyObject_class):
        (main):
        * JavaScriptCore.exp:

2006-07-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by John.
        
        - Fixed a few crashes resulting from NULL parameters to JSClassCreate.

        * API/JSClassRef.cpp:
        (JSClassCreate):
        (JSClassRelease):
        * API/testapi.c: Added test for NULL parameters.
        (main):

2006-07-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by John, mocked by Darin.
        
        - Changed JSEvaluate to take a JSObjectRef instead of a JSValueRef as
        "this," since "this" must be an object.

        * API/JSContextRef.cpp:
        (JSEvaluate):
        * API/JSContextRef.h:

2006-07-07  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by John.
        
        - More headerdoc

        * API/JSBase.h:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-07-05  Geoffrey Garen  <ggaren@apple.com>

        RS by Beth.
        
        Renamed JSCharBufferRef, which was universally unpopular, to JSStringBufferRef,
        which, hopefully, will be less unpopular.

        * API/APICast.h:
        (toJS):
        (toRef):
        * API/JSBase.h:
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::deleteProperty):
        (KJS::JSCallbackObject::staticValueGetter):
        (KJS::JSCallbackObject::callbackGetter):
        * API/JSCharBufferRef.cpp: Removed.
        * API/JSCharBufferRef.h: Removed.
        * API/JSContextRef.cpp:
        (JSEvaluate):
        (JSCheckSyntax):
        * API/JSContextRef.h:
        * API/JSNode.c:
        (JSNodePrototype_appendChild):
        (JSNode_getNodeType):
        (JSNode_getChildNodes):
        (JSNode_getFirstChild):
        * API/JSNodeList.c:
        (JSNodeList_length):
        (JSNodeList_getProperty):
        * API/JSObjectRef.cpp:
        (JSFunctionMakeWithBody):
        (JSObjectGetDescription):
        (JSObjectHasProperty):
        (JSObjectGetProperty):
        (JSObjectSetProperty):
        (JSObjectDeleteProperty):
        (JSPropertyEnumeratorGetNext):
        (JSPropertyListAdd):
        * API/JSObjectRef.h:
        * API/JSStringBufferRef.cpp: Added.
        (JSStringMake):
        (JSStringBufferCreate):
        (JSStringBufferCreateUTF8):
        (JSStringBufferRetain):
        (JSStringBufferRelease):
        (JSValueCopyStringValue):
        (JSStringBufferGetLength):
        (JSStringBufferGetCharactersPtr):
        (JSStringBufferGetCharacters):
        (JSStringBufferGetMaxLengthUTF8):
        (JSStringBufferGetCharactersUTF8):
        (JSStringBufferIsEqual):
        (JSStringBufferIsEqualUTF8):
        (JSStringBufferCreateWithCFString):
        (CFStringCreateWithJSStringBuffer):
        * API/JSStringBufferRef.h: Added.
        * API/JSValueRef.h:
        * API/JavaScriptCore.h:
        * API/minidom.c:
        (main):
        (print):
        * API/testapi.c:
        (assertEqualsAsUTF8String):
        (assertEqualsAsCharactersPtr):
        (assertEqualsAsCharacters):
        (MyObject_hasProperty):
        (MyObject_getProperty):
        (MyObject_setProperty):
        (MyObject_deleteProperty):
        (MyObject_getPropertyList):
        (print_callAsFunction):
        (myConstructor_callAsConstructor):
        (main):
        * JavaScriptCore.exp:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-07-05  Geoffrey Garen  <ggaren@apple.com>

        RS by Beth.
        
        Moved some code around for more logical file separation.

        * API/JSBase.h:
        * API/JSContextRef.h:
        * API/JSObjectRef.cpp:
        * API/JSValueRef.cpp:
        (JSValueToObject):
        * API/JSValueRef.h:

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

        Reviewed by Maciej.
        
        Implemented JSFunctionMakeWithBody, which parses a script as a function body
        in the global scope, and returns the resulting anonymous function.
        
        I also removed private data from JSCallbackFunction. It never worked,
        since JSCallbackFunction doesn't inherit from JSCallbackObject.

        * API/JSCallbackConstructor.cpp: Removed.
        * API/JSCallbackConstructor.h: Removed.
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::JSCallbackFunction):
        (KJS::JSCallbackFunction::implementsConstruct):
        (KJS::JSCallbackFunction::construct):
        (KJS::JSCallbackFunction::implementsCall):
        (KJS::JSCallbackFunction::callAsFunction):
        * API/JSCallbackFunction.h:
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::staticFunctionGetter):
        * API/JSObjectRef.cpp:
        (JSFunctionMake):
        (JSFunctionMakeWithCallbacks):
        * API/JSObjectRef.h:
        * API/JSValueRef.h:
        * API/minidom.c:
        (main):
        * API/testapi.c:
        (main):
        * JavaScriptCore.exp: Programmatically added all symbols exported by
        API object files, and sorted results
        * JavaScriptCore.xcodeproj/project.pbxproj:

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

        Reviewed by Maciej.

        - Return syntax error in JSCheckSyntax through a JSValueRef* exception
        argument
        
        * API/JSBase.h:
        * API/JSContextRef.cpp:
        (JSCheckSyntax):
        * API/testapi.c:
        (main):
        * JavaScriptCore.exp:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::checkSyntax):
        * kjs/interpreter.h:

2006-07-04  Darin Adler  <darin@apple.com>

        - fixed build

        * wtf/MathExtras.h: Oops. Added missing #endif.

2006-07-04  Bjoern Graf  <bjoern.graf@gmail.com>

        Reviewed by Maciej.
        Tweaked a bit by Darin.

        - http://bugs.webkit.org/show_bug.cgi?id=9678
          work around MSVCRT's fmod function returning NaN for fmod(x, infinity) instead of x

        * wtf/MathExtras.h: Added include of <float.h>.
        (isinf): Fix to return false for NAN.
        (wtf_fmod): Added. An inline that works around the bug.

        * kjs/nodes.cpp:
        * kjs/number_object.cpp:
        * kjs/operations.cpp:
        * kjs/value.cpp:
        Added includes of MathExtras.h to all files using fmod.

        * JavaScriptCore.xcodeproj/project.pbxproj: Let Xcode 2.3 have its way with
        the project.

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

        Reviewed by Darin.
        
        - Refined value conversions in the API:
            - failed toNumber returns NaN
            - failed toObject returns NULL
            - failed toString returns empty string
        
        - Refined excpetion handling in the API:
            - failed value conversions do not throw exceptions
            - uncaught exceptions in JSEvaluate, JSObjectCallAsFunction, and 
              JSObjectCallAsConstructor are returned through a JSValueRef* exception
              argument
            - removed JSContextHasException, because JSContextGetException does
              the same job
            
        * API/JSBase.h:
        * API/JSCharBufferRef.cpp:
        (JSValueCopyStringValue):
        * API/JSContextRef.cpp:
        (JSEvaluate):
        * API/JSContextRef.h:
        * API/JSNodeList.c: Added test code demonstrating how you would use
        toNumber, and why you probably don't need toUInt32, etc.
        (JSNodeListPrototype_item):
        (JSNodeList_getProperty):
        * API/JSObjectRef.cpp:
        (JSValueToObject):
        (JSObjectCallAsFunction):
        (JSObjectCallAsConstructor):
        * API/JSObjectRef.h:
        * API/JSValueRef.cpp:
        (JSValueToNumber):
        * API/JSValueRef.h:
        * API/minidom.c:
        (main):
        * API/testapi.c:
        (main): Added tests for new rules, and call to JSGCProtect to fix Intel 
        crash
        * JavaScriptCore.exp:

2006-07-03  Darin Adler  <darin@apple.com>

        - Rolled out HashMap implementation of NPRuntime, at least temporarily.

        Fixes hang in the bindings section of layout tests seen on the
        buildbot.

        This code was using HashMap<const char*, PrivateIdentifier*>.
        But that hashes based on pointer identity, not string value.
        The default hash for any pointer type is to hash based on the pointer.
        And WTF doesn't currently have a string hash for char*.
        We'll need to fix that before re-landing this patch.

        (Formatting was also incorrect -- extra spaces in parentheses.)

        * bindings/npruntime.cpp: Rolled out last change.

2006-07-02  Justin Haygood  <jhaygood@spsu.edu>

        Reviewed, tweaked, landed by ggaren.

        - Port NPRuntime from CFDictionary to HashMap.

        * bindings/npruntime.cpp:
        (getStringIdentifierDictionary):
        (getIntIdentifierDictionary):
        (_NPN_GetStringIdentifier):
        (_NPN_GetIntIdentifier):
        * bindings/npruntime.h:

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

        Reviewed by Adele.
        
        - Fixed <rdar://problem/4611197> REGRESSION: Liveconnect with Java test 
        fails at http://www-sor.inria.fr/~dedieu/notes/liveconnect/simple_example.html

        * JavaScriptCore.exp: Export symbols used by liveconnect

2006-06-29  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - Phase 2 in the JS API.
        
        - Added support for specifying static tables of values -- this should
        obviate the need for using complicated callbacks for most lookups.
        
        -  API objects are now created with classes (JSClassRef) -- in order to support
        static values, and in order to prevent API objects from storing their
        data inline, and thus falling into the oversized (read: slow and prone to
        giving Maciej the frowny face) heap.
        
        - Added two specialized JSObject subclasses -- JSCallbackFunction and JSCallbackConstructor -- 
        to allow JSFunctionMake and JSConstructorMake to continue to work with
        the new class model. Another solution to this problem would be to create
        a custom class object for each function and constructor you make. This
        solution is more code but also more efficient.
        
        - Substantially beefed up the minidom example to demonstrate and test a
        lot of these techniques. Its output is still pretty haphazard, though.
        
        - Gave the <kjs/ preface to some includes -- I'm told this matters to
        building on some versions of Linux.
        
        - Implemented JSValueIsInstanceOf and JSValueIsObjectOfClass
        
        - Removed GetDescription callback. Something in the class datastructure
        should take care of this.

        * API/JSBase.h:
        * API/JSCallbackConstructor.cpp: Added.
        (KJS::):
        (KJS::JSCallbackConstructor::JSCallbackConstructor):
        (KJS::JSCallbackConstructor::implementsConstruct):
        (KJS::JSCallbackConstructor::construct):
        (KJS::JSCallbackConstructor::setPrivate):
        (KJS::JSCallbackConstructor::getPrivate):
        * API/JSCallbackConstructor.h: Added.
        (KJS::JSCallbackConstructor::classInfo):
        * API/JSCallbackFunction.cpp: Added.
        (KJS::):
        (KJS::JSCallbackFunction::JSCallbackFunction):
        (KJS::JSCallbackFunction::implementsCall):
        (KJS::JSCallbackFunction::callAsFunction):
        (KJS::JSCallbackFunction::setPrivate):
        (KJS::JSCallbackFunction::getPrivate):
        * API/JSCallbackFunction.h: Added.
        (KJS::JSCallbackFunction::classInfo):
        * API/JSCallbackObject.cpp:
        (KJS::):
        (KJS::JSCallbackObject::JSCallbackObject):
        (KJS::JSCallbackObject::init):
        (KJS::JSCallbackObject::~JSCallbackObject):
        (KJS::JSCallbackObject::className):
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::deleteProperty):
        (KJS::JSCallbackObject::implementsConstruct):
        (KJS::JSCallbackObject::construct):
        (KJS::JSCallbackObject::implementsCall):
        (KJS::JSCallbackObject::callAsFunction):
        (KJS::JSCallbackObject::getPropertyList):
        (KJS::JSCallbackObject::toBoolean):
        (KJS::JSCallbackObject::toNumber):
        (KJS::JSCallbackObject::toString):
        (KJS::JSCallbackObject::inherits):
        (KJS::JSCallbackObject::staticValueGetter):
        (KJS::JSCallbackObject::staticFunctionGetter):
        (KJS::JSCallbackObject::callbackGetter):
        * API/JSCallbackObject.h:
        * API/JSCharBufferRef.cpp:
        * API/JSClassRef.cpp: Added.
        (JSClassCreate):
        (JSClassRetain):
        (JSClassRelease):
        * API/JSClassRef.h: Added.
        (StaticValueEntry::StaticValueEntry):
        (StaticFunctionEntry::StaticFunctionEntry):
        (__JSClass::__JSClass):
        * API/JSContextRef.cpp:
        (JSContextCreate):
        (JSEvaluate):
        * API/JSContextRef.h:
        * API/JSNode.c: Added.
        (JSNodePrototype_appendChild):
        (JSNodePrototype_removeChild):
        (JSNodePrototype_replaceChild):
        (JSNodePrototype_class):
        (JSNode_getNodeType):
        (JSNode_getChildNodes):
        (JSNode_getFirstChild):
        (JSNode_finalize):
        (JSNode_class):
        (JSNode_prototype):
        (JSNode_new):
        (JSNode_construct):
        * API/JSNode.h: Added.
        * API/JSNodeList.c: Added.
        (JSNodeListPrototype_item):
        (JSNodeListPrototype_class):
        (JSNodeList_length):
        (JSNodeList_getProperty):
        (JSNodeList_finalize):
        (JSNodeList_class):
        (JSNodeList_prototype):
        (JSNodeList_new):
        * API/JSNodeList.h: Added.
        * API/JSObjectRef.cpp:
        (JSObjectMake):
        (JSFunctionMake):
        (JSConstructorMake):
        (__JSPropertyEnumerator::__JSPropertyEnumerator):
        (JSObjectCreatePropertyEnumerator):
        (JSPropertyEnumeratorGetNext):
        (JSPropertyEnumeratorRetain):
        (JSPropertyEnumeratorRelease):
        * API/JSObjectRef.h:
        (__JSObjectCallbacks::):
        * API/JSValueRef.cpp:
        (JSValueIsObjectOfClass):
        (JSValueIsInstanceOf):
        * API/JSValueRef.h:
        * API/Node.c: Added.
        (Node_new):
        (Node_appendChild):
        (Node_removeChild):
        (Node_replaceChild):
        (Node_ref):
        (Node_deref):
        * API/Node.h: Added.
        * API/NodeList.c: Added.
        (NodeList_new):
        (NodeList_length):
        (NodeList_item):
        (NodeList_ref):
        (NodeList_deref):
        * API/NodeList.h: Added.
        * API/minidom.c:
        (main):
        (print):
        (createStringWithContentsOfFile):
        * API/minidom.js:
        * API/testapi.c:
        (assertEqualsAsCharacters):
        (MyObject_getProperty):
        (MyObject_class):
        (myConstructor_callAsConstructor):
        (main):
        * API/testapi.js:
        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-06-26  Kevin Ollivier  <kevino@theolliviers.com>
        
        Reviewed and tweaked by Darin.

        - Compile fixes for wx port / gcc 4.0.2

        * kjs/array_object.cpp:
        Added missing headers. 

        * kjs/ExecState.h:
        gcc needs class prototypes before defining those classes as friend classes

2006-06-30  Mike Emmel  <mike.emmel@gmail.com>

        Reviewed by Darin.

        Compilation fixes for Linux/Gdk.

        * JavaScriptCore/kjs/interpreter.cpp: added include of signal.h
        * JavaScriptCore/kjs/ExecState.h: added missing class declaration 
        * JavaScriptCore/kjs/ExecState.cpp: case wrong on include of context.h 
        * JavaScriptCore/JavaScriptCoreSources.bkl: added Context.cpp and ExecState.cpp

=== Safari-521.14 ===

2006-06-29  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - add headerdoc comments to some of the new JS API headers

        * API/JSBase.h:
        * API/JSValueRef.h:

2006-06-28  Timothy Hatcher  <timothy@apple.com>

        Prefer the Stabs debugging symbols format until DWARF bugs are fixed.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-06-27  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Tim O.

        <rdar://problem/4448350> Deprecated ObjC language API used in JavaScriptCore, WebCore, WebKit and WebBrowser

        Switch to the new ObjC 2 API, ifdefed the old code around OBJC_API_VERSION so it still works on Tiger.
        Removed the use of the old stringWithCString, switched to the new Tiger version that accepts an encoding.
        Lots of code style cleanup.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/objc/objc_class.h:
        * bindings/objc/objc_class.mm:
        (KJS::Bindings::ObjcClass::~ObjcClass):
        (KJS::Bindings::_createClassesByIsAIfNecessary):
        (KJS::Bindings::ObjcClass::classForIsA):
        (KJS::Bindings::ObjcClass::name):
        (KJS::Bindings::ObjcClass::methodsNamed):
        (KJS::Bindings::ObjcClass::fieldNamed):
        (KJS::Bindings::ObjcClass::fallbackObject):
        * bindings/objc/objc_header.h:
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::ObjcInstance):
        (ObjcInstance::~ObjcInstance):
        (ObjcInstance::operator=):
        (ObjcInstance::begin):
        (ObjcInstance::end):
        (ObjcInstance::getClass):
        (ObjcInstance::invokeMethod):
        (ObjcInstance::invokeDefaultMethod):
        (ObjcInstance::setValueOfField):
        (ObjcInstance::supportsSetValueOfUndefinedField):
        (ObjcInstance::setValueOfUndefinedField):
        (ObjcInstance::getValueOfField):
        (ObjcInstance::getValueOfUndefinedField):
        (ObjcInstance::defaultValue):
        (ObjcInstance::stringValue):
        (ObjcInstance::numberValue):
        (ObjcInstance::booleanValue):
        (ObjcInstance::valueOf):
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcMethod::ObjcMethod):
        (ObjcMethod::name):
        (ObjcMethod::getMethodSignature):
        (ObjcMethod::setJavaScriptName):
        (ObjcField::name):
        (ObjcField::type):
        (ObjcField::valueFromInstance):
        (convertValueToObjcObject):
        (ObjcField::setValueToInstance):
        (ObjcArray::operator=):
        (ObjcArray::setValueAt):
        (ObjcArray::valueAt):
        (ObjcFallbackObjectImp::ObjcFallbackObjectImp):
        (ObjcFallbackObjectImp::callAsFunction):
        (ObjcFallbackObjectImp::defaultValue):

2006-06-28  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Geoff.

        http://bugs.webkit.org/show_bug.cgi?id=8636
        REGRESSION: JavaScript access to Java applet causes hang (_webViewURL not implemented)

        * bindings/jni/jni_objc.mm:
        (KJS::Bindings::dispatchJNICall):
        Just pass nil as the calling URL. This will cause the Java plugin to use the URL of the page
        containing the applet (which is what we used to do).

2006-06-27  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin.

        <rdar://problem/4406785> Add an export file to TOT JavaScriptCore like the Safari-2-0-branch

        * JavaScriptCore.exp: Added.
        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-06-25  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Adele.
        
        - Added JSConstructorMake to match JSFunctionMake, along with test code.
        
        [ I checked in the ChangeLog before without the actual files. ]

        * API/JSObjectRef.cpp:
        (JSConstructorMake):
        * API/JSObjectRef.h:
        * API/testapi.c:
        (myConstructor_callAsConstructor):
        (main):
        * API/testapi.js:
        * ChangeLog:
        * JavaScriptCore.xcodeproj/project.pbxproj: Moved testapi.c to the testapi
        target -- this was an oversight in my earlier check-in.

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

        Reviewed by Darin.

        Bug 9574: Drosera should show inline scripts within the original HTML
        http://bugs.webkit.org/show_bug.cgi?id=9574

        Pass the starting line number and error message to the debugger.

        * kjs/debugger.cpp:
        (Debugger::sourceParsed):
        * kjs/debugger.h:
        * kjs/function.cpp:
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/function_object.cpp:
        (FunctionObjectImp::construct):
        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):

2006-06-24  Alexey Proskuryakov  <ap@nypop.com>

        Rubber-stamped by Eric.

        Add a -h (do not follow symlinks) option to ln in derived sources build script (without it,
        a symlink was created inside the source directory on second build).

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-06-24  David Kilzer  <ddkilzer@kilzer.net>

        Reviewed by Timothy.

        * Info.plist: Fixed copyright to include 2003-2006.

2006-06-24  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Darin.

        - http://bugs.webkit.org/show_bug.cgi?id=9418
        WebKit will not build when Space exists in path

        * JavaScriptCore.xcodeproj/project.pbxproj: Enclose search paths in quotes; create symlinks to 
        avoid passing paths with spaces to make.

2006-06-23  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin.

        Adding more operator[] overloads for long and short types.

        * wtf/Vector.h:
        (WTF::Vector::operator[]):

=== JavaScriptCore-521.13 ===

2006-06-22  Alexey Proskuryakov  <ap@nypop.com>

        Build fix.

        - http://bugs.webkit.org/show_bug.cgi?id=9539
        Another case error preventing build

        * API/JSObjectRef.cpp: Changed "identifier.h" to "Identifier.h"
        
2006-06-22  David Kilzer  <ddkilzer@kilzer.net>

        Build fix.

        http://bugs.webkit.org/show_bug.cgi?id=9539
        Another case error preventing build

        * API/APICast.h: Changed "UString.h" to "ustring.h".

2006-06-21  Geoffrey Garen  <ggaren@apple.com>

        Fixed release build, fixed accidental infinite recursion due to
        last minute global replace gone awry.
        
        * API/APICast.h:
        (toRef):
        * API/testapi.c:
        (assertEqualsAsBoolean):
        (assertEqualsAsNumber):
        (assertEqualsAsUTF8String):
        (assertEqualsAsCharactersPtr):
        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-06-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Anders.
        
        - First cut at C API to JavaScript. Includes a unit test, 'testapi.c', 
        and the outline of a test app, 'minidom.c'.
        
        Includes one change to JSC internals: Rename propList to getPropertyList and have it
        take its target property list by reference so that subclasses can
        add properties to the list before calling through to their superclasses.
        
        Also, I just ran prepare-ChangeLog in about 10 seconds, and I would like
        to give a shout-out to that.
        
        * API/APICast.h: Added.
        (toJS):
        (toRef):
        * API/JSBase.h: Added.
        * API/JSCallbackObject.cpp: Added.
        (KJS::):
        (KJS::JSCallbackObject::JSCallbackObject):
        (KJS::JSCallbackObject::~JSCallbackObject):
        (KJS::JSCallbackObject::className):
        (KJS::JSCallbackObject::getOwnPropertySlot):
        (KJS::JSCallbackObject::put):
        (KJS::JSCallbackObject::deleteProperty):
        (KJS::JSCallbackObject::implementsConstruct):
        (KJS::JSCallbackObject::construct):
        (KJS::JSCallbackObject::implementsCall):
        (KJS::JSCallbackObject::callAsFunction):
        (KJS::JSCallbackObject::getPropertyList):
        (KJS::JSCallbackObject::toBoolean):
        (KJS::JSCallbackObject::toNumber):
        (KJS::JSCallbackObject::toString):
        (KJS::JSCallbackObject::setPrivate):
        (KJS::JSCallbackObject::getPrivate):
        (KJS::JSCallbackObject::cachedValueGetter):
        (KJS::JSCallbackObject::callbackGetter):
        * API/JSCallbackObject.h: Added.
        (KJS::JSCallbackObject::classInfo):
        * API/JSCharBufferRef.cpp: Added.
        (JSStringMake):
        (JSCharBufferCreate):
        (JSCharBufferCreateUTF8):
        (JSCharBufferRetain):
        (JSCharBufferRelease):
        (JSValueCopyStringValue):
        (JSCharBufferGetLength):
        (JSCharBufferGetCharactersPtr):
        (JSCharBufferGetCharacters):
        (JSCharBufferGetMaxLengthUTF8):
        (JSCharBufferGetCharactersUTF8):
        (JSCharBufferIsEqual):
        (JSCharBufferIsEqualUTF8):
        (JSCharBufferCreateWithCFString):
        (CFStringCreateWithJSCharBuffer):
        * API/JSCharBufferRef.h: Added.
        * API/JSContextRef.cpp: Added.
        (JSContextCreate):
        (JSContextDestroy):
        (JSContextGetGlobalObject):
        (JSEvaluate):
        (JSCheckSyntax):
        (JSContextHasException):
        (JSContextGetException):
        (JSContextClearException):
        (JSContextSetException):
        * API/JSContextRef.h: Added.
        * API/JSObjectRef.cpp: Added.
        (JSValueToObject):
        (JSObjectMake):
        (JSFunctionMake):
        (JSObjectGetDescription):
        (JSObjectGetPrototype):
        (JSObjectSetPrototype):
        (JSObjectHasProperty):
        (JSObjectGetProperty):
        (JSObjectSetProperty):
        (JSObjectDeleteProperty):
        (JSObjectGetPrivate):
        (JSObjectSetPrivate):
        (JSObjectIsFunction):
        (JSObjectCallAsFunction):
        (JSObjectIsConstructor):
        (JSObjectCallAsConstructor):
        (__JSPropertyListEnumerator::__JSPropertyListEnumerator):
        (JSObjectCreatePropertyEnumerator):
        (JSPropertyEnumeratorGetNext):
        (JSPropertyEnumeratorRetain):
        (JSPropertyEnumeratorRelease):
        (JSPropertyListAdd):
        * API/JSObjectRef.h: Added.
        * API/JSValueRef.cpp: Added.
        (JSValueGetType):
        (JSValueIsUndefined):
        (JSValueIsNull):
        (JSValueIsBoolean):
        (JSValueIsNumber):
        (JSValueIsString):
        (JSValueIsObject):
        (JSValueIsEqual):
        (JSValueIsStrictEqual):
        (JSUndefinedMake):
        (JSNullMake):
        (JSBooleanMake):
        (JSNumberMake):
        (JSValueToBoolean):
        (JSValueToNumber):
        (JSGCProtect):
        (JSGCUnprotect):
        (JSGCCollect):
        * API/JSValueRef.h: Added.
        * API/JavaScriptCore.h: Added.
        * API/minidom.c: Added.
        (main):
        * API/minidom.html: Added.
        * API/minidom.js: Added.
        * API/testapi.c: Added.
        (assertEqualsAsBoolean):
        (assertEqualsAsNumber):
        (assertEqualsAsUTF8String):
        (assertEqualsAsCharactersPtr):
        (assertEqualsAsCharacters):
        (MyObject_initialize):
        (MyObject_copyDescription):
        (MyObject_hasProperty):
        (MyObject_getProperty):
        (MyObject_setProperty):
        (MyObject_deleteProperty):
        (MyObject_getPropertyList):
        (MyObject_callAsFunction):
        (MyObject_callAsConstructor):
        (MyObject_convertToType):
        (MyObject_finalize):
        (print_callAsFunction):
        (main):
        (createStringWithContentsOfFile):
        * API/testapi.js: Added.
        * ChangeLog:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/npruntime_impl.h:
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (ArrayInstance::getPropertyList):
        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):
        * kjs/nodes.cpp:
        (ForInNode::execute):
        * kjs/object.cpp:
        (KJS::JSObject::put):
        (KJS::JSObject::canPut):
        (KJS::JSObject::deleteProperty):
        (KJS::JSObject::propertyIsEnumerable):
        (KJS::JSObject::getPropertyAttributes):
        (KJS::JSObject::getPropertyList):
        * kjs/object.h:
        * kjs/property_map.cpp:
        (KJS::PropertyMap::get):
        * kjs/property_map.h:
        * kjs/scope_chain.cpp:
        (KJS::ScopeChain::print):
        * kjs/string_object.cpp:
        (StringInstance::getPropertyList):
        * kjs/string_object.h:
        * kjs/ustring.h:
        (KJS::UString::Rep::ref):

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

        Reviewed by Geoff.

        Make sure we clear the exception before returning so
        that future calls will not fail because of an earlier
        exception state. Assert on entry that the WebScriptObject
        is working with an ExecState that dose not have an exception. 
        Document that evaluateWebScript and callWebScriptMethod return
        WebUndefined when an exception is thrown.

        * bindings/objc/WebScriptObject.h:
        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject setValue:forKey:]):
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject removeWebScriptKey:]):
        (-[WebScriptObject webScriptValueAtIndex:]):
        (-[WebScriptObject setWebScriptValueAtIndex:value:]):

2006-06-19  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by John.

        * kjs/interpreter.cpp:
        (KJS::TimeoutChecker::pauseTimeoutCheck):
        (KJS::TimeoutChecker::resumeTimeoutCheck):
        Fix argument order in setitimer calls.

2006-06-18  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Geoff.

        * kjs/interpreter.cpp:
        (KJS::TimeoutChecker::pauseTimeoutCheck):
        Do nothing if the timeout check hasn't been started.
        
        (KJS::TimeoutChecker::resumeTimeoutCheck):
        Do nothing if the timeout check hasn't been started.
        Use the right signal handler when unblocking.
        
        (KJS::Interpreter::handleTimeout):
        pause/resume the timeout check around the call to
        shouldInterruptScript().
        
2006-06-16  Ben Goodger <beng@google.com>
        
        Reviewed by Maciej

        http://bugs.webkit.org/show_bug.cgi?id=9491
        Windows build breaks in interpreter.cpp 

        * kjs/interpreter.cpp
        (KJS::TimeoutChecker::pauseTimeoutCheck):
        (KJS::TimeoutChecker::resumeTimeoutCheck):
        Make sure to only assert equality with s_executingInterpreter when it 
        is being used (i.e. when HAVE(SYS_TIME_H) == true)

2006-06-17  David Kilzer  <ddkilzer@kilzer.net>

        Reviewed by darin.

        http://bugs.webkit.org/show_bug.cgi?id=9477
        REGRESSION: fast/dom/replaceChild.html crashes on WebKit ToT in debug build

        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction): Refetch the debugger after executing the function
        in case the WebFrame it was running in has since been destroyed.

2006-06-17  David Kilzer  <ddkilzer@kilzer.net>

        Reviewed by ggaren.

        http://bugs.webkit.org/show_bug.cgi?id=9476
        REGRESSION: Reproducible crash after closing window after viewing
        css2.1/t0803-c5501-imrgn-t-00-b-ag.html

        * kjs/debugger.cpp:
        (Debugger::detach): Call setDebugger(0) for all interpreters removed from
        the 'attached to a debugger' list.

2006-06-17  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Maciej and Geoff.

        http://bugs.webkit.org/show_bug.cgi?id=7080
        Provide some way to stop a JavaScript infinite loop
        
        * kjs/completion.h:
        (KJS::):
        Add Interrupted completion type.
        
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        (KJS::GlobalFuncImp::callAsFunction):
        Only set the exception on the new ExecState if the current one has had one.
        
        * kjs/interpreter.cpp:
        (KJS::TimeoutChecker::startTimeoutCheck):
        (KJS::TimeoutChecker::stopTimeoutCheck):
        (KJS::TimeoutChecker::alarmHandler):
        (KJS::TimeoutChecker::pauseTimeoutCheck):
        (KJS::TimeoutChecker::resumeTimeoutCheck):
        New TimeoutChecker class which handles setting Interpreter::m_timedOut flag after a given
        period of time. This currently only works on Unix platforms where setitimer and signals are used.
        
        (KJS::Interpreter::Interpreter):
        Initialize new member variables.
        
        (KJS::Interpreter::~Interpreter):
        Destroy the timeout checker.
        
        (KJS::Interpreter::startTimeoutCheck):
        (KJS::Interpreter::stopTimeoutCheck):
        (KJS::Interpreter::pauseTimeoutCheck):
        (KJS::Interpreter::resumeTimeoutCheck):
        Call the timeout checker.
        
        (KJS::Interpreter::handleTimeout):
        Called on timeout. Resets the m_timedOut flag and calls shouldInterruptScript.
        
        * kjs/interpreter.h:
        (KJS::Interpreter::setTimeoutTime):
        New function for setting the timeout time.
        
        (KJS::Interpreter::shouldInterruptScript):
        New function. The idea is that this should be overridden by subclasses in order to for example
        pop up a dialog asking the user if the script should be interrupted.
        
        (KJS::Interpreter::checkTimeout):
        New function which checks the m_timedOut flag and calls handleTimeout if it's set.
        
        * kjs/nodes.cpp:
        (DoWhileNode::execute):
        (WhileNode::execute):
        (ForNode::execute):
        Call Interpreter::checkTimeout after each iteration of the loop.

2006-06-15  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Geoff and Darin.
        
        Prefer the DWARF debugging symbols format for use in Xcode 2.3.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-06-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Beth.
        
        - fixed http://bugs.webkit.org/show_bug.cgi?id=9438
        Someone broke ToT: cannot build

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/runtime_root.h: Changed "Interpreter.h" to "interpreter.h"

2006-06-12  Geoffrey Garen  <ggaren@apple.com>

        build fix
        
        * bindings/objc/WebScriptObject.mm:
        (+[WebScriptObject throwException:]): Restore assignment I accidentally
        deleted in previous commit

2006-06-12  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by TimO, Maciej.
        
        - Merged InterpreterImp code into Interpreter, which implements
        all interpreter functionality now. This is part of my continuing quest
        to create an external notion of JS "execution context" that is unified and simple --
        something to replace the mix of Context, ContextImp, ExecState, Interpreter,
        InterpreterImp, and JSRun.
        
        All tests pass. Leaks test has not regressed from its baseline ~207 leaks
        with ~3460 leaked nodes.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/NP_jsobject.cpp:
        * bindings/objc/WebScriptObject.mm:
        (+[WebScriptObject throwException:]):
        * bindings/runtime_root.cpp:
        * bindings/runtime_root.h:
        * kjs/Context.cpp:
        (KJS::Context::Context):
        * kjs/ExecState.cpp: Added.
        (KJS::ExecState::lexicalInterpreter):
        * kjs/ExecState.h: Added.
        (KJS::ExecState::dynamicInterpreter):
        * kjs/SavedBuiltins.h: Added.
        * kjs/bool_object.cpp:
        (BooleanPrototype::BooleanPrototype):
        * kjs/collector.cpp:
        (KJS::Collector::collect):
        (KJS::Collector::numInterpreters):
        * kjs/context.h:
        * kjs/debugger.cpp:
        (Debugger::attach):
        (Debugger::detach):
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/function_object.cpp:
        (FunctionObjectImp::construct):
        * kjs/internal.cpp:
        * kjs/internal.h:
        * kjs/interpreter.cpp:
        (KJS::interpreterMap):
        (KJS::Interpreter::Interpreter):
        (KJS::Interpreter::init):
        (KJS::Interpreter::~Interpreter):
        (KJS::Interpreter::globalObject):
        (KJS::Interpreter::initGlobalObject):
        (KJS::Interpreter::globalExec):
        (KJS::Interpreter::checkSyntax):
        (KJS::Interpreter::evaluate):
        (KJS::Interpreter::builtinObject):
        (KJS::Interpreter::builtinFunction):
        (KJS::Interpreter::builtinArray):
        (KJS::Interpreter::builtinBoolean):
        (KJS::Interpreter::builtinString):
        (KJS::Interpreter::builtinNumber):
        (KJS::Interpreter::builtinDate):
        (KJS::Interpreter::builtinRegExp):
        (KJS::Interpreter::builtinError):
        (KJS::Interpreter::builtinObjectPrototype):
        (KJS::Interpreter::builtinFunctionPrototype):
        (KJS::Interpreter::builtinArrayPrototype):
        (KJS::Interpreter::builtinBooleanPrototype):
        (KJS::Interpreter::builtinStringPrototype):
        (KJS::Interpreter::builtinNumberPrototype):
        (KJS::Interpreter::builtinDatePrototype):
        (KJS::Interpreter::builtinRegExpPrototype):
        (KJS::Interpreter::builtinErrorPrototype):
        (KJS::Interpreter::builtinEvalError):
        (KJS::Interpreter::builtinRangeError):
        (KJS::Interpreter::builtinReferenceError):
        (KJS::Interpreter::builtinSyntaxError):
        (KJS::Interpreter::builtinTypeError):
        (KJS::Interpreter::builtinURIError):
        (KJS::Interpreter::builtinEvalErrorPrototype):
        (KJS::Interpreter::builtinRangeErrorPrototype):
        (KJS::Interpreter::builtinReferenceErrorPrototype):
        (KJS::Interpreter::builtinSyntaxErrorPrototype):
        (KJS::Interpreter::builtinTypeErrorPrototype):
        (KJS::Interpreter::builtinURIErrorPrototype):
        (KJS::Interpreter::mark):
        (KJS::Interpreter::interpreterWithGlobalObject):
        (KJS::Interpreter::saveBuiltins):
        (KJS::Interpreter::restoreBuiltins):
        * kjs/interpreter.h:
        (KJS::Interpreter::setCompatMode):
        (KJS::Interpreter::compatMode):
        (KJS::Interpreter::firstInterpreter):
        (KJS::Interpreter::nextInterpreter):
        (KJS::Interpreter::prevInterpreter):
        (KJS::Interpreter::debugger):
        (KJS::Interpreter::setDebugger):
        (KJS::Interpreter::setContext):
        (KJS::Interpreter::context):
        * kjs/nodes.cpp:
        (StatementNode::hitStatement):
        (RegExpNode::evaluate):
        * kjs/protect.h:

2006-06-12  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - Have *.lut.h files #include lookup.h to eliminate surprising header
        include order dependency.

        * DerivedSources.make:
        * kjs/array_object.cpp:
        * kjs/date_object.cpp:
        * kjs/date_object.h:
        (KJS::DateProtoFunc::):
        * kjs/lexer.cpp:
        * kjs/math_object.cpp:
        * kjs/number_object.cpp:
        * kjs/regexp_object.cpp:
        * kjs/string_object.cpp:

2006-06-10  Geoffrey Garen  <ggaren@apple.com>

        - http://bugs.webkit.org/show_bug.cgi?id=8515
        Linux porting compile bug
        
        Fix by Mike Emmel, Reviewed by Darin.

        * JavaScriptCoreSources.bkl:
        * jscore.bkl:
        * wtf/Platform.h:

2006-06-09  Geoffrey Garen  <ggaren@apple.com>

        Build fix -- I think :).

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/context.h:

2006-06-09  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Eric (yay!).
        
        - Removed Context wrapper for ContextImp, renamed ContextImp to Context,
        split Context into its own file -- Context.cpp -- renamed _var to m_var,
        change ' *' to '* '.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/Context.cpp: Added.
        (KJS::Context::Context):
        (KJS::Context::~Context):
        (KJS::Context::mark):
        * kjs/context.h:
        (KJS::Context::scopeChain):
        (KJS::Context::variableObject):
        (KJS::Context::setVariableObject):
        (KJS::Context::thisValue):
        (KJS::Context::callingContext):
        (KJS::Context::activationObject):
        (KJS::Context::currentBody):
        (KJS::Context::function):
        (KJS::Context::arguments):
        (KJS::Context::pushScope):
        (KJS::Context::seenLabels):
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        (KJS::FunctionImp::processParameters):
        (KJS::FunctionImp::argumentsGetter):
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/internal.cpp:
        (KJS::InterpreterImp::evaluate):
        * kjs/internal.h:
        (KJS::InterpreterImp::setContext):
        (KJS::InterpreterImp::context):
        * kjs/interpreter.cpp:
        * kjs/interpreter.h:
        (KJS::ExecState::context):
        (KJS::ExecState::ExecState):
        * kjs/nodes.cpp:
        (currentSourceId):
        (currentSourceURL):
        (ThisNode::evaluate):
        (ResolveNode::evaluate):
        (FunctionCallResolveNode::evaluate):
        (PostfixResolveNode::evaluate):
        (DeleteResolveNode::evaluate):
        (TypeOfResolveNode::evaluate):
        (PrefixResolveNode::evaluate):
        (AssignResolveNode::evaluate):
        (VarDeclNode::evaluate):
        (VarDeclNode::processVarDecls):
        (DoWhileNode::execute):
        (WhileNode::execute):
        (ForNode::execute):
        (ForInNode::execute):
        (ContinueNode::execute):
        (BreakNode::execute):
        (ReturnNode::execute):
        (WithNode::execute):
        (SwitchNode::execute):
        (LabelNode::execute):
        (TryNode::execute):
        (FuncDeclNode::processFuncDecl):
        (FuncExprNode::evaluate):

2006-06-07  Geoffrey Garen  <ggaren@apple.com>

        Removed API directory I prematurely/accidentally added.

        * API: Removed.

2006-06-05  Mitz Pettel  <opendarwin.org@mitzpettel.com>

        Reviewed and landed by Geoff.

        - fix a regression in ecma_3/String/regress-104375.js

        * kjs/string_object.cpp:
        (substituteBackreferences): If a 2-digit back reference is out of range,
        parse it as a 1-digit reference (followed by the other digit). This matches
        Firefox's behavior.

2006-06-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed By Maciej.
        Darin already reviewed this change on the branch. See <rdar://problem/4317701>.
        
        - Fixed <rdar://problem/4291345> PCRE overflow in Safari JavaScriptCore

        No test case because there's no behavior change.
        
        * pcre/pcre_compile.c:
        (read_repeat_counts): Check for integer overflow / out of bounds

2006-06-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by aliu.

        - Changed CString length from int to size_t. We sould probably do this
        for UString, too. (Darin, if you're reading this: Maciej said so.)
        
        * kjs/function.cpp:
        (KJS::encode):
        * kjs/ustring.cpp:
        (KJS::CString::CString):
        (KJS::operator==):
        * kjs/ustring.h:
        (KJS::CString::size):

2006-06-04  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - http://bugs.webkit.org/show_bug.cgi?id=9304
        Minor cleanup in JavaScriptCore

        * kjs/value.h: Removed redundant declarations

2006-06-04  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - changed deleteAllValues so it can work on "const" collections
          Deleting the values affects the values, not the pointers in the
          collection, so it's legitimate to do it to a const collection,
          and a case of that actually came up in the XPath code.

        * wtf/HashMap.h:
        (WTF::deleteAllPairSeconds): Use const iterators.
        (WTF::deleteAllValues): Take const HashMap reference as a parameter.
        * wtf/HashSet.h:
        (WTF::deleteAllValues): Take const HashSet reference as a parameter,
        and use const iterators.
        * wtf/Vector.h:
        (WTF::deleteAllValues): Take const Vector reference as a parameter.

        - added more functions that are present in <math.h> on some platforms,
          but not on others; moved here from various files in WebCore

        * wtf/MathExtras.h:
        (isinf): Added.
        (isnan): Added.
        (lround): Added.
        (lroundf): Tweaked.
        (round): Added.
        (roundf): Tweaked.
        (signbit): Added.

2006-06-02  Mitz Pettel  <opendarwin.org@mitzpettel.com>

        Reviewed by ggaren.

        - http://bugs.webkit.org/show_bug.cgi?id=9234
          Implement $&, $' and $` replacement codes in String.prototype.replace

        Test: fast/js/string-replace-3.html

        * kjs/string_object.cpp:
        (substituteBackreferences): Added support for $& (matched substring),
        $` (everything preceding matched substring), $' (everything following
        matched substring) and 2-digit back references, and cleaned up a little.

2006-06-02 Adele Peterson  <adele@apple.com>

        Reviewed by Darin.

        Set incremental linking to no. This seems to fix a build problem I was seeing
        where dftables couldn't find a dll. 

        * JavaScriptCore.vcproj/dftables/dftables.vcproj:

2006-05-26  Steve Falkenburg  <sfalken@apple.com>

        Build fixes/tweaks

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

=== JavaScriptCore-521.11 ===

2006-05-24  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by mjs.
        
        - JSC half of fix for <rdar://problem/4557926> TOT REGRESSSION: Crash
        occurs when attempting to view image in slideshow mode at
        http://d.smugmug.com/gallery/581716 ( KJS::IfNode::execute
        (KJS::ExecState*) + 312)

        On alternate threads, DOMObjects remain in the
        ScriptInterpreter's cache because they're not collected. So, they
        need an opportunity to mark their children.
        
        I'm not particularly happy with this solution because it fails to
        resolve many outstanding issues with the DOM object cache. Since none
        of those issues is a crasher or a serious compatibility concern,
        and since the behavior of other browsers is not much to go on in this
        case, I've filed <rdar://problem/4561439> about that, and I'm moving on 
        with my life.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/collector.cpp:
        (KJS::Collector::collect):
        * kjs/internal.cpp:
        (KJS::InterpreterImp::mark):
        * kjs/internal.h:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::mark):
        * kjs/interpreter.h:

=== JavaScriptCore-521.10 ===

2006-05-22  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Eric, Kevin and Geoff.

        Merge open source build fixes. <rdar://problem/4555500>

        * kjs/collector.cpp: look at the rsp register in x86_64 
        (KJS::Collector::markOtherThreadConservatively):
        * wtf/Platform.h: add x86_64 to the platform list

2006-05-19  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Geoff.

        http://bugs.webkit.org/show_bug.cgi?id=8993
        Support function declaration in case statements
        
        * kjs/grammar.y: Get rid of StatementList and use SourceElements instead.
        
        * kjs/nodes.cpp:
        (CaseClauseNode::evalStatements):
        (CaseClauseNode::processVarDecls):
        (CaseClauseNode::processFuncDecl):
        (ClauseListNode::processFuncDecl):
        (CaseBlockNode::processFuncDecl):
        (SwitchNode::processFuncDecl):
        * kjs/nodes.h:
        (KJS::CaseClauseNode::CaseClauseNode):
        (KJS::ClauseListNode::ClauseListNode):
        (KJS::ClauseListNode::getClause):
        (KJS::ClauseListNode::getNext):
        (KJS::ClauseListNode::releaseNext):
        (KJS::SwitchNode::SwitchNode):
        Add processFuncDecl for the relevant nodes.        

        * kjs/nodes2string.cpp:
        (CaseClauseNode::streamTo):
        next got renamed to source.

2006-05-17  George Staikos <staikos@kde.org>

        Reviewed by Maciej, Alexey, and Eric.

        * pcre/pcre_compile.c:
        * pcre/pcre_get.c:
        * pcre/pcre_exec.c:
        * wtf/UnusedParam.h:
        Use /**/ in .c files to compile with non-C99 and non-GCC compilers.

        * kjs/testkjs.cpp:
        Change include to <wtf/HashTraits.h> from "HashTraits.h" to avoid -I

        * wtf/unicode/qt4/UnicodeQt4.h:
        Use correct parentheses and correct mask for utf-32 support.

2006-05-17  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=8870
        Crash typing in Yahoo auto-complete widget.

        Test: fast/js/regexp-stack-overflow.html

        * pcre/pcre-config.h: Define NO_RECURSE.

2006-05-16  George Staikos <staikos@kde.org>

        Reviewed by Maciej.

        Fix some warnings and strict compilation errors.

        * kjs/nodes.cpp: 
        * kjs/value.cpp: 

2006-05-15  Alexey Proskuryakov  <ap@nypop.com>

        * make-generated-sources.sh: Changed to be executable and removed
        text in the file generated by "svn diff".

2006-05-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.

        - Fixed <rdar://problem/4534904> please do not treat "debugger" as
        a reserved word while parsing JavaScript (and other ECMA reserved
        words) 

        AKA 

        http://bugs.webkit.org/show_bug.cgi?id=6179 
        We treat "char" as a reserved word in JavaScript and firefox/IE do
        not

        (1) I unreserved most of the spec's "future reserved words" because 
        they're not reserved in IE or FF. (Most, but not all, because IE
        somewhat randomly *does* reserve a few of them.)
        (2) I made 'debugger' a legitimate statement that acts like an empty
        statement because FF and IE support it.
        
        * kjs/grammar.y:
        * kjs/keywords.table:

2006-05-15  Tim Omernick  <timo@apple.com>

        Reviewed by John Sullivan.

        Part of <rdar://problem/4466508> Add 64-bit support to the Netscape Plugin API

        Added to the Netscape Plugin API the concept of "plugin drawing models".  The drawing model
        determines the kind of graphics context created by the browser for the plugin, as well as 
        the Mac types of various Netscape Plugin API data structures.

        There is a drawing model to represent the old QuickDraw-based API.  It is used by default
        if QuickDraw is available on the system, unless the plugin specifies another drawing model.

        The big change is the addition of the CoreGraphics drawing model.  A plugin may request this
        drawing model to obtain access to a CGContextRef for drawing, instead of a QuickDraw CGrafPtr.

        * bindings/npapi.h:
        Define NP_NO_QUICKDRAW when compiling 64-bit; there is no 64-bit QuickDraw.
        Added NPNVpluginDrawingModel, NPNVsupportsQuickDrawBool, and NPNVsupportsCoreGraphicsBool
        variables.
        Added NPDrawingModel enumeration.  Currently the only drawing models are QuickDraw and
        CoreGraphics.
        NPRegion's type now depends on the drawing model specified by the plugin.
        NP_Port is now only defined when QuickDraw is available.
        Added NP_CGContext, which is the type of the NPWindow's "window" member in CoreGraphics mode.

2006-05-13  Kevin M. Ollivier  <kevino@theolliviers.com>

        Reviewed by Darin, landed by ap.

        - http://bugs.webkit.org/show_bug.cgi?id=8528
          Bakefiles (and generated Makefiles) for wx and gdk ports

        * make-generated-sources.sh: 
        Added script to configure environment to run DerivedSources.make
        
        * JavaScriptCoreSources.bkl:
        Added JavaScriptCore sources list for Bakefile.
        
        * jscore.bkl:
        Bakefile used to generate JavaScriptCore project files 
        (currently only used by wx and gdk ports)

2006-05-09  Steve Falkenburg  <sfalken@apple.com>

        Fix Windows build.
        Minor fixes to WTF headers.
        
        Reviewed by kevin.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Fix include dirs, paths to files. 
        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Fix include dirs.
        * wtf/Assertions.h: include Platform.h to get definition for COMPILER()
        * wtf/Vector.h: include FastMalloc.h for definition of fastMalloc, fastFree

2006-05-09  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Anders.
        
        - renamed kxmlcore to wtf
        
        kxmlcore --> wtf
        KXMLCore --> WTF
        KXC --> WTF

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/c/c_instance.cpp:
        * bindings/objc/WebScriptObject.mm:
        * kjs/JSImmediate.h:
        * kjs/Parser.cpp:
        * kjs/Parser.h:
        * kjs/array_object.cpp:
        * kjs/collector.cpp:
        (KJS::Collector::registerThread):
        * kjs/collector.h:
        * kjs/config.h:
        * kjs/function.cpp:
        (KJS::isStrWhiteSpace):
        * kjs/function.h:
        * kjs/identifier.cpp:
        * kjs/internal.cpp:
        * kjs/internal.h:
        * kjs/lexer.cpp:
        (Lexer::shift):
        (Lexer::isWhiteSpace):
        (Lexer::isIdentStart):
        (Lexer::isIdentPart):
        * kjs/lookup.cpp:
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/number_object.cpp:
        * kjs/object.h:
        * kjs/property_map.cpp:
        * kjs/property_map.h:
        * kjs/string_object.cpp:
        (StringProtoFunc::callAsFunction):
        * kjs/testkjs.cpp:
        (testIsInteger):
        * kjs/ustring.cpp:
        * kjs/ustring.h:
        * kxmlcore: Removed.
        * kxmlcore/AlwaysInline.h: Removed.
        * kxmlcore/Assertions.cpp: Removed.
        * kxmlcore/Assertions.h: Removed.
        * kxmlcore/FastMalloc.cpp: Removed.
        * kxmlcore/FastMalloc.h: Removed.
        * kxmlcore/FastMallocInternal.h: Removed.
        * kxmlcore/Forward.h: Removed.
        * kxmlcore/HashCountedSet.h: Removed.
        * kxmlcore/HashFunctions.h: Removed.
        * kxmlcore/HashMap.h: Removed.
        * kxmlcore/HashSet.h: Removed.
        * kxmlcore/HashTable.cpp: Removed.
        * kxmlcore/HashTable.h: Removed.
        * kxmlcore/HashTraits.h: Removed.
        * kxmlcore/ListRefPtr.h: Removed.
        * kxmlcore/Noncopyable.h: Removed.
        * kxmlcore/OwnArrayPtr.h: Removed.
        * kxmlcore/OwnPtr.h: Removed.
        * kxmlcore/PassRefPtr.h: Removed.
        * kxmlcore/Platform.h: Removed.
        * kxmlcore/RefPtr.h: Removed.
        * kxmlcore/TCPageMap.h: Removed.
        * kxmlcore/TCSpinLock.h: Removed.
        * kxmlcore/TCSystemAlloc.cpp: Removed.
        * kxmlcore/TCSystemAlloc.h: Removed.
        * kxmlcore/UnusedParam.h: Removed.
        * kxmlcore/Vector.h: Removed.
        * kxmlcore/VectorTraits.h: Removed.
        * kxmlcore/unicode: Removed.
        * kxmlcore/unicode/Unicode.h: Removed.
        * kxmlcore/unicode/UnicodeCategory.h: Removed.
        * kxmlcore/unicode/icu: Removed.
        * kxmlcore/unicode/icu/UnicodeIcu.h: Removed.
        * kxmlcore/unicode/posix: Removed.
        * kxmlcore/unicode/qt3: Removed.
        * kxmlcore/unicode/qt4: Removed.
        * kxmlcore/unicode/qt4/UnicodeQt4.h: Removed.
        * pcre/pcre_get.c:
        * wtf: Added.
        * wtf/Assertions.cpp:
        * wtf/Assertions.h:
        * wtf/FastMalloc.cpp:
        (WTF::TCMalloc_ThreadCache::Scavenge):
        (WTF::do_malloc):
        (WTF::do_free):
        (WTF::TCMallocGuard::TCMallocGuard):
        (WTF::malloc):
        (WTF::free):
        (WTF::calloc):
        (WTF::cfree):
        (WTF::realloc):
        * wtf/FastMalloc.h:
        * wtf/FastMallocInternal.h:
        * wtf/Forward.h:
        * wtf/HashCountedSet.h:
        * wtf/HashFunctions.h:
        * wtf/HashMap.h:
        * wtf/HashSet.h:
        * wtf/HashTable.cpp:
        * wtf/HashTable.h:
        * wtf/HashTraits.h:
        * wtf/ListRefPtr.h:
        * wtf/Noncopyable.h:
        * wtf/OwnArrayPtr.h:
        * wtf/OwnPtr.h:
        * wtf/PassRefPtr.h:
        * wtf/RefPtr.h:
        * wtf/TCSystemAlloc.cpp:
        (TCMalloc_SystemAlloc):
        * wtf/Vector.h:
        * wtf/VectorTraits.h:
        * wtf/unicode/UnicodeCategory.h:
        * wtf/unicode/icu/UnicodeIcu.h:

2006-05-08  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Tim O.

        * bindings/npapi.h: do not define #pragma options align=mac68k if we are 64-bit

2006-05-07  Darin Adler  <darin@apple.com>

        Reviewed and landed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=8765
        Random crashes on TOT since the form state change
        
        I haven't figured out how to construct a test for this, but this does seem to fix the
        problem; Mitz mentioned that a double-destroy was occurring in these functions.
        
        * kxmlcore/HashMap.h: (KXMLCore::HashMap::remove): Use RefCounter::deref instead of calling
        ~ValueType, because ~ValueType often results in a double-destroy, since the HashTable also
        destroys the element based on the storage type. The RefCounter template correctly does work
        only in cases where ValueType and ValueStorageType differ and this class is what's used
        elsewhere for the same purpose; I somehow missed this case when optimizing HashMap.
        * kxmlcore/HashSet.h: (KXMLCore::HashSet::remove): Ditto.
        
2006-05-05  Darin Adler  <darin@apple.com>

        - http://bugs.webkit.org/show_bug.cgi?id=8722
          IE compatibility fix in date parsing

        * kjs/date_object.cpp: (KJS::parseDate): Merged change that George Staikos provided
        from KDE 3.4.3 branch that allows day values of 0 and values that are > 1000.

2006-05-04  Anders Carlsson  <andersca@mac.com>

        Reviewed by Maciej.

        http://bugs.webkit.org/show_bug.cgi?id=8734
        Would like a Vector::append that takes another Vector
        
        * kxmlcore/Vector.h:
        (KXMLCore::::append):
        New function that takes another array.

2006-05-02  Steve Falkenburg  <sfalken@apple.com>

        Reviewed by eric.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: set NDEBUG for release build
        * kxmlcore/FastMalloc.cpp: Prevent USE_SYSTEM_MALLOC from being defined twice

2006-05-02  Anders Carlsson  <andersca@mac.com>

        Reviewed by Maciej.

        * kxmlcore/HashMap.h:
        (KXMLCore::::operator):
        Return *this

2006-05-01  Tim Omernick  <timo@apple.com>

        Reviewed by Tim Hatcher.

        <rdar://problem/4476875> Support printing for embedded Netscape plugins

        * bindings/npapi.h:
        Fixed struct alignment problem in our npapi.h.  Structs must be 68k-aligned on both pre-Mac OS X
        and Mac OS X systems, as this is what plugins expect.

2006-05-01  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Maciej.
        
        <rdar://problem/4308243> 8F36 Regression: crash in malloc_consolidate if you use a .PAC file

        The original fix missed the oversized cell case. Added a test for "currentThreadIsMainThread || 
        imp->m_destructorIsThreadSafe" where we collect oversized cells.

        We don't have a way to test PAC files yet, so there's no test attached.

        * kjs/collector.cpp:
        (KJS::Collector::collect): test the thread when we collect oversized cells

2006-05-01  Tim Omernick  <timo@apple.com>

        Reviewed by Adele.

        <rdar://problem/4526114> REGRESSION (two days ago): LOG() just prints @ for NSObject substitutions

        * kxmlcore/Assertions.cpp:
        Changed sense of strstr("%@") check.  I already made the same fix to the WebBrowser assertions.

2006-04-28  Steve Falkenburg  <sfalken@apple.com>

        Reviewed by kdecker
        
        Actually apply the change that was reviewed insted of checking it in with an #if 0 (oops).

        * kjs/testkjs.cpp:
        (main): Suppress C runtime alerts

2006-04-28  Steve Falkenburg  <sfalken@apple.com>

        Reviewed by kdecker

        Suppress error reporting dialog that blocks Javascript tests from completing.
        
        Real error is due to an overflow in the date/time handling functions that needs
        to be addressed, but this will prevent the hang running the Javascript tests
        on the build bot (along with the related changes).
        
        * kjs/testkjs.cpp:
        (main): Suppress C runtime alerts

2006-04-27  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej

        - Minor fixups I discovered while working on the autogenerator.
        
        * kjs/lookup.cpp:
        (findEntry): ASSERT that size is not 0, because otherwise we'll % by 0,
        compute a garbage address, and possibly crash.
        * kjs/lookup.h:
        (cacheGlobalObject): Don't enumerate cached objects -- ideally, they
        would be hidden entirely.

2006-04-21  Kevin M. Ollivier  <kevino@theolliviers.com>

        Reviewed by Darin.

        - http://bugs.webkit.org/show_bug.cgi?id=8507
          Compilation fixes for building on gcc 4.0.2, and without precomp headers

        * kjs/operations.h:
        * kxmlcore/Assertions.cpp:
        * kxmlcore/FastMalloc.cpp:
        Added necessary headers to resolve compilation issues when not using
        precompiled headers.
        
        * kjs/value.h: Declare the JSCell class before friend declaration  
        to resolve compilation issues with gcc 4.0.2.
        
        * kxmlcore/Platform.h: Set Unicode support to use ICU on platforms
        other than KDE (previously only defined for Win and Mac OS)
                
2006-04-18  Eric Seidel  <eseidel@apple.com>

        Reviewed by ggaren.

        Fix "new Function()" to correctly use lexical scoping.
        Add ScopeChain::print() function for debugging.
        <rdar://problem/4067864> REGRESSION (125-407): JavaScript failure on PeopleSoft REN Server

        * kjs/function_object.cpp:
        (FunctionObjectImp::construct):
        * kjs/scope_chain.cpp:
        (KJS::ScopeChain::print):
        * kjs/scope_chain.h:

2006-04-14  James G. Speth  <speth@end.com>

        Reviewed by Timothy.

        Bug 8389: support for Cocoa bindings - binding an NSTreeController to the WebView's DOM
        http://bugs.webkit.org/show_bug.cgi?id=8389

        Adds a category to WebScriptObject with array accessors for KVC/KVO.

        If super valueForKey: fails it will call valueForUndefinedKey:, which is
        important because it causes the right behavior to happen with bindings using
        the "Raises for Not Applicable Keys" flag and the "Not Applicable Placeholder"

        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject count]):
        (-[WebScriptObject objectAtIndex:]):
        (-[WebUndefined description]): return "undefined"

2006-04-13  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        * kjs/internal.cpp:
        (KJS::InterpreterImp::initGlobalObject): Add the built-in object
        prototype to the end of the global object's prototype chain instead of
        just blowing away its existing prototype. We need to do this because
        the window object has a meaningful prototype now.

2006-04-13  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.
        
        - fix testkjs to not show false-positive KJS::Node leaks in debug builds

        * kjs/testkjs.cpp:
        (doIt):
        (kjsmain):

2006-04-11  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.

        Minor code cleanup -- passes all the JS tests.

        * kjs/object_object.cpp:
        (ObjectObjectImp::construct):
        (ObjectObjectImp::callAsFunction):

2006-04-11  Darin Adler  <darin@apple.com>

        - another attempt to fix Windows build -- Vector in Forward.h was not working

        * kxmlcore/Forward.h: Remove Vector.
        * kxmlcore/Vector.h: Add back default arguments, remove include of
        Forward.h.

2006-04-11  Darin Adler  <darin@apple.com>

        - try to fix Windows build -- HashForward.h was not working

        * kxmlcore/HashForward.h: Removed.

        * JavaScriptCore.xcodeproj/project.pbxproj: Remove HashForward.h.
        * kjs/collector.h: Remove use of HashForward.h.
        * kxmlcore/HashCountedSet.h: Remove include of HashForward.h, restore
        default arguments.
        * kxmlcore/HashMap.h: Ditto.
        * kxmlcore/HashSet.h: Ditto.

2006-04-11  David Harrison  <harrison@apple.com>

        Reviewed by Darin.

        - fixed clean build, broken by Darin's check-in

        * kjs/date_object.cpp: Add needed include of lookup.h.
        * kjs/regexp_object.cpp: Move include of .lut.h file below other includes.

2006-04-10  Darin Adler  <darin@apple.com>

        Rubber-stamped by John Sullivan.

        - switched from a shell script to a makefile for generated files
        - removed lots of unneeded includes
        - added new Forward.h and HashForward.h headers that allow compiling with
          fewer unneeded templates

        * DerivedSources.make: Added.
        * generate-derived-sources: Removed.
        * JavaScriptCore.xcodeproj/project.pbxproj: Added new files, changed to use
        DerivedSources.make.

        * kxmlcore/Forward.h: Added.
        * kxmlcore/HashForward.h: Added.

        * kxmlcore/HashCountedSet.h: Include HashForward for default args.
        * kxmlcore/HashMap.h: Ditto.
        * kxmlcore/HashSet.h: Ditto.

        * kjs/object.h:
        * kjs/object.cpp:
        Moved KJS_MAX_STACK into the .cpp file.

        * bindings/NP_jsobject.cpp:
        * bindings/c/c_instance.h:
        * bindings/jni/jni_class.h:
        * bindings/jni/jni_runtime.h:
        * bindings/jni/jni_utility.h:
        * bindings/objc/WebScriptObject.mm:
        * bindings/objc/WebScriptObjectPrivate.h:
        * bindings/objc/objc_class.h:
        * bindings/objc/objc_class.mm:
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        * bindings/objc/objc_runtime.mm:
        * bindings/objc/objc_utility.mm:
        * bindings/runtime.h:
        * bindings/runtime_array.cpp:
        * bindings/runtime_array.h:
        * bindings/runtime_method.cpp:
        * bindings/runtime_method.h:
        * bindings/runtime_object.cpp:
        * bindings/runtime_root.h:
        * kjs/JSImmediate.cpp:
        * kjs/Parser.h:
        * kjs/array_object.cpp:
        * kjs/array_object.h:
        * kjs/bool_object.cpp:
        * kjs/bool_object.h:
        * kjs/collector.h:
        * kjs/context.h:
        * kjs/debugger.cpp:
        * kjs/error_object.h:
        * kjs/function_object.h:
        * kjs/internal.h:
        * kjs/lexer.cpp:
        * kjs/math_object.cpp:
        * kjs/math_object.h:
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/number_object.cpp:
        * kjs/number_object.h:
        * kjs/object_object.cpp:
        * kjs/operations.cpp:
        * kjs/protected_reference.h:
        * kjs/reference.h:
        * kjs/reference_list.h:
        * kjs/regexp_object.h:
        * kjs/string_object.cpp:
        * kjs/string_object.h:
        * kjs/testkjs.cpp:
        * kjs/value.cpp:
        * kjs/value.h:
        * kxmlcore/HashTable.h:
        * kxmlcore/ListRefPtr.h:
        * kxmlcore/TCPageMap.h:
        * kxmlcore/Vector.h:
        Removed unneeded header includes.

2006-04-09  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by eric.

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=8284
        prevent unnecessary entries in the "nodes with extra refs" hash table

        This patch switches manually RefPtr exchange with use of
        RefPtr::release to ensure that a node's ref count never tops 1
        (in the normal case).

        * kjs/nodes.cpp:
        (BlockNode::BlockNode):
        (CaseBlockNode::CaseBlockNode):
        * kjs/nodes.h:
        (KJS::ArrayNode::ArrayNode):
        (KJS::ObjectLiteralNode::ObjectLiteralNode):
        (KJS::ArgumentsNode::ArgumentsNode):
        (KJS::VarStatementNode::VarStatementNode):
        (KJS::ForNode::ForNode):
        (KJS::CaseClauseNode::CaseClauseNode):
        (KJS::FuncExprNode::FuncExprNode):
        (KJS::FuncDeclNode::FuncDeclNode):

2006-04-08  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Darin.

        One more attempt - use reinterpret_cast, rather than static_cast.

2006-04-08  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Darin.

        An attempt to fix Win32 build - ICU uses wchar_t on Windows, so we need a type cast.

        * kxmlcore/unicode/icu/UnicodeIcu.h:
        (KXMLCore::Unicode::toLower):
        (KXMLCore::Unicode::toUpper):

2006-04-08  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=8264
        toLowerCase and toUpperCase don't honor special mappings

        Test: fast/js/string-capitalization.html

        * JavaScriptCore.xcodeproj/project.pbxproj: Added KXMLCore::Unicode headers to the project.
        * icu/unicode/putil.h: Added (copied from WebCore).
        * icu/unicode/uiter.h: Ditto.
        * icu/unicode/ustring.h: Ditto.
        * kjs/string_object.cpp:
        (StringProtoFunc::callAsFunction): Use the new KXMLCore::Unicode::toUpper() and toLower().
        * kjs/ustring.cpp: Removed unused (and evil) UChar::toLower() and toUpper().
        * kjs/ustring.h: Ditto.

        * kxmlcore/unicode/Unicode.h: Corrected capitalization of the word Unicode.
        * kxmlcore/unicode/UnicodeCategory.h: Renamed include guard macro to match file name.

        * kxmlcore/unicode/icu/UnicodeIcu.h:
        (KXMLCore::Unicode::toLower): Work on strings, not individual characters. Use ICU root locale.
        (KXMLCore::Unicode::toUpper): Ditto.
        (KXMLCore::Unicode::isFormatChar): Use int32_t, which can hold a complete code point.
        (KXMLCore::Unicode::isSeparatorSpace): Ditto.
        (KXMLCore::Unicode::category): Ditto.
        * kxmlcore/unicode/qt4/UnicodeQt4.h:
        (KXMLCore::Unicode::toLower): Work on strings, not individual characters.
        (KXMLCore::Unicode::toUpper): Ditto.
        (KXMLCore::Unicode::isFormatChar): Use int32_t, which can hold a complete code point.
        (KXMLCore::Unicode::isSeparatorSpace): Ditto.
        (KXMLCore::Unicode::category): Ditto.

        * tests/mozilla/ecma/String/15.5.4.12-1.js: Corrected expected results.
        * tests/mozilla/ecma/String/15.5.4.12-5.js: Corrected expected results.

2006-04-05  Darin Adler  <darin@apple.com>

        - attempt to fix Windows build

        * kxmlcore/HashMap.h: (KXMLCore::HashMap::remove): Use (*it). instead of it->.
        * kxmlcore/HashSet.h: (KXMLCore::HashSet::remove): Ditto.

2006-04-05  Darin Adler  <darin@apple.com>

        - attempt to fix Windows build

        * os-win32/stdint.h: Add int8_t, uint8_t, int64_t.

2006-04-05  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix memory leak introduced by the previous change

        * kxmlcore/HashTable.h: Specialize NeedsRef so that it correctly returns true when
        the value in question is a pair where one of the pair needs a ref and the other
        of the pair does not.

2006-04-05  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - JavaScriptCore part of fix for http://bugs.webkit.org/show_bug.cgi?id=8049
          StringImpl hash traits deleted value creates an init routine for WebCore
          <rdar://problem/4442248> REGRESSION: WebCore has init routines (8049)

        Change HashMap and HashSet implementation so they fold various types together.
        This allows us to implement maps and sets that use RefPtr<WebCore::StringImpl>
        and WebCore::String in terms of the underlying raw pointer type, and hence use
        -1 for the deleted value.

        * kxmlcore/HashTraits.h: Added a new type to HashTraits, StorageTraits, which is a
        type to be used when storing a value that has the same layout as the type itself.
        This is used only for non-key cases. In the case of keys, the hash function must also
        be considered. Moved emptyValue out of GenericHashTraitsBase into GenericHashTraits.
        Added a new bool to HashTraits, needsRef, which indicates whether the type needs
        explicit reference counting. If the type itself has needsRef true, but the storage
        type has needsRef false, then the HashSet or HashMap has to handle the reference
        counting explicitly. Added hash trait specializations for all signed integer values
        that give -1 as the deleted value. Gave all integers StorageTraits of the canonical
        integer type of the same size so int and long will share code. Gave all pointers and
        RefPtrs StorageTraits of the appropriately sized integer type. Removed redundant
        TraitType and emptyValue definitions in the pointer specialization for HashTraits.
        Added PairBaseHashTraits, which doesn't try to set up needsDestruction and deletedValue.
        Useful for types where we don't want to force the existence of deletedValue, such as
        the type of a pair in a HashMap which is not the actual storage type. Removed an
        unneeded parameter from the DeletedValueAssigner template. Added HashKeyStorageTraits
        template, which determines what type can be used to store a given hash key type with
        a given hash function, and specialized it for pointers and RefPtr so that pointer
        hash tables share an underlying HashTable that uses IntHash.

        * kxmlcore/HashTable.h: Added HashTableConstIteratorAdapter, HashTableIteratorAdapter,
        NeedsRef, RefCountManagerBase, RefCountManager, HashTableRefCountManagerBase, and
        HashTableRefCountManager. All are used by both HashSet and HashMap to handle hash
        tables where the type stored is not the same as the real value type.
        
        * kxmlcore/HashFunctions.h: Added a new struct named IntTypes that finds an
        integer type given a sizeof value. Renamed pointerHash to intHash and made it
        use overloading and take integer parameters. Added an IntHash struct which is
        a hash function that works for integers. Changed PtrHash to call IntHash with
        an appropriately sized integer. Made IntHash the default hash function for
        many integer types. Made PtrHash the default hash function for RefPtr as well
        as for raw pointers.

        * kxmlcore/HashSet.h: Changed implementation to use a separate "storage type"
        derived from the new traits. The HashTable will use the storage type and all
        necessary translation and ref/deref is done at the HashSet level. Also reorganized
        the file so that the HashSet is at the top and has no inline implementation inside
        it so it's easy to read the interface to HashSet.

        * kxmlcore/HashMap.h: Changed implementation to use a separate "storage type"
        derived from the new traits. The HashTable will use the storage type and all
        necessary translation and ref/deref is done at the HashMap level. Also reorganized
        the file so that the HashMap is at the top and has no inline implementation inside
        it so it's easy to read the interface to HashMap.

        * kxmlcore/HashMapPtrSpec.h: Removed. Superceded by optimizations in HashMap itself.

        * JavaScriptCore.xcodeproj/project.pbxproj: Remove HashMapPtrSpec.h, resort files,
        and also remove some unnecessary build settings from the aggregate target that
        generates derived sources.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto.

2006-04-04  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin.

        The Debug and Release frameworks are now built with install paths relative to the build products directory.
        This removes the need for other projects to build with -framework WebCore and -framework JavaScriptCore. 

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-04-04  Eric Seidel  <eseidel@apple.com>

        Reviewed by ggaren.

        Fix win32 build.
        Disable ASSERT redefinition warnings for now.

        * JavaScriptCore.vcproj/testkjs/testkjs.vcproj:
        * kxmlcore/Assertions.h:

2006-04-04  Bjrn Graf  <bjoern.graf@gmail.com>

        Reviewed by ggaren & darin.  Landed by eseidel.

        Integrate CURL version of gettimeofday
        http://bugs.webkit.org/show_bug.cgi?id=7399
        Disable crash report dialogs for testkjs.exe in Release mode
        http://bugs.webkit.org/show_bug.cgi?id=8113

        * kjs/testkjs.cpp:
        (StopWatch::start):
        (StopWatch::stop):
        (StopWatch::getElapsedMS):
        (main):
        (kjsmain):

2006-04-04  Eric Seidel  <eseidel@apple.com>

        Reviewed by mjs.

        * kjs/number_object.cpp:
        (NumberProtoFunc::callAsFunction): remove trunc() to fix win32.

2006-03-12  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - fixed "toPrecision sometimes messes up the last digit on intel Macs"
        http://bugs.webkit.org/show_bug.cgi?id=7748

        * kjs/number_object.cpp:
        (intPow10): Compute integer powers of 10 using exponentiation by squaring.
        (NumberProtoFunc::callAsFunction): Use intPow10(n) in place of all pow(10.0, n),
        plus a bit of refactoring.

2006-04-03  Darin Adler  <darin@apple.com>

        - tweak config.h and Platform.h to try to get buildbot working
          (making some small changes at the same time)

        * kjs/config.h: Removed now-unneeded HAVE_ICU.
        * kxmlcore/Platform.h: Tweak how platform gets set up. Move all the
        USE stuff to the end.

2006-04-03  George Staikos   <staikos@opensource.apple.com>

        Reviewed by Maciej.

        Fix Win32 build breakage from previous commit, remove unused forward.

2006-04-03  George Staikos   <staikos@opensource.apple.com>

        Reviewed by Maciej.

        Implement a unicode abstraction layer to make JavaScriptCore much more
        easily ported to other platforms without having to take in libicu.  Also
        makes the unicode related code easier to understand.

2006-04-03  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Adele.

        Fixes <rdar://problem/4498338> JavaScriptCore fails to compile for ppc64
        Other 64 bit build fixes.

        * kjs/collector.cpp:
        (KJS::Collector::markOtherThreadConservatively): test for __DARWIN_UNIX03 and use __r1
        * kjs/dtoa.cpp:
        (Bigint::): cast PRIVATE_mem to unsigned to prevent warning
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::getJavaVM): cast jniError to long to prevent format warning
        (KJS::Bindings::getJNIEnv): cast jniError to long to prevent format warning
        * bindings/runtime_root.cpp:
        (KJS::Bindings::addNativeReference): cast CFDictionaryGetValue to unsigned long to prevent warning
        (KJS::Bindings::removeNativeReference): cast CFDictionaryGetValue to unsigned long to prevent warning

2006-03-31  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - <rdar://problem/4395622> API: WebScriptObject.h incorrectly reports that -isSelectorExcludedFromWebScript returns NO by default

        * bindings/objc/WebScriptObject.h: Fixed comment.

2006-03-31  Eric Seidel  <eseidel@apple.com>

        Reviewed by mjs.

        A bit more code cleanup.

        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertValueToNPVariant):
        * bindings/objc/objc_runtime.mm:
        (convertValueToObjcObject):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        * kjs/function.cpp:
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/interpreter.cpp:
        (KJS::ExecState::lexicalInterpreter):
        * kjs/interpreter.h:
        * kjs/operations.cpp:
        (KJS::equal):

2006-03-30  Eric Seidel  <eseidel@apple.com>

        Reviewed by anders.

        Small code-style update.

        * kjs/operations.cpp:
        (KJS::isNaN):
        (KJS::isInf):
        (KJS::isPosInf):
        (KJS::isNegInf):
        (KJS::equal):
        (KJS::strictEqual):
        (KJS::relation):
        (KJS::maxInt):
        (KJS::minInt):
        (KJS::add):
        (KJS::mult):

2006-03-31  Anders Carlsson  <andersca@mac.com>

        Reviewed by Maciej.

        Make sure the GetterSetterImp objects are marked as well.
        
        * kjs/internal.cpp:
        (KJS::GetterSetterImp::mark):
        Call JSCell::mark().

2006-03-30  Eric Seidel  <eseidel@apple.com>

        Reviewed by ggaren.

        * kjs/nodes.h: Some various small style fixes.

2006-03-30  Eric Seidel  <eseidel@apple.com>

        Reviewed by ggaren.

        Clean-up style issues in node.h, remove redundant initializations.

        * kjs/nodes.h:
        (KJS::StatementNode::evaluate):
        (KJS::ArrayNode::ArrayNode):
        (KJS::ObjectLiteralNode::ObjectLiteralNode):
        (KJS::ArgumentsNode::ArgumentsNode):
        (KJS::NewExprNode::NewExprNode):
        (KJS::CaseClauseNode::CaseClauseNode):
        (KJS::FuncDeclNode::FuncDeclNode):

2006-03-30  Tim Omernick  <timo@apple.com>

        Reviewed by Geoff.

        <rdar://problem/4212626> REGRESSION: LIVECONNECT: JavaScript type for Java Strings is function,
        not object

        * bindings/runtime.h:
        (KJS::Bindings::Instance::implementsCall):
        New method.  Returns false by default.  Concrete subclasses can override this return true when
        the bound object may be called as a function.
        (KJS::Bindings::Instance::invokeDefaultMethod):
        Since bound objects are no longer treated as functions by default, we can return jsUndefined()
        here instead of in concrete subclasses that decide not to implement the default method
        functionality.

        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::implementsCall):
        Don't assume that the bound object is a function; instead, let the object instance decide whether
        it is callable.

        * bindings/c/c_instance.h:
        * bindings/c/c_instance.cpp:
        (KJS::Bindings::CInstance::implementsCall):
        The object is callable if its class has an invokeDefault function.

        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::implementsCall):
        The object is callable if the ObjC instance responds to -invokeDefaultMethodWithArguments:.

        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_instance.cpp:
        Moved bogus invokeDefaultMethod() to superclass.

2006-03-29  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        - JavaScriptCore side of fix for <rdar://problem/4308243> 8F36 
        Regression: crash in malloc_consolidate if you use a .PAC file

        The crash was a result of threaded deallocation of thread-unsafe
        objects. Pure JS objects are thread-safe because all JS execution
        is synchronized through JSLock. However, JS objects that wrap WebCore 
        objects are thread-unsafe because JS and WebCore execution are not 
        synchronized.  That unsafety comes into play when the collector 
        deallocates a JS object that wraps a WebCore object, thus causing the 
        WebCore object to be deallocated.

        The solution here is to have each JSCell know whether it is safe to
        collect on a non-main thread, and to avoid collecting unsafe cells
        when on a non-main thread.

        We don't have a way to test PAC files yet, so there's no test
        attached to this patch.

        * kjs/collector.cpp:
        (KJS::Collector::collect):
        (1) Added the test "currentThreadIsMainThread || 
        imp->m_destructorIsThreadSafe". 

        * kjs/protect.h:
        (KJS::gcProtectNullTolerant):
        (KJS::gcUnprotectNullTolerant):
        * kjs/value.h:
        (KJS::JSCell::JSCell): The bools here must be bitfields, otherwise
        m_destructorIsThreadSafe becomes another whole word, ruining the
        collector optimizations we've made based on the size of a JSObject.
        * kxmlcore/FastMalloc.cpp:
        (KXMLCore::currentThreadIsMainThread):
        (KXMLCore::fastMallocRegisterThread):
        * kxmlcore/FastMalloc.h:

2006-03-28  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - change some code that resulted in init routines on Mac OS X -- if the framework has
          init routines it will use memory and slow down applications that link with WebKit
          even in cases where those applications don't use WebKit

        * kjs/date_object.cpp: Changed constants that were derived by multiplying other constants
        to use immediate numbers instead. Apparently, double constant expressions of the type we
        had here are evaluated at load time.

        * kjs/list.cpp: Can't use OwnArrayPtr in ListImp because of the global instances of
        ListImp, so go back to using a plain old pointer.
        (KJS::List::List): Set overflow to 0 when initializing ListImp.
        (KJS::List::release): Replace a clear call with a delete and explicit set to 0.
        (KJS::List::append): Use raw pointers, and do a delete [] instead of finessing it with
        a swap of OwnArrayPtr.
        (KJS::List::copyFrom): Remove now-unneeded get().
        (KJS::List::copyTail): Ditto.

        * kjs/ustring.cpp: Changed UString::Rep::empty initializer a bit so that it doesn't get
        a static initializer routine. Had to get rid of one level of constant to get the compiler
        to understand it could initialize without any code.

        - added a build step that checks for init routines

        * JavaScriptCore.xcodeproj/project.pbxproj: Deleted now-unused custom build rule that
        was replaced by the generate-derived-sources script a while back. Added a custom build
        phase that invokes the check-for-global-initializers script.

2006-03-28  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Eric.

        fixes <rdar://problem/4458539> Unable to include Security(public) and WebKit(private) headers

        * bindings/npapi.h: added #defines after the #ifndefs

2006-03-27  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Anders.
        
        - fixed <rdar://problem/4489745> REGRESSION: Safari crashes at to display http://www.lgphilips-lcd.com/

        * kjs/nodes.cpp:
        (Node::deref): take into account the case where the extra refcount table was never created

2006-03-23  David Carson <dacarson@gmail.com>

        Reviewed by Darin.
        
        - JSObject in LiveConnect not working.
        http://bugs.webkit.org/show_bug.cgi?id=7917

        * bindings/jni_jsobject.cpp:
        (JavaJSObject::convertJObjectToValue): Was trying to retrieve the native pointer from the wrong base
        class, and the GetFieldID was using the wrong signature.

2006-03-23  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix buildbot

        * JavaScriptCore.xcodeproj/project.pbxproj: Change target name to JavaScriptCore (it was "include"!?).
        Also add -Y 3 option for linker.

2006-03-23  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=7726
          REGRESSION: orbitz calendar fails (JavaScript function serialization/parsing)

        * kjs/object.h: Take function name, as well as source URL and line number, when
        using the special overloaded construct for making functions.
        * kjs/object.cpp: (KJS::JSObject::construct): Ditto.
        * kjs/function_object.h: Ditto.
        * kjs/function_object.cpp: (FunctionObjectImp::construct): Pass a name when
        constructing the function rather than null. Use "anonymous" when making a
        function using the default function constructor.

        * kjs/nodes2string.cpp: (FuncDeclNode::streamTo): Put a line break just before
        a function declaration.

        - unrelated fix

        * kxmlcore/HashMapPtrSpec.h: Add missing needed friend declaration.

2006-03-23  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=7805
          LEAK: method name leaks in KJS::Bindings::CInstance::invokeMethod

        * bindings/c/c_utility.h: Remove NPN_UTF16FromString declaration (not implemented).
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertValueToNPVariant): Use DOUBLE_TO_NPVARIANT,
        BOOLEAN_TO_NPVARIANT, VOID_TO_NPVARIANT, NULL_TO_NPVARIANT, and
        OBJECT_TO_NPVARIANT. In the case of OBJECT, call _NPN_RetainObject in
        one case and remove a _NPN_ReleaseObject in another because this
        should return a retained value.
        (KJS::Bindings::convertNPVariantToValue): Use NPVARIANT_TO_BOOLEAN,
        NPVARIANT_TO_INT32, and NPVARIANT_TO_DOUBLE.

        * bindings/c/c_runtime.h: Removed implementations of CMethod::name and
        CField::name that called _NPN_UTF8FromIdentifier and hence leaked.
        * bindings/c/c_runtime.cpp:
        (KJS::Bindings::CMethod::name): Added. Returns the string from inside the
        method object.
        (KJS::Bindings::CField::name): Added. Returns the string from inside the
        field object.
        (KJS::Bindings::CField::valueFromInstance): Added call to _NPN_ReleaseVariantValue
        on the result of getProperty after using it to fix a storage leak.
        (KJS::Bindings::CField::setValueToInstance): Added call to _NPN_ReleaseVariantValue
        after pasing a value to setProperty now that the conversion function does a retain.

        * bindings/c/c_instance.cpp:
        (KJS::Bindings::CInstance::invokeMethod): Changed to use Vector for a local
        stack buffer. Removed special case for NPVARIANT_IS_VOID because the
        convertNPVariantToValue function handles that properly.
        (KJS::Bindings::CInstance::invokeDefaultMethod): Ditto.

        * bindings/NP_jsobject.h: Formatting changes only.
        * bindings/NP_jsobject.cpp:
        (jsDeallocate): Changed parameter type so we don't need a function cast.
        (_NPN_InvokeDefault): Use VOID_TO_NPVARIANT.
        (_NPN_Invoke): Use NULL_TO_NPVARIANT and VOID_TO_NPVARIANT.
        (_NPN_Evaluate): Use VOID_TO_NPVARIANT.
        (_NPN_GetProperty): Use NULL_TO_NPVARIANT and VOID_TO_NPVARIANT.

        * bindings/c/c_class.cpp: Formatting changes only.
        * bindings/c/c_class.h: Formatting changes only.

        * bindings/npruntime_priv.h: Removed obsolete and now-unused functions:
        NPN_VariantIsVoid, NPN_VariantIsNull, NPN_VariantIsUndefined,
        NPN_VariantIsBool, NPN_VariantIsInt32, NPN_VariantIsDouble,
        NPN_VariantIsString, NPN_VariantIsObject, NPN_VariantToBool,
        NPN_VariantToInt32, NPN_VariantToDouble, NPN_VariantToString,
        NPN_VariantToStringCopy, NPN_VariantToObject, NPN_InitializeVariantAsVoid,
        NPN_InitializeVariantAsNull, NPN_InitializeVariantAsUndefined,
        NPN_InitializeVariantWithBool, NPN_InitializeVariantWithInt32,
        NPN_InitializeVariantWithDouble, NPN_InitializeVariantWithString,
        NPN_InitializeVariantWithObject, and NPN_InitializeVariantWithVariant.
        * bindings/npruntime.cpp:
        (getIntIdentifierDictionary): Don't bother creating custom callbacks for the
        integer dictionary since the default behavior is fine for integers.

2006-03-23  Mark Rowe  <opendarwin.org@bdash.net.nz>

        Reviewed and landed by Maciej.

        - WebKit no longer builds with bison 2.1
        http://bugs.webkit.org/show_bug.cgi?id=7923

        * generate-derived-sources:  Handle generated header named either grammar.cpp.h
        or grammar.hpp.

2006-03-22  Maciej Stachowiak  <mjs@apple.com>

        - fix the build

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-03-21  Maciej Stachowiak  <mjs@apple.com>

        * kjs/generate-derived-sources: Set executable property.

2006-03-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        Ensure that generated source dependencies are handled properly, as follows:
        
        - Made an external script that generates the sources into a
          DerivedSources dir in the build products directory.
        - Added a new build target that builds all the generated sources
          if needed. Sadly it has to be a target, not a phase for Xcode to notice changes.
        - Added the DerivedSources dir in question to the include path.
        - Added the new DerivedSources dir and its contents to the project as build-relative.
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/generate-derived-sources: Added. Based on the windows version - maybe someday they
        can share more.

2006-03-11  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - fixed "charAt layout test fails on intel macs; some NaNs are printed as -NaN"
        http://bugs.webkit.org/show_bug.cgi?id=7745

        * kjs/ustring.cpp:
        (KJS::UString::from): Use "NaN" for all NaN values, regardless of sign.

2006-03-16  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - tweaks to my change to redo KJS::Node refcounting

        * kjs/nodes.cpp:
        (Node::ref):
        (Node::deref):
        (Node::refcount):
        (Node::clearNewNodes):
        * kjs/nodes.h:

2006-03-16  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed Vector so that you can pass a reference to something in the vector
          to the append or insert functions

        * kxmlcore/Vector.h:
        (KXMLCore::Vector::expandCapacity): Added new overloads that take a pointer to adjust
        and return the adjusted value of the pointer.
        (KXMLCore::Vector::append): Pass a pointer when expanding the vector, and use it when
        adding the new element. Makes the case where the element moves when the vector
        is expanded work.
        (KXMLCore::Vector::insert): Ditto.

2006-03-15  Eric Seidel  <eseidel@apple.com>

        Reviewed by adele.

        Build fix.

        * kjs/date_object.cpp:
        (KJS::DateProtoFunc::callAsFunction): use size() not "len()"

2006-03-15  Eric Seidel  <eseidel@apple.com>

        Reviewed by mjs.

        Fix CString copy constructor, fixes Date.parse("") on Win32.

        * kjs/date_object.cpp:
        (KJS::DateProtoFunc::callAsFunction):
        * kjs/ustring.cpp:
        (KJS::CString::CString):
        (KJS::CString::operator=):

2006-03-13  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Anders.
        
        - KJS::Node and KJS::StatementNode are bigger than they need to be
        http://bugs.webkit.org/show_bug.cgi?id=7775

        The memory usage of Node was reduced by 2 machine words per node:

        - sourceURL was removed and only kept on FunctionBodyNode. The
        source URL can only be distinct per function or top-level program node, 
        and you always have one.
        
        - refcount was removed and kept in a separate hashtable when
        greater than 1. newNodes set represents floating nodes with
        refcount of 0. This helps because almost all nodes have a refcount of 1
        for almost all of their lifetime.
        
        * bindings/runtime_method.cpp:
        (RuntimeMethod::RuntimeMethod): Pass null body, added FIXME.
        * kjs/Parser.cpp:
        (KJS::clearNewNodes): New nodes are tracked in nodes.cpp now, but still clear
        them at the appropriate time.
        * kjs/context.h:
        (KJS::ContextImp::currentBody): added; used to retrieve source URL and sid
        for current code.
        (KJS::ContextImp::pushIteration): moved here from LabelStack
        (KJS::ContextImp::popIteration): ditto
        (KJS::ContextImp::inIteration): ditto
        (KJS::ContextImp::pushSwitch): ditto
        (KJS::ContextImp::popSwitch): ditto
        (KJS::ContextImp::inSwitch): ditto
        * kjs/function.cpp:
        (KJS::FunctionImp::FunctionImp): Add FunctionBodyNode* parameter.
        (KJS::FunctionImp::callAsFunction): Pass body to ContextImp.
        (KJS::FunctionImp::argumentsGetter): _context renamed to m_context.
        (KJS::DeclaredFunctionImp::DeclaredFunctionImp): Pass body to superclass
        constructor.
        (KJS::GlobalFuncImp::callAsFunction): Pass progNode as body for ContextImp in
        eval.
        * kjs/function.h: Move body field from DeclaredFunctionImp to
        FunctionImp.
        * kjs/grammar.y: Change DBG; statements no longer have a sourceid.
        * kjs/internal.cpp:
        (KJS::ContextImp::ContextImp): Initialize new m_currentBody, m_iterationDepth
        and m_switchDepth data members. New FunctionBodyNode* parameter - the
        function body provides source URL and SourceId.
        (KJS::InterpreterImp::mark): Use exception() function, not _exception directly.
        (KJS::InterpreterImp::evaluate): Pass progNode to ContextImp constructor
        to use as the body.
        * kjs/internal.h:
        (KJS::LabelStack::LabelStack): Remove iteration depth and switch depth;
        statement label stacks don't need these and it bloats their size. Put them
        in the ContextImp instead.
        * kjs/interpreter.cpp:
        (KJS::ExecState::lexicalInterpreter): Renamed _context to m_context.
        * kjs/interpreter.h:
        (KJS::ExecState::dynamicInterpreter): Renamed _context to m_context.
        (KJS::ExecState::context): ditto
        (KJS::ExecState::setException): Renamed _exception to m_exception
        (KJS::ExecState::clearException): ditto
        (KJS::ExecState::exception): ditto
        (KJS::ExecState::hadException): ditto
        (KJS::ExecState::ExecState): ditto both above renames
        * kjs/nodes.cpp:
        (Node::Node): Removed initialization of line, source URL and refcount. Add to
        local newNodes set instead of involving parser.
        (Node::ref): Instead of managing refcount directly, story refcount over 1 in a
        HashCountedSet, and keep a separate HashSet of "floating" nodes with refcount
        0.
        (Node::deref): ditto
        (Node::refcount): ditto
        (Node::clearNewNodes): Destroy anything left in the new nodes set.
        (currentSourceId): Inline helper to get sourceId from function body via context.
        (currentSourceURL): ditto for sourceURL.
        (Node::createErrorCompletion): use new helper
        (Node::throwError): ditto
        (Node::setExceptionDetailsIfNeeded): ditto
        (StatementNode::StatementNode): remove initialization of l0 and sid, rename
        l1 to m_lastLine.
        (StatementNode::setLoc): Set own m_lastLine and Node's m_line.
        (StatementNode::hitStatement): Get sid, first line, last line in the proper new ways.
        (StatListNode::StatListNode): updated for setLoc changes
        (BlockNode::BlockNode): ditto
        (DoWhileNode::execute): excpect iteraton counts on ContextImp, not LabelStack
        (WhileNode::execute): ditto
        (ForNode::execute): ditto
        (ForInNode::execute): ditto
        (ContinueNode::execute): excpect inIteration on ContextImp, not LabelStack
        (BreakNode::execute): excpect inIteration and inSwitch on ContextImp, not LabelStack
        (SwitchNode::execute): expect switch counts on ContextImp, not LabelStack
        (FunctionBodyNode::FunctionBodyNode): update for new setLoc
        (FunctionBodyNode::processFuncDecl): reindent
        (SourceElementsNode::SourceElementsNode): update for new setLoc
        * kjs/nodes.h:
        (KJS::Node::lineNo): Renamed _line to m_line
        (KJS::StatementNode::firstLine): Use lineNo()
        (KJS::StatementNode::lastLine): Renamed l1 to m_lastLine
        (KJS::FunctionBodyNode::sourceId): added
        (KJS::FunctionBodyNode::sourceURL): added
        * kjs/testkjs.cpp:

2006-03-14  Geoffrey Garen  <ggaren@apple.com>

        - Fixed <rdar://problem/4478239> string sort puts "closed" before 
        "close"

        Reviewed by Eric.

        * kjs/ustring.cpp:
        (KJS::compare): Inverted a < in order to treat the longer string as > 
        the shorter string.

2006-03-12  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=7708
        REGRESSION: Flash callback to JavaScript function not working.

        Test: plugins/invoke.html

        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertUTF8ToUTF16): Return a correct string length.

2006-03-08  Eric Seidel  <eseidel@apple.com>

        Reviewed by darin.

        Partially fix JS on win32 by fixing hash table generation.

        * kjs/create_hash_table: limit << results to 32 bits.
        * kjs/testkjs.cpp:
        (TestFunctionImp::callAsFunction):

2006-03-07  Darin Adler  <darin@apple.com>

        * kxmlcore/Vector.h: Quick fix to try to get Windows compiling again.

2006-03-07  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - fix http://bugs.webkit.org/show_bug.cgi?id=7655
          unwanted output while running layout tests

        * kjs/lexer.cpp: (Lexer::lex): Turn off the "yylex: ERROR" message.
        * kjs/regexp.cpp: (KJS::RegExp::RegExp): Remove the code to log errors from PCRE
        to standard output. I think we should arrange for the error text to be in JavaScript
        exceptions instead at some point.
        * kxmlcore/Vector.h: Add a check for overflow so that we'll abort if we pass a
        too-large size rather than allocating a buffer smaller than requested.

2006-03-06  David Carson <dacarson@gmail.com>

        Reviewed by Darin, landed by ap.

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=7582
        c_utility.cpp contains CFString OS X platform-dependent code; should use ICU

        Tested with test case from:
        http://bugs.webkit.org/show_bug.cgi?id=5163

        * bindings/c_utility.cpp
        (convertUTF8ToUTF16): Changed to using Unicode converter from ICU, and manual Latin-1 conversion.
        * icu/unicode/ucnv.h: Copied from WebCore.
        * icu/unicode/ucnv_err.h: Ditto.
        * icu/unicode/uenum.h: Ditto.

2006-03-05  Darin Adler  <darin@apple.com>

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Updated.

2006-03-06  Mitz Pettel  <opendarwin.org@mitzpettel.com>

        Fix suggested by Alexey Proskuryakov <ap@nypop.com>, reviewed by Maciej and Hyatt.
        
        - fix http://bugs.webkit.org/show_bug.cgi?id=7601
          REGRESSION (r13089): Reproducible crash dereferencing a deallocated element on google image search

        * kxmlcore/Platform.h: Corrected the define to enable USE(MULTIPLE_THREADS) on Mac OS X.

2006-03-05  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=7616
          get all references to KJS::Node out of internal.h

        * JavaScriptCore.xcodeproj/project.pbxproj: Updated for file changes.

        * kjs/Parser.cpp: Added.
        * kjs/Parser.h: Added.

        * kjs/internal.cpp: Removed the Parser class.
        * kjs/internal.h: Ditto. Also removed unnecessary declarations of classes
        not used in this header.

        * kjs/nodes.h: Added an include of "Parser.h".
        * kjs/function.h: Added a declaration of FunctionBodyNode.

2006-03-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.

        - JSC support for the fix for <rdar://problem/4467143> JavaScript 
        enumeration of HTML element properties skips DOM node properties

        * kjs/lookup.h: 
        (1) Added the KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE macro. The 
        class definiton macro needs to know about the prototype's prototype so 
        that the class constructor properly sets it. 
        (2) Removed the KJS_IMPLEMENT_PROTOTYPE_WITH_PARENT macro. The class
        implementation macro does not need to know about the prototype's
        prototype, since getOwnPropertySlot should only look in the current 
        object's property map, and not its prototype's.

2006-03-05  Andrew Wellington  <proton@wiretapped.net>

        Reviewed by Eric, landed by ap.
        
        - Remove unused breakpoint bool from StatementNodes. No test provided as
        there is no functionality change.

        * kjs/nodes.cpp:
        (StatementNode::StatementNode):
        * kjs/nodes.h:

2006-03-03  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        - Fixed <rdar://problem/4465598> REGRESSION (TOT): Crash occurs at 
        http://maps.google.com/?output=html ( KJS::Identifier::add(KJS::UString::Rep*)

        This regression was caused by my fix for 4448098. I failed to account for the
        deleted entry sentinel in the mehtod that saves the contents of a property map to 
        the back/forward cache.

        Manual test in WebCore/manual-tests/property-map-save-crash.html

        * kjs/property_map.cpp:
        (KJS::deletedSentinel): Use 1 instead of -1 to facilitate an easy bit mask
        (KJS::isValid): New function: checks if a key is null or the deleted sentinel
        (KJS::PropertyMap::~PropertyMap): Fixed up the branch logic here for readability
        and a slight performance win
        (KJS::PropertyMap::clear):
        (KJS::PropertyMap::rehash):
        (KJS::PropertyMap::addSparseArrayPropertiesToReferenceList):
        (KJS::PropertyMap::save): Check keys with isValid()

2006-03-02  Maciej Stachowiak  <mjs@apple.com>

        - now fix mac build again

        * kjs/identifier.cpp:

2006-03-02  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Anders and Eric.

        - add fpconst.cpp to win32 build, it is now needed

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * kjs/fpconst.cpp:

2006-03-02  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.

        - fix windows build, broken by my last patch

        * kjs/JSImmediate.cpp:
        * kjs/identifier.cpp:
        * kxmlcore/FastMalloc.cpp:
        * kxmlcore/Platform.h:

2006-03-01  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - Set up new prototype macros and avoid using #if without defined() in JSC
        
        Added new PLATFORM macros and related, to make sure #if's all check if relevant macros
        are defined, and to separate core OS-level dependencies from operating environment
        dependencies so you can, e.g., build KDE on Mac or Windows.

        * kxmlcore/Platform.h: Added.

        - deploy them everywhere in JavaScriptCore
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::convertValueToJValue):
        * bindings/objc/WebScriptObject.mm:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::end):
        * bindings/softlinking.h:
        * bindings/testbindings.mm:
        (main):
        * kjs/JSLock.cpp:
        * kjs/collector.cpp:
        (KJS::Collector::markCurrentThreadConservatively):
        (KJS::Collector::markOtherThreadConservatively):
        (KJS::Collector::markStackObjectsConservatively):
        * kjs/config.h:
        * kjs/date_object.cpp:
        (gmtoffset):
        (KJS::formatTime):
        (KJS::DateProtoFunc::callAsFunction):
        (KJS::DateObjectImp::construct):
        (KJS::makeTime):
        * kjs/dtoa.cpp:
        * kjs/fpconst.cpp:
        (KJS::sizeof):
        (KJS::):
        * kjs/grammar.y:
        * kjs/identifier.cpp:
        * kjs/internal.cpp:
        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):
        (KJS::Interpreter::createLanguageInstanceForValue):
        * kjs/interpreter.h:
        * kjs/lookup.cpp:
        * kjs/lookup.h:
        * kjs/math_object.cpp:
        * kjs/object.cpp:
        * kjs/object.h:
        * kjs/operations.cpp:
        (KJS::isNaN):
        (KJS::isInf):
        (KJS::isPosInf):
        (KJS::isNegInf):
        * kjs/operations.h:
        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp):
        (KJS::RegExp::~RegExp):
        (KJS::RegExp::match):
        * kjs/regexp.h:
        * kjs/testkjs.cpp:
        (StopWatch::start):
        (StopWatch::stop):
        (StopWatch::getElapsedMS):
        * kjs/ustring.cpp:
        * kjs/ustring.h:
        * kxmlcore/AlwaysInline.h:
        * kxmlcore/Assertions.cpp:
        * kxmlcore/Assertions.h:
        * kxmlcore/FastMalloc.cpp:
        (KXMLCore::):
        * kxmlcore/FastMalloc.h:
        * kxmlcore/FastMallocInternal.h:
        * kxmlcore/HashTable.h:
        * kxmlcore/TCPageMap.h:
        * kxmlcore/TCSpinLock.h:
        (TCMalloc_SpinLock::Lock):
        (TCMalloc_SpinLock::Unlock):
        (TCMalloc_SlowLock):
        * kxmlcore/TCSystemAlloc.cpp:
        (TCMalloc_SystemAlloc):
        * os-win32/stdint.h:

2006-02-28  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        - Fixed <rdar://problem/4448098> Switch PropertyMap deleted entry 
        placeholder to -1 from UString::Rep::null

        This turned out to be only a small speedup (.12%). That's within the 
        margin of error for super accurate JS iBench, but Shark confirms the 
        same, so I think it's worth landing.

        FYI, I also confirmed that the single entry optimization in 
        PropertyMap is a 3.2% speedup.

        * kjs/property_map.cpp:
        (KJS::PropertyMap::~PropertyMap):
        (KJS::PropertyMap::clear):
        (KJS::PropertyMap::put):
        (KJS::PropertyMap::insert):
        (KJS::PropertyMap::rehash):
        (KJS::PropertyMap::remove):
        (KJS::PropertyMap::addSparseArrayPropertiesToReferenceList):
        (KJS::PropertyMap::checkConsistency):
        * kjs/property_map.h:
        (KJS::PropertyMap::deletedSentinel):

2006-02-27  Eric Seidel  <eseidel@apple.com>

        Rubber-stamped by darin.

        Remove fpconst.cpp, unused on win32 and the cause of linker warnings.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:

2006-02-27  Eric Seidel  <eseidel@apple.com>

        Reviewed by mjs.

        Fix Assertions.cpp to compile on win32.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * kxmlcore/Assertions.cpp:

2006-02-27  Eric Seidel  <eseidel@apple.com>

        Reviewed by mjs.

        Made Assertions.cpp platform independent.
        Moved mac-specific logging logic up into WebCore.
        http://bugs.webkit.org/show_bug.cgi?id=7503

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kxmlcore/Assertions.cpp: Added.
        * kxmlcore/Assertions.h:
        * kxmlcore/Assertions.mm: Removed.

2006-02-27  Darin Adler  <darin@apple.com>

        - fixed Mac Debug build, there was an unused parameter

        * kxmlcore/FastMalloc.cpp: (KXMLCore::fastMallocRegisterThread):
        Remove parameter name.

        * kjs/debugger.h: Fixed comment.

2006-02-27  Eric Seidel  <eseidel@apple.com>

        Reviewed by darin.

        * kxmlcore/Vector.h:
        (KXMLCore::deleteAllValues): fix unused variable warning

2006-02-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - Turn off -Wno-unused-param for JavaScriptCore and get rid of unused params
        http://bugs.webkit.org/show_bug.cgi?id=7384

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/NP_jsobject.cpp:
        (jsAllocate):
        (_NPN_InvokeDefault):
        (_NPN_Evaluate):
        (_NPN_GetProperty):
        (_NPN_SetProperty):
        (_NPN_RemoveProperty):
        (_NPN_HasProperty):
        (_NPN_HasMethod):
        * bindings/c/c_class.h:
        (KJS::Bindings::CClass::constructorAt):
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertNPVariantToValue):
        * bindings/jni/jni_class.cpp:
        (JavaClass::methodsNamed):
        (JavaClass::fieldNamed):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeDefaultMethod):
        * bindings/jni/jni_jsobject.cpp:
        * bindings/jni/jni_objc.mm:
        (-[NSObject KJS::Bindings::]):
        * bindings/objc/WebScriptObject.mm:
        (+[WebUndefined allocWithZone:]):
        (-[WebUndefined initWithCoder:]):
        (-[WebUndefined encodeWithCoder:]):
        (-[WebUndefined copyWithZone:]):
        * bindings/objc/objc_class.h:
        (KJS::Bindings::ObjcClass::constructorAt):
        * bindings/objc/objc_class.mm:
        (KJS::Bindings::ObjcClass::methodsNamed):
        (KJS::Bindings::ObjcClass::fallbackObject):
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::getValueOfUndefinedField):
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::getOwnPropertySlot):
        (ObjcFallbackObjectImp::put):
        (ObjcFallbackObjectImp::canPut):
        (ObjcFallbackObjectImp::deleteProperty):
        (ObjcFallbackObjectImp::toBoolean):
        * bindings/runtime.cpp:
        (KJS::Bindings::Instance::createLanguageInstanceForValue):
        * bindings/runtime.h:
        (KJS::Bindings::Instance::getValueOfUndefinedField):
        (KJS::Bindings::Instance::setValueOfUndefinedField):
        * bindings/runtime_array.cpp:
        (RuntimeArray::lengthGetter):
        (RuntimeArray::indexGetter):
        (RuntimeArray::put):
        (RuntimeArray::deleteProperty):
        * bindings/runtime_method.cpp:
        (RuntimeMethod::lengthGetter):
        (RuntimeMethod::execute):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::fallbackObjectGetter):
        (RuntimeObjectImp::fieldGetter):
        (RuntimeObjectImp::methodGetter):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::canPut):
        (RuntimeObjectImp::deleteProperty):
        (RuntimeObjectImp::defaultValue):
        (RuntimeObjectImp::callAsFunction):
        * bindings/runtime_root.cpp:
        (performJavaScriptAccess):
        * kjs/array_object.cpp:
        (ArrayInstance::lengthGetter):
        (ArrayInstance::getOwnPropertySlot):
        (ArrayPrototype::ArrayPrototype):
        (ArrayPrototype::getOwnPropertySlot):
        * kjs/bool_object.cpp:
        (BooleanObjectImp::BooleanObjectImp):
        * kjs/date_object.cpp:
        (KJS::DateObjectFuncImp::DateObjectFuncImp):
        (KJS::DateObjectFuncImp::callAsFunction):
        * kjs/error_object.cpp:
        (ErrorObjectImp::ErrorObjectImp):
        (NativeErrorPrototype::NativeErrorPrototype):
        (NativeErrorImp::NativeErrorImp):
        * kjs/function.cpp:
        (KJS::FunctionImp::argumentsGetter):
        (KJS::FunctionImp::lengthGetter):
        (KJS::Arguments::mappedIndexGetter):
        (KJS::ActivationImp::argumentsGetter):
        (KJS::ActivationImp::put):
        * kjs/function_object.cpp:
        (FunctionObjectImp::FunctionObjectImp):
        * kjs/internal.cpp:
        (KJS::GetterSetterImp::toPrimitive):
        (KJS::GetterSetterImp::toBoolean):
        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate):
        * kjs/interpreter.h:
        (KJS::Interpreter::isGlobalObject):
        (KJS::Interpreter::interpreterForGlobalObject):
        (KJS::Interpreter::isSafeScript):
        * kjs/lexer.cpp:
        (Lexer::makeIdentifier):
        (Lexer::makeUString):
        * kjs/lookup.h:
        (KJS::staticFunctionGetter):
        (KJS::staticValueGetter):
        * kjs/nodes.cpp:
        (StatementNode::processFuncDecl):
        (PropertyNode::evaluate):
        (PropertyNameNode::evaluate):
        * kjs/number_object.cpp:
        (NumberObjectImp::NumberObjectImp):
        (NumberObjectImp::getOwnPropertySlot):
        * kjs/object.cpp:
        (KJS::JSObject::defineGetter):
        (KJS::JSObject::defineSetter):
        (KJS::JSObject::hasInstance):
        (KJS::JSObject::propertyIsEnumerable):
        * kjs/object_object.cpp:
        (ObjectObjectImp::ObjectObjectImp):
        * kjs/property_slot.cpp:
        (KJS::PropertySlot::undefinedGetter):
        (KJS::PropertySlot::functionGetter):
        * kjs/reference.cpp:
        (KJS::Reference::getPropertyName):
        * kjs/reference_list.cpp:
        (ReferenceListIterator::operator++):
        * kjs/regexp_object.cpp:
        (RegExpObjectImp::RegExpObjectImp):
        (RegExpObjectImp::getValueProperty):
        (RegExpObjectImp::putValueProperty):
        * kjs/string_object.cpp:
        (StringInstance::lengthGetter):
        (StringInstance::indexGetter):
        (StringPrototype::StringPrototype):
        * kxmlcore/Assertions.mm:
        * kxmlcore/FastMalloc.cpp:
        (KXMLCore::TCMalloc_PageHeap::CheckList):
        * kxmlcore/HashTable.h:
        (KXMLCore::HashTableConstIterator::checkValidity):
        (KXMLCore::IdentityHashTranslator::translate):
        * pcre/pcre_get.c:
        (pcre_get_stringnumber):

2006-02-23  Darin Adler  <darin@apple.com>

        - try to fix buildbot failure

        * bindings/c/c_utility.cpp: Touch this file, which seems to not have been
        recompiled after additional inlining was introduced (Xcode bug?).

2006-02-23  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin, Maciej.

        - Inline some functions suggested by Shark. 2.9% speedup on super
        accurate JS iBench.

        http://bugs.webkit.org/show_bug.cgi?id=7411
        <rdar://problem/4448116>

        * kjs/nodes.h:
        (KJS::ArgumentsNode::evaluateList):
        * kjs/object.cpp:
        * kjs/object.h:
        (KJS::ScopeChain::release):
        (KJS::JSObject::toPrimitive):
        * kjs/scope_chain.cpp:
        * kjs/ustring.cpp:
        * kjs/ustring.h:
        (KJS::UString::toArrayIndex):
        * kjs/value.cpp:
        * kjs/value.h:
        (KJS::JSValue::toObject):
        * kxmlcore/FastMalloc.cpp:
        (KXMLCore::TCMalloc_ThreadCache_FreeList::Push):
        (KXMLCore::TCMalloc_ThreadCache_FreeList::Pop):

2006-02-21  Eric Seidel  <eseidel@apple.com>

        Added *.user to ignore list.

2006-02-21  Eric Seidel  <eseidel@apple.com>

        Reviewed by ggaren.

        Add grammarWrapper.cpp to work around visual studio bug plaguing buildbot.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/JavaScriptCore/grammarWrapper.cpp: Added.

2006-02-21  Eric Seidel  <eseidel@apple.com>

        Reviewed by ggaren.

        * kjs/testkjs.cpp: #if out timeval code on win32

2006-02-21  Michael Emmel  <mike.emmel@gmail.com>

        Reviewed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=7397
          TCPageMap.h would not compile for me because string.h was missing

        * kxmlcore/TCPageMap.h: Added <string.h> include.

2006-02-21  Darin Adler  <darin@apple.com>

        Reviewed by John Sullivan.

        - http://bugs.webkit.org/show_bug.cgi?id=7404
          remove a bunch of extra implementsCall overrides

        * JavaScriptCore.xcodeproj/project.pbxproj: Sorted files.

        * kjs/internal.h: Made InternalFunctionImp::callAsFunction pure virtual so that
        we'll get a compile error if some derived class neglects to implement it.

        * kjs/function.cpp: (KJS::FunctionImp::FunctionImp): Remove unneeded initialization
        of param, which is an OwnPtr so it gets initialized by default.

        * bindings/runtime_method.cpp:
        * bindings/runtime_method.h:
        * kjs/array_object.cpp:
        * kjs/array_object.h:
        * kjs/bool_object.cpp:
        * kjs/bool_object.h:
        * kjs/date_object.cpp:
        * kjs/date_object.h:
        * kjs/error_object.cpp:
        * kjs/error_object.h:
        * kjs/function.cpp:
        * kjs/function.h:
        * kjs/function_object.cpp:
        * kjs/function_object.h:
        * kjs/math_object.cpp:
        * kjs/math_object.h:
        * kjs/number_object.cpp:
        * kjs/number_object.h:
        * kjs/object_object.cpp:
        * kjs/object_object.h:
        * kjs/regexp_object.cpp:
        * kjs/regexp_object.h:
        * kjs/string_object.cpp:
        * kjs/string_object.h:
        Removed many rendundant implementations of implementsCall from subclasses of
        InternalFunctionImp.

2006-02-21  Darin Adler  <darin@apple.com>

        - fixed build

        * kjs/internal.cpp: (KJS::InternalFunctionImp::implementsCall):
        Oops, fixed name.

2006-02-21  Darin Adler  <darin@apple.com>

        Change suggested by Mitz.

        - http://bugs.webkit.org/show_bug.cgi?id=7402
          REGRESSION: Methods do not execute

        * kjs/internal.h: Add implementsHasCall to InternalFunctionImp.
        * kjs/internal.cpp: (KJS::InternalFunctionImp::implementsHasCall):
        Return true. All the classes derived from InternalFunctionImp need
        to return true from this -- later we can remove all the extra
        implementations too.

2006-02-21  Maciej Stachowiak  <mjs@apple.com>

        - fix build breakage caused by last-minute change to my patch

        * kjs/lookup.h:

2006-02-20  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff and Darin.
        
        Patch from Maks Orlovich, based on work by David Faure, hand-applied and 
        significantly reworked by me.
        
        - Patch: give internal function names (KJS merge)
        http://bugs.webkit.org/show_bug.cgi?id=6279

        * tests/mozilla/expected.html: Updated for newly fixed test.

        * kjs/array_object.cpp:
        (ArrayProtoFunc::ArrayProtoFunc):
        * kjs/array_object.h:
        * kjs/bool_object.cpp:
        (BooleanPrototype::BooleanPrototype):
        (BooleanProtoFunc::BooleanProtoFunc):
        * kjs/bool_object.h:
        * kjs/date_object.cpp:
        (KJS::DateProtoFunc::DateProtoFunc):
        (KJS::DateObjectImp::DateObjectImp):
        (KJS::DateObjectFuncImp::DateObjectFuncImp):
        * kjs/error_object.cpp:
        (ErrorPrototype::ErrorPrototype):
        (ErrorProtoFunc::ErrorProtoFunc):
        * kjs/error_object.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::FunctionImp):
        (KJS::GlobalFuncImp::GlobalFuncImp):
        * kjs/function.h:
        * kjs/function_object.cpp:
        (FunctionPrototype::FunctionPrototype):
        (FunctionProtoFunc::FunctionProtoFunc):
        (FunctionProtoFunc::callAsFunction):
        * kjs/function_object.h:
        * kjs/internal.cpp:
        (KJS::InterpreterImp::initGlobalObject):
        (KJS::InternalFunctionImp::InternalFunctionImp):
        * kjs/internal.h:
        (KJS::InternalFunctionImp::functionName):
        * kjs/lookup.h:
        (KJS::staticFunctionGetter):
        (KJS::HashEntryFunction::HashEntryFunction):
        (KJS::HashEntryFunction::implementsCall):
        (KJS::HashEntryFunction::toBoolean):
        (KJS::HashEntryFunction::implementsHasInstance):
        (KJS::HashEntryFunction::hasInstance):
        * kjs/math_object.cpp:
        (MathFuncImp::MathFuncImp):
        * kjs/math_object.h:
        * kjs/number_object.cpp:
        (NumberPrototype::NumberPrototype):
        (NumberProtoFunc::NumberProtoFunc):
        * kjs/number_object.h:
        * kjs/object.cpp:
        (KJS::JSObject::putDirectFunction):
        (KJS::Error::create):
        * kjs/object.h:
        * kjs/object_object.cpp:
        (ObjectPrototype::ObjectPrototype):
        (ObjectProtoFunc::ObjectProtoFunc):
        * kjs/object_object.h:
        * kjs/regexp_object.cpp:
        (RegExpPrototype::RegExpPrototype):
        (RegExpProtoFunc::RegExpProtoFunc):
        * kjs/regexp_object.h:
        * kjs/string_object.cpp:
        (StringProtoFunc::StringProtoFunc):
        (StringObjectImp::StringObjectImp):
        (StringObjectFuncImp::StringObjectFuncImp):
        * kjs/string_object.h:
        
2006-02-20  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin, with help from Eric, Maciej.

        - More changes to support super-accurate JS iBench. Doesn't work on 
        Windows. (Doesn't break Windows, either.) I've filed 
        [http://bugs.webkit.org/show_bug.cgi?id=7399] about that. 

        * kjs/interpreter.cpp:
        (KJS::Interpreter::evaluate): Print line numbers with exception output
        * kjs/testkjs.cpp: Changed " *" to "* " because Eric says that's the 
        way we roll with .cpp files.
        (StopWatch::StopWatch): New class. Provides microsecond-accurate 
        timings.
        (StopWatch::~StopWatch):
        (StopWatch::start):
        (StopWatch::stop):
        (StopWatch::getElapsedMS):
        (TestFunctionImp::callAsFunction): Added missing return statement. 
        Fixed up "run" to use refactored helper functions. Removed bogus 
        return statement from "quit" case. Made "print" output to stdout 
        instead of stderr because that makes more sense, and PERL handles 
        stdout better.
        (main): Factored out KXMLCore unit tests. Removed custom exception 
        printing code because the interpreter prints exceptions for you. Added 
        a "delete" call for the GlobalImp we allocate.
        (testIsInteger): New function, result of refacotring.
        (createStringWithContentsOfFile): New function, result of refactoring. 
        Renamed "code" to "buffer" to match factored-out-ness.

2006-02-20  Eric Seidel  <eseidel@apple.com>

        Reviewed by hyatt.

        Fix "Copy ICU DLLs..." phase.

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh:

2006-02-19  Darin Adler  <darin@apple.com>

        - renamed ERROR to LOG_ERROR to fix build
          presumably Maciej had this change and forgot to land it

        * kjs/collector.cpp: Removed now-unneeded #undef ERROR.
        * kxmlcore/Assertions.h: Renamed ERROR to LOG_ERROR.
        * kxmlcore/FastMalloc.cpp: Changed MESSAGE macro to use LOG_ERROR.

2006-02-18  Mitz Pettel  <opendarwin.org@mitzpettel.com>

        Test: fast/js/toString-exception.html

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=7343
          REGRESSION: fast/js/toString-overrides.html fails when run multiple times

        * kjs/array_object.cpp:
        (ArrayProtoFunc::callAsFunction): Remove the object from the visited elements set before
        returning an error.

2006-02-18  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=7345
          add insert and remove to KXMLCore::Vector

        * kxmlcore/Vector.h: Added "moveOverlapping", which is used in both
        insert and remove to slide elements within the vector. Also added
        "insert" and "remove" functions.

2006-02-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by John.

        - Fixed <rdar://problem/4448534> TOT REGRESSION: crash in KJS::
        Bindings::Instance::deref when leaving page @ gigaom.com

        * bindings/c/c_instance.cpp:
        (KJS::Bindings::CInstance::~CInstance): Since we cache the class object
        globally, we shouldn't delete it, so don't.

2006-02-16  Timothy Hatcher  <timothy@apple.com>

        Added -Wno-deprecated-declarations to all the ObjC binding files to prevent deprecation
        warnings. Using <rdar://problem/4448350> to track this.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/objc/objc_jsobject.h: Removed empty file.
        * bindings/objc/objc_jsobject.mm: Removed empty file.

2006-02-16  Tim Omernick  <timo@apple.com>

        Reviewed by Geoff.

        <rdar://problem/4428609> Flash Player 8.0.22 can crash Safari (and WebKit apps) with
        javascript disabled (7015)

        * bindings/NP_jsobject.cpp:
        (_NPN_CreateNoScriptObject):
        Returns an NPObject which is not bound to a JavaScript object.  This kind of NPObject
        can be given to a plugin as the "window script object" when JavaScript is disabled.
        The object has a custom NPClass, NPNoScriptObjectClass, which has no defined methods.
        Because of this, none of the NPN_* functions called by the plugin on this "no script
        object" will cause entry into JavaScript code.
        (_NPN_InvokeDefault):
        Make sure the NPVariant is filled before returning from this function.  This never
        mattered before because we never reached this case, having only created NPObjects of
        the class NPScriptObjectClass.
        (_NPN_Invoke):
        ditto
        (_NPN_Evaluate):
        ditto
        (_NPN_GetProperty):
        ditto

        * bindings/NP_jsobject.h:
        Declared _NPN_CreateNoScriptObject().

2006-02-16  Darin Adler  <darin@apple.com>

        Reviewed by me, change by Peter Kuemmel.

        * kjs/operations.cpp: (KJS::isNegInf): Fix Windows code, which was
        checking for positive infinity (rolling in fix from KDE side).

2006-02-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej, Eric.

        - JavaScriptCore half of fix for <rdar://problem/4176077> CrashTracer: 6569
        crashes in DashboardClient at com.apple.JavaScriptCore:
        KJS::Bindings::ObjcFallbackObjectImp::type()

        WebCore and JavaScriptCore weren't sharing Instance objects very
        nicely. I made them use RefPtrs, and sent them to bed without dessert.

        * bindings/jni/jni_instance.cpp: Made _instance a RefPtr
        (JavaInstance::~JavaInstance):
        (JObjectWrapper::JObjectWrapper):
        * bindings/jni/jni_instance.h:
        (KJS::Bindings::JObjectWrapper::ref):
        (KJS::Bindings::JObjectWrapper::deref):
        * bindings/jni/jni_runtime.cpp: Made _array a RefPtr
        (JavaArray::~JavaArray):
        (JavaArray::JavaArray):
        * bindings/jni/jni_runtime.h:
        (KJS::Bindings::JavaArray::operator=):
        * bindings/objc/objc_runtime.h:
        - Prohibited copying because that would muss the ref count.
        - Prohibited construction without instance because an instance wrapper
        without an instance is almost certainly a bug.
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::ObjcFallbackObjectImp):
        * bindings/runtime.cpp:
        (KJS::Bindings::Instance::Instance):
        (KJS::Bindings::Instance::createBindingForLanguageInstance):
        (KJS::Bindings::Instance::createRuntimeObject):
        * bindings/runtime.h:
        (KJS::Bindings::Instance::ref):
        (KJS::Bindings::Instance::deref):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::RuntimeObjectImp):
        (RuntimeObjectImp::fallbackObjectGetter):
        (RuntimeObjectImp::fieldGetter):
        (RuntimeObjectImp::methodGetter):
        (RuntimeObjectImp::getOwnPropertySlot):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::canPut):
        * bindings/runtime_object.h: 
        - Removed ownsInstance data member because RefPtr takes care of 
        instance lifetime now. 
        - Prohibited copying because that would muss the ref count.
        - Prohibited construction without instance because an instance wrapper
        without an instance is almost certainly a bug.
        (KJS::RuntimeObjectImp::getInternalInstance):

2006-02-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by John.

        - Applied the 4330457 change to CClass and ObjcClass as well.

        Once plugins work in DumpRenderTree, running run-webkit-tests --leaks
        will catch this. 

        This change isn't as critical because CClass and ObjcClass objects get 
        cached globally and never deleted, but it's good practice, in case we 
        ever do decide to delete CClass and ObjcClass objects.

        This change requires prohibiting copying, because we don't do any 
        intelligent ref-counting -- when a Class is destroyed, it destroys its 
        methods and fields unconditionally. (Java classes already prohibited
        copying.)

        * bindings/c/c_class.cpp:
        - Merged _commonInit and _commonDelete into constructor and destructor.
        (CClass::CClass):
        (CClass::~CClass):
        (CClass::methodsNamed): Added delete callbacks
        (CClass::fieldNamed): Added delete callbacks
        * bindings/c/c_class.h: Prohibited copying
        * bindings/c/c_instance.cpp: 
        (KJS::Bindings::CInstance::getClass): Changed to use the preferred 
        class factory method, to take advantage of the global cache.

        [ Repeated changes applied to CClass for ObjcClass: ]

        * bindings/objc/objc_class.h: 
        * bindings/objc/objc_class.mm:
        (KJS::Bindings::ObjcClass::ObjcClass):
        (KJS::Bindings::ObjcClass::~ObjcClass):
        (KJS::Bindings::ObjcClass::methodsNamed):
        (KJS::Bindings::ObjcClass::fieldNamed):
        * bindings/objc/objc_runtime.h:
        (KJS::Bindings::ObjcMethod::ObjcMethod): Initialized uninitialized
        variable to prevent bad CFRelease.
        (KJS::Bindings::ObjcMethod::~ObjcMethod): Removed erroneous ';' from
        if statement to prevent bad CFRelease.
        * bindings/objc/objc_runtime.cpp: Changed to use the preferred
        ObjectStructPtr, for clarity.

2006-02-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by John.

        - Fixed <rdar://problem/4330457> CrashTracer: [REGRESSION] 3763 crashes
        in Safari at com.apple.JavaScriptCore: KJS::Bindings::JavaInstance::
        getClass const + 56

        Once plugins work in DumpRenderTree, running run-webkit-tests --leaks
        will catch this. 

        This was a memory leak in the bindings code. The leak was so extreme
        that it would cause Safari or the JVM to abort from lack of memory.
        Upon construction, Class objects create field and method objects, 
        storing them in CFDictionaries. The bug was that upon destruction, the 
        class objects released the dictionaries but didn't destroy the stored 
        objects.

        The fix is to supply CFDictionary callbacks for destroying the values
        added to the dictionary. 
        
        * bindings/jni/jni_class.cpp: 
        (JavaClass::JavaClass): Added delete callbacks
        * bindings/runtime.cpp: Added definitions for delete callbacks
        (KJS::Bindings::deleteMethodList):
        (KJS::Bindings::deleteMethod):
        (KJS::Bindings::deleteField):
        * bindings/runtime.h: Added declarations for delete callbacks

2006-02-14  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Justin.

        Fixed <rdar://problem/4415050> STD: WebCore build steps use echo -n, which will change
        behavior due to POSIX version of sh

        * JavaScriptCore.xcodeproj/project.pbxproj: removed the use of echo -n, replaced with printf ""

2006-02-13   Dave Hyatt <hyatt@apple.com>

        Fix Win32 bustage in JavaScriptCore.

        Reviewed by darin

        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
        Add JSImmediate to the Win32 project.

        * kjs/JSImmediate.h:
        (KJS::JSImmediate::fromDouble):
        (KJS::JSImmediate::toDouble):
        (KJS::JSImmediate::NanAsBits):
        (KJS::JSImmediate::oneAsBits):
        Win32 needs explicit returns after abort() for non-void functions.

        * kjs/testkjs.cpp:
        (run):
        Win32 catches a bug in testkjs!  The "return 2" should actually
        have been a return false.

        * kjs/value.h:
        The extern decls of NaN and Inf need to be const.

=== JavaScriptCore-521.7 ===

2006-02-13  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin.

        Replaced the old NS_DURING exception blocking with @try/@catch.

        * JavaScriptCorePrefix.h: undef try and catch to workaround a C++ conflict
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):
        (ObjcInstance::invokeDefaultMethod):
        (ObjcInstance::setValueOfUndefinedField):
        (ObjcInstance::getValueOfUndefinedField):
        * bindings/objc/objc_runtime.mm:
        (ObjcField::valueFromInstance):
        (ObjcField::setValueToInstance):
        (ObjcArray::setValueAt):
        (ObjcArray::valueAt):

2006-02-13  Darin Adler  <darin@apple.com>

        - fix a couple problems building on Windows, based on requests
          from Krzysztof Kowalczyk <kkowalczyk@gmail.com>

        * kjs/JSImmediate.h: Change code using non-standard u_int32/64_t types
        to the standard uint32/64_t. Also removed curious "isIEEE()" function
        that checked the sizes of some types (and type sizes alone don't tell you if
        the floating point conforms to the IEEE-standard). Added missing include
        of <stdint.h>.

        * kjs/property_slot.h: Added missing include of <assert.h>.

2006-02-12  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by darin.

        Cleaned up testkjs, added new "run" functionality to allow scripting 
        tests from within JS. ("run" is a part of my new super-accurate
        JS iBench.)

        No regressions in run-javascriptcore-tests.

        * kjs/testkjs.cpp:
        (GlobalImp::className):
        (TestFunctionImp::):
        (TestFunctionImp::callAsFunction):
        (main):
        (run):

2006-02-11  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Darin.

        - improve fix for http://bugs.webkit.org/show_bug.cgi?id=5163
        RealPlayer.GetTitle() Crashes Safari/Dashboard

        * bindings/c/c_utility.cpp: (KJS::Bindings::convertUTF8ToUTF16):
        Use kCFStringEncodingISOLatin1 rather than kCFStringEncodingWindowsLatin1, 
        because the latter encoding has holes, and conversion can still fail.

2006-02-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        - Inlined RefPtr assignment operators. .7% performance win on 
        super-accurate JS iBench.

        * kxmlcore/RefPtr.h:
        (KXMLCore::::operator):

2006-02-10  Geoffrey Garen  <ggaren@apple.com>

        No review needed, just a build fix. This time for sure.

        * kjs/JSType.h:

2006-02-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by eric.
        
        - Fixed build. As it goes without saying, I will not mention that I
        blame Kevin.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/JSImmediate.cpp:
        (KJS::JSImmediate::toObject):

2006-02-09  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by mjs.

        - Fixed <rdar://problem/4343730> Should switch ConstantValues (null, 
        undefined, true, false) from JS objects to immediate values similar to
        SimpleNumber

        2.0% performance gain on my new super-accurate version of JS iBench.
        (I promise to land a version of it soon.)

        The gist of the change:
        (1) The SimpleNumber class (simple_number.h) is now the JSImmediate
        class (JSImmediate.h/.cpp), and it handles not only numbers but also 
        null, undefined, true, and false. 
        (2) JSImmediate provides convenience methods for the bit masking
        necessary to encode and decode immediate values.
        (3) ConstantValues, BooleanImp, NullImp, and UndefinedImp are gone.
        (4) JSCell no longer implements functions like getBoolean, because
        only a JSImmediate can be a boolean.
        (5) JSImmediate no longer uses ALWAYS_INLINE because there's no need,
        and ALWAYS_INLINE is a non-portable option of last resort.
        (6) Type is now JSType, and it resides in its own file, JSType.h.
        Since I was there, I did some header include sorting as part of this
        change.

        The rest pretty much explains itself.

        * JavaScriptCore.xcodeproj/project.pbxproj: Removed simple_number.h,
        added JSImmediate.h/.cpp.
        * bindings/c/c_instance.cpp:
        (KJS::Bindings::CInstance::defaultValue):
        * bindings/c/c_instance.h:
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertValueToNPVariant):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::defaultValue):
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::convertValueToJObject):
        * bindings/objc/WebScriptObject.mm:
        (+[WebScriptObject _convertValueToObjcValue:originExecutionContext:executionContext:]):
        Standardized calls to use getXXX instead of hand-rolling JSValue 
        functionality.
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::getValueOfUndefinedField):
        (ObjcInstance::defaultValue):
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::type):
        (ObjcFallbackObjectImp::defaultValue):
        * bindings/runtime.h:
        (KJS::Bindings::Instance::getValueOfUndefinedField):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::defaultValue):
        * bindings/runtime_object.h:
        * kjs/JSImmediate.h: Added.
        (KJS::JSImmediate::isImmediate):
        (KJS::JSImmediate::isNumber):
        (KJS::JSImmediate::isBoolean):
        (KJS::JSImmediate::isUndefinedOrNull):
        (KJS::JSImmediate::fromDouble):
        (KJS::JSImmediate::toDouble):
        (KJS::JSImmediate::toBoolean):
        (KJS::JSImmediate::trueImmediate):
        (KJS::JSImmediate::falseImmediate):
        (KJS::JSImmediate::NaNImmediate):
        (KJS::JSImmediate::undefinedImmediate):
        (KJS::JSImmediate::nullImmediate):
        (KJS::JSImmediate::tag):
        (KJS::JSImmediate::unTag):
        (KJS::JSImmediate::getTag):
        (KJS::JSImmediate::):
        (KJS::JSImmediate::isIEEE):
        (KJS::JSImmediate::is32bit):
        (KJS::JSImmediate::is64bit):
        (KJS::JSImmediate::NanAsBits):
        (KJS::JSImmediate::zeroAsBits):
        (KJS::JSImmediate::oneAsBits):
        * kjs/JSLock.cpp:
        (KJS::JSLock::lock): Removed hack-o-rama to initialize ConstantValues.
        * kjs/JSType.h: Added.
        * kjs/collector.cpp:
        (KJS::Collector::protect):
        (KJS::Collector::unprotect):
        (KJS::Collector::collect):
        * kjs/internal.cpp:
        (KJS::StringImp::toPrimitive):
        (KJS::NumberImp::toPrimitive):
        (KJS::NumberImp::toBoolean):
        (KJS::GetterSetterImp::toPrimitive):
        * kjs/internal.h:
        (KJS::StringImp::type):
        (KJS::NumberImp::type):
        * kjs/object.cpp:
        (KJS::JSObject::type):
        (KJS::tryGetAndCallProperty): Replaced "Are you one of the six things
        I'm looking for?" test with "Are you not the one thing I'm not looking
        for" test.
        (KJS::JSObject::defaultValue):
        (KJS::JSObject::toPrimitive):
        * kjs/object.h:
        (KJS::GetterSetterImp::type):
        (KJS::JSValue::isObject):
        * kjs/operations.cpp:
        (KJS::equal):
        (KJS::strictEqual):
        (KJS::add):
        * kjs/reference.cpp:
        (KJS::Reference::deleteValue):
        * kjs/simple_number.h: Removed.
        * kjs/string_object.cpp:
        (StringInstance::getOwnPropertySlot): fixed indentation
        * kjs/value.cpp:
        (KJS::JSValue::toObject):
        (KJS::jsNumberCell): New function to quarantine a PIC branch -- allows
        us to inline jsNumber without adding PIC branches to callers.
        * kjs/value.h:
        (KJS::jsUndefined):
        (KJS::jsNull):
        (KJS::jsNaN):
        (KJS::jsBoolean):
        (KJS::jsNumber):
        (KJS::JSValue::downcast):
        (KJS::JSValue::isUndefinedOrNull):
        (KJS::JSValue::isBoolean):
        (KJS::JSValue::isNumber):
        (KJS::JSValue::isString):
        (KJS::JSValue::isObject):
        (KJS::JSValue::getBoolean):
        (KJS::JSValue::getNumber):
        (KJS::JSValue::getString):
        (KJS::JSValue::getObject):
        (KJS::JSValue::getUInt32):
        (KJS::JSValue::mark): Replaced !JSImmediate::is() test with assertion,
        resulting in a slight performance gain. Callers should always check
        !marked() before calling mark(), so it's impossible to call mark on
        a JSImmediate.
        (KJS::JSValue::marked):
        (KJS::JSValue::type):
        (KJS::JSValue::toPrimitive):
        (KJS::JSValue::toBoolean):
        (KJS::JSValue::toNumber):
        (KJS::JSValue::toString):

2006-02-06  Eric Seidel  <eseidel@apple.com>

        Add svn:ignore properties for visual studio internals.

2006-02-06  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Darin.

        - Refactor DateInstance to provide direct access to data. Several WIN32 modifications.
        http://bugs.webkit.org/show_bug.cgi?id=7107

        - No tests added - only changed functionality on WIN32, which should be covered by 
        existing tests.

        * kjs/date_object.cpp:
        (gmtoffset): On WIN32, use the recommended global (_timezone rather than timezone).
        Updated comments. 
        (KJS::timeZoneOffset): Removed, was basically the same as the above.
        (KJS::formatTime): Pass an UTC flag - UTC/local cannot be correctly selected on
        Windows based on struct tm itself.
        (KJS::DateInstance::getTime): Added.
        (KJS::DateInstance::getUTCTime): Added.
        (KJS::millisecondsToTM): Factored out from DateProtoFunc::callAsFunction().
        (KJS::DateObjectImp::callAsFunction): Use the new parameter to formatTime().
        (KJS::DateProtoFunc::callAsFunction): Updated for the other changes. The code for
        GetTimezoneOffset was incorrect on WIN32 - _daylight global has nothing to do
        with daylight savings time being in effect.

        * kjs/date_object.h: Added prototypes for new functions.

2006-02-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Anders.
        
        - fixed ~1100 KJS::Node leaked on layout tests
        http://bugs.webkit.org/show_bug.cgi?id=7097

        * kjs/internal.cpp:
        (KJS::Parser::noteNodeCycle):
        (KJS::Parser::removeNodeCycle):
        (KJS::clearNewNodes):
        * kjs/internal.h:
        * kjs/nodes.cpp:
        (ElementNode::breakCycle):
        (PropertyListNode::breakCycle):
        (ArgumentListNode::breakCycle):
        (StatListNode::StatListNode):
        (StatListNode::breakCycle):
        (VarDeclListNode::breakCycle):
        (BlockNode::BlockNode):
        (ClauseListNode::breakCycle):
        (CaseBlockNode::CaseBlockNode):
        (ParameterNode::breakCycle):
        (SourceElementsNode::SourceElementsNode):
        (SourceElementsNode::breakCycle):
        * kjs/nodes.h:
        (KJS::Node::breakCycle):
        (KJS::ElementNode::ElementNode):
        (KJS::ArrayNode::ArrayNode):
        (KJS::PropertyListNode::PropertyListNode):
        (KJS::ObjectLiteralNode::ObjectLiteralNode):
        (KJS::ArgumentListNode::ArgumentListNode):
        (KJS::ArgumentsNode::ArgumentsNode):
        (KJS::VarDeclListNode::VarDeclListNode):
        (KJS::VarStatementNode::VarStatementNode):
        (KJS::ForNode::ForNode):
        (KJS::CaseClauseNode::CaseClauseNode):
        (KJS::ClauseListNode::ClauseListNode):
        (KJS::ParameterNode::ParameterNode):
        (KJS::FuncExprNode::FuncExprNode):
        (KJS::FuncDeclNode::FuncDeclNode):

2006-02-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Hyatt.
        
        - fix default traits for classes to make sure default constructors get called

        * kxmlcore/VectorTraits.h:
        (KXMLCore::):

2006-02-04  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=5210
          REGRESSION: for/in loop with var changes global variable instead of making local

        Test: fast/js/for-in-var-scope.html

        * kjs/nodes.cpp:
        (valueForReadModifyAssignment): Use ALWAYS_INLINE macro.
        (ForInNode::execute): Break out of the scope chain loop once we find and set the
        loop variable. We don't want to set multiple loop variables.
        (ForInNode::processVarDecls): Process the declaration of the loop variable.

        - other cleanup

        * kjs/object.cpp: (KJS::tryGetAndCallProperty): Use ALWAYS_INLINE macro.
        * kxmlcore/FastMalloc.cpp: Change to use ALWAYS_INLINE macro from AlwaysInline.h
        instead of defining it here a second time.

2006-02-04  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Hyatt.
        
        - change JavaScript collector statistics calls to use HashCountedSet instead
        of CFSet; other misc cleanup
        http://bugs.webkit.org/show_bug.cgi?id=7072
        
        * kjs/collector.cpp:
        (KJS::Collector::numProtectedObjects): renamed from numReferencedObjects
        (KJS::typeName):
        (KJS::Collector::rootObjectTypeCounts): renamed from rootObjectClasses,
        use HashSet
        * kjs/collector.h:
        (KJS::Collector::isOutOfMemory): Renamed from outOfMemory.
        * kjs/nodes.cpp:

2006-02-03  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Justin.

        Renamed configuration names to Debug, Release and Production.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-02-02  George Staikos <staikos@opensource.apple.com>

        Reviewed by Maciej.

        * kjs/lookup.h: Fix compile, merged from KDE.

2006-02-02  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - http://bugs.webkit.org/show_bug.cgi?id=7005
          add Noncopyable, OwnPtr, OwnArrayPtr to KXMLCore

        * kxmlcore/Noncopyable.h: Added.
        * kxmlcore/OwnArrayPtr.h: Added.
        * kxmlcore/OwnPtr.h: Added.

        * JavaScriptCore.xcodeproj/project.pbxproj: Added new files.

        * kjs/function.h:
        * kjs/function.cpp: Use OwnPtr for Parameter pointers.

        * kjs/internal.h: Use Noncopyable for LabelStack.

        * kjs/list.cpp: Use OwnArrayPtr for overflow.

        * kjs/property_map.h:
        * kjs/property_map.cpp: Use OwnArrayPtr for SavedProperties.
        Use Vector for some stack buffers.

        * kjs/regexp_object.h:
        * kjs/regexp_object.cpp: Use OwnArrayPtr for lastOvector.

2006-01-31  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - fixed leak of hundreds of thousands of JS parser nodes on the layout tests, and added an exit counter
        that would catch them

        * kjs/nodes.cpp:
        (NodeCounter::~NodeCounter): Added debug-only node counter.
        (Node::Node):
        (Node::~Node):
        * kxmlcore/VectorTraits.h: Simple classes like RefPtr do in fact need destruction.

2006-01-31  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - added deleteAllValues for HashSet as well as HashMap
        - fixed conversion from const_iterator to iterator, which I broke a while back

        * kxmlcore/HashMap.h: Updated copyright date.
        * kxmlcore/HashSet.h: (KXMLCore::deleteAllValues): Added.
        * kxmlcore/HashTable.h: (KXMLCore::HashTableIterator::operator const_iterator): Added.

2006-01-31  Tim Omernick  <timo@apple.com>

        Reviewed by Geoff Garen.

        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertUTF8ToUTF16):
        Fixed an invalid assertion that UTF8Chars is not NULL.  It is valid for it to be NULL as long as
        UTF8Length is 0.
        This fixes an assertion failure on TOT at <http://www.musicindiaonline.com/p/x/tJO0OOBME9.As1NMvHdW/>,
        where JavaScript is getting a NULL string back from some call on the Real Player plugin.

2006-01-30  Anders Carlsson  <andersca@mac.com>

        Reviewed by Darin.

        Fix http://bugs.webkit.org/show_bug.cgi?id=6907
        REGRESSION: United.com menus messed up due to document.all/MSIE sniff
        
        * kjs/nodes.cpp:
        (typeStringForValue):
        Return "undefined" if the given object should masquerade as undefined.
        
        * kjs/object.h:
        (KJS::JSObject::masqueradeAsUndefined):
        Rename from isEqualToNull.
        
        * kjs/operations.cpp:
        (KJS::equal):
        Update for name change.

2006-01-29  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - properly define Vector assignment operator; the private version was accidentally left
        in, and the template version is not enough to replace the default

        * kxmlcore/Vector.h:
        (KXMLCore::Vector::operator=):

2006-01-29  Eric Seidel  <eseidel@apple.com>

        Reviewed by darin.

        Fix the build by applying a GCC-specific namespace hack.

        * kjs/lookup.h:

2006-01-29  Eric Seidel <eseidel@apple.com>

        Reviewed by hyatt.

        Fix build on Win32.

        * kjs/lookup.h: fixed ::cacheGlobalObject
        * kxmlcore/Vector.h:
        (KXMLCore::Vector::operator[]): use unsigned long

2006-01-29  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Dave Hyatt.

        * kxmlcore/Vector.h:
        (KXMLCore::Vector::operator[]): Add unsigned overload

2006-01-28  Darin Adler  <darin@apple.com>

        Reviewed by John Sullivan.

        - http://bugs.webkit.org/show_bug.cgi?id=6895
          include exception names in JavaScript form of DOM exception

        * khtml/ecma/kjs_binding.cpp: (KJS::setDOMException): Include the name of the
        exception in the error message.

2006-01-28  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.
        
        - miscellaneous Vector improvements

        * kxmlcore/Vector.h:
        (KXMLCore::Vector::at): Add range-checking asserts.
        (KXMLCore::Vector::first): Added as a convenience.
        (KXMLCore::Vector::last): Convenience for stack-style use.
        (KXMLCore::Vector::removeLast): ditto

2006-01-28  Darin Adler  <darin@apple.com>

        Reviewed by John Sullivan

        - fix http://bugs.webkit.org/show_bug.cgi?id=6870
          REGRESSION: JavaScript Date constructor won't accept another Date object

        Test: fast/js/date-constructor.html

        * kjs/date_object.cpp: (KJS::DateObjectImp::construct):
        Added a special case for constructing one date from another (to avoid losing
        milliseconds, which are not in the text form, to match Firefox), and changed
        the base code to convert to primitive before checking for string to match
        the standard. Also corrected a couple silly things in the "construct from
        current time" code path (removed a floor that does no good, and changed
        the constant used to convert microseconds to milliseconds to be a 1000
        rather than "msPerSecond").

2006-01-28  Darin Adler  <darin@apple.com>

        * kjs/create_hash_table: Added missing license.

2006-01-28  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Dave Hyatt.
        
        - added a Vector class
        http://bugs.webkit.org/show_bug.cgi?id=6894

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/internal.cpp:
        (KJS::Parser::saveNewNode): Apply Vector.
        (KJS::clearNewNodes): ditto
        * kjs/number_object.cpp:
        (integer_part_noexp): ditto
        (char_sequence): ditto
        * kjs/ustring.cpp:
        (KJS::UString::UTF8String): ditto
        * kxmlcore/HashMap.h:
        (KXMLCore::deleteAllValues): Tweaked this to only apply to HashMap,
        other versions are useful for other containers.
        * kxmlcore/Vector.h: Added. Implemented a Vector class, which should
        be usable for all Array/QVector style purposes, and also as a stack buffer
        with oversize handling. Also some helper classes to make vector operations
        as efficient as possible for POD types and for simple non-PODs like RefPtr.
        (KXMLCore::):
        (KXMLCore::VectorTypeOperations::destruct):
        (KXMLCore::VectorTypeOperations::initialize):
        (KXMLCore::VectorTypeOperations::move):
        (KXMLCore::VectorTypeOperations::uninitializedCopy):
        (KXMLCore::VectorTypeOperations::uninitializedFill):
        (KXMLCore::VectorBuffer::VectorBuffer):
        (KXMLCore::VectorBuffer::~VectorBuffer):
        (KXMLCore::VectorBuffer::deallocateBuffer):
        (KXMLCore::VectorBuffer::inlineBuffer):
        (KXMLCore::Vector::Vector):
        (KXMLCore::Vector::~Vector):
        (KXMLCore::Vector::size):
        (KXMLCore::Vector::capacity):
        (KXMLCore::Vector::isEmpty):
        (KXMLCore::Vector::at):
        (KXMLCore::Vector::operator[]):
        (KXMLCore::Vector::data):
        (KXMLCore::Vector::operator T*):
        (KXMLCore::Vector::operator const T*):
        (KXMLCore::Vector::begin):
        (KXMLCore::Vector::end):
        (KXMLCore::Vector::clear):
        (KXMLCore::Vector::fill):
        (KXMLCore::Vector::operator=):
        (KXMLCore::::Vector):
        (KXMLCore::::operator):
        (KXMLCore::::fill):
        (KXMLCore::::expandCapacity):
        (KXMLCore::::resize):
        (KXMLCore::::reserveCapacity):
        (KXMLCore::::append):
        (KXMLCore::deleteAllValues):
        * kxmlcore/VectorTraits.h: Added.
        (KXMLCore::VectorTraits): Traits to enable making Vector efficient for
        simple types.

2006-01-28  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=5163
        RealPlayer.GetTitle() Crashes Safari/Dashboard

        * bindings/c/c_utility.cpp: (KJS::Bindings::convertUTF8ToUTF16):
        Fallback to kCFStringEncodingWindowsLatin1 if the passed buffer is not valid UTF-8, preventing crashes.

2006-01-25  George Staikos <staikos@opensource.apple.com>

        Reviewed by Darin.

        * kxmlcore/HashFunctions.h: Merge build fix from KDE.

2006-01-25  Darin Adler  <darin@apple.com>

        - removed an unused source file

        * kjs/pointer_hash.h: Removed.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Removed reference to pointer_hash.h.

2006-01-23  Anders Carlsson  <andersca@mac.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=6737
        KJS_DEFINE_PROTOTYPE should work outside of the KJS namespace
        
        * kjs/lookup.h:
        Prefix all KJS types with KJS:: in KJS_DEFINE_PROTOTYPE.
        
        (cacheGlobalObject):
        Move this out of the KJS namespace.

2006-01-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.

        - renamed PointerHash to PtrHash
        - made PtrHash the default hash function for int and pointer types that aren't further specialized
        - added an AtomicStringImpl class to make it easier and more typesafe to identity hash atomic strings
        - did appropriate consequent cleanup (very few places now need to declare a hash function)
        http://bugs.webkit.org/show_bug.cgi?id=6752
        
        * kjs/array_object.cpp:
        (ArrayProtoFunc::callAsFunction): no need to mention PointerHash
        * kjs/collector.cpp: ditto
        * kjs/identifier.cpp:
        (KXMLCore::): declare DefaultHash the new way
        * kjs/internal.cpp: no need to mention PointerHash
        * kjs/ustring.h:
        * kxmlcore/HashCountedSet.h: change how we get the default hash to make it
        easier to specialize on PtrHash
        * kxmlcore/HashFunctions.h:
        (KXMLCore::): renamed PointerHash to PtrHash; changed DefaultHash so that it has
        a Hash typedef rather than being a hash function class itself; declared DefaultHash
        for int and partializy specialized for pointer types
        * kxmlcore/HashMapPtrSpec.h:
        (KXMLCore::PtrHashIteratorAdapter::PtrHashIteratorAdapter): Slight tweaks for new
        way of handling pointer hash
        (KXMLCore::PtrHashConstIteratorAdapter::PtrHashConstIteratorAdapter): ditto
        (KXMLCore::): ditto
        * kxmlcore/HashMap.h: ditto
        * kxmlcore/HashSet.h: ditto

2006-01-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Tim Omernick.
        
        - use classes instead of free functions for extractors, this better matches how other
        things work and should avoid the need for hacky workarounds on other compilers
        http://bugs.webkit.org/show_bug.cgi?id=6748

        * kjs/array_object.cpp:
        * kjs/identifier.cpp:
        * kjs/internal.cpp:
        * kxmlcore/HashMap.h:
        (KXMLCore::PairFirstExtractor::extract):
        * kxmlcore/HashMapPtrSpec.h:
        (KXMLCore::):
        * kxmlcore/HashSet.h:
        (KXMLCore::IdentityExtractor::extract):
        * kxmlcore/HashTable.h:
        (KXMLCore::addIterator):
        (KXMLCore::removeIterator):
        (KXMLCore::HashTable::add):
        (KXMLCore::HashTable::isEmptyBucket):
        (KXMLCore::HashTable::isDeletedBucket):
        (KXMLCore::HashTable::HashTable):
        (KXMLCore::HashTable::lookup):
        (KXMLCore::HashTable::add):
        (KXMLCore::HashTable::reinsert):
        (KXMLCore::HashTable::find):
        (KXMLCore::HashTable::contains):
        (KXMLCore::HashTable::remove):
        (KXMLCore::HashTable::allocateTable):
        (KXMLCore::HashTable::deallocateTable):
        (KXMLCore::HashTable::expand):
        (KXMLCore::HashTable::rehash):
        (KXMLCore::HashTable::clear):
        (KXMLCore::HashTable::swap):
        (KXMLCore::HashTable::operator):
        (KXMLCore::HashTable::checkTableConsistency):
        (KXMLCore::HashTable::checkTableConsistencyExceptSize):
        (KXMLCore::HashTable::invalidateIterators):

2006-01-23  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Tim Hatcher.
        
        - renamed inert() operation on HashSet, HashCountedSet and HashTable to add()
        for consistency with HashMap

        * kjs/array_object.cpp:
        (ArrayProtoFunc::callAsFunction):
        * kjs/collector.cpp:
        (KJS::Collector::protect):
        * kjs/identifier.cpp:
        (KJS::Identifier::add):
        * kxmlcore/HashCountedSet.h:
        (KXMLCore::::add):
        * kxmlcore/HashMap.h:
        (KXMLCore::::inlineAdd):
        * kxmlcore/HashSet.h:
        (KXMLCore::::add):
        * kxmlcore/HashTable.h:
        (KXMLCore::HashTable::add):
        (KXMLCore::::add):
        (KXMLCore::::HashTable):

2006-01-23  Justin Garcia  <justin.garcia@apple.com>

        Reviewed by thatcher
        
        Turned on -O2 for B&I build.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-01-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Tim Hatcher.
        
        - it's "Franklin Street", not "Franklin Steet"

        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        * kjs/array_object.h:
        * kjs/bool_object.cpp:
        * kjs/bool_object.h:
        * kjs/collector.cpp:
        * kjs/collector.h:
        * kjs/completion.h:
        * kjs/context.h:
        * kjs/date_object.cpp:
        * kjs/date_object.h:
        * kjs/debugger.cpp:
        * kjs/debugger.h:
        * kjs/dtoa.h:
        * kjs/error_object.cpp:
        * kjs/error_object.h:
        * kjs/function.cpp:
        * kjs/function.h:
        * kjs/function_object.cpp:
        * kjs/function_object.h:
        * kjs/grammar.y:
        * kjs/identifier.cpp:
        * kjs/identifier.h:
        * kjs/internal.cpp:
        * kjs/internal.h:
        * kjs/interpreter.cpp:
        * kjs/interpreter.h:
        * kjs/lexer.cpp:
        * kjs/lexer.h:
        * kjs/list.cpp:
        * kjs/list.h:
        * kjs/lookup.cpp:
        * kjs/lookup.h:
        * kjs/math_object.cpp:
        * kjs/math_object.h:
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:
        * kjs/number_object.cpp:
        * kjs/number_object.h:
        * kjs/object.cpp:
        * kjs/object.h:
        * kjs/object_object.cpp:
        * kjs/object_object.h:
        * kjs/operations.cpp:
        * kjs/operations.h:
        * kjs/property_map.cpp:
        * kjs/property_map.h:
        * kjs/property_slot.cpp:
        * kjs/property_slot.h:
        * kjs/reference.cpp:
        * kjs/reference.h:
        * kjs/reference_list.cpp:
        * kjs/reference_list.h:
        * kjs/regexp.cpp:
        * kjs/regexp.h:
        * kjs/regexp_object.cpp:
        * kjs/regexp_object.h:
        * kjs/scope_chain.cpp:
        * kjs/scope_chain.h:
        * kjs/simple_number.h:
        * kjs/string_object.cpp:
        * kjs/string_object.h:
        * kjs/testkjs.cpp:
        * kjs/types.h:
        * kjs/ustring.cpp:
        * kjs/ustring.h:
        * kjs/value.cpp:
        * kjs/value.h:
        * kxmlcore/AlwaysInline.h:
        * kxmlcore/ListRefPtr.h:
        * kxmlcore/PassRefPtr.h:
        * kxmlcore/RefPtr.h:

2006-01-23  Darin Adler  <darin@apple.com>

        Reviewed by John Sullivan.

        - change needed for fix to http://bugs.webkit.org/show_bug.cgi?id=6617
          REGRESSION: Crash in cloneChildNodes when clicking element

        * kxmlcore/PassRefPtr.h: Fix assignment operator from RefPtr of a different
        type by calling get() instead of going directly at m_ptr.
        * kxmlcore/RefPtr.h: Ditto.

        - other changes

        * JavaScriptCore.xcodeproj/project.pbxproj: Xcode decided to change this file.
        It's just a resorted list of keys in a dictionary.

        * kjs/fpconst.cpp: Wrap this file in #if __APPLE__ since the alternate version
        in internal.cpp is in #if !__APPLE__. This file is to give us the "no init
        routine" property we want to have on OS X.

2006-01-22  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - Set up Page class and invert Frame / WebCoreFrameBridge ownership
        http://bugs.webkit.org/show_bug.cgi?id=6577

        * kjs/interpreter.h: make globalExec virtual so ScriptInterpreter can 
        override it

2006-01-23  George Staikos <staikos@opensource.apple.com>

        Reviewed by Maciej and Darin.

        * kxmlcore/Assertions.h: This file only works with __APPLE__ right now
        * kjs/interpreter.cpp: ditto
        * kjs/simple_number.h: Add assert.h and remove from config.h
        * kjs/array_object.cpp: Use relative paths for kxmlcore includes
        * kjs/testkjs.cpp: Use relative paths for kxmlcore includes

2006-01-23  George Staikos <staikos@opensource.apple.com>

        Reviewed by Maciej.

        * kjs/config.h: unbreak preprocessor change

2006-01-23  George Staikos <staikos@opensource.apple.com>

        Approved by Maciej and Darin.

        * kjs/:
        * kxmlcore/:
             Update FSF address in license to make merging easier

2006-01-22  George Staikos <staikos@opensource.apple.com>

        Reviewed by Maciej.

        * kjs/collector.cpp: merge major speedup from KDE on Linux
                             patch by Maks Orlovich, bug #6145
                             Also unify cpu detection
        * kjs/config.h: define simpler CPU macros

2006-01-22  George Staikos <staikos@opensource.apple.com>

        Reviewed by Maciej.

        * kjs/collector.cpp: merge FreeBSD compile fix from KDE
                             -> requires build magic for use

2006-01-21  George Staikos <staikos@opensource.apple.com>

        Reviewed by Maciej.

        * kjs/nodes2string.cpp
        * kjs/operations.h
        * kjs/debugger.h
          Fix pedantic compile with some gcc versions (Merge from KDE)

        * kjs/create_hash_table:
          Fix build with Perl 5.8.0 (Merge from KDE)

2006-01-18  Darin Adler  <darin@apple.com>

        Reviewed by Hyatt.

        - hash table fixes needed for my WebCore changes

        * kxmlcore/HashTable.h: (KXMLCore::HashTableConstIterator::operator=):
        Added a missing return statement.

        * kxmlcore/HashTraits.h: Fix traits so they work properly for classes where you
        can't instantiate with a 0 by using traits rather than ? : to select the default
        emtpy value of hash table keys.

        - small cleanup of "runtime" code left over from recent JavaScript crash fix

        * bindings/runtime_root.h:
        (KJS::Bindings::RootObject::RootObject): No explicit initialization of _imp needed
        since it's now a ProtectedPtr.
        (KJS::Bindings::RootObject::setRootObjectImp): Remove old code that relied on the
        fact that _imp was 0 and replaced with use of ProtectedPtr.
        (KJS::Bindings::RootObject::rootObjectImp): Updated since _imp is a ProtectedPtr.

2006-01-17  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - http://bugs.webkit.org/show_bug.cgi?id=6611
          add assertions to check correct use of hash table iterators

        * kxmlcore/HashTable.h:
        (KXMLCore::addIterator): Added. Helper function that adds an iterator to the list
        maintained by the specified hash table.
        (KXMLCore::removeIterator): Added. Helper function that removes an iterator from
        the list maintained by the hash table it's in.
        (KXMLCore::HashTableConstIterator::HashTableConstIterator): Added a HashTable
        parameter, ignored when not debugging. Call addIterator.
        (KXMLCore::HashTableConstIterator::~HashTableConstIterator):
        (KXMLCore::HashTableConstIterator::operator=): Call removeIterator.
        (KXMLCore::HashTableConstIterator::operator*): Call checkValidity.
        (KXMLCore::HashTableConstIterator::operator->): Ditto.
        (KXMLCore::HashTableConstIterator::operator++): Ditto.
        (KXMLCore::HashTableConstIterator::operator==): Ditto.
        (KXMLCore::HashTableConstIterator::operator!=): Ditto.
        (KXMLCore::HashTableConstIterator::checkValidity): Checks that the hash table
        pointer is not 0 and if there are two iterators that both point at the same table.
        (KXMLCore::HashTableIterator::HashTableIterator): Changed to use the const iterator
        as an implementation detail, to avoid having two separate iterator implementations.
        (KXMLCore::HashTableIterator::operator*): Ditto.
        (KXMLCore::HashTableIterator::operator->): Ditto.
        (KXMLCore::HashTableIterator::operator++): Ditto.
        (KXMLCore::HashTableIterator::operator==): Ditto.
        (KXMLCore::HashTableIterator::operator!=): Ditto.
        (KXMLCore::HashTable::HashTable): Initialize pointer to head of iterators list.
        (KXMLCore::HashTable::~HashTable): Added call to invalidateIterators.
        (KXMLCore::HashTable::makeIterator): Pass this pointer.
        (KXMLCore::HashTable::makeConstIterator): Ditto.
        (KXMLCore::HashTable::insert): Call invalidateIterators, since this is a public
        entry point that modifies the hash table.
        (KXMLCore::HashTable::remove): Ditto.
        (KXMLCore::HashTable::clear): Ditto.
        (KXMLCore::HashTable::swap): Ditto.
        (KXMLCore::HashTable::invalidateIterators): Added. Walks the iterators list and
        clears out the table, next, and previous pointers in all of them, and then clears
        the head so we have an empty list.
        (KXMLCore::addIterator): Added. Adds the iterator the the linked list in the
        passed-in table, and points the iterator at the table.
        (KXMLCore::removeIterator): Added. Removes the iterator from the linked list in
        the passed-in table.

        * kxmlcore/HashTraits.h: A bit of tweaking and formatting.

2006-01-17  Justin Garcia  <justin.garcia@apple.com>

        Reviewed by eric
        
        Deployment builds now use -O2

        * JavaScriptCore.xcodeproj/project.pbxproj:

2006-01-17  Darin Adler  <darin@apple.com>

        Reviewed by Anders.

        - fix http://bugs.webkit.org/show_bug.cgi?id=6610
          change RefPtr so that it works when deref ends up deleting the RefPtr

        * kxmlcore/PassRefPtr.h: Always set m_ptr before calling deref.
        * kxmlcore/RefPtr.h: Ditto.

2006-01-16  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by darin.

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=6322
        DateProtoFuncImp::callAsFunction can crash due to lack of type checking

        * kjs/date_object.cpp:
        (KJS::DateProtoFunc::callAsFunction): Type check calls to all methods. 
        This matches section 15.9.5 in the spec.

2006-01-16  Tim Omernick  <timo@apple.com>

        Reviewed by John Sullivan.

        JavaScriptCore part of <rdar://problem/4211707> NPAPI ref count behavior differs with Mozilla

        * bindings/npruntime.cpp:
        (_NPN_ReleaseObject):
        Refactored part of this function out into _NPN_DeallocateObject.
        (_NPN_DeallocateObject):
        Forcibly deallocates the passed object, even if its refcount is
        greater than zero.
        
        * bindings/npruntime_impl.h:
        Declared _NPN_DeallocateObject().

2006-01-16  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix problem with ++, ==, and != on const iterators in
          HashMaps that are using the pointer specialization

        * kxmlcore/HashMapPtrSpec.h:
        (KXMLCore::PointerHashConstIteratorAdapter::operator++): Change type to const_iterator.
        (KXMLCore::PointerHashConstIteratorAdapter::operator==): Ditto.
        (KXMLCore::PointerHashConstIteratorAdapter::operator!=): Ditto.

2006-01-15  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Anders.

        - fix http://bugs.webkit.org/show_bug.cgi?id=6561
        run-javascriptcore-tests doesn't work

        * JavaScriptCore/tests/mozilla/Getopt/Mixed.pm: 
        Changed revision number to 1.8 (broken by svn migration).

2006-01-14  David Kilzer  <ddkilzer@kilzer.net>

        Reviewed and landed by Anders.

        * kjs/create_hash_table: Fixed comment typo.

2006-01-13  Maks Orlovich   <maksim@kde.org>

        Mostly merging work by Peter Kelly. Reviewed by Maciej, landed by ap.

        - fix http://bugs.webkit.org/show_bug.cgi?id=6261
        Misc. array object fixes from KJS

        * kjs/array_object.cpp: Don't treat 2^32-1 as a real array index property.
        (ArrayInstance::getOwnPropertySlot): Ditto.
        (ArrayInstance::deleteProperty): Ditto.
        (ArrayInstance::put): Ditto.
        (ArrayInstance::propList): Added a FIXME comment.
        (ArrayInstance::put): Throw exception on trying to set invalid array length.
        (ArrayProtoFunc::callAsFunction): Do not use a separator argument when doing toString/toLocalString.
        * kjs/array_object.h: Added MAX_ARRAY_INDEX.

2006-01-13  Darin Adler  <darin@apple.com>

        - Replaced tabs with spaces in source files that had less than 10 lines with tabs.
        - Set allow-tabs Subversion property in source files that have more than 10 lines with tabs.

2006-01-13  Anders Carlsson  <andersca@mac.com>

        Reviewed by Eric.

        * kjs/create_hash_table:
        Use correct size variables.

2006-01-13  Anders Carlsson  <andersca@mac.com>

        Reviewed by Darin.

        * kjs/create_hash_table:
        Don't create an empty entry array, instead add a entry with all fields
        set to null and set the hash table size to 1.
        
        * kjs/lookup.cpp:
        (findEntry):
        Remove the hash table size check

2006-01-12  Anders Carlsson  <andersca@mac.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=6494
        Crash when assigning a new function to a DOMParser object
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        Move lookup.cpp before lookup.h
        
        * kjs/lookup.cpp:
        (findEntry):
        If the hash table is empty, return 0 early.

2006-01-12  George Staikos <staikos@kde.org>

        Reviewed by Darin.

        * kjs/interpreter.cpp:
        * kjs/testkjs.cpp:
        * kjs/interpreter.h:
        Add helper to interpreter to call the collector in order to facilitate
        visibility rules in KDE.

2006-01-12  George Staikos <staikos@kde.org>

        Reviewed by Maciej.

        * kjs/kjs.pro: Updates to build the whole thing on Linux at least.

        * kxmlcore/HashTable.h: Add missing assert.h

2006-01-12  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fix http://bugs.webkit.org/show_bug.cgi?id=6505
          retire APPLE_CHANGES from JavaScriptCore

        * JavaScriptCore.xcodeproj/project.pbxproj: Removed both
        APPLE_CHANGES and HAVE_CONFIG_H from all targets.

        * README: Removed. This had obsolete information in it
        and it wasn't clear what to replace it with.

        * kjs/collector.h: Removed an APPLE_CHANGES if around something
        that's not really platform-specific (although it does use a
        platform-specific API at the moment).
        * kjs/collector.cpp: Removed a mistaken comment.

        * kjs/grammar.y:
        * kjs/internal.cpp:
        * kjs/object.h:
        * kjs/operations.cpp:
        * kjs/operations.h:
        * kjs/ustring.h:
        Use __APPLE__ instead of APPLE_CHANGES for code that should be
        used only on Mac OS X.

        * kjs/interpreter.cpp: Removed APPLE_CHANGES ifdef around the include
        of the runtime.h header. Even though that header isn't needed at the
        moment on platforms other than Mac OS X, the conditional stuff should
        be in the header itself, not in this one client.

        * kjs/math_object.cpp: (MathFuncImp::callAsFunction): Removed some
        code inside APPLE_CHANGES. I'm pretty sure this code isn't needed on
        any platform where pow is implemented corrrectly according to the IEEE
        standard. If it is needed on some, we can add it back with an appropriate
        #if for the platforms where it is needed.

2006-01-12  Justin Haygood  <justin@xiondigital.net>

        Reviewed, tweaked, and landed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=6416
          lexer.cpp, grammar.y protect include of config.h with "HAVE_CONFIG_H"

        * kjs/dtoa.cpp: Removed HAVE_CONFIG_H, changed config.h to use
        quotes instead of angle brackets. Moved dtoa.h include to the top.
        Changed system header includes to use angle brackets instead of quotes.
        * kjs/grammar.y: Removed HAVE_CONFIG_H, changed config.h to use
        quotes instead of angle brackets.
        * kjs/lexer.cpp: Removed HAVE_CONFIG_H, changed config.h to use
        quotes instead of angle brackets. Moved lexer.h include to the top.
        * kjs/ustring.cpp: Removed HAVE_CONFIG_H, changed config.h to use
        quotes instead of angle brackets. Moved ustring.h include to the top.

2006-01-12  George Staikos <staikos@kde.org>

        Reviewed by Maciej

        - Import initial QMake file.  Doesn't fully work yet.

2006-01-11  Ricci Adams  <ricciadams@apple.com>

        Reviewed by Maciej and Darin, landed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=5939
          final comma in javascript object prevents parsing

        * kjs/grammar.y: Added rule to allow trailing comma in
        object construction.

2006-01-11  Ricci Adams  <ricciadams@apple.com>

        Reviewed by Geoff, landed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=5308
          Number.toFixed doesn't include leading 0

        * kjs/number_object.cpp: (NumberProtoFunc::callAsFunction):
        Fixed a "<" that should have been a "<=".

2006-01-11  Ricci Adams  <ricciadams@apple.com>

        Reviewed by Geoff, landed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=5307
          Number.toFixed doesn't round 0.5 up

        * kjs/number_object.cpp: (NumberProtoFunc::callAsFunction):
        Fixed a ">" that should have been a ">=".

2006-01-11  Justin Haygood  <justin@xiondigital.net>

        Reviewed and landed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=6486
          JavaScriptCore should use system malloc on Windows

        * kjs/config.h: Add USE_SYSTEM_MALLOC to the Win32 section.

2006-01-10  Darin Adler  <darin@apple.com>

        * Makefile: Took out unneeded "export" line.
        * <many-files>: Changed a lot of flags (cleared bogus executable bits, set
          MIME types, other small corrections).

2006-01-09  Darin Adler  <darin@apple.com>

        * Makefile.am: Removed.

2006-01-07  Anders Carlsson  <andersca@mac.com>

        Reviewed by Maciej.
        
        - fix http://bugs.webkit.org/show_bug.cgi?id=6373
        REGRESSION: JavaScript hang when comparing large array to null
        
        * kjs/object.h:
        (KJS::JSObject::isEqualToNull):
        Add new function which returns true if an object should be treated as null when
        doing comparisons.
        
        * kjs/operations.cpp:
        (KJS::equal):
        Use isEqualToNull.

2006-01-07  Alexey Proskuryakov  <ap@nypop.com>

        Reviewed by Maciej.

        - Fix WebCore development build
        http://bugs.webkit.org/show_bug.cgi?id=6408

        * kxmlcore/Assertions.h: Use __VA_ARGS__ in variadic macros.

2006-01-06  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - miscellaneous changes for 4% speedup on the JavaScript iBench
        http://bugs.webkit.org/show_bug.cgi?id=6396
        
        Changes mostly thanks to Maks Orlovich, tweaked a little by me.

        * kjs/create_hash_table: Use the same hash as the one used by Identifier.
        * kjs/function.cpp:
        (KJS::FunctionImp::processParameters): Use the new List::copyFrom
        (KJS::ActivationImp::ActivationImp): track variable while iterating
        * kjs/internal.cpp:
        (KJS::StringImp::toObject): create StringInstance directly
        * kjs/list.cpp:
        (KJS::List::copy): implement in terms of copyFrom
        (KJS::List::copyFrom): more efficient way to copy in another list
        * kjs/list.h:
        * kjs/lookup.cpp:
        (keysMatch): updated to work with identifier hash
        (findEntry): ditto
        (Lookup::findEntry): ditto
        (Lookup::find): ditto
        * kjs/lookup.h:

2006-01-06  Maciej Stachowiak  <mjs@apple.com>

        - fix development build failure from the previous checkin

        * kjs/function.cpp:
        (KJS::ActivationImp::put): Use prototype() accessor in assert.

2006-01-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.

        - fix remaining performance regression from Getter/Setter change
        http://bugs.webkit.org/show_bug.cgi?id=6249

        - Activation objects should not have __proto__ property
        http://bugs.webkit.org/show_bug.cgi?id=6395

        * kjs/function.cpp:
        (KJS::ActivationImp::getOwnPropertySlot): Implement directly, thus
        skipping getter/setter handling and __proto__ handling, as well
        as inlining needed superclass stuff.
        (KJS::ActivationImp::put): Implement directly, skipping getter/setter,
        __proto__, and do canPut directly in PropertyMap::put since there's no
        static property table either.
        * kjs/function.h:
        * kjs/property_map.cpp:
        (KJS::PropertyMap::put): Allow optionally inlining canPut check.
        * kjs/property_map.h:

2006-01-04  Geoffrey Garen  <ggaren@apple.com>

        Patch by kimmo.t.kinnunen@nokia.com, reviewed by darin, tweaked by me.

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=4921
        \u escape sequences in JavaScript identifiers

        * kjs/function_object.cpp:
        (FunctionObjectImp::construct):
        * kjs/lexer.cpp:
        (Lexer::shift):
        (Lexer::lex):
        (Lexer::isWhiteSpace):
        (Lexer::isLineTerminator):
        (Lexer::isIdentStart):
        (Lexer::isIdentPart):
        (isDecimalDigit):
        (Lexer::scanRegExp):
        * kjs/lexer.h:
        (KJS::Lexer::):

        * tests/mozilla/expected.html: Updated test results.

2005-12-30  Maciej Stachowiak  <mjs@apple.com>

        No review, just test result update.

        * tests/mozilla/expected.html: Updated for newly passing test from recent fixes.

2005-12-30  Anders Carlsson  <andersca@mac.com>

        Reviewed by Maciej.

        - Fix http://bugs.webkit.org/show_bug.cgi?id=6298
        Getter setter test is failing
                
        * kjs/object.cpp:
        (KJS::JSObject::put):
        Rework the getter setter part. We now walk the prototype chain, checking for
        getter/setter properties and only take the slow path if any are found. 

2005-12-30  Maks Orlovich <maksim@kde.org>

        Reviewed and committed by Maciej.

        - Handle negative, FP numbers with non-10 radix in toString
        http://bugs.webkit.org/show_bug.cgi?id=6259

        (Merged from KJS, original work by Harri Porten)
        
        * kjs/number_object.cpp:
        (NumberProtoFunc::callAsFunction): rewrote Number.toString(radix) to work with  
        negative numbers, floating point and very large numbers.

2005-12-29  Geoffrey Garen  <ggaren@apple.com>

        Patch by Maks Orlovich, reviewed and landed by me.

        - http://bugs.webkit.org/show_bug.cgi?id=6267
        Fix Number.prototype.toFixed/toExponential(undefined)

        * kjs/number_object.cpp:
        (NumberProtoFunc::callAsFunction):

2005-12-29  Geoffrey Garen  <ggaren@apple.com>

        Patch by Maks Orlovich, Reviewed and landed by me.

        - http://bugs.webkit.org/show_bug.cgi?id=6266
        Minor object naming updates (to match Mozilla, KJS)

        * kjs/number_object.cpp:
        * kjs/regexp_object.cpp:

2005-12-29  Geoffrey Garen  <ggaren@apple.com>

        Patch by Maks Orlovich, reviewed by mjs.

        This has 2 very minor fixes, covered by KJS testsuite:    
        1. Enumerates string indices in property list (with the same bug as array    
           object has in corresponding code). This is a mozilla emulation thing. 
        2. Permits properties with integer names in prototypes to be found    

        * kjs/string_object.cpp:
        (StringInstance::getOwnPropertySlot):
        (StringInstanceImp::propList):
        * kjs/string_object.h:

2005-12-26  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by mjs.

        - Fixed <rdar://problem/4364705> run-javascriptcore-tests crashes in 
        KJS::BlockNode::deref 
        AKA 
        http://bugs.webkit.org/show_bug.cgi?id=6233
        Reproducible stack-overflow crash in ~RefPtr<T> due to RefPtr<T> use in 
        linked lists

        This patch does four things: 
        (1) Standardizes all our linked list nodes to use "next" as their next 
        pointers. 
        (2) Creates the ListRefPtr<T> class, a subclass of RefPtr<T> specialized
        to iteratively deref "next" pointers.
        (3) Standardizes our linked list nodes to use ListRefPtr<T> and 
        implement the releaseNext() function used by ~ListRefPtr<T>().
        (4) Adds to RefPtr<T> the release() method used by releaseNext().

        - Modified existing mozilla test to ensure it would make deployment 
        builds crash as well.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/nodes.cpp:
        (ElementNode::evaluate):
        (PropertyListNode::evaluate):
        (ArgumentListNode::evaluateList):
        (StatListNode::StatListNode):
        (StatListNode::execute):
        (StatListNode::processVarDecls):
        (VarDeclListNode::evaluate):
        (VarDeclListNode::processVarDecls):
        (VarStatementNode::execute):
        (VarStatementNode::processVarDecls):
        (BlockNode::BlockNode):
        (CaseClauseNode::evalStatements):
        (CaseClauseNode::processVarDecls):
        (ClauseListNode::processVarDecls):
        (CaseBlockNode::CaseBlockNode):
        (CaseBlockNode::evalBlock):
        (SourceElementsNode::SourceElementsNode):
        (SourceElementsNode::execute):
        (SourceElementsNode::processFuncDecl):
        (SourceElementsNode::processVarDecls):
        * kjs/nodes.h:
        (KJS::ElementNode::ElementNode):
        (KJS::ElementNode::releaseNext):
        (KJS::ArrayNode::ArrayNode):
        (KJS::PropertyListNode::PropertyListNode):
        (KJS::PropertyListNode::releaseNext):
        (KJS::ObjectLiteralNode::ObjectLiteralNode):
        (KJS::ArgumentListNode::ArgumentListNode):
        (KJS::ArgumentListNode::releaseNext):
        (KJS::ArgumentsNode::ArgumentsNode):
        (KJS::StatListNode::releaseNext):
        (KJS::VarDeclListNode::VarDeclListNode):
        (KJS::VarDeclListNode::releaseNext):
        (KJS::VarStatementNode::VarStatementNode):
        (KJS::ForNode::ForNode):
        (KJS::CaseClauseNode::CaseClauseNode):
        (KJS::ClauseListNode::ClauseListNode):
        (KJS::ClauseListNode::getClause):
        (KJS::ClauseListNode::getNext):
        (KJS::ClauseListNode::releaseNext):
        (KJS::ParameterNode::ParameterNode):
        (KJS::ParameterNode::releaseNext):
        (KJS::SourceElementsNode::releaseNext):
        * kjs/nodes2string.cpp:
        (ElementNode::streamTo):
        (PropertyListNode::streamTo):
        (ArgumentListNode::streamTo):
        (StatListNode::streamTo):
        (VarDeclListNode::streamTo):
        (VarStatementNode::streamTo):
        (CaseClauseNode::streamTo):
        (ClauseListNode::streamTo):
        (CaseBlockNode::streamTo):
        (SourceElementsNode::streamTo):
        * kxmlcore/ListRefPtr.h: Added.
        (KXMLCore::ListRefPtr::ListRefPtr):
        (KXMLCore::ListRefPtr::~ListRefPtr):
        (KXMLCore::ListRefPtr::operator=):
        * kxmlcore/RefPtr.h:
        (KXMLCore::RefPtr::release):

2005-12-29  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by mjs.

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=4026
        Math.random() not seeded.

        Added call to sranddev() -- it executes the first time a process
        calls Math.random().

        * kjs/math_object.cpp:
        (MathFuncImp::callAsFunction):

2005-12-29  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by darin.

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=6265
        Name change regression: Java doesn't know what JavaJSObject is

        Changed strings passed to Java back to original "JSObject".

        * bindings/jni/jni_jsobject.cpp:
        (JavaJSObject::convertValueToJObject):
        (JavaJSObject::convertJObjectToValue):

2005-12-28  Anders Carlsson  <andersca@mac.com>

        Reviewed by Maciej.

        - The JSC part of http://bugs.webkit.org/show_bug.cgi?id=6268
        Add undetectable document.all
        
        * kjs/operations.cpp:
        (KJS::equal):
        When comparing an object with null or undefined, call toPrimitive with 
        NullType as the preferred type.

2005-12-27  Anders Carlsson  <andersca@mac.com>

        Reviewed by Darin.

        * kjs/array_object.cpp:
        (ArrayProtoFunc::callAsFunction):
        Implement filter and map. Also, make the existing
        array iteration functions not invoke the callback for
        non-existing properties, just as Mozilla does now.
        
        * kjs/array_object.h:
        (KJS::ArrayProtoFunc::):
        Add filter and map.
        
        * tests/mozilla/expected.html:
        Update, two 1.6 tests now pass.

2005-12-27  Maciej Stachowiak  <mjs@apple.com>

        - updated test results for new JS 1.6 tests

        * tests/mozilla/expected.html:

2005-12-27  Anders Carlsson  <andersca@mac.com>

        Reviewed by Maciej.

        Add Mozilla JS 1.6 tests.
        
        * tests/mozilla/js1_6/Array/browser.js: Added.
        * tests/mozilla/js1_6/Array/regress-290592.js: Added.
        * tests/mozilla/js1_6/Array/regress-304828.js: Added.
        * tests/mozilla/js1_6/Array/regress-305002.js: Added.
        * tests/mozilla/js1_6/Array/regress-310425-01.js: Added.
        * tests/mozilla/js1_6/Array/regress-310425-02.js: Added.
        * tests/mozilla/js1_6/Array/regress-320887.js: Added.
        * tests/mozilla/js1_6/Array/shell.js: Added.
        * tests/mozilla/js1_6/README: Added.
        * tests/mozilla/js1_6/Regress/browser.js: Added.
        * tests/mozilla/js1_6/Regress/regress-301574.js: Added.
        * tests/mozilla/js1_6/Regress/regress-309242.js: Added.
        * tests/mozilla/js1_6/Regress/regress-311157-01.js: Added.
        * tests/mozilla/js1_6/Regress/regress-311157-02.js: Added.
        * tests/mozilla/js1_6/Regress/regress-314887.js: Added.
        * tests/mozilla/js1_6/Regress/regress-320172.js: Added.
        * tests/mozilla/js1_6/Regress/shell.js: Added.
        * tests/mozilla/js1_6/String/browser.js: Added.
        * tests/mozilla/js1_6/String/regress-306591.js: Added.
        * tests/mozilla/js1_6/String/shell.js: Added.
        * tests/mozilla/js1_6/browser.js: Added.
        * tests/mozilla/js1_6/shell.js: Added.
        * tests/mozilla/js1_6/template.js: Added.

2005-12-27  Maks Orlovich <maksim@kde.org>

        Reviewed and landed by Maciej.

        - fixed 6234: Can delete array index property incorrectly.
        http://bugs.webkit.org/show_bug.cgi?id=6234

        * kjs/array_object.cpp:
        (ArrayInstance::deleteProperty): use toArrayIndex instead of toUInt32 when
        looking for array properties.

2005-12-27  Anders Carlsson  <andersca@mac.com>

        Reviewed by Maciej.

        * kjs/object.cpp:
        (KJS::JSObject::defineSetter):
        Remove duplicate call to putDirect.

2005-12-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin and Geoff.

        Changes by me and Anders.

        - mostly fixed REGRESSION: 5-10% performance regression on JS iBench from getter/setter change
        http://bugs.webkit.org/show_bug.cgi?id=6083

        - also fixed some warnings reported by -Winline
        
        * JavaScriptCorePrefix.h: Move new and delete definitions higher so there
        aren't conflicts with use in standard C++ headers
        * kjs/object.cpp:
        (KJS::throwSetterError): Moved this piece of put into a seprate function
        to avoid the PIC branch.
        (KJS::JSObject::put): Use hasGetterSetterProperties to avoid expensive stuff
        when not needed. Also use GetterSetter properties attribute.
        (KJS::JSObject::deleteProperty): Recompute whether any properties are getter/setter
        properties any more, if this one was one.
        (KJS::JSObject::defineGetter): Let the PropertyMap know that it has getter/setter
        properties now (and use the new attribute).
        (KJS::JSObject::defineSetter): Ditto.
        (KJS::JSObject::fillGetterPropertySlot): Out-of-line helper for getOwnPropertySlot,
        to avoid global variable access in the hot code path.
        * kjs/object.h:
        (KJS::): Added GetterSetter attribute.
        (KJS::JSCell::isObject): Moved lower to be after inline methods it uses.
        (KJS::JSValue::isObject): ditto
        (KJS::JSObject::getOwnPropertySlot): try to avoid impact of getters and setters
        as much as possible in the case where they are not being used
        * kjs/property_map.cpp:
        (KJS::PropertyMap::containsGettersOrSetters): New method to help with this
        * kjs/property_map.h:
        (KJS::PropertyMap::hasGetterSetterProperties): Ditto
        (KJS::PropertyMap::setHasGetterSetterProperties): Ditto
        (KJS::PropertyMap::PropertyMap): Added a crazy hack to store the
        global "has getter/setter properties" flag in the property map
        single entry, to avoid making objects any bigger.
        * kjs/value.h: Moved some things to object.h to make -Winline happier

2005-12-24  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric and Dave Hyatt.

        - make even const PassRefPtrs give transfer of ownership semantics
        http://bugs.webkit.org/show_bug.cgi?id=6238
        
        This is a somewhat cheesy change. Having to use PassRefPtr_Ref creates ambiguities
        in assignment and copy construction. And this makes life way easier and removes
        the need for pass(). It is not really correct, but we pretty much never need a real
        const PassRefPtr, and this takes care of things for PassRefPtr temporaries.
        
        * kjs/identifier.cpp:
        (KJS::Identifier::add): No more need for pass()
        * kjs/property_map.cpp:
        (KJS::PropertyMap::addSparseArrayPropertiesToReferenceList): No more need for pass()
        * kjs/ustring.cpp:
        (KJS::UString::Rep::create): Use adoptRef
        (KJS::UString::UString): No more need for pass
        (KJS::UString::append): No more need for pass
        (KJS::UString::substr): No more need for pass
        * kxmlcore/PassRefPtr.h: made m_ptr mutable (ugh)
        (KXMLCore::PassRefPtr::PassRefPtr): Take a const PassRefPtr reference
        (KXMLCore::PassRefPtr::release): Made this a const method (ugh)
        (KXMLCore::PassRefPtr::operator=): clean up appropriately
        (KXMLCore::adoptRef): Added this to use instead of PassRefPtr<T>::adopt, I think
        it makes the behavior more clear and it is less verbose.
        (KXMLCore::static_pointer_cast): use adoptRef
        (KXMLCore::const_pointer_cast): use adoptRef
        * kxmlcore/RefPtr.h:
        (KXMLCore::RefPtr::RefPtr): take const PassRefPtr&
        (KXMLCore::PassRefPtr::operator=): take const PassRefPtr&

2005-12-25  Eric Seidel  <eseidel@apple.com>

        Reviewed by mjs.

        Unbreak HashTableConstIterator++ by returning const_iterator

        * kxmlcore/HashTable.h:
        (KXMLCore::HashTableConstIterator::operator++): use const_iterator

2005-12-25  Eric Seidel  <eseidel@apple.com>

        Reviewed by mjs.

        Un-break HashTable copy constructor.

        * kxmlcore/HashTable.h:
        (KXMLCore::::HashTable): use const_iterator instead

2005-12-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.

        - fixed "HashMap does not work with const pointer keys or values"
        http://bugs.webkit.org/show_bug.cgi?id=6222
        
        * kxmlcore/HashMapPtrSpec.h:
        (KXMLCore::HashMap): In all methods, explicitly cast all pointers
        to void * before passing to internal implementation. Use C-style
        casts instead of new-style casts, because the real solution would
        require a combo of reinterpret_cast anc const_cast.


2005-12-23  Maciej Stachowiak  <mjs@apple.com>

        - this time for sure

        * kxmlcore/RefPtr.h:
        (KXMLCore::::swap):

2005-12-22  Maciej Stachowiak  <mjs@apple.com>

        - fix build problem from last commit.

        * kxmlcore/RefPtr.h:
        (KXMLCore::::swap):

2005-12-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - Make HashMap/HashSet support non-POD types
        http://bugs.webkit.org/show_bug.cgi?id=5332

        The changes for support are relatively simple, but I also made extensive changes to
        avoid copying, so that there isn't refcount thrash when you put RefPtrs into a HashMap.

        * kxmlcore/HashTable.h:
        (KXMLCore::swap): specialize swap for pairs, to swap elements individually,
        so that excess copies can be avoided.
        (KXMLCore::Mover::move): Template function to either copy or swap, used
        when transferring elements from old table to new.
        (KXMLCore::IdentityHashTranslator::hash): The old "converting lookup" templates
        that took two or three function parameters now take a class parameter, this is
        the class used to do a normal lookup.
        (KXMLCore::IdentityHashTranslator::equal): Ditto.
        (KXMLCore::IdentityHashTranslator::translate): Ditto. Translate now takes a reference
        to write into instead of returning a value to avoid redundant copies.
        (KXMLCore::HashTable::~HashTable): Use deallocateTable instead of freeing directly.
        (KXMLCore::HashTable::insert): Based on HashTranslator now instead of separate
        functions. Added a FIXME about a remaining rare excess copy.
        (KXMLCore::HashTable::isEmptyBucket): Use KeyTraits directly instead of unwrapping
        the key from Traits, to avoid creating and destroying pair, which copies.
        (KXMLCore::HashTable::isDeletedBucket): ditto
        (KXMLCore::HashTable::lookup): Use HashTranslator now instead of separate functions.
        (KXMLCore::HashTable::initializeBucket): Renamed from emptyBucket. Use placement new to
        work right for non-POD types.
        (KXMLCore::HashTable::deleteBucket): Use assignDeleted to avoid excess copies.
        (KXMLCore::HashTable::reinsert): use Mover template to copy or swap as appropriate
        (KXMLCore::HashTable::allocateTable): Initialize every bucket if calloc won't do.
        (KXMLCore::HashTable::deallocateTable): Destruct every bucket if needed.
        (KXMLCore::HashTable::rehash): Avoid copy before reinserting, so that swap can do its magic.
        (KXMLCore::HashTable::clear): use deallocateTable instead of freeing directly.
        (KXMLCore::HashTable::HashTable): be more dumb when copying to ensure that non-POD types
        work right
        * kxmlcore/HashFunctions.h:
        (KXMLCore::PointerHash): Specialize PointerHash for RefPtr
        * kxmlcore/HashMap.h:
        (KXMLCore::extractFirst): Return a reference not a full object to avoid
        copies.
        (KXMLCore::HashMapTranslator::hash): Use a special translator for insertion
        to defer making the pair as long as possible, thus avoiding needless copies.
        (KXMLCore::HashMapTranslator::equal): ditto
        (KXMLCore::HashMapTranslator::translate): ditto
        (KXMLCore::::inlineAdd): Shared by set and add to insert using HashMapTranslator
        (KXMLCore::::set): Use inlineAdd
        (KXMLCore::::add): Use inlineAdd
        * kxmlcore/HashMapPtrSpec.h:
        (KXMLCore::): Pass KeyTraits along
        * kxmlcore/HashSet.h:
        (KXMLCore::identityExtract): Return a reference not a full object to avoid copies.
        (KXMLCore::HashSetTranslatorAdapter::hash): Redo adapter stuff to work with
        the new HashTranslator approach.
        (KXMLCore::HashSetTranslatorAdapter::equal): ditto
        (KXMLCore::HashSetTranslatorAdapter::translate): ditto
        (KXMLCore::::insert): ditto
        * kxmlcore/HashTraits.h:
        (KXMLCore::GenericHashTraits): This is intended be used as a base class for
        customized traits: sensible defaults.
        (KXMLCore::): Use it a bunch
        (KXMLCore::assignDeleted): template function to allow pairs to be assigned the
        deleted value w/o excess copies.
        (KXMLCore::PairHashTraits::emptyValue): Updated
        (KXMLCore::PairHashTraits::deletedValue): Updated
        (KXMLCore::PairHashTraits::assignDeletedValue): part of assignDeleted hack
        (KXMLCore::DeletedValueAssigner::assignDeletedValue): Use template magic
        to either use use deletedValue or assignDeletedValue for the cases where we care.
        * kxmlcore/RefPtr.h:
        (KXMLCore::RefPtr::swap): Added swap method.
        (KXMLCore::swap): Added swap free function.
        * kjs/identifier.cpp:
        (KJS::CStringTranslator::hash): Use new HashTranslator class approach to
        alternate type based insertion.
        (KJS::CStringTranslator::equal): ditto
        (KJS::CStringTranslator::translate): ditto
        (KJS::Identifier::add): ditto
        (KJS::UCharBufferTranslator::hash): ditto
        (KJS::UCharBufferTranslator::equal): ditto
        (KJS::UCharBufferTranslator::translate): ditto

        - irrelevant change:
        
        * kjs/array_object.cpp:
        (ArrayProtoFunc::callAsFunction): Removed a stray space.

2005-12-22  Anders Carlsson  <andersca@mac.com>

        Reviewed by Eric and Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=6196
        Would like to be able to define prototypes in headers
        
        * kjs/lookup.h:
        Move ClassName from KJS_DECLARE_PROTOTYPE to KJS_IMPLEMENT_PROTOTYPE.
        Also, namespace all macros by prefixing them with KJS_. 

2005-12-22  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=6191
          RefPtr/PassRefPtr have a leak issue, operator== issues

        * kxmlcore/PassRefPtr.h:
        (KXMLCore::PassRefPtr::PassRefPtr): Remove non-template constructor that takes RefPtr
        since the constructor template that takes RefPtr should be sufficient. Add a constructor
        template that takes PassRefPtr&.
        (KXMLCore::PassRefPtr::adopt): Use PassRefPtr_Ref to avoid setting pointer first to
        0 and then to the pointer.
        (KXMLCore::PassRefPtr::operator=): Added template versions that take PassRefPtr& and
        RefPtr parameters.
        (KXMLCore::PassRefPtr::operator PassRefPtr<U>): Changed to fix leak -- old version
        would release and then ref.
        (KXMLCore::operator==): Make templates have two parameters so you can mix types.
        Also remove unneeded const in raw pointer versions.
        (KXMLCore::operator!=): Ditto.

        * kxmlcore/RefPtr.h:
        (KXMLCore::RefPtr::RefPtr): Add constructor template that takes PassRefPtr.
        (KXMLCore::RefPtr::operator=): Add assignment operator templates that take
        RefPtr and PassRefPtr.
        (KXMLCore::operator==): Make templates have two parameters so you can mix types.
        Also remove unneeded const in raw pointer versions.
        (KXMLCore::operator!=): Ditto.

2005-12-21  Timothy Hatcher  <timothy@apple.com>

        * JavaScriptCore.xcodeproj/project.pbxproj:
          Set tab width to 8, indent width to 4 and uses tabs to false per file.

2005-12-21  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        Removed evil hack for determining if a type is an integer, replaced
        with template metaprogramming.

        * JavaScriptCore.xcodeproj/project.pbxproj: Set tab size to 2 for
        testkjs.cpp
        * kjs/testkjs.cpp:
        (main): Inserted asserts to test IsInteger. FIXME: Move these to
        KXMLCore unit tests directory when we create one.
        * kxmlcore/HashTraits.h:
        (KXMLCore::): Added IsInteger class for querying types.

2005-12-20  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - made ALWAYS_INLINE declare things inline as well as __attribute__((always_inline))
        http://bugs.webkit.org/show_bug.cgi?id=6159

        * kxmlcore/AlwaysInline.h:

2005-12-19  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - fixed a leak in the assignment operator from PassRefPtr to RefPtr
        http://bugs.webkit.org/show_bug.cgi?id=6158

        * kxmlcore/RefPtr.h:
        (KXMLCore::RefPtr::operator=):

        - fix problem with PassRefPtr that darin spotted - it lacked a copy constructor
        and therefore was using the default one, which can lead to excess derefs

        I fixed this by adding a copy constructor from non-const
        reference, and by adding a template pass() function that you have
        to use when raw pointer or RefPtr are passed where PassRefPtr is
        expected.

        * kjs/identifier.cpp:
        (KJS::Identifier::add): Changed to have PassRefPtr return type and
        pass() the results.
        * kjs/identifier.h:
        * kjs/property_map.cpp:
        (KJS::PropertyMap::addSparseArrayPropertiesToReferenceList): Use pass()
        where required.
        * kjs/ustring.cpp:
        (KJS::UString::UString): Use pass() as needed.
        (KJS::UString::append): ditto
        (KJS::UString::substr): ditto
        * kjs/ustring.h:
        (KJS::UString::UString): Use initializer instead of assignment
        * kxmlcore/PassRefPtr.h:
        (KXMLCore::PassRefPtr::PassRefPtr): Added copy constructor
        (KXMLCore::pass): new template function to make it convenient to pass
        a PassRefPtr

2005-12-19  Geoffrey Garen  <ggaren@apple.com>
  
        Reviewed by Maciej.

        Fixed <rdar://problem/4370397> Missing return statement in
        JSMethodNameToObjcMethodName.

        JSMethodNameToObjcMethodName had a check for a name being too long, but
        the check was missing a return statement.

        A lot of this code was confusing and some of it was wrong, so I fixed
        it up, added some asserts to catch this type of bug in the future, 
        changed some comments, and renamed some variables.

        The two advantages of the new algorithm are (1) It makes writing past
        the end of the buffer virtually impossible because the test on the main
        loop is "while (not past end of buffer)" and (2) It's twice as fast
        because it doesn't call strlen. (There's no need to call strlen when
        we're walking the string ourselves.) 
        
        methodsNamed also supports arbitrary-length method names now. Just in 
        case the AppKit folks start getting REALLY verbose...

        * bindings/objc/objc_class.mm:
        (KJS::Bindings::ObjcClass::methodsNamed):
        * bindings/objc/objc_utility.h:
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::JSMethodNameToObjcMethodName):

2005-12-19  Darin Adler  <darin@apple.com>

        Originally done by both George Staikos and Alexey Proskuryakov.

        - fix http://bugs.webkit.org/show_bug.cgi?id=5706
          Sharedptr dependency can be removed

        Our coding guidelines say "use 0 instead of NULL" and both RefPtr and
        PassRefPtr were using NULL, which required including a header that
        defines NULL.

        * kxmlcore/PassRefPtr.h:
        (KXMLCore::PassRefPtr::PassRefPtr): Use 0 instead of NULL.
        (KXMLCore::PassRefPtr::operator!): Use ! instead of == NULL.
        * kxmlcore/RefPtr.h:
        (KXMLCore::RefPtr::RefPtr): Use 0 instead of NULL.
        (KXMLCore::RefPtr::operator!): Use ! instead of == NULL.
        Also did some reformatting.

2005-12-19  Darin Adler  <darin@apple.com>

        Reviewed by Geoff Garen and Eric Seidel.

        - fix http://bugs.webkit.org/show_bug.cgi?id=4923
          stop using <ostream> in WebCore, eliminating the <cmath> troubles it causes

        * kjs/simple_number.h: Removed many unnecessary includes, including
        the <cmath> one to work around GCC library header bugs. We may have to
        add some includes elsewhere for platforms other than OS X, since our
        prefix header takes care of some things.

        * kxmlcore/AlwaysInline.h: Added. Now clients that don't include
        simple_number.h can still get the ALWAYS_INLINE macro.
        * JavaScriptCore.xcodeproj/project.pbxproj: Added AlwaysInline.h.

        * bindings/NP_jsobject.h: Removed a lot of unnecessary includes
        and removed C-specific stuff from this C++-only header.
        * bindings/jni/jni_jsobject.h: Removed a lot of unnecessary includes
        and did some reformatting.
        * bindings/objc/objc_runtime.h:  Removed an unnecessary include.
        * bindings/runtime.h: Removed some unneeded includes. Reformatted.
        * bindings/runtime.cpp: Updated to compile with header changes,
        including a lot of reformatting.
        * bindings/runtime_object.h: Removed an unnecessary include.

2005-12-13  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff and Adele

        - replaced custom Identifier hashtable with HashSet

        * kjs/identifier.cpp:
        (KXMLCore::):
        (KJS::identifierTable):
        (KJS::Identifier::equal):
        (KJS::hash):
        (KJS::equal):
        (KJS::convert):
        (KJS::Identifier::add):
        (KJS::Identifier::remove):
        * kjs/identifier.h:
        * kjs/internal.cpp:
        (KJS::InterpreterImp::initGlobalObject):

2005-12-18  Justin Haygood  <justin@xiondigital.net>

        Reviewed, tweaked, and landed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=5227
          Array indexOf() extension for JavaScript 1.5 Core

        * kjs/array_object.h:
        * kjs/array_object.cpp: (ArrayProtoFunc::callAsFunction): Added implementation of indexOf.

2005-12-18  Anders Carlsson  <andersca@mac.com>

        Reviewed by Darin and Geoffrey.

        - fix for <http://bugs.webkit.org/show_bug.cgi?id=4000>
        Object.prototype is missing isPrototypeOf
        
        * kjs/object_object.cpp:
        (ObjectPrototype::ObjectPrototype):
        Add isPrototypeOf to object prototype.
        
        (ObjectProtoFunc::callAsFunction):
        Implement isPrototypeOf
        
        * kjs/object_object.h:
        (KJS::ObjectProtoFunc::):
        Add id for isPrototypeOf.

2005-12-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        Fixed http://bugs.webkit.org/show_bug.cgi?id=6119
        split() function ignores case insensitive modifier.

        Glossary:
        RegExpImp: The C++ object you get when JavaScript executes
                   "new RegExp()".
        RegExp:    A C++ wrapper object that performs regular expression
                   matching on behalf of a RegExpImp.

        Instead of unnecessarily constructing a RegExp which (wrongly) lacks
        any modifiers, String.split() now uses the RegExp built in to the 
        RegExpImp passed to it, which has the right modifiers already.

        I also cleaned up other bits of the string code to standardized how
        we handle RegExpImp arguments.

        * ChangeLog:
        * kjs/string_object.cpp:
        (replace):
        (StringProtoFunc::callAsFunction):

2005-12-16  David Hyatt  <hyatt@apple.com>

        Remove unused RefPtr constructors that can create an ambiguity in ustring on some platforms.
        
        Reviewed by mjs

        * kxmlcore/RefPtr.h:
        (KXMLCore::RefPtr::RefPtr):

2005-12-15  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=5688
          speed up JavaScript parsing by not creating a UString just to parse

        * kjs/internal.h:
        * kjs/internal.cpp: (KJS::InterpreterImp::evaluate): Change to take a character pointer
        and length rather than a UString.

        * kjs/interpreter.h:
        * kjs/interpreter.cpp: (Interpreter::evaluate): Ditto.

        * kjs/protect.h: Remove uneeded "convert to bool" operator since we already have a
        "convert to raw pointer" operator in this class.

=== Safari-521~5 ===

2005-12-13  Geoffrey Garen  <ggaren@apple.com>

        Updated test results to match Anders's last fix.

        * tests/mozilla/expected.html:

2005-12-13  Anders Carlsson  <andersca@mac.com>

        * ChangeLog: Add titles for my bugzilla bugs.

2005-12-13  Anders Carlsson  <andersca@mac.com>

        Reviewed by Darin.

        - Fixes <http://bugs.webkit.org/show_bug.cgi?id=6041>
        Support property getters and setters.
        
        * bindings/runtime_array.cpp:
        (RuntimeArray::lengthGetter):
        (RuntimeArray::indexGetter):
        * bindings/runtime_array.h:
        * bindings/runtime_method.cpp:
        (RuntimeMethod::lengthGetter):
        * bindings/runtime_method.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::fallbackObjectGetter):
        (RuntimeObjectImp::fieldGetter):
        (RuntimeObjectImp::methodGetter):
        * bindings/runtime_object.h:
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (ArrayInstance::lengthGetter):
        (getProperty):
        Update for changes to PropertySlot::getValue and
        PropertySlot::GetValueFunc.
        
        * kjs/collector.cpp:
        (KJS::className):
        Handle GetterSetterType.
        
        * kjs/function.cpp:
        (KJS::FunctionImp::argumentsGetter):
        (KJS::FunctionImp::lengthGetter):
        (KJS::Arguments::mappedIndexGetter):
        (KJS::ActivationImp::argumentsGetter):
        * kjs/function.h:
        Update for changes to PropertySlot::getValue and
        PropertySlot::GetValueFunc.
        
        * kjs/grammar.y:
        Rework grammar parts for get set declarations directly
        in the object literal.
        
        * kjs/internal.cpp:
        (KJS::GetterSetterImp::mark):
        (KJS::GetterSetterImp::toPrimitive):
        (KJS::GetterSetterImp::toBoolean):
        (KJS::GetterSetterImp::toNumber):
        (KJS::GetterSetterImp::toString):
        (KJS::GetterSetterImp::toObject):
        Add type conversion functions. These aren't meant to be called.
        
        (KJS::printInfo):
        Handle GetterSetterType.
        
        * kjs/lookup.h:        
        (KJS::staticFunctionGetter):
        (KJS::staticValueGetter):
        Update for changes to PropertySlot::GetValueFunc.
        
        * kjs/nodes.cpp:
        Refactor they way properties nodes are implemented.
        We now have a PropertyListNode which is a list of PropertyNodes.
        Each PropertyNode has a name (which is a PropertyNameNode) and an associated
        value node. PropertyNodes can be of different types. The Constant type is the
        old constant declaration and the Getter and Setter types are for property getters
        and setters.
        (ResolveNode::evaluate):
        Update for changes to PropertySlot::getValue.
        
        (PropertyListNode::evaluate):
        Go through all property nodes and set them on the newly created object. If the
        property nodes are of type Getter or Setter, define getters and setters. Otherwise,
        just add the properties like before.
        
        (PropertyNode::evaluate):
        This should never be called directly.
        
        (PropertyNameNode::evaluate):
        Rename from PropertyNode::evaluate.
        
        (FunctionCallResolveNode::evaluate):
        (FunctionCallBracketNode::evaluate):
        (FunctionCallDotNode::evaluate):
        (PostfixResolveNode::evaluate):
        (PostfixBracketNode::evaluate):
        (PostfixDotNode::evaluate):
        (TypeOfResolveNode::evaluate):
        (PrefixResolveNode::evaluate):
        (PrefixBracketNode::evaluate):
        (PrefixDotNode::evaluate):
        (AssignResolveNode::evaluate):
        (AssignDotNode::evaluate):
        (AssignBracketNode::evaluate):
        Update for changes to PropertySlot::getValue.
        
        * kjs/nodes.h:
        (KJS::PropertyNameNode::PropertyNameNode):
        Rename from PropertyNode.
        
        (KJS::PropertyNode::):
        (KJS::PropertyNode::PropertyNode):
        New class, representing a single property.
        
        (KJS::PropertyListNode::PropertyListNode):
        Rename from PropertyValueNode.
        
        (KJS::FuncExprNode::FuncExprNode):
        Put ParameterNode parameter last, and make it optional.
        
        (KJS::ObjectLiteralNode::ObjectLiteralNode):
        Use a PropertyListNode here now.
        
        * kjs/nodes2string.cpp:
        (PropertyListNode::streamTo):
        Iterate through all property nodes.
        
        (PropertyNode::streamTo):
        Print out the name and value. Doesn't handle getters and setters currently.
        
        (PropertyNameNode::streamTo):
        Rename from PropertyNode::streamTo.
        
        * kjs/object.cpp:
        (KJS::JSObject::get):
        Update for changes to PropertySlot::getValue.
        
        (KJS::JSObject::put):
        If the property already exists and has a Setter, invoke
        the setter function instead of setting the property directly.
        
        (KJS::JSObject::defineGetter):
        (KJS::JSObject::defineSetter):
        New functions for defining property getters and setters on the object.
        
        * kjs/object.h:
        (KJS::GetterSetterImp::type):
        (KJS::GetterSetterImp::GetterSetterImp):
        (KJS::GetterSetterImp::getGetter):
        (KJS::GetterSetterImp::setGetter):
        (KJS::GetterSetterImp::getSetter):
        (KJS::GetterSetterImp::setSetter):
        New class for properties which have getters and setters defined.
        This class is only used internally and should never be seen from the outside.
        
        (KJS::JSObject::getOwnPropertySlot):
         If the property is a getter, call setGetterSlot on the property slot.
         
        * kjs/object_object.cpp:
        (ObjectPrototype::ObjectPrototype):
        Add __defineGetter__, __defineSetter, __lookupGetter__, __lookupSetter__
        to prototype.
        
        (ObjectProtoFunc::callAsFunction):
        Implement handlers for new functions.
        
        * kjs/object_object.h:
        (KJS::ObjectProtoFunc::):
        Add ids for new functions.
        
        * kjs/property_slot.cpp:
        (KJS::PropertySlot::undefinedGetter):
        Update for changes to PropertySlot::GetValueFunc.
        
        (KJS::PropertySlot::functionGetter):
        Call the function getter object and return its value.
        
        * kjs/property_slot.h:
        (KJS::PropertySlot::getValue):
        Add a new argument which is the original object that
        getPropertySlot was called on.
        
        (KJS::PropertySlot::setGetterSlot):
        (KJS::PropertySlot::):
        New function which sets a getter slot. When getValue is called on a 
        getter slot, the getter function object is invoked.
        
        * kjs/string_object.cpp:
        (StringInstance::lengthGetter):
        (StringInstance::indexGetter):
        * kjs/string_object.h:
        Update for changes to PropertySlot::GetValueFunc.
        
        * kjs/value.h:
        (KJS::):
        Add GetterSetterType and make GetterSetterImp a friend class of JSCell.

2005-12-12  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.

        - added a new HashCountedSet class for the common pattern of mapping items to counts that can change
        
        * kxmlcore/HashCountedSet.h: Added.
        (KXMLCore::HashCountedSet::*): Implemented, on top of HashMap.
        * kxmlcore/HashMap.h:
        (KXMLCore::HashMap::add): New method - does not replace existing value if key already present
        but otherwise like set().
        (KXMLCore::HashMap::set): Improved comments.
        * kxmlcore/HashMapPtrSpec.h:
        (KXMLCore::HashMap::add): Added to specializations too.
        * JavaScriptCore.xcodeproj/project.pbxproj: Add new  file.
        * kxmlcore/HashFunctions.h: Added include of stdint.h
        
        - replaced the custom hashtable for values protected from GC with HashCountedSet

        * kjs/collector.cpp:
        (KJS::Collector::protect): Moved code here from ProtectedValues::increaseProtectCount
        since the code is so simple now.
        (KJS::Collector::unprotect): Ditto for ProtectedValues::decreaseProtectCount.
        (KJS::Collector::markProtectedObjects): Updated for new way of doing things, now
        simpler and safer.
        (KJS::Collector::numReferencedObjects): ditto
        (KJS::Collector::rootObjectClasses): ditto
        * kjs/collector.h: Added protect and unprotect static methods
        * kjs/protect.h:
        (KJS::gcProtect): Updated for removal of ProtectedValues class
        (KJS::gcUnprotect): likewise
        * kjs/protected_values.cpp: Removed.
        * kjs/protected_values.h: Removed.

2005-12-10  Darin Adler  <darin@apple.com>

        Rubber stamped by Maciej.

        - did long-promised KJS renaming:
        
            ValueImp -> JSValue
            ObjectImp -> JSObject
            AllocatedValueImp -> JSCell
        
        A renaming to get a class out of the way
        
            KJS::Bindings::JSObject -> JavaJSObject
 
        and some other "imp-reduction" renaming
        
            *InstanceImp -> *Instance
            *ProtoFuncImp -> *ProtoFunc
            *PrototypeImp -> *Prototype
            ArgumentsImp -> Arguments
            RuntimeArrayImp -> RuntimeArray
            RuntimeMethodImp -> RuntimeMethod

        * most files and functions

2005-12-10  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - eliminated the old Undefined(), Null(), Boolean(), Number(), and String()

        Code now uses jsUndefined(), jsNull(), jsBoolean(), jsNumber(), and jsString().

        * bindings/NP_jsobject.cpp:
        (_NPN_Evaluate):
        * bindings/c/c_instance.cpp:
        (KJS::Bindings::CInstance::invokeMethod):
        (KJS::Bindings::CInstance::invokeDefaultMethod):
        * bindings/c/c_runtime.cpp:
        (CField::valueFromInstance):
        * bindings/c/c_utility.cpp:
        (KJS::Bindings::convertNPVariantToValue):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        (JavaInstance::invokeDefaultMethod):
        * bindings/jni/jni_jsobject.cpp:
        (JSObject::eval):
        (JSObject::convertJObjectToValue):
        * bindings/jni/jni_runtime.cpp:
        (JavaArray::convertJObjectToArray):
        (JavaField::valueFromInstance):
        (JavaArray::valueAt):
        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject webScriptValueAtIndex:]):
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):
        (ObjcInstance::invokeDefaultMethod):
        (ObjcInstance::getValueOfUndefinedField):
        * bindings/objc/objc_runtime.mm:
        (ObjcField::valueFromInstance):
        (ObjcFallbackObjectImp::callAsFunction):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertNSStringToString):
        (KJS::Bindings::convertObjcValueToValue):
        * bindings/runtime.h:
        (KJS::Bindings::Class::fallbackObject):
        (KJS::Bindings::Instance::getValueOfUndefinedField):
        (KJS::Bindings::Instance::valueOf):
        * bindings/runtime_array.cpp:
        (RuntimeArrayImp::lengthGetter):
        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::lengthGetter):
        (RuntimeMethodImp::callAsFunction):
        (RuntimeMethodImp::execute):
        * kjs/array_object.cpp:
        (ArrayInstanceImp::lengthGetter):
        (CompareWithCompareFunctionArguments::CompareWithCompareFunctionArguments):
        (ArrayPrototypeImp::ArrayPrototypeImp):
        (ArrayProtoFuncImp::ArrayProtoFuncImp):
        (ArrayProtoFuncImp::callAsFunction):
        (ArrayObjectImp::ArrayObjectImp):
        * kjs/bool_object.cpp:
        (BooleanPrototypeImp::BooleanPrototypeImp):
        (BooleanProtoFuncImp::callAsFunction):
        (BooleanObjectImp::BooleanObjectImp):
        (BooleanObjectImp::callAsFunction):
        * kjs/error_object.cpp:
        (ErrorPrototypeImp::ErrorPrototypeImp):
        (ErrorProtoFuncImp::ErrorProtoFuncImp):
        (ErrorProtoFuncImp::callAsFunction):
        (ErrorObjectImp::ErrorObjectImp):
        (NativeErrorImp::NativeErrorImp):
        * kjs/function.cpp:
        (KJS::FunctionImp::callAsFunction):
        (KJS::FunctionImp::processParameters):
        (KJS::FunctionImp::argumentsGetter):
        (KJS::FunctionImp::lengthGetter):
        (KJS::DeclaredFunctionImp::execute):
        (KJS::encode):
        (KJS::decode):
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/function_object.cpp:
        (FunctionPrototypeImp::FunctionPrototypeImp):
        (FunctionPrototypeImp::callAsFunction):
        (FunctionProtoFuncImp::callAsFunction):
        (FunctionObjectImp::FunctionObjectImp):
        * kjs/internal.cpp:
        (KJS::InterpreterImp::initGlobalObject):
        * kjs/interpreter.h:
        * kjs/lookup.h:
        * kjs/math_object.cpp:
        (MathObjectImp::getValueProperty):
        (MathFuncImp::callAsFunction):
        * kjs/nodes.cpp:
        (Node::setExceptionDetailsIfNeeded):
        (NullNode::evaluate):
        (PropertyNode::evaluate):
        (FunctionCallBracketNode::evaluate):
        (FunctionCallDotNode::evaluate):
        (PostfixBracketNode::evaluate):
        (PostfixDotNode::evaluate):
        (VoidNode::evaluate):
        (PrefixBracketNode::evaluate):
        (PrefixDotNode::evaluate):
        (ShiftNode::evaluate):
        (valueForReadModifyAssignment):
        (AssignDotNode::evaluate):
        (AssignBracketNode::evaluate):
        (VarDeclNode::evaluate):
        (VarDeclNode::processVarDecls):
        (VarDeclListNode::evaluate):
        (ReturnNode::execute):
        (CaseClauseNode::evalStatements):
        (ParameterNode::evaluate):
        (FuncDeclNode::processFuncDecl):
        * kjs/nodes.h:
        (KJS::StatementNode::evaluate):
        * kjs/number_object.cpp:
        (NumberPrototypeImp::NumberPrototypeImp):
        (NumberProtoFuncImp::callAsFunction):
        (NumberObjectImp::NumberObjectImp):
        (NumberObjectImp::getValueProperty):
        (NumberObjectImp::callAsFunction):
        * kjs/object.cpp:
        (KJS::ObjectImp::get):
        (KJS::Error::create):
        * kjs/object_object.cpp:
        (ObjectPrototypeImp::ObjectPrototypeImp):
        (ObjectProtoFuncImp::callAsFunction):
        (ObjectObjectImp::ObjectObjectImp):
        * kjs/property_slot.cpp:
        (KJS::PropertySlot::undefinedGetter):
        * kjs/regexp_object.cpp:
        (RegExpPrototypeImp::RegExpPrototypeImp):
        (RegExpProtoFuncImp::callAsFunction):
        (RegExpObjectImp::RegExpObjectImp):
        (RegExpObjectImp::arrayOfMatches):
        (RegExpObjectImp::getBackref):
        (RegExpObjectImp::getLastMatch):
        (RegExpObjectImp::getLastParen):
        (RegExpObjectImp::getLeftContext):
        (RegExpObjectImp::getRightContext):
        (RegExpObjectImp::getValueProperty):
        (RegExpObjectImp::construct):
        * kjs/string_object.cpp:
        (StringInstanceImp::StringInstanceImp):
        (StringPrototypeImp::StringPrototypeImp):
        (replace):
        (StringProtoFuncImp::callAsFunction):
        (StringObjectImp::StringObjectImp):
        (StringObjectImp::callAsFunction):
        (StringObjectFuncImp::StringObjectFuncImp):
        (StringObjectFuncImp::callAsFunction):
        * kjs/testkjs.cpp:
        (TestFunctionImp::callAsFunction):
        (VersionFunctionImp::callAsFunction):
        * kjs/value.h:

2005-12-10  Oliver Hunt  <ojh16@student.canterbury.ac.nz>

        Reviewed by Maciej, landed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=3539
          Array join and toString methods do not support circular references

        * kjs/array_object.cpp: (ArrayProtoFuncImp::callAsFunction):
        Added set of visited objects -- don't recurse if item is already in the set.

2005-12-08  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        - fix major memory leak and resultant slowdown on JavaScript iBench from
        my PassRefPtr changes
        
        * kjs/ustring.cpp:
        (KJS::UString::Rep::create): I forgot to change one of the two overloads to create
        with a refcount of 0 instead of 1 (the smart pointer then bumps it. But instead of
        changing it, I changed both to start with a refcounter of 1 and use PassRefPtr::adopt
        to adopt the initial refcount, this may be a hair more efficient.

        - made the assignment operators for smart pointers inline because Shark said so
        
        * kxmlcore/PassRefPtr.h:
        (KXMLCore::::operator=):
        * kxmlcore/RefPtr.h:
        (KXMLCore::::operator=):

2005-12-06  Anders Carlsson  <andersca@mac.com>

        Reviewed by Darin.

        - fix build when using gcc 4
                
        * kjs/ustring.h:
        Make Rep public.

        * kxmlcore/PassRefPtr.h:
        (KXMLCore::::operator):
        Fix a typo.

2005-12-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.

        - add PassRefPtr, a smart pointer class that works in conjunction
        with RefPtr but has transfer-of-ownership semantics
        - apply RefPtr and PassRefPtr to UString
        - cleaned up UString a little so that it doesn't need to have so many friend classes

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/identifier.cpp:
        (KJS::Identifier::add):
        * kjs/identifier.h:
        (KJS::Identifier::Identifier):
        (KJS::Identifier::equal):
        * kjs/property_map.cpp:
        (KJS::PropertyMap::get):
        (KJS::PropertyMap::getLocation):
        (KJS::PropertyMap::put):
        (KJS::PropertyMap::remove):
        * kjs/ustring.cpp:
        (KJS::UCharReference::operator=):
        (KJS::UCharReference::ref):
        (KJS::UString::Rep::createCopying):
        (KJS::UString::Rep::create):
        (KJS::UString::usedCapacity):
        (KJS::UString::usedPreCapacity):
        (KJS::UString::expandCapacity):
        (KJS::UString::expandPreCapacity):
        (KJS::UString::UString):
        (KJS::UString::spliceSubstringsWithSeparators):
        (KJS::UString::append):
        (KJS::UString::operator=):
        (KJS::UString::toStrictUInt32):
        (KJS::UString::substr):
        (KJS::UString::copyForWriting):
        (KJS::operator==):
        * kjs/ustring.h:
        (KJS::UString::UString):
        (KJS::UString::~UString):
        (KJS::UString::data):
        (KJS::UString::isNull):
        (KJS::UString::isEmpty):
        (KJS::UString::size):
        (KJS::UString::rep):
        * kxmlcore/RefPtr.h:
        (KXMLCore::RefPtr::RefPtr):
        (KXMLCore::RefPtr::operator*):
        (KXMLCore::::operator):
        (KXMLCore::operator==):
        (KXMLCore::operator!=):
        (KXMLCore::static_pointer_cast):
        (KXMLCore::const_pointer_cast):

2005-12-04  Geoffrey Garen  <ggaren@apple.com>

        Update test results to match Anders's last checkin.

        * tests/mozilla/expected.html:

2005-12-04  Anders Carlsson  <andersca@mac.com>

        Reviewed by Geoffrey.

        - Fixes <http://bugs.webkit.org/show_bug.cgi?id=3999>
        Object.prototype is missing propertyIsEnumerable
        
        * kjs/object.cpp:
        (KJS::ObjectImp::canPut):
        Refactor to use getPropertyAttributes.

        (KJS::ObjectImp::propertyIsEnumerable):
        New function which checks if a property is enumerable.

        (KJS::ObjectImp::getPropertyAttributes):
        * kjs/object.h:
        Add getPropertyAttributes and propertyIsEnumerable.

        * kjs/object_object.cpp:
        (ObjectPrototypeImp::ObjectPrototypeImp):
        (ObjectProtoFuncImp::callAsFunction):
        * kjs/object_object.h:
        (KJS::ObjectProtoFuncImp::):
        Add propertyIsEnumerable to the Object prototype.

2005-12-01  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Tim Hatcher.

        - removed deprecated reset, isNull and nonNull methods

        * kxmlcore/RefPtr.h:

2005-12-01  Anders Carlsson  <andersca@mac.com>

        Reviewed by Darin.

        - Fixes <http://bugs.webkit.org/show_bug.cgi?id=3382>
        nodes2strings.cpp fails to print left expression of ForInNode when 'var' is not used
        
        Patch by Mark Rowe.

        * kjs/nodes2string.cpp:
        (ForInNode::streamTo):
        Add lexpr if there's no varDecl.

2005-12-01  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Eric.

        - renamed SharedPtr to RefPtr via script

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/function.cpp:
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/function.h:
        * kjs/function_object.cpp:
        (FunctionObjectImp::construct):
        * kjs/internal.cpp:
        (KJS::Parser::parse):
        (KJS::InterpreterImp::checkSyntax):
        (KJS::InterpreterImp::evaluate):
        * kjs/internal.h:
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:
        (KJS::SourceStream::operator<<):
        * kjs/protect.h:
        * kxmlcore/RefPtr.h: Added.
        (KXMLCore::RefPtr::RefPtr):
        (KXMLCore::RefPtr::~RefPtr):
        (KXMLCore::RefPtr::isNull):
        (KXMLCore::RefPtr::notNull):
        (KXMLCore::RefPtr::reset):
        (KXMLCore::RefPtr::get):
        (KXMLCore::RefPtr::operator*):
        (KXMLCore::RefPtr::operator->):
        (KXMLCore::RefPtr::operator!):
        (KXMLCore::RefPtr::operator UnspecifiedBoolType):
        (KXMLCore::::operator):
        (KXMLCore::operator==):
        (KXMLCore::operator!=):
        (KXMLCore::static_pointer_cast):
        (KXMLCore::const_pointer_cast):
        * kxmlcore/SharedPtr.h: Removed.

2005-11-30  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Dave Hyatt.

        - change idiom used for implicit bool conversion of smart pointers, because the old one gives weird error messages sometimes

        * kjs/protect.h:
        (KJS::ProtectedPtr::operator UnspecifiedBoolType):
        * kxmlcore/SharedPtr.h:
        (KXMLCore::SharedPtr::operator UnspecifiedBoolType):

2005-11-29  Mitz Pettel  <opendarwin.org@mitzpettel.com>

        Reviewed by ggaren.  Committed by eseidel.

        Date conversion to local time gets the DST flag wrong sometimes
        http://bugs.webkit.org/show_bug.cgi?id=5514

        * kjs/date_object.cpp:
        (KJS::isTime_tSigned):
        (KJS::DateProtoFuncImp::callAsFunction):

2005-11-26  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Eric.

        - renamed InterpreterLock to JSLock

        * bindings/NP_jsobject.cpp:
        (_NPN_Invoke):
        (_NPN_Evaluate):
        (_NPN_GetProperty):
        (_NPN_SetProperty):
        (_NPN_RemoveProperty):
        (_NPN_HasProperty):
        (_NPN_HasMethod):
        (_NPN_SetException):
        * bindings/jni/jni_jsobject.cpp:
        (JSObject::call):
        (JSObject::eval):
        (JSObject::getMember):
        (JSObject::setMember):
        (JSObject::removeMember):
        (JSObject::getSlot):
        (JSObject::setSlot):
        (JSObject::toString):
        (JSObject::convertJObjectToValue):
        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject setValue:forKey:]):
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject removeWebScriptKey:]):
        (-[WebScriptObject stringRepresentation]):
        (-[WebScriptObject webScriptValueAtIndex:]):
        (-[WebScriptObject setWebScriptValueAtIndex:value:]):
        (+[WebScriptObject _convertValueToObjcValue:originExecutionContext:executionContext:]):
        * bindings/runtime.cpp:
        (Instance::createRuntimeObject):
        * bindings/runtime_root.cpp:
        (KJS::Bindings::addNativeReference):
        (KJS::Bindings::removeNativeReference):
        (RootObject::removeAllNativeReferences):
        * bindings/runtime_root.h:
        (KJS::Bindings::RootObject::~RootObject):
        (KJS::Bindings::RootObject::setRootObjectImp):
        * bindings/testbindings.cpp:
        (main):
        * bindings/testbindings.mm:
        (main):
        * kjs/JSLock.cpp:
        (KJS::initializeJSLock):
        (KJS::JSLock::lock):
        (KJS::JSLock::unlock):
        (KJS::JSLock::lockCount):
        (KJS::JSLock::DropAllLocks::DropAllLocks):
        (KJS::JSLock::DropAllLocks::~DropAllLocks):
        * kjs/JSLock.h:
        (KJS::JSLock::JSLock):
        (KJS::JSLock::~JSLock):
        * kjs/collector.cpp:
        (KJS::Collector::allocate):
        (KJS::Collector::collect):
        * kjs/internal.cpp:
        (KJS::InterpreterImp::InterpreterImp):
        (KJS::InterpreterImp::clear):
        (KJS::InterpreterImp::checkSyntax):
        (KJS::InterpreterImp::evaluate):
        * kjs/interpreter.cpp:
        (Interpreter::evaluate):
        * kjs/protect.h:
        (KJS::::ProtectedPtr):
        (KJS::::~ProtectedPtr):
        (KJS::::operator):
        * kjs/protected_reference.h:
        (KJS::ProtectedReference::ProtectedReference):
        (KJS::ProtectedReference::~ProtectedReference):
        (KJS::ProtectedReference::operator=):
        * kjs/protected_values.cpp:
        (KJS::ProtectedValues::getProtectCount):
        (KJS::ProtectedValues::increaseProtectCount):
        (KJS::ProtectedValues::decreaseProtectCount):
        * kjs/testkjs.cpp:
        (TestFunctionImp::callAsFunction):
        (main):

2005-11-26  Darin Adler  <darin@apple.com>

        Reviewed by eseidel.  Committed by eseidel.

        Inline ScopeChain functions for speed.
        http://bugs.webkit.org/show_bug.cgi?id=5687

        * kjs/object.h:
        (KJS::ScopeChain::mark):
        * kjs/scope_chain.cpp:
        * kjs/scope_chain.h:
        (KJS::ScopeChain::ref):
        (KJS::ScopeChain::operator=):
        (KJS::ScopeChain::bottom):
        (KJS::ScopeChain::push):
        (KJS::ScopeChain::pop):

2005-11-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.

        <rdar://problem/4139620> Seed: WebKit: hang when sending XMLHttpRequest if automatic proxy config is used

        Also factored locking code completely into a separate class, and
        added a convenient packaged way to temporarily drop locks.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/JSLock.cpp: Added.
        (KJS::initializeInterpreterLock):
        (KJS::InterpreterLock::lock):
        (KJS::InterpreterLock::unlock):
        (KJS::InterpreterLock::lockCount):
        (KJS::InterpreterLock::DropAllLocks::DropAllLocks):
        (KJS::InterpreterLock::DropAllLocks::~DropAllLocks):
        * kjs/JSLock.h: Added.
        (KJS::InterpreterLock::InterpreterLock):
        (KJS::InterpreterLock::~InterpreterLock):
        * kjs/internal.cpp:
        * kjs/internal.h:
        * kjs/interpreter.cpp:
        * kjs/interpreter.h:
        * kjs/protect.h:
        * kjs/testkjs.cpp:
        (TestFunctionImp::callAsFunction):

2005-11-21  Eric Seidel  <eseidel@apple.com>

        Rubber-stamped by hyatt.
        
        Removed JavaScriptCore+SVG target.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2005-11-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by mjs.
        
        - Fixed <rdar://problem/4342216> Installer crash in 
          KJS::ValueImp::marked() when garbage collector runs inside call to 
          ConstantValues::init()
          
        I took responsibility for initializing and marking ConstantValues away 
        from InterpreterImp, since it's possible to reference such a value 
        before any interpreter has been created and after the last interpreter 
        has been destroyed.

        InterpreterImp::lock now initializes ConstantValues. It's a good
        place for the initialization because you have to call it before
        creating any objects. Since ::lock can be called more than once,
        I added a check in ConstantValues::init to ensure that it executes 
        only once.

        Collector:collect is now responsible for marking ConstantValues.

        We no longer clear the ConstantValues since we can't guarantee that no 
        one has a reference to them.

        FIXME: This is hackery. The long-term plan is to make ConstantValues
        use immediate values that require no initialization.

        * ChangeLog:
        * kjs/collector.cpp:
        (KJS::Collector::collect):
        * kjs/internal.cpp:
        (KJS::InterpreterImp::InterpreterImp):
        (KJS::InterpreterImp::lock):
        (KJS::InterpreterImp::clear):
        (KJS::InterpreterImp::mark):
        * kjs/internal.h:
        * kjs/value.cpp:
        (KJS::ConstantValues::initIfNeeded):
        * kjs/value.h:

2005-11-08  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        This patch fixes some naughty naughty code -- 5 crashes and 2 
        may-go-haywire-in-the-futures.
        
        One such crash is <rdar://problem/4247330> 8C46 Crash with with 
        incomplete parameter list to webScript object function.
        
        I replaced early returns from within NS_DURINGs with calls to
        NS_VALUERETURN because the doc says, "You cannot use goto or 
        return to exit an exception handling domain -- errors will result."
        
        I replaced hard-coded analyses of -[NSMethodSignature 
        methodReturnType] with more abstracted alternatives, since
        the documentation says "This encoding is implementation-specific, 
        so applications should use it with caution," and then emits an
        evil cackle.
        
        I removed the early return in the case where a JavaScript caller
        supplies an insufficient number of arguments, because the right
        thing to do in such a case is to use JavaScript's defined behavior
        of supplying "undefined" for any missing arguments.
        
        I also changed ObjcInstance::invokeMethod so that it no longer
        deletes the method passed to it. It doesn't create the method,
        so it shouldn't delete it. A friend of mine named
        KERNEL_PROTECTION_FAILURE agrees with me on this point.
        
        Finally, I changed an assert(true) to assert(false) because
        all the other asserts were making fun of it.

        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):
        (ObjcInstance::invokeDefaultMethod):

2005-11-06  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=5571
          REGRESSION (412.5-TOT): duplicated words/sentences at 
          shakespeer.sourceforge.net

        Our UTF16-modified PCRE didn't work with extended character classes
        (classes involving characters > 255) because it used the GETCHARINC
        macro to read through them. In UTF16 mode, GETCHARINC expects UTF16 
        input, but PCRE encodes character classes in UTF8 regardless of the
        input mode of the subject string.

        The fix is to explicitly define GETUTF8CHARINC, and to use it,
        rather than GETCHARINC, when reading extended character classes. 
        
        In UTF8 mode, we simply define GETCHARINC to be GETUTF8CHARINC.

        * pcre/pcre_internal.h:
        * pcre/pcre_xclass.c:
        (_pcre_xclass):

2005-11-05  Geoffrey Garen  <ggaren@apple.com>

        Patch by Mitz Pettel, reviewed by Maciej.

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=5357
          REGRESSION: Scriptable plugin hides properties of OBJECT element

        * bindings/objc/objc_class.mm:
        (KJS::Bindings::ObjcClass::fallbackObject):

2005-11-05  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=5409
        slice() testcase doesn't pass

        Modified String.slice to deal with funky values.
        Updated test results. We now pass <js1_2/String/slice.js>.

        * kjs/string_object.cpp:
        (StringProtoFuncImp::callAsFunction):
        * tests/mozilla/expected.html:

2005-11-04  Darin Adler  <darin@apple.com>

        Reviewed by Tim Hatcher.

        * kxmlcore/HashSet.h: Fixed case of "hashfunctions.h" -- needs to be "HashFunctions.h".

2005-11-03  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin and Vicki.

        * JavaScriptCore.xcodeproj/project.pbxproj:
          Change to use $(SYSTEM_LIBRARY_DIR) consistently and place
          $(NEXT_ROOT) in a few spots to make build-root work.

2005-11-03  Geoffrey Garen  <ggaren@apple.com>

        - Updated JavaScriptCore test results to reflect recent fixes.

        * tests/mozilla/expected.html:

2005-11-03  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by darin.

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=5602
          REGRESSION: RegExp("[^\\s$]+", "g") returns extra matches

        We now update lastIndex relative to the start of the last match,
        rather than the start of the last search. We used to assume that
        the two were equal, but that is not the case when a pattern
        matches at a character after the first in the string.

        * kjs/regexp_object.cpp:
        (RegExpProtoFuncImp::callAsFunction):

2005-10-24  John Sullivan  <sullivan@apple.com>

        Reviewed by Darin Adler. Code changes by Alexey Proskuryakov.
        
        - fixed http://bugs.webkit.org/show_bug.cgi?id=4931
        Unicode format characters (Cf) should be removed from JavaScript source

        * kjs/lexer.cpp:
        include <unicode/uchar.h>
        (Lexer::Lexer):
        use KJS::UChar instead of UChar to avoid ambiguity caused by new include
        (Lexer::setCode):
        ditto; also, use shift(4) to skip first 4 chars to take advantage of new
        logic there.
        (Lexer::shift):
        skip chars of type U_FORMAT_CHAR
        (Lexer::convertUnicode):
        use KJS::UChar instead of UChar to avoid ambiguity caused by new include
        (Lexer::record16):
        ditto
        (Lexer::makeIdentifier):
        ditto
        (Lexer::makeUString):
        ditto
        
        * tests/mozilla/ecma/Array/15.4.5.1-1.js:
        updated to skip soft hyphens

2005-10-24  John Sullivan  <sullivan@apple.com>

        Reviewed by Darin Adler. Code changes by George Staikos/Geoff Garen.
        
        - fixed http://bugs.webkit.org/show_bug.cgi?id=4142
        Date object does not always adjust daylight savings correctly

        * kjs/date_object.cpp:
        (KJS::makeTime):
        Fix the case where a time change crosses the daylight savings start/end dates.

2005-10-17  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff. Code changes by Darin.

        - some micro-optimizations to FastMalloc to reduce math and branches.

        * kxmlcore/FastMalloc.cpp:
        (KXMLCore::TCMalloc_Central_FreeList::Populate):
        (KXMLCore::fastMallocRegisterThread):
        (KXMLCore::TCMalloc_ThreadCache::GetCache):
        (KXMLCore::TCMalloc_ThreadCache::GetCacheIfPresent):

2005-10-15  Maciej Stachowiak  <mjs@apple.com>

        Reverted fix for this bug, because it was part of a time range that caused a performance
        regression:
        
        <rdar://problem/4260481> Remove Reference type from JavaScriptCore

2005-10-15  Darin Adler  <darin@apple.com>

        * kxmlcore/HashTable.cpp: Fixed build failure (said hashtable.h instead of HashTable.h).

2005-10-14  Geoffrey Garen  <ggaren@apple.com>

        Style changes recommended by Darin.
        
        Changed to camelCase, changed ValueImp* to ValueImp *.

        * kjs/simple_number.h:
        (KJS::SimpleNumber::make):
        (KJS::SimpleNumber::value):

2005-10-11  Geoffrey Garen  <ggaren@apple.com>

        Added regexp_object.lut.h build phase from JavaScriptCore
        to JavaScriptCore+SVG.

        Reviewed by mitz.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2005-10-11  Geoffrey Garen  <ggaren@apple.com>

        Fixed build bustage from last checkin (stray characters
        in the project file).

        Reviewed by mitz.

        * JavaScriptCore.xcodeproj/project.pbxproj:

2005-10-11  Geoffrey Garen  <ggaren@apple.com>

        New JavaScriptCore test results to reflect the last change.

        * tests/mozilla/expected.html:

2005-10-10  Geoffrey Garen  <ggaren@apple.com>

        - Implemented caching of match state inside the global RegExp object
          (lastParen, leftContext, rightContext, lastMatch, input).

          exec(), test(), match(), search(), and replace() now dipatch regular
          expression matching through the RegExp object's performMatch function, 
          to facilitate caching. This replaces registerRegexp and 
          setSubPatterns.
        
        - Implemented the special '$' aliases (e.g. RegExp.input aliases to 
          RegExp.$_).

        - Moved support for backreferences into the new static hash table
          used for other special RegExp properties. Truncated backreferences
          at $9 to match IE, FF, and the "What's New in Netscape 1.2?" doc.
          (String.replace still supports double-digit backreferences.)

        - Tweaked RegExp.prototype.exec to handle ginormous values in lastIndex.

        Fixes 11 -- count em, 11 -- JavaScriptCore tests.

        * fast/js/regexp-caching-expected.txt: Added.
        * fast/js/regexp-caching.html: Added.

        Reviewed by mjs.

        * JavaScriptCore.xcodeproj/project.pbxproj: Added regexp_object.lut.h
        * kjs/create_hash_table: Tweaked to allow for more exotic characters.
                                 We now rely on the compiler to catch illegal
                                 identifiers.
        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp):
        * kjs/regexp_object.cpp:
        (RegExpProtoFuncImp::callAsFunction):
        (RegExpObjectImp::RegExpObjectImp):
        (RegExpObjectImp::performMatch):
        (RegExpObjectImp::arrayOfMatches):
        (RegExpObjectImp::backrefGetter):
        (RegExpObjectImp::getLastMatch):
        (RegExpObjectImp::getLastParen):
        (RegExpObjectImp::getLeftContext):
        (RegExpObjectImp::getRightContext):
        (RegExpObjectImp::getOwnPropertySlot):
        (RegExpObjectImp::getValueProperty):
        (RegExpObjectImp::put):
        (RegExpObjectImp::putValueProperty):
        * kjs/regexp_object.h:
        (KJS::RegExpObjectImp::):
        * kjs/string_object.cpp:
        (substituteBackreferences):
        (replace):
        (StringProtoFuncImp::callAsFunction):

2005-10-09  Darin Adler  <darin@apple.com>

        Reviewed by Maciej; some changes done after review.

        - fixed <rdar://problem/4092064> hanging loading page; rte.ie (works in IE and Firefox)
        - fixed http://bugs.webkit.org/show_bug.cgi?id=5280
          Date.setMonth fails with negative values
        - fixed http://bugs.webkit.org/show_bug.cgi?id=5154
          JSC should switch to _r variants of unix time/date functions
        - fixed a few possible overflow cases

        Retested all tests to be sure nothing broke; added layout test for bug 5280.

        * kjs/config.h: Removed TIME_WITH_SYS_TIME define. Also set HAVE_SYS_TIMEB_H
        for the __APPLE__ case (the latter is accurate but irrelevant).

        * kjs/date_object.h: Reformatted. Removed unnecessary include of "function_object.h".
        Moved declarations of helper classes and functions into the cpp file.

        * kjs/date_object.cpp: Removed code at top to define macros to use CoreFoundation instead of
        POSIX date functions.
        (KJS::styleFromArgString): Tweaked to return early instead of using a variable.
        (KJS::formatLocaleDate): Tweaked to check for undefined rather than checking argument count.
        (KJS::formatDate): Made parameter const.
        (KJS::formatDateUTCVariant): Ditto.
        (KJS::formatTime): Ditto.
        (KJS::DateProtoFuncImp::callAsFunction): Use gmtime_r and localtime_r instead of gmtime and
        localtime.
        (KJS::DateObjectImp::callAsFunction): Use localtime_r instead of localtime.
        (KJS::ymdhmsToSeconds): Renamed from ymdhms_to_seconds. Changed computation to avoid possible
        overflow if year is an extremely large or small number.
        (KJS::makeTime): Removed code to move large month numbers from tm_mon to tm_year; this was
        to accomodate CFGregorianDate, which is no longer used (and didn't handle negative values).
        (KJS::parseDate): Renamed from KRFCDate_parseDate; changed to return a value in milliseconds
        rather than in seconds. Reformatted the code. Changed to use UTF8String() instead of ascii(),
        since ascii() is not thread safe. Changed some variables back from int to long to avoid
        trouble if the result of strtol does not fit in an int (64-bit issue only).

2005-10-08  Mitz Pettel  <opendarwin.org@mitzpettel.com>

        Reviewed by Geoff.
        Tweaked and landed by Darin.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=5266
          Support parenthesized comments in Date.parse()

        * kjs/date_object.cpp:
        (KJS::skipSpacesAndComments): Take a pointer, and advance it past spaces,
        and also past anything enclosed in parentheses.
        (KJS::KRFCDate_parseDate): Use skipSpacesAndComments wherever we formerly had
        code to skip spaces.

2005-10-08  Justin Haygood  <justin@xiondigital.net>

        Reviewed, tweaked, and landed by Darin.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=5189
          pcre_exec.c fails to compile using MSVC
        - fixed http://bugs.webkit.org/show_bug.cgi?id=5190
          KJS config.h adjustment for Win32
        
        * kjs/config.h: Make sure HAVE_MMAP and HAVE_SBRK are off for Win32.
        Turn HAVE_ERRNO_H on for Mac OS X. Sort defines so they are easy to compare
        with each other. Remove #undef of DEBUG_COLLECTOR.
        * pcre/pcre_exec.c: (match): Work around strange MSVC complaint by splitting
        the definition of a local variable into a separate declaration and
        initialization.

2005-10-05  Geoffrey Garen  <ggaren@apple.com>
 
        - Darin and I rewrote our implementation of the SimpleNumber class
          to store number bit patterns in their floating point formats.
 
        My tweaks reviewed by Darin.
        
        ~1% speedup on JS iBench.
        
        * kjs/internal.h: removed obsolete jsNumber declarations.
        * kjs/math_object.cpp:
        (MathFuncImp::callAsFunction): changed KJS::isNaN to isNaN
        * kjs/nodes.cpp:
        (PostfixResolveNode::evaluate): removed obsolete knownToBeInteger
        (PostfixBracketNode::evaluate): ditto
        (PostfixDotNode::evaluate): ditto
        (PrefixResolveNode::evaluate): ditto
        (PrefixBracketNode::evaluate): ditto
        (PrefixDotNode::evaluate): ditto
        (NegateNode::evaluate): ditto
        (valueForReadModifyAssignment): ditto
        * kjs/number_object.cpp: removed obsolete comment
        * kjs/operations.cpp:
        (KJS::equal): removed unnecessary isNaN checks
        (KJS::strictEqual): ditto
        (KJS::add): removed obsolete knownToBeInteger
        (KJS::mult): ditto
        * kjs/operations.h: removed include of "value.h" to prevent circular reference
        * kjs/simple_number.h: removed unnecessary #includes
        (KJS::SimpleNumber::make): see above
        (KJS::SimpleNumber::is): ditto
        (KJS::SimpleNumber::value): ditto
        * kjs/string_object.cpp:
        (StringProtoFuncImp::callAsFunction): changed KJS::isNaN to isNaN
        * kjs/ustring.cpp: removed unnecessary isNaN check
        (KJS::UString::toUInt32): ditto
        * kjs/value.cpp:
        (KJS::jsNumber): removed obsolete jsNumber definitions
        (KJS::ConstantValues::init): NaN is no longer a ConstantValue
        (KJS::ConstantValues::clear): ditto
        (KJS::ConstantValues::mark): ditto
        * kjs/value.h: removed obsolete knownToBeInteger
        (KJS::jsNaN): now returns a SimpleNumber
        (KJS::ValueImp::getUInt32): changed to account for NaN being a SimpleNumber
        (KJS::ValueImp::toBoolean): ditto
        (KJS::ValueImp::toString): changed to account for +/- 0.0
        (KJS::jsZero): changed to reflect that SimpleNumber::make takes a double
        (KJS::jsOne): ditto
        (KJS::jsTwo): ditto
        (KJS::Number): removed obsolete non-double constructor declarations

2005-10-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.

        - fixed <rdar://problem/4260481> Remove Reference type from JavaScriptCore

        Also fixed some bugs with for..in enumeration while I was at it. object
        properties now come before prototype properties and duplicates
        between object and prototype are listed only once.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/IdentifierSequencedSet.cpp: Added.
        (KJS::IdentifierSequencedSet::IdentifierSequencedSet):
        (KJS::IdentifierSequencedSet::deallocateVector):
        (KJS::IdentifierSequencedSet::~IdentifierSequencedSet):
        (KJS::IdentifierSequencedSet::insert):
        * kjs/IdentifierSequencedSet.h: Added.
        (KJS::IdentifierSequencedSetIterator::IdentifierSequencedSetIterator):
        (KJS::IdentifierSequencedSetIterator::operator*):
        (KJS::IdentifierSequencedSetIterator::operator->):
        (KJS::IdentifierSequencedSetIterator::operator++):
        (KJS::IdentifierSequencedSetIterator::operator==):
        (KJS::IdentifierSequencedSetIterator::operator!=):
        (KJS::IdentifierSequencedSet::begin):
        (KJS::IdentifierSequencedSet::end):
        (KJS::IdentifierSequencedSet::size):
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (ArrayInstanceImp::getPropertyNames):
        (ArrayInstanceImp::setLength):
        (ArrayInstanceImp::pushUndefinedObjectsToEnd):
        * kjs/nodes.cpp:
        (ForInNode::execute):
        * kjs/nodes.h:
        * kjs/object.cpp:
        (KJS::ObjectImp::getPropertyNames):
        * kjs/object.h:
        * kjs/property_map.cpp:
        (KJS::PropertyMap::getEnumerablePropertyNames):
        (KJS::PropertyMap::getSparseArrayPropertyNames):
        * kjs/property_map.h:
        * kjs/protect.h:
        * kjs/protected_reference.h: Removed.
        * kjs/reference.cpp: Removed.
        * kjs/reference.h: Removed.
        * kjs/reference_list.cpp: Removed.
        * kjs/reference_list.h: Removed.
        * kjs/ustring.h:
        (KJS::UString::impl):
        * kxmlcore/HashSet.h:

2005-10-04  Eric Seidel  <eseidel@apple.com>

        Reviewed by mjs.

        Code cleanup, which resulted in a small win on iBench.

        * kjs/object.cpp:
        (KJS::tryGetAndCallProperty): new static inline
        (KJS::ObjectImp::defaultValue): code cleanup

2005-10-03  Maciej Stachowiak  <mjs@apple.com>

        Patch from George Staikos <staikos@kde.org>, reviewed and tweaked a bit by me.

        - more Linux build fixes
        
        * kjs/operations.cpp:
        * kxmlcore/FastMalloc.h:
        * kxmlcore/TCSystemAlloc.cpp:
        (TCMalloc_SystemAlloc):

2005-10-03  Maciej Stachowiak  <mjs@apple.com>

        Patch from George Staikos <staikos@kde.org>, reviewed and tweaked a bit by me.

        http://bugs.webkit.org/show_bug.cgi?id=5174
        Add support for compiling on Linux (likely to help for other POSIX systems too)

        * kjs/collector.cpp:
        (KJS::Collector::markCurrentThreadConservatively):
        (KJS::Collector::markOtherThreadConservatively):
        * kjs/config.h:
        * kjs/date_object.cpp:
        (KJS::formatDate):
        (KJS::formatDateUTCVariant):
        (KJS::formatTime):
        (KJS::timeZoneOffset):
        (KJS::DateProtoFuncImp::callAsFunction):
        (KJS::DateObjectImp::construct):
        (KJS::DateObjectImp::callAsFunction):
        (KJS::makeTime):
        * kjs/identifier.cpp:
        * kjs/internal.cpp:
        (KJS::initializeInterpreterLock):
        (KJS::lockInterpreter):
        (KJS::unlockInterpreter):
        (KJS::UndefinedImp::toPrimitive):
        (KJS::UndefinedImp::toBoolean):
        (KJS::UndefinedImp::toNumber):
        (KJS::UndefinedImp::toString):
        (KJS::NullImp::toPrimitive):
        (KJS::NullImp::toBoolean):
        (KJS::NullImp::toNumber):
        (KJS::NullImp::toString):
        (KJS::BooleanImp::toPrimitive):
        (KJS::BooleanImp::toBoolean):
        (KJS::BooleanImp::toNumber):
        (KJS::BooleanImp::toString):
        (KJS::StringImp::toPrimitive):
        (KJS::StringImp::toBoolean):
        (KJS::StringImp::toNumber):
        (KJS::StringImp::toString):
        * kjs/internal.h:
        * kjs/protected_values.cpp:

2005-10-03  Maciej Stachowiak  <mjs@apple.com>

        - fix Development build after last checkin

        * kxmlcore/FastMalloc.cpp:
        (KXMLCore::fastMallocRegisterThread):

2005-10-02  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        <rdar://problem/4283967> REGRESSION: 3% regression on PLT from new FastMalloc
        http://bugs.webkit.org/show_bug.cgi?id=5243
        
        A number of optimizations to the new threadsafe malloc that make it actually as fast
        as dlmalloc (I measured wrong before) and as memory-efficient as the system malloc.

        - use fastMalloc for everything - it now gets applied to all new/delete allocations
        via a private inline operator new that is now included into every file via config.h.

        - tweaked some of the numeric parameters for size classes and amount of wasted memory
        allowed per allocation - this saves on memory use and consequently improves speed.

        - so long as the allocator is not being used on background threads, get the per-thread
        cache from a global variable instead of from pthread_getspecific, since the latter is slow.

        - inline more functions, and force the ones GCC refuses to inline with 
        attribute(always_inline), nearly all of these have one call site so inlining them has 
        to be a win.

        - use some tricks to calculate allocation size more efficiently and fewer times for small
        allocations, to avoid hitting the huge size table array.

        - avoid hitting the per-thread cache on code paths that don't need it.

        - implement inline assembly version of spinlock for PowerPC (was already done for x86)

        * bindings/NP_jsobject.cpp:
        * bindings/c/c_class.cpp:
        * bindings/c/c_instance.cpp:
        * bindings/c/c_runtime.cpp:
        * bindings/c/c_utility.cpp:
        * bindings/jni/jni_class.cpp:
        * bindings/jni/jni_instance.cpp:
        * bindings/jni/jni_jsobject.cpp:
        * bindings/jni/jni_objc.mm:
        * bindings/jni/jni_runtime.cpp:
        * bindings/jni/jni_utility.cpp:
        * bindings/npruntime.cpp:
        * bindings/objc/WebScriptObject.mm:
        * bindings/objc/objc_class.mm:
        * bindings/objc/objc_instance.mm:
        * bindings/objc/objc_runtime.mm:
        * bindings/objc/objc_utility.mm:
        * bindings/runtime.cpp:
        * bindings/runtime_array.cpp:
        * bindings/runtime_method.cpp:
        * bindings/runtime_object.cpp:
        * bindings/runtime_root.cpp:
        * bindings/testbindings.cpp:
        * bindings/testbindings.mm:
        * kjs/array_object.cpp:
        (ArrayInstanceImp::ArrayInstanceImp):
        (ArrayInstanceImp::~ArrayInstanceImp):
        (ArrayInstanceImp::resizeStorage):
        * kjs/bool_object.cpp:
        * kjs/collector.cpp:
        (KJS::Collector::registerThread):
        * kjs/config.h:
        * kjs/debugger.cpp:
        * kjs/error_object.cpp:
        * kjs/function.cpp:
        * kjs/function_object.cpp:
        * kjs/identifier.cpp:
        (KJS::Identifier::rehash):
        * kjs/internal.cpp:
        (KJS::Parser::saveNewNode):
        (KJS::clearNewNodes):
        * kjs/interpreter.cpp:
        * kjs/lexer.cpp:
        (Lexer::doneParsing):
        (Lexer::makeIdentifier):
        (Lexer::makeUString):
        * kjs/list.cpp:
        * kjs/math_object.cpp:
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:
        * kjs/number_object.cpp:
        (integer_part_noexp):
        (char_sequence):
        * kjs/object.cpp:
        * kjs/object_object.cpp:
        * kjs/property_map.cpp:
        * kjs/property_slot.cpp:
        * kjs/protected_values.cpp:
        (KJS::ProtectedValues::rehash):
        * kjs/reference.cpp:
        * kjs/reference_list.cpp:
        * kjs/regexp.cpp:
        * kjs/regexp_object.cpp:
        * kjs/scope_chain.cpp:
        * kjs/scope_chain.h:
        * kjs/string_object.cpp:
        * kjs/testkjs.cpp:
        * kjs/ustring.h:
        * kjs/value.cpp:
        * kxmlcore/Assertions.mm:
        * kxmlcore/FastMalloc.cpp:
        (KXMLCore::InitSizeClasses):
        (KXMLCore::DLL_IsEmpty):
        (KXMLCore::DLL_Prepend):
        (KXMLCore::TCMalloc_Central_FreeList::Insert):
        (KXMLCore::TCMalloc_Central_FreeList::Remove):
        (KXMLCore::TCMalloc_Central_FreeList::Populate):
        (KXMLCore::TCMalloc_ThreadCache::Allocate):
        (KXMLCore::TCMalloc_ThreadCache::FetchFromCentralCache):
        (KXMLCore::fastMallocRegisterThread):
        (KXMLCore::TCMalloc_ThreadCache::GetCache):
        (KXMLCore::TCMalloc_ThreadCache::GetCacheIfPresent):
        (KXMLCore::TCMalloc_ThreadCache::CreateCacheIfNecessary):
        (KXMLCore::do_malloc):
        (KXMLCore::do_free):
        (KXMLCore::realloc):
        * kxmlcore/FastMalloc.h:
        (operator new):
        (operator delete):
        (operator new[]):
        (operator delete[]):
        * kxmlcore/HashTable.cpp:
        * kxmlcore/TCSpinLock.h:
        (TCMalloc_SpinLock::Lock):
        (TCMalloc_SpinLock::Unlock):
        (TCMalloc_SlowLock):
        * kxmlcore/TCSystemAlloc.cpp:

2005-09-30  Geoffrey Garen  <ggaren@apple.com>

        - Second cut at fixing <rdar://problem/4275206> Denver Regression: Seed: 
          Past Editions of Opinions display "NAN/Undefined" for www.washingtonpost.com
                
        Reviewed by john.

        * kjs/date_object.cpp:
        (KJS::KRFCDate_parseDate): Intead of creating a timezone when one isn't specified,
        just rely on the fallback logic, which will do it for you. Also, return invalidDate
        if the date includes trailing garbage. (Somewhat accidentally, the timezone logic
        used to catch trailing garbage.)

        Added test case to fast/js/date-parse-test.html.

2005-09-29  Eric Seidel  <eseidel@apple.com>
        Fix from Mitz Pettel <opendarwin.org@mitzpettel.com>

        Reviewed by darin.

        Fix JSC memory smasher in TOT.
        http://bugs.webkit.org/show_bug.cgi?id=5176

        * pcre/pcre_exec.c:
        (match):

2005-09-29  Eric Seidel  <eseidel@apple.com>
        Fix from Mitz Pettel <opendarwin.org@mitzpettel.com>

        Reviewed by mjs.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        Build fix for JSC+SVG after 5161.
        http://bugs.webkit.org/show_bug.cgi?id=5179

2005-09-28  Geoffrey Garen  <ggaren@apple.com>

        - Fixed <rdar://problem/4275206> Denver Regression: Seed: Past Editions of Opinions display 
          "NAN/Undefined" for www.washingtonpost.com
          
        Reviewed by darin.

        * kjs/date_object.cpp:
        (KJS::KRFCDate_parseDate): If the timezone isn't specified, rather than returning
        invalidDate, substitute the local timezone. This matches the behavior of FF/IE.

2005-09-28  Maciej Stachowiak  <mjs@apple.com>

        Patch from George Staikos, reviewed by me.

        - fixed some compile issues on Linux
        
        * kjs/property_slot.h:
        * kjs/simple_number.h:

2005-09-27  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.

        - move HashMap/HashSet code down to JavaScriptCore
        http://bugs.webkit.org/show_bug.cgi?id=5161
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/internal.cpp:
        (KJS::interpreterMap): Function that fetches the interpreter map on demand. 
        (KJS::InterpreterImp::InterpreterImp): Replace use of InterpreterMap
        class with an appropriate HashMap.
        (KJS::InterpreterImp::clear): ditto
        (KJS::InterpreterImp::interpreterWithGlobalObject): ditto
        * kjs/interpreter_map.cpp: Removed.
        * kjs/interpreter_map.h: Removed.

        The HashMap/HashSet code (copied and slightly tweaked from WebCore)
        
        * kxmlcore/HashFunctions.h: Added.
        (KXMLCore::4):
        (KXMLCore::8):
        (KXMLCore::):
        (KXMLCore::PointerHash::hash):
        (KXMLCore::PointerHash::equal):
        * kxmlcore/HashMap.h: Added.
        (KXMLCore::extractFirst):
        (KXMLCore::HashMap::HashMap):
        (KXMLCore::::size):
        (KXMLCore::::capacity):
        (KXMLCore::::isEmpty):
        (KXMLCore::::begin):
        (KXMLCore::::end):
        (KXMLCore::::find):
        (KXMLCore::::contains):
        (KXMLCore::::set):
        (KXMLCore::::get):
        (KXMLCore::::remove):
        (KXMLCore::::clear):
        (KXMLCore::deleteAllValues):
        * kxmlcore/HashMapPtrSpec.h: Added.
        (KXMLCore::PointerHashIteratorAdapter::PointerHashIteratorAdapter):
        (KXMLCore::PointerHashIteratorAdapter::operator*):
        (KXMLCore::PointerHashIteratorAdapter::operator->):
        (KXMLCore::PointerHashIteratorAdapter::operator++):
        (KXMLCore::PointerHashIteratorAdapter::operator==):
        (KXMLCore::PointerHashIteratorAdapter::operator!=):
        (KXMLCore::PointerHashConstIteratorAdapter::PointerHashConstIteratorAdapter):
        (KXMLCore::PointerHashConstIteratorAdapter::operator*):
        (KXMLCore::PointerHashConstIteratorAdapter::operator->):
        (KXMLCore::PointerHashConstIteratorAdapter::operator++):
        (KXMLCore::PointerHashConstIteratorAdapter::operator==):
        (KXMLCore::PointerHashConstIteratorAdapter::operator!=):
        (KXMLCore::):
        * kxmlcore/HashSet.h: Added.
        (KXMLCore::identityExtract):
        (KXMLCore::convertAdapter):
        (KXMLCore::HashSet::HashSet):
        (KXMLCore::::size):
        (KXMLCore::::capacity):
        (KXMLCore::::isEmpty):
        (KXMLCore::::begin):
        (KXMLCore::::end):
        (KXMLCore::::find):
        (KXMLCore::::contains):
        (KXMLCore::::insert):
        (KXMLCore::::remove):
        (KXMLCore::::clear):
        * kxmlcore/HashTable.cpp: Added.
        (KXMLCore::HashTableStats::~HashTableStats):
        (KXMLCore::HashTableStats::recordCollisionAtCount):
        * kxmlcore/HashTable.h: Added.
        (KXMLCore::HashTableIterator::skipEmptyBuckets):
        (KXMLCore::HashTableIterator::HashTableIterator):
        (KXMLCore::HashTableIterator::operator*):
        (KXMLCore::HashTableIterator::operator->):
        (KXMLCore::HashTableIterator::operator++):
        (KXMLCore::HashTableIterator::operator==):
        (KXMLCore::HashTableIterator::operator!=):
        (KXMLCore::HashTableConstIterator::HashTableConstIterator):
        (KXMLCore::HashTableConstIterator::operator*):
        (KXMLCore::HashTableConstIterator::operator->):
        (KXMLCore::HashTableConstIterator::skipEmptyBuckets):
        (KXMLCore::HashTableConstIterator::operator++):
        (KXMLCore::HashTableConstIterator::operator==):
        (KXMLCore::HashTableConstIterator::operator!=):
        (KXMLCore::HashTable::HashTable):
        (KXMLCore::HashTable::~HashTable):
        (KXMLCore::HashTable::begin):
        (KXMLCore::HashTable::end):
        (KXMLCore::HashTable::size):
        (KXMLCore::HashTable::capacity):
        (KXMLCore::HashTable::insert):
        (KXMLCore::HashTable::isEmptyBucket):
        (KXMLCore::HashTable::isDeletedBucket):
        (KXMLCore::HashTable::isEmptyOrDeletedBucket):
        (KXMLCore::HashTable::hash):
        (KXMLCore::HashTable::equal):
        (KXMLCore::HashTable::identityConvert):
        (KXMLCore::HashTable::extractKey):
        (KXMLCore::HashTable::lookup):
        (KXMLCore::HashTable::shouldExpand):
        (KXMLCore::HashTable::mustRehashInPlace):
        (KXMLCore::HashTable::shouldShrink):
        (KXMLCore::HashTable::shrink):
        (KXMLCore::HashTable::clearBucket):
        (KXMLCore::HashTable::deleteBucket):
        (KXMLCore::HashTable::makeLookupResult):
        (KXMLCore::HashTable::makeIterator):
        (KXMLCore::HashTable::makeConstIterator):
        (KXMLCore::::lookup):
        (KXMLCore::::insert):
        (KXMLCore::::reinsert):
        (KXMLCore::::find):
        (KXMLCore::::contains):
        (KXMLCore::::remove):
        (KXMLCore::::allocateTable):
        (KXMLCore::::expand):
        (KXMLCore::::rehash):
        (KXMLCore::::clear):
        (KXMLCore::::HashTable):
        (KXMLCore::::swap):
        (KXMLCore::::operator):
        (KXMLCore::::checkTableConsistency):
        (KXMLCore::::checkTableConsistencyExceptSize):
        * kxmlcore/HashTraits.h: Added.
        (KXMLCore::HashTraits::emptyValue):
        (KXMLCore::):
        (KXMLCore::PairHashTraits::emptyValue):
        (KXMLCore::PairHashTraits::deletedValue):

2005-09-27  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - update grammar to fix conflicts; fixes one of our test cases
          because it resolves the relationship between function expressions
          and declarations in the way required by the ECMA specification

        * kjs/grammar.y: Added lots of new grammar rules so we have no conflicts.
        A new set of rules for "no bracket or function at start of expression" and
        another set of rules for "no in anywhere in expression". Also simplified the
        handling of try to use only a single node and used operator precedence to
        get rid of the conflict in handling of if and else. Also used a macro to
        streamline the handling of automatic semicolons and changed parenthesis
        handling to use a virtual function.

        * kjs/nodes.h: Added nodeInsideAllParens, removed unused abortStatement.
        (KJS::TryNode::TryNode): Updated to hold catch and finally blocks directly instead
        of using a special node for each.
        * kjs/nodes.cpp:
        (Node::createErrorCompletion): Added. Used instead of throwError when creating errors
        that should not be in a completion rather than an ExecState.
        (Node::throwUndefinedVariableError): Added. Sets source location unlike the call it
        replaces.
        (Node::nodeInsideAllParens): Added.
        (GroupNode::nodeInsideAllParens): Added.
        (StatListNode::execute): Removed code to move exceptions into completion objects;
        that's now done solely by the KJS_CHECKEXCEPTION macro.
        (TryNode::execute): Include execution of catch and finally here rather than using
        separate nodes.
        (FuncDeclNode::execute): Moved here, no longer inline.
        * kjs/nodes2string.cpp:
        (TryNode::streamTo): Updated for change.
        (FuncDeclNode::streamTo): Ditto.
        (FuncExprNode::streamTo): Ditto.

        * kjs/kjs-test: Removed. Was part of "make check".
        * kjs/kjs-test.chk: Ditto.
        * kjs/test.js: Ditto.

        * tests/mozilla/expected.html: Updated because one more test succeeds.

2005-09-27  Adele Peterson  <adele@apple.com>

        Reviewed by Maciej.

        Changed ints to size_t where appropriate.

        * kjs/collector.cpp:
        (KJS::Collector::allocate):
        (KJS::Collector::markStackObjectsConservatively):
        (KJS::Collector::collect):
        (KJS::Collector::size):
        (KJS::Collector::numInterpreters):
        (KJS::Collector::numGCNotAllowedObjects):
        (KJS::Collector::numReferencedObjects):
        * kjs/collector.h:

2005-09-27  Eric Seidel  <eseidel@apple.com>

        Reviewed by kevin.

        * JavaScriptCore.xcodeproj/project.pbxproj: fix after malloc changes.

2005-09-27  Eric Seidel  <eseidel@apple.com>

        Reviewed by mjs.

        * kjs/nodes.cpp:
        (FuncExprNode::evaluate): Now sets .constructor properly.
        Test cases added to WebCore/layout-tests.
        http://bugs.webkit.org/show_bug.cgi?id=3537

2005-09-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        - replace dlmalloc with tcmalloc
        http://bugs.webkit.org/show_bug.cgi?id=5145

        I also moved SharedPtr and the assertion code from WebCore into a
        new kxmlcore directory.
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/collector.cpp:
        (KJS::Collector::allocate):
        (KJS::Collector::collect):
        * kjs/config.h:
        * kjs/fast_malloc.cpp: Removed.
        * kjs/fast_malloc.h: Removed.
        * kjs/function.cpp:
        * kjs/function.h:
        * kjs/function_object.cpp:
        * kjs/identifier.cpp:
        (KJS::Identifier::add):
        * kjs/internal.cpp:
        * kjs/internal.h:
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:
        * kjs/property_map.cpp:
        (KJS::PropertyMap::~PropertyMap):
        (KJS::PropertyMap::rehash):
        * kjs/scope_chain.h:
        * kjs/shared_ptr.h: Removed.
        * kjs/string_object.cpp:
        (StringObjectFuncImp::callAsFunction):
        * kjs/ustring.cpp:
        (KJS::UString::Rep::createCopying):
        (KJS::UString::Rep::destroy):
        (KJS::UString::expandCapacity):
        (KJS::UString::expandPreCapacity):
        (KJS::UString::UString):
        (KJS::UString::spliceSubstringsWithSeparators):
        (KJS::UString::append):
        (KJS::UString::operator=):
        (KJS::UString::detach):
        * kjs/ustring.h:
        * kxmlcore/Assertions.h: Added.
        * kxmlcore/Assertions.mm: Added.
        * kxmlcore/FastMalloc.cpp: Added.
        (KXMLCore::LgFloor):
        (KXMLCore::SizeClass):
        (KXMLCore::ByteSizeForClass):
        (KXMLCore::InitSizeClasses):
        (KXMLCore::MetaDataAlloc):
        (KXMLCore::PageHeapAllocator::Init):
        (KXMLCore::PageHeapAllocator::New):
        (KXMLCore::PageHeapAllocator::Delete):
        (KXMLCore::PageHeapAllocator::inuse):
        (KXMLCore::pages):
        (KXMLCore::AllocationSize):
        (KXMLCore::Event):
        (KXMLCore::NewSpan):
        (KXMLCore::DeleteSpan):
        (KXMLCore::DLL_Init):
        (KXMLCore::DLL_Remove):
        (KXMLCore::DLL_IsEmpty):
        (KXMLCore::DLL_Length):
        (KXMLCore::DLL_Print):
        (KXMLCore::DLL_Prepend):
        (KXMLCore::DLL_InsertOrdered):
        (KXMLCore::):
        (KXMLCore::TCMalloc_PageHeap::GetDescriptor):
        (KXMLCore::TCMalloc_PageHeap::SystemBytes):
        (KXMLCore::TCMalloc_PageHeap::FreeBytes):
        (KXMLCore::TCMalloc_PageHeap::RecordSpan):
        (KXMLCore::TCMalloc_PageHeap::TCMalloc_PageHeap):
        (KXMLCore::TCMalloc_PageHeap::New):
        (KXMLCore::TCMalloc_PageHeap::Split):
        (KXMLCore::TCMalloc_PageHeap::Carve):
        (KXMLCore::TCMalloc_PageHeap::Delete):
        (KXMLCore::TCMalloc_PageHeap::RegisterSizeClass):
        (KXMLCore::TCMalloc_PageHeap::Dump):
        (KXMLCore::TCMalloc_PageHeap::GrowHeap):
        (KXMLCore::TCMalloc_PageHeap::Check):
        (KXMLCore::TCMalloc_PageHeap::CheckList):
        (KXMLCore::TCMalloc_ThreadCache_FreeList::Init):
        (KXMLCore::TCMalloc_ThreadCache_FreeList::length):
        (KXMLCore::TCMalloc_ThreadCache_FreeList::empty):
        (KXMLCore::TCMalloc_ThreadCache_FreeList::lowwatermark):
        (KXMLCore::TCMalloc_ThreadCache_FreeList::clear_lowwatermark):
        (KXMLCore::TCMalloc_ThreadCache_FreeList::Push):
        (KXMLCore::TCMalloc_ThreadCache_FreeList::Pop):
        (KXMLCore::TCMalloc_ThreadCache::freelist_length):
        (KXMLCore::TCMalloc_ThreadCache::Size):
        (KXMLCore::TCMalloc_Central_FreeList::length):
        (KXMLCore::TCMalloc_Central_FreeList::Init):
        (KXMLCore::TCMalloc_Central_FreeList::Insert):
        (KXMLCore::TCMalloc_Central_FreeList::Remove):
        (KXMLCore::TCMalloc_Central_FreeList::Populate):
        (KXMLCore::TCMalloc_ThreadCache::SampleAllocation):
        (KXMLCore::TCMalloc_ThreadCache::Init):
        (KXMLCore::TCMalloc_ThreadCache::Cleanup):
        (KXMLCore::TCMalloc_ThreadCache::Allocate):
        (KXMLCore::TCMalloc_ThreadCache::Deallocate):
        (KXMLCore::TCMalloc_ThreadCache::FetchFromCentralCache):
        (KXMLCore::TCMalloc_ThreadCache::ReleaseToCentralCache):
        (KXMLCore::TCMalloc_ThreadCache::Scavenge):
        (KXMLCore::TCMalloc_ThreadCache::GetCache):
        (KXMLCore::TCMalloc_ThreadCache::GetCacheIfPresent):
        (KXMLCore::TCMalloc_ThreadCache::PickNextSample):
        (KXMLCore::TCMalloc_ThreadCache::InitModule):
        (KXMLCore::TCMalloc_ThreadCache::InitTSD):
        (KXMLCore::TCMalloc_ThreadCache::CreateCacheIfNecessary):
        (KXMLCore::TCMalloc_ThreadCache::DeleteCache):
        (KXMLCore::TCMalloc_ThreadCache::RecomputeThreadCacheSize):
        (KXMLCore::TCMalloc_ThreadCache::Print):
        (KXMLCore::ExtractStats):
        (KXMLCore::DumpStats):
        (KXMLCore::PrintStats):
        (KXMLCore::DumpStackTraces):
        (KXMLCore::TCMallocImplementation::GetStats):
        (KXMLCore::TCMallocImplementation::ReadStackTraces):
        (KXMLCore::TCMallocImplementation::GetNumericProperty):
        (KXMLCore::TCMallocImplementation::SetNumericProperty):
        (KXMLCore::DoSampledAllocation):
        (KXMLCore::do_malloc):
        (KXMLCore::do_free):
        (KXMLCore::do_memalign):
        (KXMLCore::TCMallocGuard::TCMallocGuard):
        (KXMLCore::TCMallocGuard::~TCMallocGuard):
        (KXMLCore::malloc):
        (KXMLCore::free):
        (KXMLCore::calloc):
        (KXMLCore::cfree):
        (KXMLCore::realloc):
        (KXMLCore::memalign):
        (KXMLCore::posix_memalign):
        (KXMLCore::valloc):
        (KXMLCore::pvalloc):
        (KXMLCore::malloc_stats):
        (KXMLCore::mallopt):
        (KXMLCore::mallinfo):
        * kxmlcore/FastMalloc.h: Added.
        (KXMLCore::FastAllocated::operator new):
        (KXMLCore::FastAllocated::operator delete):
        (KXMLCore::FastAllocated::operator new[]):
        (KXMLCore::FastAllocated::operator delete[]):
        * kxmlcore/SharedPtr.h: Added.
        (KXMLCore::SharedPtr::SharedPtr):
        (KXMLCore::SharedPtr::~SharedPtr):
        (KXMLCore::SharedPtr::isNull):
        (KXMLCore::SharedPtr::notNull):
        (KXMLCore::SharedPtr::reset):
        (KXMLCore::SharedPtr::get):
        (KXMLCore::SharedPtr::operator*):
        (KXMLCore::SharedPtr::operator->):
        (KXMLCore::SharedPtr::operator!):
        (KXMLCore::SharedPtr::operator bool):
        (KXMLCore::::operator):
        (KXMLCore::operator==):
        (KXMLCore::operator!=):
        (KXMLCore::static_pointer_cast):
        (KXMLCore::const_pointer_cast):
        * kxmlcore/TCPageMap.h: Added.
        (TCMalloc_PageMap1::TCMalloc_PageMap1):
        (TCMalloc_PageMap1::Ensure):
        (TCMalloc_PageMap1::get):
        (TCMalloc_PageMap1::set):
        (TCMalloc_PageMap2::TCMalloc_PageMap2):
        (TCMalloc_PageMap2::get):
        (TCMalloc_PageMap2::set):
        (TCMalloc_PageMap2::Ensure):
        (TCMalloc_PageMap3::NewNode):
        (TCMalloc_PageMap3::TCMalloc_PageMap3):
        (TCMalloc_PageMap3::get):
        (TCMalloc_PageMap3::set):
        (TCMalloc_PageMap3::Ensure):
        * kxmlcore/TCSpinLock.h: Added.
        (TCMalloc_SpinLock::Init):
        (TCMalloc_SpinLock::Finalize):
        (TCMalloc_SpinLock::Lock):
        (TCMalloc_SpinLock::Unlock):
        (TCMalloc_SlowLock):
        (TCMalloc_SpinLockHolder::TCMalloc_SpinLockHolder):
        (TCMalloc_SpinLockHolder::~TCMalloc_SpinLockHolder):
        * kxmlcore/TCSystemAlloc.cpp: Added.
        (TrySbrk):
        (TryMmap):
        (TryDevMem):
        (TCMalloc_SystemAlloc):
        * kxmlcore/TCSystemAlloc.h: Added.

2005-09-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        <rdar://problem/4260479> Finish deploying PropertySlot in the interpreter
        http://bugs.webkit.org/show_bug.cgi?id=5112
        
        Convert postfix, prefix, delete, prefix, and for..in expressions to use
        PropertySlot-based lookup instead of evaluateReference.

        3% speedup on JS iBench.

        Fixed two of the JS tests:
        * tests/mozilla/expected.html:

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (PostfixResolveNode::evaluate):
        (PostfixBracketNode::evaluate):
        (PostfixDotNode::evaluate):
        (DeleteResolveNode::evaluate):
        (DeleteBracketNode::evaluate):
        (DeleteDotNode::evaluate):
        (DeleteValueNode::evaluate):
        (typeStringForValue):
        (TypeOfResolveNode::evaluate):
        (TypeOfValueNode::evaluate):
        (PrefixResolveNode::evaluate):
        (PrefixBracketNode::evaluate):
        (PrefixDotNode::evaluate):
        (ForInNode::execute):
        * kjs/nodes.h:
        (KJS::PostfixResolveNode::PostfixResolveNode):
        (KJS::PostfixBracketNode::PostfixBracketNode):
        (KJS::PostfixDotNode::PostfixDotNode):
        (KJS::DeleteResolveNode::DeleteResolveNode):
        (KJS::DeleteBracketNode::DeleteBracketNode):
        (KJS::DeleteDotNode::DeleteDotNode):
        (KJS::DeleteValueNode::DeleteValueNode):
        (KJS::TypeOfResolveNode::TypeOfResolveNode):
        (KJS::TypeOfValueNode::TypeOfValueNode):
        (KJS::PrefixResolveNode::PrefixResolveNode):
        (KJS::PrefixBracketNode::PrefixBracketNode):
        (KJS::PrefixDotNode::PrefixDotNode):
        * kjs/nodes2string.cpp:
        (PostfixResolveNode::streamTo):
        (PostfixBracketNode::streamTo):
        (PostfixDotNode::streamTo):
        (DeleteResolveNode::streamTo):
        (DeleteBracketNode::streamTo):
        (DeleteDotNode::streamTo):
        (DeleteValueNode::streamTo):
        (TypeOfValueNode::streamTo):
        (TypeOfResolveNode::streamTo):
        (PrefixResolveNode::streamTo):
        (PrefixBracketNode::streamTo):
        (PrefixDotNode::streamTo):
        * kjs/reference.cpp:
        (KJS::Reference::Reference):
        (KJS::Reference::getPropertyName):
        (KJS::Reference::getValue):
        (KJS::Reference::deleteValue):
        * kjs/reference.h:

2005-09-23  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed and landed by Darin.

        - a Windows-specific file

        * os-win32/stdint.h: Added. We plan to remove dependency on the <stdint.h> types,
        and if we do so, we will remove this file.

2005-09-22  Geoffrey Garen  <ggaren@apple.com>

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=5053
        Need to restore int/long changes to simple_number.h
        
        Reviewed by darin and mjs.

        * kjs/simple_number.h: changed enums to indenpendent constants to clarify types
        (KJS::isNegativeZero): changed to static function - no reason to export
        (KJS::SimpleNumber::rightShiftSignExtended): new function for clarity
        (KJS::SimpleNumber::make): specified cast as reinterpret_cast
        (KJS::SimpleNumber::is): changed to use uintptr_t for portability
        (KJS::SimpleNumber::value): changed to use uintptr_t and rightShiftSignExtended
        (KJS::SimpleNumber::fits): inverted tests - probably only a performance win for double
        (KJS::SimpleNumber::integerFits): ditto

2005-09-20  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff and partly by Darin.

        - fixed http://bugs.webkit.org/post_bug.cgi
        (Reduce conflicts in JavaScriptCore grammar)

        This change gets us down from over 200 shift/reduce and 45 reduce/reduce to
        9 shift/reduce and 45 reduce/reduce.

        * kjs/grammar.y:
        * kjs/grammar_types.h: Removed.
        * kjs/lexer.cpp:
        * kjs/nodes.h:
        (KJS::Node::isGroupNode):
        (KJS::Node::isLocation):
        (KJS::Node::isResolveNode):
        (KJS::Node::isBracketAccessorNode):
        (KJS::Node::isDotAccessorNode):
        (KJS::ResolveNode::isLocation):
        (KJS::ResolveNode::isResolveNode):
        (KJS::ResolveNode::identifier):
        (KJS::GroupNode::isGroupNode):
        (KJS::GroupNode::leafNode):
        (KJS::BracketAccessorNode::isLocation):
        (KJS::BracketAccessorNode::isBracketAccessorNode):
        (KJS::BracketAccessorNode::base):
        (KJS::BracketAccessorNode::subscript):
        (KJS::DotAccessorNode::isLocation):
        (KJS::DotAccessorNode::isDotAccessorNode):
        (KJS::DotAccessorNode::base):
        (KJS::DotAccessorNode::identifier):
        (KJS::FuncExprNode::FuncExprNode):
        (KJS::FuncExprNode::identifier):
        (KJS::FuncDeclNode::FuncDeclNode):
        (KJS::FuncDeclNode::execute):

2005-09-20  Geoffrey Garen  <ggaren@apple.com>

        - Oops. The 4263434 change was only appropriate on the branch. Rolling out.
        
        Reviewed by eric.
        
        * kjs/internal.cpp:
        (KJS::InterpreterImp::mark):

2005-09-20  Geoffrey Garen  <ggaren@apple.com>

        - More changes needed to fix <rdar://problem/4214783> 8F29 REGRESSION(Denver/Chardonnay):
          kjs_fast_malloc crash due to lack of locking on multiple threads (seen selecting volumes in
          the installer)
          
        Added InterpreterLocks in some places in the bindings we missed before.
        
        Reviewed by john.

        * bindings/runtime_root.cpp:
        (KJS::Bindings::addNativeReference):
        (KJS::Bindings::removeNativeReference):
        (RootObject::removeAllNativeReferences):
        * bindings/runtime_root.h:
        (KJS::Bindings::RootObject::~RootObject):
        (KJS::Bindings::RootObject::setRootObjectImp):

2005-09-20  Geoffrey Garen  <ggaren@apple.com>

        - Fixed <rdar://problem/4263434> <rdar://problem/4263434> Denver 8F29 Regression:
          KJS::InterpreterImp::mark() crash
          
        Fix by mjs, review by me.

        * kjs/internal.cpp:
        (KJS::InterpreterImp::mark): Added a null check on globExec in case a
        garbage collection occurs inside InterpreterImp::globalInit (called
        from InterpreterImp::InterpreterImp), at which point globExec has not yet been initialized.

2005-09-20  Geoffrey Garen  <ggaren@apple.com>

        - Rolled in fix for http://bugs.webkit.org/show_bug.cgi?id=4892
          Date constructor has problems with months larger than 11

        Test cases added:

        * layout-tests/fast/js/date-big-constructor-expected.txt: Added.
        * layout-tests/fast/js/date-big-constructor.html: Added.

        Reviewed by darin.

        * kjs/date_object.cpp:
        (KJS::fillStructuresUsingDateArgs):
        (KJS::makeTime):

2005-09-19  Geoffrey Garen  <ggaren@apple.com>

        - Fixed http://bugs.webkit.org/show_bug.cgi?id=5028
          9 layout tests fail following the change from long to int
          
        - Rolled out changes to simple_number.h, and added fits(long long) 
          and SimpleNumber::fits(unsigned long long) to the old system.
        
        Reviewed by mjs.

        * kjs/simple_number.h:
        (KJS::SimpleNumber::):
        (KJS::SimpleNumber::value):
        (KJS::SimpleNumber::fits):
        (KJS::SimpleNumber::integerFits):
        (KJS::SimpleNumber::make):

2005-09-14  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.

        - fixed <rdar://problem/4214783> REGRESSION: kjs_fast_malloc crash due to lack of locking on multiple threads (seen selecting volumes in the installer)

        Make sure to lock using the InterpreterLock class in all places that need it
        (including anything that uses the collector, the parser, the protect count hash table,
        and anything that allocates via fast_malloc).

        Also added assertions to ensure that the locking rules are followed for the relevant
        resources.

        * Makefile.am:
        * bindings/NP_jsobject.cpp:
        (identifierFromNPIdentifier):
        (_NPN_Invoke):
        (_NPN_Evaluate):
        (_NPN_GetProperty):
        (_NPN_SetProperty):
        (_NPN_RemoveProperty):
        (_NPN_HasProperty):
        (_NPN_HasMethod):
        (_NPN_SetException):
        * bindings/jni/jni_jsobject.cpp:
        (JSObject::call):
        (JSObject::eval):
        (JSObject::getMember):
        (JSObject::setMember):
        (JSObject::removeMember):
        (JSObject::getSlot):
        (JSObject::setSlot):
        (JSObject::toString):
        (JSObject::convertJObjectToValue):
        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject setValue:forKey:]):
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject removeWebScriptKey:]):
        (-[WebScriptObject stringRepresentation]):
        (-[WebScriptObject webScriptValueAtIndex:]):
        (-[WebScriptObject setWebScriptValueAtIndex:value:]):
        (+[WebScriptObject _convertValueToObjcValue:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
        * bindings/runtime.cpp:
        (Instance::createRuntimeObject):
        * bindings/runtime_root.h:
        * bindings/testbindings.cpp:
        (main):
        * bindings/testbindings.mm:
        (main):
        * kjs/fast_malloc.cpp:
        (KJS::kjs_fast_malloc):
        (KJS::kjs_fast_calloc):
        (KJS::kjs_fast_free):
        (KJS::kjs_fast_realloc):
        * kjs/fast_malloc.h:
        * kjs/identifier.h:
        * kjs/internal.cpp:
        (InterpreterImp::InterpreterImp):
        (InterpreterImp::clear):
        (InterpreterImp::mark):
        (InterpreterImp::checkSyntax):
        (InterpreterImp::evaluate):
        * kjs/internal.h:
        (KJS::InterpreterImp::globalObject):
        * kjs/interpreter.cpp:
        (Interpreter::evaluate):
        * kjs/interpreter.h:
        (KJS::InterpreterLock::InterpreterLock):
        (KJS::InterpreterLock::~InterpreterLock):
        * kjs/nodes.h:
        * kjs/protect.h:
        (KJS::ProtectedValue::ProtectedValue):
        (KJS::ProtectedValue::~ProtectedValue):
        (KJS::ProtectedValue::operator=):
        (KJS::ProtectedObject::ProtectedObject):
        (KJS::ProtectedObject::~ProtectedObject):
        (KJS::ProtectedObject::operator=):
        (KJS::ProtectedReference::ProtectedReference):
        (KJS::ProtectedReference::~ProtectedReference):
        (KJS::ProtectedReference::operator=):
        * kjs/protected_object.h:
        * kjs/protected_values.cpp:
        (KJS::ProtectedValues::getProtectCount):
        (KJS::ProtectedValues::increaseProtectCount):
        (KJS::ProtectedValues::decreaseProtectCount):
        * kjs/string_object.cpp:
        (StringObjectImp::StringObjectImp):
        * kjs/testkjs.cpp:
        (main):

2005-09-16  Adele Peterson  <adele@apple.com>

        Change by Darin, reviewed by me and Maciej.

        Fixes http://bugs.webkit.org/show_bug.cgi?id=4547
        use int instead of long for 32-bit (to prepare for LP64 compiling)

        * bindings/c/c_class.h:
        (KJS::Bindings::CClass::constructorAt):
        (KJS::Bindings::CClass::numConstructors):
        * bindings/c/c_runtime.h:
        (KJS::Bindings::CMethod::numParameters):
        * bindings/jni/jni_class.cpp:
        (JavaClass::JavaClass):
        * bindings/jni/jni_class.h:
        (KJS::Bindings::JavaClass::constructorAt):
        (KJS::Bindings::JavaClass::numConstructors):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_jsobject.cpp:
        (JSObject::convertJObjectToValue):
        (JSObject::listFromJArray):
        * bindings/jni/jni_runtime.cpp:
        (JavaMethod::JavaMethod):
        * bindings/jni/jni_runtime.h:
        (KJS::Bindings::JavaConstructor::_commonCopy):
        (KJS::Bindings::JavaConstructor::parameterAt):
        (KJS::Bindings::JavaConstructor::numParameters):
        (KJS::Bindings::JavaMethod::_commonCopy):
        (KJS::Bindings::JavaMethod::parameterAt):
        (KJS::Bindings::JavaMethod::numParameters):
        * bindings/npapi.h:
        * bindings/objc/WebScriptObject.mm:
        (listFromNSArray):
        * bindings/objc/objc_class.h:
        (KJS::Bindings::ObjcClass::constructorAt):
        (KJS::Bindings::ObjcClass::numConstructors):
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcMethod::numParameters):
        * bindings/runtime.h:
        * kjs/identifier.h:
        * kjs/internal.h:
        * kjs/property_slot.h:
        (KJS::PropertySlot::setCustomIndex):
        (KJS::PropertySlot::index):
        (KJS::PropertySlot::):
        * kjs/regexp_object.cpp:
        (RegExpObjectImp::backrefGetter):
        (RegExpObjectImp::getOwnPropertySlot):
        * kjs/simple_number.h:
        (KJS::SimpleNumber::):
        (KJS::SimpleNumber::value):
        (KJS::SimpleNumber::fits):
        (KJS::SimpleNumber::integerFits):
        (KJS::SimpleNumber::make):
        * kjs/string_object.cpp:
        (substituteBackreferences):
        * kjs/ustring.cpp:
        (KJS::UString::from):
        (KJS::UString::toUInt32):
        (KJS::UString::find):
        (KJS::UString::rfind):
        * kjs/ustring.h:
        * kjs/value.cpp:
        (KJS::jsNumber):
        * kjs/value.h:

2005-09-11  Eric Seidel  <eseidel@apple.com>

        No review requested, build fix affects only SVG.

        * JavaScriptCore.xcodeproj/project.pbxproj: Fixed JSC+SVG
        Fixed JavaScriptCore+SVG after PCRE 6.1 merger.
        http://bugs.webkit.org/show_bug.cgi?id=4932

2005-09-10  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed and landed by Darin.

        * Makefile.vc: Added.
        * README-Win32.txt: Added.

2005-09-10  Darin Adler  <darin@apple.com>

        - fixed compilation for WebCore (another try)

        * kjs/simple_number.h: Added more "using" lines.

2005-09-10  Darin Adler  <darin@apple.com>

        - fixed compilation for WebCore

        * kjs/simple_number.h: Have to include <cmath> here to work around a bug in the GCC
        standard C++ library headers.

2005-09-10  Darin Adler  <darin@apple.com>

        Windows changes by Krzysztof Kowalczyk <kkowalczyk@gmail.com>.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4870
          win portability: fix IS_NEGATIVE_ZERO macro in simple_number.h

        * kjs/simple_number.h:
        (KJS::isNegativeZero): Added. Inline function. Has a case for Windows that
        uses _fpclass and a case for other platforms that uses signbit.
        (KJS::SimpleNumber::fits): Use inline isNegativeZero instead of macro IS_NEGATIVE_ZERO.

        * kjs/internal.cpp: Remove definition of now-unneeded negZero global.

        * kjs/value.cpp: Touched the file because Xcode didn't know it needed to
        recompile it.

        - improved test engine

        * tests/mozilla/jsDriver.pl: Sort tests in numeric order instead of using
        a plain-ASCII sort; now test 33 will be after test 5 in any given set of
        numbered tests.

2005-09-08  Darin Adler  <darin@apple.com>

        - fixed overloaded versions of throwError so that they substitute *all* 
          expected parameters into the message string -- some versions used to
          skip parameters, resulting in "%s" being printed in the error message.
        
        Reviewed by Geoff.

        * kjs/nodes.h: Updated declarations to use "const &" and not to name parameters
        * kjs/nodes.cpp: (Node::throwError): Updated to match above and add one missing
        call to substitute.

2005-09-08  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - updated to PCRE 6.1

        The original PCRE 6.1 sources are checked into the tree with the tag
        "pcre-6-1" for reference. What we're checking in right now is the original
        plus our changes to make it support UTF-16 and at least one other tweak
        (vertical tab considered whitespace). Our work to get our changes was
        done on "pcre-6-1-branch", with an anchor at "pcre-6-1-anchor" so you can
        see the evolution of the UTF-16 changes.
        
        Note also that there was one small change made here that's not on the branch
        in pcre_compile.c.

        * Info.plist: Updated the part of the copyright message that's about PCRE.

        * JavaScriptCore.xcodeproj/project.pbxproj: Added new PCRE source files,
        removed obsolete ones.

        * pcre/AUTHORS: Updated to PCRE 6.1. Includes credits for Apple's UTF-16
        changes, but not the credits for Google's C++ wrapper, since we don't include that.
        * pcre/COPYING: Updated to PCRE 6.1.
        * pcre/LICENCE: Ditto.
        * pcre/dftables.c: Ditto.
        * pcre/pcre-config.h: Ditto.
        * pcre/pcre.h: Ditto.

        * pcre/pcre_compile.c: Added for PCRE 6.1.
        * pcre/pcre_config.c: Ditto.
        * pcre/pcre_exec.c: Ditto.
        * pcre/pcre_fullinfo.c: Ditto.
        * pcre/pcre_get.c: Ditto.
        * pcre/pcre_globals.c: Ditto.
        * pcre/pcre_info.c: Ditto.
        * pcre/pcre_internal.h: Ditto.
        * pcre/pcre_maketables.c: Ditto.
        * pcre/pcre_ord2utf8.c: Ditto.
        * pcre/pcre_printint.c: Ditto.
        * pcre/pcre_refcount.c: Ditto.
        * pcre/pcre_study.c: Ditto.
        * pcre/pcre_tables.c: Ditto.
        * pcre/pcre_try_flipped.c: Ditto.
        * pcre/pcre_ucp_findchar.c: Ditto.
        * pcre/pcre_version.c: Ditto.
        * pcre/pcre_xclass.c: Ditto.
        * pcre/ucp.h: Ditto.
        * pcre/ucp_findchar.c: Ditto.
        * pcre/ucpinternal.h: Ditto.
        * pcre/ucptable.c: Ditto.

        * pcre/get.c: Removed.
        * pcre/internal.h: Removed.
        * pcre/maketables.c: Removed.
        * pcre/pcre.c: Removed.
        * pcre/study.c: Removed.

2005-09-07  Geoffrey Garen  <ggaren@apple.com>

        -fixed http://bugs.webkit.org/show_bug.cgi?id=4781
        Date.setMonth fails with big values due to overflow

        Reviewed by darin.

        * kjs/date_object.cpp:
        (timetUsingCF): for consistency, changed return statement to invalidDate instead of LONG_MAX
        (KJS::fillStructuresUsingTimeArgs): modified for readability
        (KJS::fillStructuresUsingDateArgs): new function analogous to fillStructuresUsingTimeArgs
        (KJS::DateProtoFuncImp::callAsFunction): modified to use fillStructuresUsingDateArgs
        (KJS::DateObjectImp::construct): moved variable declaration to proper scope
        (KJS::DateObjectFuncImp::callAsFunction): moved variable declaration to proper scope

2005-09-07  Geoffrey Garen  <ggaren@apple.com>
        -updated expected test results to reflect fix for 
        http://bugs.webkit.org/show_bug.cgi?id=4698
        kjs does not allow named functions in function expressions
 
        * tests/mozilla/expected.html:

2005-09-04  Darin Adler  <darin@apple.com>

        * kjs/identifier.cpp: Fix comment, add missing include.
        (Follow-on to changes from yesterday.)

2005-09-03  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed, tweaked and landed by Darin.

        - another try at some of the Windows compilation fixes
          should fix these bugs: 4546, 4831, 4834, 4643, 4830, 4832, 4833, 4835

        * kjs/collector.cpp: Add missing <setjmp.h> include.
        * kjs/date_object.cpp: Fix broken copysign macro.
        * kjs/dtoa.cpp: Move macro definitions down after all header includes.
        * kjs/fast_malloc.cpp: Add missing <assert.h> and <stddef.h> includes.
        * kjs/function.cpp: Remove broken isxdigit definition.
        * kjs/grammar.y: Add a missing semicolon (and remove an excess one).
        * kjs/identifier.cpp: Turn off AVOID_STATIC_CONSTRUCTORS because the placement new syntax
        doesn't seem to work in Visual C++ (I'm surprised to hear that, by the way).
        * kjs/value.h: Made ValueImp's destructor virtual because otherwise pointers to ValueImp
        on the stack aren't right for garbage collection on Windows (don't think it works that
        way with gcc's virtual table scheme, but it's a harmless change).

2005-09-03  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>

        Reviewed, tweaked and landed by Darin.

        - some Windows compilation fixes, hoping to fix the problems reported in these bugs:
          4627, 4629, 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4639, 4640, 4641, 4644, 4645

        * kjs/collector.cpp: Include <windows.h> on WIN32. Put thread-related code inside
        KJS_MULTIPLE_THREADS #if directives.
        (KJS::Collector::markCurrentThreadConservatively): Use NT_TIB to find the stack base on Win32.

        * kjs/config.h: Define HAVE_SYS_TIMEB_H for Win32.

        * kjs/date_object.cpp: Add include of <limits.h>. Add definitions of strncasecmp, isfinite, and
        copysign for Win32.
        (KJS::KRFCDate_parseDate): Move "errno = 0" line down closer to the first call to strol -- I believe
        that on Win32 there's some other call before that setting errno.

        * kjs/date_object.h: Remove unneeded include of <sys/time.h>.

        * kjs/dtoa.cpp: Add an undef of strtod, needed on Win32.

        * kjs/fast_malloc.cpp: Put #if !WIN32 around some customization that's not appropriate on Win32.
        (KJS::region_list_append): Add a missing cast so this Win32-specific function compiles in C++.
        (KJS::sbrk): Change parameter type to match the declaration.

        * kjs/function.cpp: (isxdigit): Define a locale-independent isxdigit on Win32.

        * kjs/function.h: Remove unneeded friend class Function for FunctionImp.

        * kjs/identifier.cpp: Took out the APPLE_CHANGES from around the AVOID_STATIC_CONSTRUCTORS
        define. We ultimately intend to phase out APPLE_CHANGES entirely. Also fix the
        non-AVOID_STATIC_CONSTRUCTORS code path.

        * kjs/internal.cpp: Remove uneeded include of <strings.h>, which was confused with <string.h>!
        Add a Win32 implementation of copysign. Put the threads code inside KJS_MULTIPLE_THREADS.

        * kjs/internal.h: Define a KJS_MULTIPLE_THREADS macro on non-Win32 only. Later we can make this
        specific to Mac OS X if we like.

        * kjs/interpreter_map.cpp: Add missing include of <stdlib.h>.

        * kjs/list.cpp:
        (KJS::ListImp::markValues): Use std::min instead of MIN.
        (KJS::List::copy): Ditto.
        (KJS::List::copyTail): Ditto.

        * kjs/math_object.cpp: (signbit): Add a Win32 implementation of signbit.

        * kjs/nodes.cpp: (Node::finalCheck): Use unsigned instead of uint.
        Put the use of always_inline inside __GNUC__.

        * kjs/number_object.cpp: (NumberProtoFuncImp::callAsFunction): Use "10.0" instead of "10"
        inside all the calls to pow to avoid ambiguity caused by overloading of pow on Win32, seen
        when passing an int rather than a double or float.

        * kjs/operations.cpp:
        (KJS::isInf): Add Win32 implementation.
        (KJS::isPosInf): Add Win32 implementation.
        (KJS::isNegInf): Add Win32 implementation.

        * kjs/regexp.cpp: Use unsigned instead of uint.
        * kjs/regexp.h: Ditto.
        * kjs/regexp_object.cpp: Ditto.
        * kjs/regexp_object.h: Ditto.

2005-09-02  Beth Dakin  <bdakin@apple.com>

        Fix for <rdar://problem/4235531> Denver Regression: Safari crash in KWQStringData::makeUnicode
        The other half of the fix is in WebCore.

        Fix written by Maciej and Darin.
        Reviewed by me/Maciej

        As Maciej said in Radar: These problems was caused by a conflict between some of our custom 
        allocators, causing them to return null. Symptom is typically a null pointer dereference in 
        a place where it might be expected an allocation has just occurred.

        * kjs/fast_malloc.cpp: Added #define for MORECORE_CONTIGUOUS, MORECORE_CANNOT_TRIM, 
                               and MALLOC_FAILURE_ACTION.

2005-08-31  Geoffrey Garen  <ggaren@apple.com>

        -rolled in fix for http://bugs.webkit.org/show_bug.cgi?id=4698
        kjs does not allow named functions in function expressions
        
        Fix by Arthur Langereis.
        
        Reviewed by darin.
        
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (FuncExprNode::evaluate):
        * kjs/nodes.h:
        (KJS::FuncExprNode::FuncExprNode):

        Test cases added:

        * layout-tests/fast/js/named-function-expression-expected.txt: Added.
        * layout-tests/fast/js/named-function-expression.html: Added.
        
2005-08-31  Justin Haygood  <justin@xiondigital.net>

        Reviewed, tweaked, and landed by Darin.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4085
        - fixed http://bugs.webkit.org/show_bug.cgi?id=4087
        - fixed http://bugs.webkit.org/show_bug.cgi?id=4096
          Some fixes for compiling on windows.

        * kjs/config.h: Added a WIN32 case in here, with suitable defines.
        (To be tweaked as necessary.)
        * kjs/function.cpp: Took out APPLE_CHANGES around use of ICU.
        * kjs/operations.cpp: Removed some bogus code that always set HAVE_FLOAT_H.

2005-08-30  Darin Adler  <darin@apple.com>

        Reviewed by John Sullivan.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4758
          unify SharedPtr in WebCore and JavaScriptCore

        * kjs/shared_ptr.h: Updated namespace to KXMLCore instead of kxhmlcore.
        Made a few small improvements to use local variables a bit more and added
        an "operator int" to reduce the chance that we'll convert a SharedPtr to
        an int by accident. Also made the == operators normal functions rather than
        friend functions, added a couple of comemnts.

        * kjs/function.h: Updated for namespace change.
        * kjs/function.cpp: Ditto.
        * kjs/function_object.cpp: Ditto.
        * kjs/internal.h: Ditto.
        * kjs/internal.cpp: Ditto.
        * kjs/nodes.h: Ditto.
        * kjs/nodes2string.cpp: Ditto.

2005-08-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        <rdar://problem/4224911> many many leaks in kjsyyparse with malformed Javascript        

        Record all nodes that are created during parsing, and delete any
        that are left floating with a refcount of 0.
        
        * kjs/internal.cpp:
        (KJS::Parser::saveNewNode):
        (KJS::clearNewNodes):
        (KJS::Parser::parse):
        * kjs/internal.h:
        * kjs/nodes.cpp:
        (Node::Node):
        * kjs/nodes.h:
        (KJS::Node::refcount):

2005-08-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        - fixed <rdar://problem/4232452> many many leaks in kjsyyparse on some well-formed JavaScript (can repro on sony.com, webkit tests)
        
        Fixed by changing the refcounting scheme for nodes. Instead of each node implementing a custom ref and
        deref for all its children (and being responsible for deleting them), nodes use a smart pointer to
        hold their children, and smart pointers are used outside the node tree as well. This change mostly
        removes code.
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/function.cpp:
        (KJS::DeclaredFunctionImp::DeclaredFunctionImp):
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/function.h:
        * kjs/function_object.cpp:
        (FunctionObjectImp::construct):
        * kjs/grammar.y:
        * kjs/internal.cpp:
        (KJS::Parser::parse):
        (KJS::Parser::accept):
        (KJS::InterpreterImp::checkSyntax):
        (KJS::InterpreterImp::evaluate):
        * kjs/internal.h:
        * kjs/nodes.cpp:
        (Node::Node):
        (Node::~Node):
        (ElementNode::evaluate):
        (PropertyValueNode::evaluate):
        (ArgumentListNode::evaluateList):
        (NewExprNode::evaluate):
        (FunctionCallValueNode::evaluate):
        (FunctionCallBracketNode::evaluate):
        (FunctionCallDotNode::evaluate):
        (RelationalNode::evaluate):
        (StatListNode::execute):
        (StatListNode::processVarDecls):
        (VarDeclListNode::evaluate):
        (VarDeclListNode::processVarDecls):
        (ForInNode::ForInNode):
        (ClauseListNode::processVarDecls):
        (CaseBlockNode::evalBlock):
        (FuncDeclNode::processFuncDecl):
        (FuncExprNode::evaluate):
        (SourceElementsNode::execute):
        (SourceElementsNode::processFuncDecl):
        (SourceElementsNode::processVarDecls):
        * kjs/nodes.h:
        (KJS::Node::ref):
        (KJS::Node::deref):
        (KJS::NumberNode::NumberNode):
        (KJS::GroupNode::GroupNode):
        (KJS::ElementNode::ElementNode):
        (KJS::ArrayNode::ArrayNode):
        (KJS::PropertyValueNode::PropertyValueNode):
        (KJS::ObjectLiteralNode::ObjectLiteralNode):
        (KJS::BracketAccessorNode::BracketAccessorNode):
        (KJS::DotAccessorNode::DotAccessorNode):
        (KJS::ArgumentListNode::ArgumentListNode):
        (KJS::ArgumentsNode::ArgumentsNode):
        (KJS::NewExprNode::NewExprNode):
        (KJS::FunctionCallValueNode::FunctionCallValueNode):
        (KJS::FunctionCallResolveNode::FunctionCallResolveNode):
        (KJS::FunctionCallBracketNode::FunctionCallBracketNode):
        (KJS::FunctionCallDotNode::FunctionCallDotNode):
        (KJS::PostfixNode::PostfixNode):
        (KJS::DeleteNode::DeleteNode):
        (KJS::VoidNode::VoidNode):
        (KJS::TypeOfNode::TypeOfNode):
        (KJS::PrefixNode::PrefixNode):
        (KJS::UnaryPlusNode::UnaryPlusNode):
        (KJS::NegateNode::NegateNode):
        (KJS::BitwiseNotNode::BitwiseNotNode):
        (KJS::LogicalNotNode::LogicalNotNode):
        (KJS::MultNode::MultNode):
        (KJS::AddNode::AddNode):
        (KJS::ShiftNode::ShiftNode):
        (KJS::RelationalNode::RelationalNode):
        (KJS::EqualNode::EqualNode):
        (KJS::BitOperNode::BitOperNode):
        (KJS::BinaryLogicalNode::BinaryLogicalNode):
        (KJS::ConditionalNode::ConditionalNode):
        (KJS::AssignResolveNode::AssignResolveNode):
        (KJS::AssignBracketNode::AssignBracketNode):
        (KJS::AssignDotNode::AssignDotNode):
        (KJS::CommaNode::CommaNode):
        (KJS::AssignExprNode::AssignExprNode):
        (KJS::VarDeclListNode::VarDeclListNode):
        (KJS::VarStatementNode::VarStatementNode):
        (KJS::ExprStatementNode::ExprStatementNode):
        (KJS::IfNode::IfNode):
        (KJS::DoWhileNode::DoWhileNode):
        (KJS::WhileNode::WhileNode):
        (KJS::ForNode::ForNode):
        (KJS::ReturnNode::ReturnNode):
        (KJS::WithNode::WithNode):
        (KJS::CaseClauseNode::CaseClauseNode):
        (KJS::ClauseListNode::ClauseListNode):
        (KJS::ClauseListNode::clause):
        (KJS::ClauseListNode::next):
        (KJS::SwitchNode::SwitchNode):
        (KJS::LabelNode::LabelNode):
        (KJS::ThrowNode::ThrowNode):
        (KJS::CatchNode::CatchNode):
        (KJS::FinallyNode::FinallyNode):
        (KJS::TryNode::TryNode):
        (KJS::ParameterNode::ParameterNode):
        (KJS::ParameterNode::nextParam):
        (KJS::FuncDeclNode::FuncDeclNode):
        (KJS::FuncExprNode::FuncExprNode):
        * kjs/nodes2string.cpp:
        (KJS::SourceStream::operator<<):
        (ElementNode::streamTo):
        (PropertyValueNode::streamTo):
        (ArgumentListNode::streamTo):
        (StatListNode::streamTo):
        (VarDeclListNode::streamTo):
        (CaseBlockNode::streamTo):
        (ParameterNode::streamTo):
        (SourceElementsNode::streamTo):
        * kjs/shared_ptr.h: Added.
        (kxmlcore::SharedPtr::SharedPtr):
        (kxmlcore::SharedPtr::~SharedPtr):
        (kxmlcore::SharedPtr::isNull):
        (kxmlcore::SharedPtr::notNull):
        (kxmlcore::SharedPtr::reset):
        (kxmlcore::SharedPtr::get):
        (kxmlcore::SharedPtr::operator*):
        (kxmlcore::SharedPtr::operator->):
        (kxmlcore::SharedPtr::operator!):
        (kxmlcore::SharedPtr::operator bool):
        (kxmlcore::SharedPtr::operator==):
        (kxmlcore::::operator):
        (kxmlcore::operator!=):
        (kxmlcore::static_pointer_cast):
        (kxmlcore::const_pointer_cast):

2005-08-26  Geoff Garen  <ggaren@apple.com>

        Reviewed by John.
        Landed by Darin.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4664
          TOT Crash from backwards null check in WebScriptObject.mm

        * bindings/objc/WebScriptObject.mm:
        (+[WebScriptObject _convertValueToObjcValue:originExecutionContext:executionContext:]):
        Remove bogus !.

2005-08-25  Darin Adler  <darin@apple.com>

        Reviewed by John Sullivan.

        - rename KJS::UString::string() to KJS::UString::domString()
        - rename KJS::Identifier::string() to KJS::Identifier::domString()

        * kjs/identifier.h: Renamed.
        * kjs/ustring.h: Ditto.

2005-08-19  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4435
          speed up JavaScript by tweaking the Identifier class

        * kjs/identifier.h: Add a new global nullIdentifier and make Identifier::null a function
        that returns it.
        * kjs/identifier.cpp: (KJS::Identifier::init): Initialize a global for the null identifier
        as well as all the other globals for special identifiers.

        * kjs/ustring.h: (KJS::UString::UString): Make this empty constructor inline.
        * kjs/ustring.cpp: Remove the old non-inline version.

2005-08-19  Mitz Pettel  <opendarwin.org@mitzpettel.com>

        Reviewed by Maciej.
        Revised and landed by Darin.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4474
          REGRESSION: Crash when using in-place operator on uninitialized array element

        * kjs/nodes.cpp:
        (AssignResolveNode::evaluate): Remove unneeded "isSet" assertion.
        (AssignBracketNode::evaluate): Replace code that tested "isSet" with code that
        tests the return value of getPropertySlot.

        * kjs/property_slot.h: Removed unneeded "isSet" function. Property slots are
        either uninitialized or set. There's no "initialized and not set" state.

2005-08-18  Adele Peterson  <adele@apple.com>

        Checked "Inline Functions Hidden" box

        * JavaScriptCore.xcodeproj/project.pbxproj:

2005-08-16  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fixed crash in one of the JavaScript tests (introduced by my throwError change)

        * kjs/nodes.cpp: (Node::setExceptionDetailsIfNeeded): Check if the exception is an
        object before setting the file and line number properties on it. Something to think
        about in the future -- do we really want to do this on any object that's thrown?
        How about limiting it to error objects that were created by the JavaScript engine?

        - changed kjs_fast_malloc so we don't have two conflicting versions of the same function

        * kjs/fast_malloc.h: Took out all the ifdefs from this header.
        * kjs/fast_malloc.cpp: Added non-NDEBUG versions of the functions that just call
        the system malloc, and put the NDEBUG versions in an #else.

2005-08-16  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - clean up exported symbols that are not in a "KJS" namespace

        * bindings/NP_jsobject.cpp: (identiferFromNPIdentifier): Marked this function static
        so it no longer has external linkage.
        * bindings/c/c_utility.h: Put all this stuff inside the KJS namespace.
        * bindings/c/c_utility.cpp: Also marked some globals static so they don't have external
        linkage; not as important given the namespace.
        * bindings/npruntime.cpp: Marked functions static so they no longer have internal linkage.
        Also removed unused _NPN_SetExceptionWithUTF8 function (not in header, had C++ linkage!).

        * bindings/jni/jni_utility.cpp: (KJS::Bindings::getJavaVM): Call KJS_GetCreatedJavaVMs
        using the soft linking header, instead of calling the JNI call. This allows processes
        to link both JavaScriptCore and JavaVM without a symbol conflict.
        * bindings/softlinking.c:
        (loadFramework): Marked this function static so it no longer has external linkage.
        (getFunctionPointer): Ditto.
        (KJS_GetCreatedJavaVMs): Renamed this so it has a KJS prefix.

        * JavaScriptCore.xcodeproj/project.pbxproj: Added softlinking.h.
        * bindings/softlinking.h: Added.

        * kjs/nodes2string.cpp: (streamAssignmentOperatorTo): Marked this function static so it
        no longer has external linkage.

2005-08-15  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4437
          clean up error creation with new throwError function

        * bindings/NP_jsobject.cpp:
        (_NPN_SetException):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_runtime.cpp:
        (JavaField::dispatchValueFromInstance):
        (JavaField::dispatchSetValueToInstance):
        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject _initializeWithObjectImp:originExecutionContext:executionContext:]):
        (-[WebScriptObject _initWithObjectImp:originExecutionContext:executionContext:]):
        (+[WebScriptObject throwException:]):
        (-[WebScriptObject setException:]):
        (+[WebScriptObject _convertValueToObjcValue:originExecutionContext:executionContext:]):
        * bindings/objc/objc_class.h:
        (KJS::Bindings::ObjcClass::~ObjcClass):
        (KJS::Bindings::ObjcClass::ObjcClass):
        (KJS::Bindings::ObjcClass::operator=):
        (KJS::Bindings::ObjcClass::constructorAt):
        (KJS::Bindings::ObjcClass::numConstructors):
        * bindings/objc/objc_header.h:
        * bindings/objc/objc_runtime.h:
        (KJS::Bindings::ObjcField::~ObjcField):
        (KJS::Bindings::ObjcField::ObjcField):
        (KJS::Bindings::ObjcField::operator=):
        (KJS::Bindings::ObjcMethod::ObjcMethod):
        (KJS::Bindings::ObjcMethod::~ObjcMethod):
        (KJS::Bindings::ObjcMethod::operator=):
        * bindings/objc/objc_runtime.mm:
        (ObjcField::valueFromInstance):
        (ObjcField::setValueToInstance):
        (ObjcArray::setValueAt):
        (ObjcArray::valueAt):
        * bindings/objc/objc_utility.h:
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::JSMethodNameToObjCMethodName):
        (KJS::Bindings::convertValueToObjcValue):
        (KJS::Bindings::convertNSStringToString):
        (KJS::Bindings::convertObjcValueToValue):
        (KJS::Bindings::objcValueTypeForType):
        (KJS::Bindings::createObjcInstanceForValue):
        (KJS::Bindings::throwError):
        * bindings/runtime.h:
        (KJS::Bindings::Parameter::~Parameter):
        (KJS::Bindings::Method::~Method):
        (KJS::Bindings::Instance::Instance):
        (KJS::Bindings::Instance::begin):
        (KJS::Bindings::Instance::end):
        (KJS::Bindings::Instance::getValueOfUndefinedField):
        (KJS::Bindings::Instance::supportsSetValueOfUndefinedField):
        (KJS::Bindings::Instance::setValueOfUndefinedField):
        (KJS::Bindings::Instance::valueOf):
        * bindings/runtime_array.cpp:
        (RuntimeArrayImp::put):
        * bindings/runtime_object.h:
        (KJS::RuntimeObjectImp::setInternalInstance):
        (KJS::RuntimeObjectImp::getInternalInstance):
        * kjs/array_object.cpp:
        (getProperty):
        (ArrayProtoFuncImp::callAsFunction):
        (ArrayObjectImp::construct):
        * kjs/bool_object.cpp:
        (BooleanProtoFuncImp::callAsFunction):
        * kjs/date_object.cpp:
        (KJS::DateProtoFuncImp::callAsFunction):
        * kjs/function.cpp:
        (KJS::decode):
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/function_object.cpp:
        (FunctionProtoFuncImp::callAsFunction):
        (FunctionObjectImp::construct):
        * kjs/internal.cpp:
        (KJS::UndefinedImp::toObject):
        (KJS::NullImp::toObject):
        (KJS::InterpreterImp::evaluate):
        (KJS::InternalFunctionImp::hasInstance):
        * kjs/nodes.cpp:
        (Node::throwError):
        (substitute):
        (Node::setExceptionDetailsIfNeeded):
        (undefinedVariableError):
        (ProgramNode::ProgramNode):
        * kjs/number_object.cpp:
        (NumberProtoFuncImp::callAsFunction):
        * kjs/object.cpp:
        (KJS::ObjectImp::call):
        (KJS::ObjectImp::defaultValue):
        (KJS::Error::create):
        (KJS::throwError):
        * kjs/object.h:
        (KJS::ObjectImp::clearProperties):
        (KJS::ObjectImp::getPropertySlot):
        (KJS::ObjectImp::getOwnPropertySlot):
        * kjs/object_object.cpp:
        (ObjectProtoFuncImp::callAsFunction):
        * kjs/reference.cpp:
        (KJS::Reference::getBase):
        (KJS::Reference::getValue):
        (KJS::Reference::putValue):
        (KJS::Reference::deleteValue):
        * kjs/regexp_object.cpp:
        (RegExpProtoFuncImp::callAsFunction):
        (RegExpObjectImp::construct):
        * kjs/string_object.cpp:
        (StringProtoFuncImp::callAsFunction):

2005-08-15  Anders Carlsson  <andersca@mac.com>

        Reviewed by Darin.

        * tests/mozilla/ecma_3/Date/15.9.5.5.js:
        Remove the code which tests that Date.toLocaleString should be parsable
        by Date.parse. That is not true according to the spec.

2005-08-15  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        * kjs/collector.cpp: (KJS::Collector::allocate): Use a local instead of a global in one
        more place; slight speedup.

2005-08-14  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed crash observed on one of the Apple-only layout tests

        * kjs/property_map.cpp: (KJS::PropertyMap::mark): Change code to understand that deleted
        entries have a value of NULL, so the deleted sentinel count doesn't need to be included
        in the count of things to mark since we're ignoring the keys.

2005-08-14  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4421
          speed up JavaScript by inlining some label stack functions

        * kjs/internal.h: Removed the copy constructor and assignment operator for LabelStack.
        They were unused, and the implementations had bugs; I removed them rather than fixing them.
        Also removed the clear function, since that was only needed to help the assignment operator
        share code with the destructor, and was not efficient enough for the destructor.
        (KJS::LabelStack::~LabelStack): Made this inline. Also used an efficient implementation
        that's nice and fast when the stack is empty, better than the old clear() function which
        used to keep updating and refetching "tos" each time through the loop.
        (KJS::LabelStack::pop): Made this inline.

        * kjs/internal.cpp: Deleted the now-inline functions and the obsolete functions. Also
        deleted a commented-out line of code.

2005-08-14  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4419
          speed up JavaScript by improving KJS::List

        my measurements show an improvement of 1% on iBench JavaScript

        * kjs/list.cpp: Rearrange list to make the values and free list share the same storage,
        which saves 4 bytes per list. Also remove the pointers used only on the heap from the
        lists that are in the pool, which saves 8 bytes per list. Moving the free list pointer
        closer to the start of the list object also speeds up access to the free list. New
        "HeapListImp" struct is used only for the lists on the heap.
        (KJS::List::markProtectedLists): Shadowed global variable in local and updated for the
        new terminology ("heap" instead of "outside pool").
        (KJS::allocateListImp): Updated for new terminology.
        (KJS::List::release): Moved the code from deallocateListImp in here -- it wasn't being
        inlined and didn't need to be in a separate function.

2005-08-14  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4417
          speed up JavaScript with some small changes to the property map code

        my measurements show an improvement of 2% on iBench JavaScript

        * kjs/property_map.h: (KJS::PropertyMap::PropertyMap): Made the default constructor inline.
        * kjs/property_map.cpp:
        (KJS::PropertyMap::~PropertyMap): Changed loop to exit early once we know we've processed
        all the hash table entries, based on the count.
        (KJS::PropertyMap::mark): Ditto.

        * kjs/object.h: Made an arbitrary change here to force recompiling so we pick up changes to
        property_map.h. Works around what seems to be an Xcode header dependency bug.

2005-08-14  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4416
          speed up JavaScript with some improvements to the garbage collector

        my measurements show an improvement of 2% on iBench JavaScript

        * kjs/collector.cpp:
        (KJS::Collector::allocate): Use local variables to shadow globals instead of repeatedly
        going at global variables. Tighten up loop implementations to make the common case fast.
        (KJS::Collector::markStackObjectsConservatively): Use local variables to shadow globals.
        Used a goto to eliminate a boolean since it was showing up in the profile.
        (KJS::Collector::markProtectedObjects): Iterate through the table using pointer rather
        than an index since the profile showed that generating better code.
        (KJS::Collector::collect): Added a special case for blocks where all cells are used,
        Use local variables to shadow globals. Eliminated a boolean by computing it another
        way (checking to see if the number of live objects changed). Also used local variables
        to shadow fields in the current cell when sweeping.
        (KJS::Collector::numReferencedObjects): Use AllocatedValueImp instead of ValueImp
        in one place -- means we get faster versions of various functions that don't worry
        about SimpleNumber.
        (KJS::className): Ditto.
        (KJS::Collector::rootObjectClasses): Ditto.

2005-08-14  Darin Adler  <darin@apple.com>

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4344
          REGRESSION: JavaScript crash when going back from viewing a thread (NULL protoype)

        * kjs/error_object.cpp: (NativeErrorImp::NativeErrorImp): Set proto in a more
        straightforward way. The old code set the proto to 0 and then to the correct value.
        This showed up as a "false positive" when searching for places that set prototype
        to NULL/0 so I fixed it.

        * kjs/function_object.cpp: (FunctionPrototypeImp::FunctionPrototypeImp): Change to
        not pass an explicit "0" to the base class (InternalFunctionImp) constructor.

        * kjs/internal.h: Added a default constructor for InternalFunctionImp.
        * kjs/internal.cpp: (KJS::InternalFunctionImp::InternalFunctionImp): Added the
        default constructor (empty body, just calls base class's default constructor).

        * kjs/object.h:
        (KJS::ObjectImp::ObjectImp): Add an assertion to catch NULL prototypes earlier
        in Development builds.
        (KJS::ObjectImp::setPrototype): Ditto.

2005-08-12  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        - two simple speed improvements for a 3% speed gain
        
        * JavaScriptCore.xcodeproj/project.pbxproj: turn on -fstrict-aliasing

        * kjs/scope_chain.h:
        (KJS::ScopeChainIterator::ScopeChainIterator): Add a scope chain iterator
        so you can walk a scope chain without having to make a copy that you then mutate.
        (KJS::ScopeChainIterator::operator*): standard iterator operation
        (KJS::ScopeChainIterator::operator->): ditto
        (KJS::ScopeChainIterator::operator++): ditto
        (KJS::ScopeChainIterator::operator==): ditto
        (KJS::ScopeChainIterator::operator!=): ditto
        (KJS::ScopeChain::begin): Iterator for the top of the scope chain
        (KJS::ScopeChain::end): Iterator for one past the bottom (i.e. null)
        * kjs/nodes.cpp:
        (ResolveNode::evaluate): Use scope chain iterator instead of copying
        a scope chain and then modifying the copy
        (ResolveNode::evaluateReference): ditto
        (FunctionCallResolveNode::evaluate): ditto
        (AssignResolveNode::evaluate): ditto

2005-08-12  Maciej Stachowiak  <mjs@apple.com>

        Patch from Anders Carlsson, reviewed by me.

        * kjs/nodes.h: Fix build breakage.

2005-08-12  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by hyatt.

        - refactor function calls, 3% speedup on JS iBench.

        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (Node::throwError): Added new useful variants.
        (FunctionCallValueNode::evaluate): New node to handle calls on expressions
        that are strictly values, not references.
        (FunctionCallValueNode::ref):  ditto
        (FunctionCallValueNode::deref): ditto
        (FunctionCallResolveNode::evaluate): New node to handle calls on identifier
        expressions, so that they are looked up in the scope chain.
        (FunctionCallResolveNode::ref): ditto
        (FunctionCallResolveNode::deref): ditto
        (FunctionCallBracketNode::evaluate): New node to handle calls on bracket
        dereferences, so that the expression before brackets is used as the this
        object.
        (FunctionCallBracketNode::ref): ditto
        (FunctionCallBracketNode::deref): ditto
        (FunctionCallDotNode::evaluate): New node to handle calls on dot
        dereferences, so that the expression before the dot is used as the this
        object.
        (FunctionCallDotNode::ref): ditto
        (FunctionCallDotNode::deref): ditto
        (dotExprNotAnObjectString): helper function to avoid global variable access.
        (dotExprDoesNotAllowCallsString): ditto
        * kjs/nodes.h: Declared new classes.
        * kjs/nodes2string.cpp:
        (FunctionCallValueNode::streamTo): Added - serializes the appropriate function call
        (FunctionCallResolveNode::streamTo): ditto
        (FunctionCallBracketNode::streamTo): ditto
        (FunctionCallParenBracketNode::streamTo): ditto
        (FunctionCallDotNode::streamTo): ditto
        (FunctionCallParenDotNode::streamTo): ditto
        * kjs/object.h:
        (KJS::ObjectImp::isActivation): Change how activation objects are
        detected in the scope chain, a virtual function is cheaper than the
        old inheritance test.
        * kjs/function.h:
        (KJS::ActivationImp::isActivation): Ditto.

2005-08-11  Maciej Stachowiak  <mjs@apple.com>

        - added missing file from earlier checkin

        * kjs/grammar_types.h: Added.
        (KJS::makeNodePair):
        (KJS::makeNodeWithIdent):

2005-08-11  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.

        * kjs/date_object.cpp:
        (timetUsingCF): Fix one of the date tests my making the CF version of mktime
        have the same quirk about the DST field as the real mktime.
        * tests/mozilla/expected.html: Updated for newly fixed test.

2005-08-11  Maciej Stachowiak  <mjs@apple.com>

        - updated for one of the tests that Darin incidentally fixed.

        * tests/mozilla/expected.html:

2005-08-10  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.

        Refactor assignment grammar to avoid Reference type, and to later
        be able to take advantage of writeable PropertySlots, when those
        are added. I also fixed a minor bug, turning a function to a
        string lost parentheses, I made sure they are printed at least
        where semantically significant.
        
        Test cases: see WebCore
        
        * kjs/grammar.y: Change grammar so that assignment expressions are parsed
        directly to nodes that know how to set the kind of location being assigned, instead
        of having a generic assign node that counts on evaluateReference.
        * kjs/lexer.cpp: Include grammar_types.h.
        * kjs/nodes.cpp:
        (BracketAccessorNode): Renamed from AccessorNode1 for clarity.
        (DotAccessorNode): Renamed from AccessorNode2 for clarity.
        (combineForAssignment): Inline function for doing the proper kind of
        operation for various update assignments like += or *=.
        (AssignResolveNode): Node that handles assignment to a bare identifier.
        (AssignDotNode): Node that handles assignments of the form EXPR . IDENT = EXPR
        (AssignBracketNode): EXPR [ IDENT ] = EXPR
        * kjs/nodes.h: Updated for declarations/renames of new classes.
        * kjs/nodes2string.cpp:
        (GroupNode::streamTo): Fixed to print parens around the expression.
        (BracketAccessorNode::streamTo): Renamed.
        (DotAccessorNode::streamTo): Renamed.
        (AssignResolveNode::streamTo): Added.
        (AssignBracketNode::streamTo): Added.
        (AssignDotNode::streamTo): Added.
        (streamAssignmentOperatorTo): helper function for the above
        * kjs/property_slot.h:
        (KJS::PropertySlot::isSet): Made this const.

2005-08-10  Adele Peterson  <adele@apple.com>

        Bumping version to 420+

        * Info.plist:

2005-08-10  Geoffrey Garen  <ggaren@apple.com>

        -fixed <rdar://problem/4151132> REGRESSION: Some applet liveconnect calls 
        throws privilege exception.
        
        Reviewed by richard and mjs.

        -I removed the global static JavaClass cache, since it violated Java
        security to cache classes between websites and applets.
        
        * bindings/jni/jni_class.cpp: 
            -removed global static cache dictionary
            -instance constructor and destructor now do the work that used to 
            be done by static factory methods
            -removed obsolete functions
        (JavaClass::JavaClass):
        (JavaClass::~JavaClass):
        * bindings/jni/jni_class.h:
            -removed obsolete function declarations
            -made copying private since it's unused and it's also not clear
            excatly how copying would work with Java security
            -made default construction private since it's meaningless
        * bindings/jni/jni_instance.cpp:
            -removed obsolete functions
        (JavaInstance::~JavaInstance):
        (JavaInstance::getClass):
        * bindings/jni/jni_instance.h:
           -made copying private since it's unused and it's also not clear
            excatly how copying would work with Java security
            -made default construction private since it's meaningless

2005-08-08  Geoffrey Garen  <ggaren@apple.com>

        -fixed crash caused by fix for http://bugs.webkit.org/show_bug.cgi?id=4313
        
        - exceptionDescription now gets explicitly initialized to NULL in all
        the places listed below -- our wrapper classes used to take care of this 
        automagically
        
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_runtime.cpp:
        (JavaField::dispatchValueFromInstance):
        (JavaField::dispatchSetValueToInstance):

2005-08-08  Darin Adler  <darin@apple.com>

        Reviewed by John Sullivan.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4325
          Mozilla Date tests have an unnecessary loop that runs 1970 times before each test

        * tests/mozilla/ecma/shell.js: Added TIME_YEAR_0 constant.

        * tests/mozilla/ecma/Date/15.9.5.10-1.js: Removed the loop and changed code to use the constant.
        * tests/mozilla/ecma/Date/15.9.5.10-10.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.10-11.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.10-12.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.10-13.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.10-2.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.10-3.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.10-4.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.10-5.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.10-6.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.10-7.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.10-8.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.10-9.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.11-2.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.12-1.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.12-2.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.12-3.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.12-4.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.12-5.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.12-6.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.12-7.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.12-8.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.13-2.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.13-8.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.14.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.15.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.16.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.17.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.18.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.19.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.20.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.21-1.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.21-2.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.21-3.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.21-4.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.21-5.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.21-6.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.21-7.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.21-8.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.22-1.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.22-2.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.22-3.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.22-4.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.22-5.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.22-6.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.22-7.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.22-8.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.23-4.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.23-5.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.23-6.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.23-7.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.23-8.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.23-9.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.5.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.6.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.7.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.8.js: Ditto.
        * tests/mozilla/ecma/Date/15.9.5.9.js: Ditto.

2005-08-08  Darin Adler  <darin@apple.com>

        - forgot to delete an obsolete file

        * kjs/object_wrapper.h: Deleted.

2005-08-07  Darin Adler  <darin@apple.com>

        - fixed two problems compiling with gcc 4.0

        * kjs/array_object.cpp: (ArrayProtoFuncImp::callAsFunction): Initialized a
        variable to quiet an erroneous warning.
        * kjs/date_object.cpp: (KJS::makeTime): Removed extraneous KJS:: prefix.

2005-08-07  Darin Adler  <darin@apple.com>

        Rubber stamped by Maciej.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4313
          eliminate KJS::Value and KJS::Object smart pointer wrappers (for simplicity and speed)

        * JavaScriptCore.xcodeproj/project.pbxproj: Removed object_wrapper.h.

        Global replaces and other wonderful stuff.

        * bindings/NP_jsobject.cpp:
        (_NPN_Invoke):
        (_NPN_Evaluate):
        (_NPN_GetProperty):
        (_NPN_SetProperty):
        (_NPN_HasMethod):
        (_NPN_SetException):
        * bindings/c/c_instance.cpp:
        (KJS::Bindings::CInstance::CInstance):
        (KJS::Bindings::CInstance::invokeMethod):
        (KJS::Bindings::CInstance::invokeDefaultMethod):
        (KJS::Bindings::CInstance::defaultValue):
        (KJS::Bindings::CInstance::stringValue):
        (KJS::Bindings::CInstance::numberValue):
        (KJS::Bindings::CInstance::booleanValue):
        (KJS::Bindings::CInstance::valueOf):
        * bindings/c/c_instance.h:
        * bindings/c/c_runtime.cpp:
        (CField::valueFromInstance):
        (CField::setValueToInstance):
        * bindings/c/c_runtime.h:
        * bindings/c/c_utility.cpp:
        (convertNPStringToUTF16):
        (convertUTF8ToUTF16):
        (coerceValueToNPVariantStringType):
        (convertValueToNPVariant):
        (convertNPVariantToValue):
        * bindings/c/c_utility.h:
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::stringValue):
        (JavaInstance::numberValue):
        (JavaInstance::booleanValue):
        (JavaInstance::invokeMethod):
        (JavaInstance::invokeDefaultMethod):
        (JavaInstance::defaultValue):
        (JavaInstance::valueOf):
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_jsobject.cpp:
        (JSObject::invoke):
        (JSObject::call):
        (JSObject::eval):
        (JSObject::getMember):
        (JSObject::getSlot):
        (JSObject::toString):
        (JSObject::convertValueToJObject):
        (JSObject::convertJObjectToValue):
        (JSObject::listFromJArray):
        * bindings/jni/jni_jsobject.h:
        * bindings/jni/jni_objc.mm:
        (KJS::Bindings::dispatchJNICall):
        * bindings/jni/jni_runtime.cpp:
        (JavaArray::convertJObjectToArray):
        (JavaField::dispatchValueFromInstance):
        (JavaField::valueFromInstance):
        (JavaField::dispatchSetValueToInstance):
        (JavaField::setValueToInstance):
        (JavaArray::setValueAt):
        (JavaArray::valueAt):
        * bindings/jni/jni_runtime.h:
        (KJS::Bindings::JavaString::ustring):
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::getJavaVM):
        (KJS::Bindings::getJNIEnv):
        (KJS::Bindings::getMethodID):
        (KJS::Bindings::callJNIVoidMethod):
        (KJS::Bindings::callJNIObjectMethod):
        (KJS::Bindings::callJNIBooleanMethod):
        (KJS::Bindings::callJNIStaticBooleanMethod):
        (KJS::Bindings::callJNIByteMethod):
        (KJS::Bindings::callJNICharMethod):
        (KJS::Bindings::callJNIShortMethod):
        (KJS::Bindings::callJNIIntMethod):
        (KJS::Bindings::callJNILongMethod):
        (KJS::Bindings::callJNIFloatMethod):
        (KJS::Bindings::callJNIDoubleMethod):
        (KJS::Bindings::callJNIVoidMethodA):
        (KJS::Bindings::callJNIObjectMethodA):
        (KJS::Bindings::callJNIByteMethodA):
        (KJS::Bindings::callJNICharMethodA):
        (KJS::Bindings::callJNIShortMethodA):
        (KJS::Bindings::callJNIIntMethodA):
        (KJS::Bindings::callJNILongMethodA):
        (KJS::Bindings::callJNIFloatMethodA):
        (KJS::Bindings::callJNIDoubleMethodA):
        (KJS::Bindings::callJNIBooleanMethodA):
        (KJS::Bindings::callJNIVoidMethodIDA):
        (KJS::Bindings::callJNIObjectMethodIDA):
        (KJS::Bindings::callJNIByteMethodIDA):
        (KJS::Bindings::callJNICharMethodIDA):
        (KJS::Bindings::callJNIShortMethodIDA):
        (KJS::Bindings::callJNIIntMethodIDA):
        (KJS::Bindings::callJNILongMethodIDA):
        (KJS::Bindings::callJNIFloatMethodIDA):
        (KJS::Bindings::callJNIDoubleMethodIDA):
        (KJS::Bindings::callJNIBooleanMethodIDA):
        (KJS::Bindings::getCharactersFromJString):
        (KJS::Bindings::releaseCharactersForJString):
        (KJS::Bindings::getCharactersFromJStringInEnv):
        (KJS::Bindings::releaseCharactersForJStringInEnv):
        (KJS::Bindings::getUCharactersFromJStringInEnv):
        (KJS::Bindings::releaseUCharactersForJStringInEnv):
        (KJS::Bindings::JNITypeFromClassName):
        (KJS::Bindings::signatureFromPrimitiveType):
        (KJS::Bindings::JNITypeFromPrimitiveType):
        (KJS::Bindings::getJNIField):
        (KJS::Bindings::convertValueToJValue):
        * bindings/jni/jni_utility.h:
        * bindings/objc/WebScriptObject.mm:
        (_didExecute):
        (-[WebScriptObject _initializeWithObjectImp:originExecutionContext:Bindings::executionContext:Bindings::]):
        (-[WebScriptObject _initWithObjectImp:originExecutionContext:Bindings::executionContext:Bindings::]):
        (-[WebScriptObject _imp]):
        (-[WebScriptObject _executionContext]):
        (-[WebScriptObject _setExecutionContext:]):
        (-[WebScriptObject _originExecutionContext]):
        (-[WebScriptObject _setOriginExecutionContext:]):
        (+[WebScriptObject throwException:]):
        (listFromNSArray):
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject setValue:forKey:]):
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject removeWebScriptKey:]):
        (-[WebScriptObject stringRepresentation]):
        (-[WebScriptObject webScriptValueAtIndex:]):
        (-[WebScriptObject setException:]):
        (+[WebScriptObject _convertValueToObjcValue:originExecutionContext:executionContext:Bindings::]):
        * bindings/objc/WebScriptObjectPrivate.h:
        * bindings/objc/objc_class.h:
        * bindings/objc/objc_class.mm:
        (KJS::Bindings::ObjcClass::fallbackObject):
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):
        (ObjcInstance::invokeDefaultMethod):
        (ObjcInstance::setValueOfField):
        (ObjcInstance::setValueOfUndefinedField):
        (ObjcInstance::getValueOfField):
        (ObjcInstance::getValueOfUndefinedField):
        (ObjcInstance::defaultValue):
        (ObjcInstance::stringValue):
        (ObjcInstance::numberValue):
        (ObjcInstance::booleanValue):
        (ObjcInstance::valueOf):
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcField::valueFromInstance):
        (convertValueToObjcObject):
        (ObjcField::setValueToInstance):
        (ObjcArray::setValueAt):
        (ObjcArray::valueAt):
        (ObjcFallbackObjectImp::put):
        (ObjcFallbackObjectImp::callAsFunction):
        (ObjcFallbackObjectImp::defaultValue):
        * bindings/objc/objc_utility.h:
        * bindings/objc/objc_utility.mm:
        (Bindings::JSMethodNameToObjCMethodName):
        (Bindings::convertValueToObjcValue):
        (Bindings::convertNSStringToString):
        (Bindings::convertObjcValueToValue):
        (Bindings::objcValueTypeForType):
        (Bindings::createObjcInstanceForValue):
        * bindings/runtime.cpp:
        (Instance::getValueOfField):
        (Instance::setValueOfField):
        (Instance::createRuntimeObject):
        (Instance::createLanguageInstanceForValue):
        * bindings/runtime.h:
        (KJS::Bindings::Constructor::~Constructor):
        (KJS::Bindings::Field::~Field):
        (KJS::Bindings::MethodList::MethodList):
        (KJS::Bindings::Class::fallbackObject):
        (KJS::Bindings::Class::~Class):
        (KJS::Bindings::Instance::Instance):
        (KJS::Bindings::Instance::getValueOfUndefinedField):
        (KJS::Bindings::Instance::supportsSetValueOfUndefinedField):
        (KJS::Bindings::Instance::setValueOfUndefinedField):
        (KJS::Bindings::Instance::valueOf):
        (KJS::Bindings::Instance::setExecutionContext):
        (KJS::Bindings::Instance::~Instance):
        (KJS::Bindings::Array::~Array):
        * bindings/runtime_array.cpp:
        (RuntimeArrayImp::RuntimeArrayImp):
        (RuntimeArrayImp::lengthGetter):
        (RuntimeArrayImp::indexGetter):
        (RuntimeArrayImp::put):
        * bindings/runtime_array.h:
        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::lengthGetter):
        (RuntimeMethodImp::callAsFunction):
        * bindings/runtime_method.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::fallbackObjectGetter):
        (RuntimeObjectImp::fieldGetter):
        (RuntimeObjectImp::methodGetter):
        (RuntimeObjectImp::getOwnPropertySlot):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::defaultValue):
        (RuntimeObjectImp::callAsFunction):
        * bindings/runtime_object.h:
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (ArrayInstanceImp::ArrayInstanceImp):
        (ArrayInstanceImp::lengthGetter):
        (ArrayInstanceImp::getOwnPropertySlot):
        (ArrayInstanceImp::put):
        (ArrayInstanceImp::propList):
        (ArrayInstanceImp::setLength):
        (compareByStringForQSort):
        (compareWithCompareFunctionForQSort):
        (ArrayInstanceImp::sort):
        (ArrayInstanceImp::pushUndefinedObjectsToEnd):
        (ArrayPrototypeImp::ArrayPrototypeImp):
        (ArrayProtoFuncImp::ArrayProtoFuncImp):
        (ArrayProtoFuncImp::callAsFunction):
        (ArrayObjectImp::ArrayObjectImp):
        (ArrayObjectImp::construct):
        (ArrayObjectImp::callAsFunction):
        * kjs/array_object.h:
        * kjs/bool_object.cpp:
        (BooleanPrototypeImp::BooleanPrototypeImp):
        (BooleanProtoFuncImp::BooleanProtoFuncImp):
        (BooleanProtoFuncImp::callAsFunction):
        (BooleanObjectImp::BooleanObjectImp):
        (BooleanObjectImp::construct):
        (BooleanObjectImp::callAsFunction):
        * kjs/bool_object.h:
        * kjs/collector.cpp:
        (KJS::Collector::markStackObjectsConservatively):
        (KJS::Collector::collect):
        (KJS::className):
        * kjs/completion.h:
        (KJS::Completion::Completion):
        (KJS::Completion::value):
        (KJS::Completion::isValueCompletion):
        * kjs/context.h:
        (KJS::ContextImp::variableObject):
        (KJS::ContextImp::setVariableObject):
        (KJS::ContextImp::thisValue):
        (KJS::ContextImp::activationObject):
        (KJS::ContextImp::pushScope):
        * kjs/date_object.cpp:
        (formatLocaleDate):
        (KJS::timeFromArgs):
        (KJS::DatePrototypeImp::DatePrototypeImp):
        (KJS::DateProtoFuncImp::DateProtoFuncImp):
        (KJS::DateProtoFuncImp::callAsFunction):
        (KJS::DateObjectImp::DateObjectImp):
        (KJS::DateObjectImp::construct):
        (KJS::DateObjectImp::callAsFunction):
        (KJS::DateObjectFuncImp::DateObjectFuncImp):
        (KJS::DateObjectFuncImp::callAsFunction):
        (KJS::parseDate):
        (KJS::KRFCDate_parseDate):
        (KJS::timeClip):
        * kjs/date_object.h:
        * kjs/debugger.cpp:
        (Debugger::exception):
        (Debugger::callEvent):
        (Debugger::returnEvent):
        * kjs/debugger.h:
        * kjs/error_object.cpp:
        (ErrorPrototypeImp::ErrorPrototypeImp):
        (ErrorProtoFuncImp::ErrorProtoFuncImp):
        (ErrorProtoFuncImp::callAsFunction):
        (ErrorObjectImp::ErrorObjectImp):
        (ErrorObjectImp::construct):
        (ErrorObjectImp::callAsFunction):
        (NativeErrorPrototypeImp::NativeErrorPrototypeImp):
        (NativeErrorImp::NativeErrorImp):
        (NativeErrorImp::construct):
        (NativeErrorImp::callAsFunction):
        * kjs/error_object.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::FunctionImp):
        (KJS::FunctionImp::callAsFunction):
        (KJS::FunctionImp::processParameters):
        (KJS::FunctionImp::argumentsGetter):
        (KJS::FunctionImp::lengthGetter):
        (KJS::FunctionImp::put):
        (KJS::DeclaredFunctionImp::DeclaredFunctionImp):
        (KJS::DeclaredFunctionImp::construct):
        (KJS::ArgumentsImp::ArgumentsImp):
        (KJS::ArgumentsImp::mappedIndexGetter):
        (KJS::ArgumentsImp::put):
        (KJS::ActivationImp::argumentsGetter):
        (KJS::GlobalFuncImp::GlobalFuncImp):
        (KJS::encode):
        (KJS::decode):
        (KJS::GlobalFuncImp::callAsFunction):
        * kjs/function.h:
        * kjs/function_object.cpp:
        (FunctionPrototypeImp::FunctionPrototypeImp):
        (FunctionPrototypeImp::callAsFunction):
        (FunctionProtoFuncImp::FunctionProtoFuncImp):
        (FunctionProtoFuncImp::callAsFunction):
        (FunctionObjectImp::FunctionObjectImp):
        (FunctionObjectImp::construct):
        (FunctionObjectImp::callAsFunction):
        * kjs/function_object.h:
        * kjs/internal.cpp:
        (KJS::UndefinedImp::toPrimitive):
        (KJS::UndefinedImp::toObject):
        (KJS::NullImp::toPrimitive):
        (KJS::NullImp::toObject):
        (KJS::BooleanImp::toPrimitive):
        (KJS::BooleanImp::toObject):
        (KJS::StringImp::toPrimitive):
        (KJS::StringImp::toObject):
        (KJS::NumberImp::toPrimitive):
        (KJS::NumberImp::toObject):
        (KJS::NumberImp::getUInt32):
        (KJS::LabelStack::push):
        (KJS::ContextImp::ContextImp):
        (KJS::InterpreterImp::globalInit):
        (KJS::InterpreterImp::globalClear):
        (KJS::InterpreterImp::InterpreterImp):
        (KJS::InterpreterImp::initGlobalObject):
        (KJS::InterpreterImp::clear):
        (KJS::InterpreterImp::mark):
        (KJS::InterpreterImp::evaluate):
        (KJS::InternalFunctionImp::hasInstance):
        (KJS::roundValue):
        (KJS::printInfo):
        * kjs/internal.h:
        (KJS::InterpreterImp::builtinObject):
        (KJS::InterpreterImp::builtinFunction):
        (KJS::InterpreterImp::builtinArray):
        (KJS::InterpreterImp::builtinBoolean):
        (KJS::InterpreterImp::builtinString):
        (KJS::InterpreterImp::builtinNumber):
        (KJS::InterpreterImp::builtinDate):
        (KJS::InterpreterImp::builtinRegExp):
        (KJS::InterpreterImp::builtinError):
        (KJS::InterpreterImp::builtinObjectPrototype):
        (KJS::InterpreterImp::builtinFunctionPrototype):
        (KJS::InterpreterImp::builtinArrayPrototype):
        (KJS::InterpreterImp::builtinBooleanPrototype):
        (KJS::InterpreterImp::builtinStringPrototype):
        (KJS::InterpreterImp::builtinNumberPrototype):
        (KJS::InterpreterImp::builtinDatePrototype):
        (KJS::InterpreterImp::builtinRegExpPrototype):
        (KJS::InterpreterImp::builtinErrorPrototype):
        (KJS::InterpreterImp::builtinEvalError):
        (KJS::InterpreterImp::builtinRangeError):
        (KJS::InterpreterImp::builtinReferenceError):
        (KJS::InterpreterImp::builtinSyntaxError):
        (KJS::InterpreterImp::builtinTypeError):
        (KJS::InterpreterImp::builtinURIError):
        (KJS::InterpreterImp::builtinEvalErrorPrototype):
        (KJS::InterpreterImp::builtinRangeErrorPrototype):
        (KJS::InterpreterImp::builtinReferenceErrorPrototype):
        (KJS::InterpreterImp::builtinSyntaxErrorPrototype):
        (KJS::InterpreterImp::builtinTypeErrorPrototype):
        (KJS::InterpreterImp::builtinURIErrorPrototype):
        * kjs/interpreter.cpp:
        (Context::variableObject):
        (Context::thisValue):
        (Interpreter::Interpreter):
        (Interpreter::globalObject):
        (Interpreter::evaluate):
        (Interpreter::builtinObject):
        (Interpreter::builtinFunction):
        (Interpreter::builtinArray):
        (Interpreter::builtinBoolean):
        (Interpreter::builtinString):
        (Interpreter::builtinNumber):
        (Interpreter::builtinDate):
        (Interpreter::builtinRegExp):
        (Interpreter::builtinError):
        (Interpreter::builtinObjectPrototype):
        (Interpreter::builtinFunctionPrototype):
        (Interpreter::builtinArrayPrototype):
        (Interpreter::builtinBooleanPrototype):
        (Interpreter::builtinStringPrototype):
        (Interpreter::builtinNumberPrototype):
        (Interpreter::builtinDatePrototype):
        (Interpreter::builtinRegExpPrototype):
        (Interpreter::builtinErrorPrototype):
        (Interpreter::builtinEvalError):
        (Interpreter::builtinRangeError):
        (Interpreter::builtinReferenceError):
        (Interpreter::builtinSyntaxError):
        (Interpreter::builtinTypeError):
        (Interpreter::builtinURIError):
        (Interpreter::builtinEvalErrorPrototype):
        (Interpreter::builtinRangeErrorPrototype):
        (Interpreter::builtinReferenceErrorPrototype):
        (Interpreter::builtinSyntaxErrorPrototype):
        (Interpreter::builtinTypeErrorPrototype):
        (Interpreter::builtinURIErrorPrototype):
        (Interpreter::createLanguageInstanceForValue):
        * kjs/interpreter.h:
        (KJS::Interpreter::isGlobalObject):
        (KJS::ExecState::setException):
        (KJS::ExecState::clearException):
        (KJS::ExecState::exception):
        (KJS::ExecState::hadException):
        (KJS::ExecState::ExecState):
        * kjs/list.cpp:
        (KJS::List::at):
        * kjs/list.h:
        (KJS::List::operator[]):
        (KJS::ListIterator::operator->):
        (KJS::ListIterator::operator*):
        (KJS::ListIterator::operator++):
        (KJS::ListIterator::operator--):
        * kjs/lookup.h:
        (KJS::staticFunctionGetter):
        (KJS::staticValueGetter):
        (KJS::lookupPut):
        (KJS::cacheGlobalObject):
        * kjs/math_object.cpp:
        (MathObjectImp::getValueProperty):
        (MathFuncImp::MathFuncImp):
        (MathFuncImp::callAsFunction):
        * kjs/math_object.h:
        * kjs/nodes.cpp:
        (Node::evaluateReference):
        (Node::throwError):
        (Node::setExceptionDetailsIfNeeded):
        (NullNode::evaluate):
        (BooleanNode::evaluate):
        (NumberNode::evaluate):
        (StringNode::evaluate):
        (RegExpNode::evaluate):
        (ThisNode::evaluate):
        (ResolveNode::evaluate):
        (ResolveNode::evaluateReference):
        (GroupNode::evaluate):
        (ElementNode::evaluate):
        (ArrayNode::evaluate):
        (ObjectLiteralNode::evaluate):
        (PropertyValueNode::evaluate):
        (PropertyNode::evaluate):
        (AccessorNode1::evaluate):
        (AccessorNode1::evaluateReference):
        (AccessorNode2::evaluate):
        (AccessorNode2::evaluateReference):
        (ArgumentListNode::evaluate):
        (ArgumentListNode::evaluateList):
        (ArgumentsNode::evaluate):
        (NewExprNode::evaluate):
        (FunctionCallNode::evaluate):
        (PostfixNode::evaluate):
        (DeleteNode::evaluate):
        (VoidNode::evaluate):
        (TypeOfNode::evaluate):
        (PrefixNode::evaluate):
        (UnaryPlusNode::evaluate):
        (NegateNode::evaluate):
        (BitwiseNotNode::evaluate):
        (LogicalNotNode::evaluate):
        (MultNode::evaluate):
        (AddNode::evaluate):
        (ShiftNode::evaluate):
        (RelationalNode::evaluate):
        (EqualNode::evaluate):
        (BitOperNode::evaluate):
        (BinaryLogicalNode::evaluate):
        (ConditionalNode::evaluate):
        (AssignNode::evaluate):
        (CommaNode::evaluate):
        (StatListNode::execute):
        (AssignExprNode::evaluate):
        (VarDeclNode::evaluate):
        (VarDeclNode::processVarDecls):
        (VarDeclListNode::evaluate):
        (ExprStatementNode::execute):
        (IfNode::execute):
        (DoWhileNode::execute):
        (WhileNode::execute):
        (ForNode::execute):
        (ForInNode::execute):
        (ContinueNode::execute):
        (BreakNode::execute):
        (ReturnNode::execute):
        (WithNode::execute):
        (CaseClauseNode::evaluate):
        (ClauseListNode::evaluate):
        (CaseBlockNode::evaluate):
        (CaseBlockNode::evalBlock):
        (SwitchNode::execute):
        (ThrowNode::execute):
        (CatchNode::execute):
        (TryNode::execute):
        (ParameterNode::evaluate):
        (FuncDeclNode::processFuncDecl):
        (FuncExprNode::evaluate):
        (SourceElementsNode::execute):
        * kjs/nodes.h:
        (KJS::StatementNode::evaluate):
        * kjs/number_object.cpp:
        (NumberPrototypeImp::NumberPrototypeImp):
        (NumberProtoFuncImp::NumberProtoFuncImp):
        (NumberProtoFuncImp::callAsFunction):
        (NumberObjectImp::NumberObjectImp):
        (NumberObjectImp::getValueProperty):
        (NumberObjectImp::construct):
        (NumberObjectImp::callAsFunction):
        * kjs/number_object.h:
        * kjs/object.cpp:
        (KJS::ObjectImp::call):
        (KJS::ObjectImp::mark):
        (KJS::ObjectImp::classInfo):
        (KJS::ObjectImp::get):
        (KJS::ObjectImp::getProperty):
        (KJS::ObjectImp::getPropertySlot):
        (KJS::ObjectImp::put):
        (KJS::ObjectImp::hasOwnProperty):
        (KJS::ObjectImp::defaultValue):
        (KJS::ObjectImp::findPropertyHashEntry):
        (KJS::ObjectImp::construct):
        (KJS::ObjectImp::callAsFunction):
        (KJS::ObjectImp::hasInstance):
        (KJS::ObjectImp::propList):
        (KJS::ObjectImp::toPrimitive):
        (KJS::ObjectImp::toNumber):
        (KJS::ObjectImp::toString):
        (KJS::ObjectImp::toObject):
        (KJS::ObjectImp::putDirect):
        (KJS::Error::create):
        (KJS::error):
        * kjs/object.h:
        (KJS::):
        (KJS::ObjectImp::getPropertySlot):
        (KJS::AllocatedValueImp::isObject):
        (KJS::ObjectImp::ObjectImp):
        (KJS::ObjectImp::internalValue):
        (KJS::ObjectImp::setInternalValue):
        (KJS::ObjectImp::prototype):
        (KJS::ObjectImp::setPrototype):
        (KJS::ObjectImp::inherits):
        * kjs/object_object.cpp:
        (ObjectPrototypeImp::ObjectPrototypeImp):
        (ObjectProtoFuncImp::ObjectProtoFuncImp):
        (ObjectProtoFuncImp::callAsFunction):
        (ObjectObjectImp::ObjectObjectImp):
        (ObjectObjectImp::construct):
        (ObjectObjectImp::callAsFunction):
        * kjs/object_object.h:
        * kjs/operations.cpp:
        (KJS::equal):
        (KJS::strictEqual):
        (KJS::relation):
        (KJS::add):
        (KJS::mult):
        * kjs/operations.h:
        * kjs/property_map.cpp:
        (KJS::PropertyMap::mark):
        (KJS::PropertyMap::addEnumerablesToReferenceList):
        (KJS::PropertyMap::addSparseArrayPropertiesToReferenceList):
        (KJS::PropertyMap::save):
        (KJS::PropertyMap::restore):
        * kjs/property_map.h:
        * kjs/property_slot.cpp:
        (KJS::PropertySlot::undefinedGetter):
        * kjs/property_slot.h:
        (KJS::PropertySlot::getValue):
        * kjs/protect.h:
        (KJS::gcUnprotectNullTolerant):
        (KJS::ProtectedValue::ProtectedValue):
        (KJS::ProtectedValue::~ProtectedValue):
        (KJS::ProtectedValue::operator=):
        (KJS::ProtectedValue::operator ValueImp *):
        (KJS::ProtectedValue::operator->):
        * kjs/protected_object.h:
        (KJS::ProtectedObject::ProtectedObject):
        (KJS::ProtectedObject::operator=):
        (KJS::ProtectedObject::operator ValueImp *):
        (KJS::ProtectedObject::operator ObjectImp *):
        (KJS::ProtectedObject::operator->):
        (KJS::ProtectedReference::ProtectedReference):
        (KJS::ProtectedReference::~ProtectedReference):
        (KJS::ProtectedReference::operator=):
        * kjs/protected_values.cpp:
        (KJS::ProtectedValues::getProtectCount):
        (KJS::ProtectedValues::increaseProtectCount):
        (KJS::ProtectedValues::insert):
        (KJS::ProtectedValues::decreaseProtectCount):
        * kjs/protected_values.h:
        * kjs/reference.cpp:
        (KJS::Reference::Reference):
        (KJS::Reference::makeValueReference):
        (KJS::Reference::getBase):
        (KJS::Reference::getValue):
        (KJS::Reference::putValue):
        (KJS::Reference::deleteValue):
        * kjs/reference.h:
        (KJS::Reference::baseIfMutable):
        * kjs/regexp_object.cpp:
        (RegExpPrototypeImp::RegExpPrototypeImp):
        (RegExpProtoFuncImp::RegExpProtoFuncImp):
        (RegExpProtoFuncImp::callAsFunction):
        (RegExpObjectImp::RegExpObjectImp):
        (RegExpObjectImp::arrayOfMatches):
        (RegExpObjectImp::backrefGetter):
        (RegExpObjectImp::construct):
        (RegExpObjectImp::callAsFunction):
        * kjs/regexp_object.h:
        * kjs/string_object.cpp:
        (StringInstanceImp::lengthGetter):
        (StringInstanceImp::indexGetter):
        (StringInstanceImp::getOwnPropertySlot):
        (StringInstanceImp::put):
        (StringPrototypeImp::StringPrototypeImp):
        (StringProtoFuncImp::StringProtoFuncImp):
        (regExpIsGlobal):
        (replace):
        (StringProtoFuncImp::callAsFunction):
        (StringObjectImp::StringObjectImp):
        (StringObjectImp::construct):
        (StringObjectImp::callAsFunction):
        (StringObjectFuncImp::StringObjectFuncImp):
        (StringObjectFuncImp::callAsFunction):
        * kjs/string_object.h:
        * kjs/testkjs.cpp:
        (TestFunctionImp::callAsFunction):
        (VersionFunctionImp::callAsFunction):
        (main):
        * kjs/value.cpp:
        (KJS::AllocatedValueImp::operator new):
        (KJS::AllocatedValueImp::getUInt32):
        (KJS::ValueImp::toInteger):
        (KJS::ValueImp::toInt32):
        (KJS::ValueImp::toUInt32):
        (KJS::ValueImp::toUInt16):
        (KJS::ValueImp::toObject):
        (KJS::AllocatedValueImp::getBoolean):
        (KJS::AllocatedValueImp::getNumber):
        (KJS::AllocatedValueImp::getString):
        (KJS::AllocatedValueImp::getObject):
        (KJS::jsString):
        (KJS::jsNumber):
        (KJS::ConstantValues::init):
        (KJS::ConstantValues::clear):
        (KJS::ConstantValues::mark):
        * kjs/value.h:
        (KJS::):
        (KJS::jsUndefined):
        (KJS::jsNull):
        (KJS::jsBoolean):
        (KJS::jsNaN):
        (KJS::ValueImp::ValueImp):
        (KJS::ValueImp::~ValueImp):
        (KJS::AllocatedValueImp::AllocatedValueImp):
        (KJS::AllocatedValueImp::~AllocatedValueImp):
        (KJS::AllocatedValueImp::isBoolean):
        (KJS::AllocatedValueImp::isNumber):
        (KJS::AllocatedValueImp::isString):
        (KJS::AllocatedValueImp::isObject):
        (KJS::AllocatedValueImp::marked):
        (KJS::AllocatedValueImp::mark):
        (KJS::ValueImp::downcast):
        (KJS::ValueImp::isUndefined):
        (KJS::ValueImp::isNull):
        (KJS::ValueImp::isUndefinedOrNull):
        (KJS::ValueImp::isBoolean):
        (KJS::ValueImp::isNumber):
        (KJS::ValueImp::isString):
        (KJS::ValueImp::isObject):
        (KJS::ValueImp::getBoolean):
        (KJS::ValueImp::getNumber):
        (KJS::ValueImp::getString):
        (KJS::ValueImp::getObject):
        (KJS::ValueImp::getUInt32):
        (KJS::ValueImp::mark):
        (KJS::ValueImp::marked):
        (KJS::ValueImp::type):
        (KJS::ValueImp::toPrimitive):
        (KJS::ValueImp::toBoolean):
        (KJS::ValueImp::toNumber):
        (KJS::ValueImp::toString):
        (KJS::jsZero):
        (KJS::jsOne):
        (KJS::jsTwo):
        (KJS::Undefined):
        (KJS::Null):
        (KJS::Boolean):
        (KJS::Number):
        (KJS::String):

2005-08-06  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        Change over to the new PropertySlot mechanism for property
        lookup. This allows the elimination of hasOwnProperty
        methods. Also did some of the performance tuning enabled by this
        (but not yet all the possible improvements for function calls,
        assignment, ++, and so forth). And also much code cleanup.

        Net result is about a 2% speedup on the JS iBench.
        
        Also redid Geoff's fix for the chrashing applet by avoiding a NULL
        prototype in the bindings code and using the default of Null()
        instead.
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::ObjcFallbackObjectImp):
        (ObjcFallbackObjectImp::getOwnPropertySlot):
        * bindings/runtime_array.cpp:
        (RuntimeArrayImp::lengthGetter):
        (RuntimeArrayImp::indexGetter):
        (RuntimeArrayImp::getOwnPropertySlot):
        * bindings/runtime_array.h:
        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::lengthGetter):
        (RuntimeMethodImp::getOwnPropertySlot):
        * bindings/runtime_method.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::RuntimeObjectImp):
        (RuntimeObjectImp::fallbackObjectGetter):
        (RuntimeObjectImp::fieldGetter):
        (RuntimeObjectImp::methodGetter):
        (RuntimeObjectImp::getOwnPropertySlot):
        * bindings/runtime_object.h:
        * bindings/runtime_root.h:
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (ArrayInstanceImp::lengthGetter):
        (ArrayInstanceImp::getOwnPropertySlot):
        (ArrayPrototypeImp::getOwnPropertySlot):
        * kjs/array_object.h:
        * kjs/date_object.cpp:
        (DatePrototypeImp::getOwnPropertySlot):
        * kjs/date_object.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::argumentsGetter):
        (KJS::FunctionImp::lengthGetter):
        (KJS::FunctionImp::getOwnPropertySlot):
        (KJS::FunctionImp::put):
        (KJS::FunctionImp::deleteProperty):
        (KJS::ArgumentsImp::mappedIndexGetter):
        (KJS::ArgumentsImp::getOwnPropertySlot):
        (KJS::ActivationImp::argumentsGetter):
        (KJS::ActivationImp::getArgumentsGetter):
        (KJS::ActivationImp::getOwnPropertySlot):
        (KJS::ActivationImp::deleteProperty):
        * kjs/function.h:
        * kjs/internal.cpp:
        (InterpreterImp::InterpreterImp):
        (InterpreterImp::initGlobalObject):
        (InterpreterImp::~InterpreterImp):
        (InterpreterImp::evaluate):
        * kjs/internal.h:
        (KJS::InterpreterImp::globalExec):
        * kjs/interpreter.cpp:
        (Interpreter::Interpreter):
        (Interpreter::createLanguageInstanceForValue):
        * kjs/interpreter.h:
        (KJS::Interpreter::argumentsIdentifier):
        (KJS::Interpreter::specialPrototypeIdentifier):
        * kjs/lookup.h:
        (KJS::staticFunctionGetter):
        (KJS::staticValueGetter):
        (KJS::getStaticPropertySlot):
        (KJS::getStaticFunctionSlot):
        (KJS::getStaticValueSlot):
        * kjs/math_object.cpp:
        (MathObjectImp::getOwnPropertySlot):
        * kjs/math_object.h:
        * kjs/nodes.cpp:
        (ResolveNode::evaluate):
        (ResolveNode::evaluateReference):
        (AccessorNode1::evaluate):
        (AccessorNode2::evaluate):
        * kjs/number_object.cpp:
        (NumberObjectImp::getOwnPropertySlot):
        * kjs/number_object.h:
        * kjs/object.cpp:
        (KJS::ObjectImp::get):
        (KJS::ObjectImp::getProperty):
        (KJS::ObjectImp::getPropertySlot):
        (KJS::ObjectImp::getOwnPropertySlot):
        (KJS::ObjectImp::put):
        (KJS::ObjectImp::hasProperty):
        (KJS::ObjectImp::hasOwnProperty):
        * kjs/object.h:
        (KJS::ObjectImp::getDirectLocation):
        (KJS::ObjectImp::getPropertySlot):
        (KJS::ObjectImp::getOwnPropertySlot):
        * kjs/object_wrapper.h: Added.
        (KJS::):
        (KJS::Object::Object):
        (KJS::Object::operator ObjectImp *):
        * kjs/property_map.cpp:
        (KJS::PropertyMap::getLocation):
        * kjs/property_map.h:
        * kjs/property_slot.cpp: Added.
        (KJS::PropertySlot::undefinedGetter):
        * kjs/property_slot.h: Added.
        (KJS::PropertySlot::isSet):
        (KJS::PropertySlot::getValue):
        (KJS::PropertySlot::setValueSlot):
        (KJS::PropertySlot::setStaticEntry):
        (KJS::PropertySlot::setCustom):
        (KJS::PropertySlot::setCustomIndex):
        (KJS::PropertySlot::setUndefined):
        (KJS::PropertySlot::slotBase):
        (KJS::PropertySlot::staticEntry):
        (KJS::PropertySlot::index):
        (KJS::PropertySlot::):
        * kjs/protect.h:
        * kjs/protected_object.h: Added.
        (KJS::ProtectedObject::ProtectedObject):
        (KJS::ProtectedObject::~ProtectedObject):
        (KJS::ProtectedObject::operator=):
        (KJS::ProtectedReference::ProtectedReference):
        (KJS::ProtectedReference::~ProtectedReference):
        (KJS::ProtectedReference::operator=):
        * kjs/reference.h:
        * kjs/reference_list.cpp:
        * kjs/regexp_object.cpp:
        (RegExpObjectImp::backrefGetter):
        (RegExpObjectImp::getOwnPropertySlot):
        * kjs/regexp_object.h:
        * kjs/string_object.cpp:
        (StringInstanceImp::lengthGetter):
        (StringInstanceImp::indexGetter):
        (StringInstanceImp::getOwnPropertySlot):
        (StringPrototypeImp::getOwnPropertySlot):
        * kjs/string_object.h:

2005-08-05  Adele Peterson  <adele@apple.com>

        Reviewed by Darin.

        * JavaScriptCore.xcodeproj/project.pbxproj: Unchecked 'statics are thread safe' option.

2005-08-05  Geoffrey Garen  <ggaren@apple.com>

        -fixed <rdar://problem/4207220> REGRESSION (DENVER): Crash occurs 
        after clicking on Hangman applet

        Reviewed by darin.

        * kjs/object.cpp:
        (KJS::ObjectImp::hasProperty): added check for null prototype.

        FIXME: The long-term plan is to make runtime objects use JS Null()
        instead of null pointers, which will allow us to eliminate null
        checks, improving performance.

2005-08-05  Geoffrey Garen  <ggaren@apple.com>

        Fix by darin, reviewed by me.
        
        - rolled in fix for: <rdar://problem/4161606> JavaScript regular 
        expressions with certain ranges of Unicode characters cause a crash

        Test cases added:

        * layout-tests/fast/js/regexp-big-unicode-ranges-expected.txt: Added.
        * layout-tests/fast/js/regexp-big-unicode-ranges.html: Added.

        * pcre/pcre.c:
        (compile_branch): added checks for characters > 255

2005-08-04  Maciej Stachowiak  <mjs@apple.com>

        - updated expected test results now that we no longer exlude the
        date tests (apparently this was overlooked)

        * tests/mozilla/expected.html:

2005-07-31  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - remove uses of Mac-OS-X-specific MAX macro
        - remove one of the many excess "APPLE_CHANGES" ifdefs

        * kjs/collector.cpp: (KJS::Collector::allocate): Use std::max instead of MAX.
        * kjs/property_map.cpp: (KJS::PropertyMap::rehash): Ditto.
        * kjs/ustring.cpp:
        (KJS::UChar::toLower): Take out non-ICU code path.
        (KJS::UChar::toUpper): Ditto.
        (KJS::UString::spliceSubstringsWithSeparators): Use std::max instead of MAX.

2005-07-27  Geoffrey Garen  <ggaren@apple.com>

        - fixed http://bugs.webkit.org/show_bug.cgi?id=4147
        Array.toString() and toLocaleString() improvements from KDE KJS
        (rolled in KDE changes)

        Test cases added:

        * layout-tests/fast/js/toString-overrides-expected.txt: Added.
        * layout-tests/fast/js/toString-overrides.html: Added.
        
        * kjs/array_object.cpp:
        (ArrayProtoFuncImp::call):

2005-07-27  Maciej Stachowiak  <mjs@apple.com>

        Changes by Michael Kahl, reviewed by me.

        - fixed <rdar://problem/4194278> Need better debugging support in JavaScriptCore
        
        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/debugger.cpp:
        (KJS::AttachedInterpreter::AttachedInterpreter):
        (KJS::AttachedInterpreter::~AttachedInterpreter):
        (Debugger::~Debugger):
        (Debugger::attach):
        (Debugger::detach):
        (Debugger::sourceParsed):
        * kjs/debugger.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::call):
        (KJS::GlobalFuncImp::call):
        * kjs/function_object.cpp:
        (FunctionObjectImp::construct):
        * kjs/grammar.y:
        * kjs/internal.cpp:
        (Parser::parse):
        (InterpreterImp::evaluate):
        * kjs/internal.h:
        (KJS::InterpreterImp::setDebugger):
        * kjs/interpreter.cpp:
        * kjs/interpreter.h:
        (KJS::Interpreter::imp):
        * kjs/nodes.cpp:

2005-07-27  Geoffrey Garen  <ggaren@apple.com>

        - fixed http://bugs.webkit.org/show_bug.cgi?id=3381
        Date.prototype.setDate() incorrect for values >=128
        
        - Test cases added:

        * layout-tests/fast/js/date-big-setdate-expected.txt: Added.
        * layout-tests/fast/js/date-big-setdate.html: Added.

        Reviewed by darin.

        * kjs/date_object.cpp:
        (DateProtoFuncImp::call):

2005-07-27  Geoffrey Garen  <ggaren@apple.com>

        -rolled in patch by Carsten Guenther <cguenther@gmail.com>
        for http://bugs.webkit.org/show_bug.cgi?id=3759
        Date object enhancements
        
        Test cases added:

        * layout-tests/fast/js/date-preserve-milliseconds-expected.txt: Added.
        * layout-tests/fast/js/date-preserve-milliseconds.html: Added.

        Reviewed by darin.

        * kjs/date_object.cpp:
        (timeFromArgs):
        (DateProtoFuncImp::call):
        (DateObjectImp::construct):
        (DateObjectFuncImp::call):
        (KJS::makeTime):
        * kjs/date_object.h:
        * tests/mozilla/expected.html:

2005-07-26  Justin Garcia  <justin.garcia@apple.com>

        Added a forward declaration to fix gcc4 build error

        * kjs/function.h:

2005-07-25  Geoffrey Garen  <ggaren@apple.com>
        - fixed mistake in my last checkin -- the expected results included
        results from a patch that hasn't landed yet.
        
        * tests/mozilla/expected.html:

2005-07-25  Maciej Stachowiak  <mjs@apple.com>

        - fix mistake in last change that leads to assertion failure in the Development build

        * kjs/lookup.h:
        (KJS::lookupGetOwnValue):

2005-07-24  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - http://bugs.webkit.org/show_bug.cgi?id=4124
        (change JavaScript property access to avoid double lookup)

        - 10% speedup on JavaScript iBench
        - 5% speedup on 24fun BenchJS benchmark

        Changed all get methods to getOwnProperty - they are no longer
        responsible for prototype lookup, and determine if the property
        was found as a side efect. 

        get() is now a nonvirtual ObjectImp method which calls the virtual
        getOwnProperty and walks the prototype chain. A few selected
        methods were inlined.

        Changed ResolveNode::evaluate plus some other places to use
        getProperty which does get() and hasProperty() in one lookup.

        Also miscellaneous code cleanup.
        
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::ObjcFallbackObjectImp):
        (ObjcFallbackObjectImp::getOwnProperty):
        * bindings/runtime_array.cpp:
        (RuntimeArrayImp::RuntimeArrayImp):
        (RuntimeArrayImp::getOwnProperty):
        * bindings/runtime_array.h:
        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::getOwnProperty):
        * bindings/runtime_method.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::getOwnProperty):
        * bindings/runtime_object.h:
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (ArrayInstanceImp::getOwnProperty):
        (ArrayPrototypeImp::getOwnProperty):
        (ArrayProtoFuncImp::call):
        * kjs/array_object.h:
        * kjs/date_object.cpp:
        (DatePrototypeImp::getOwnProperty):
        * kjs/date_object.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::getOwnProperty):
        (KJS::ArgumentsImp::getOwnProperty):
        (KJS::ActivationImp::getOwnProperty):
        * kjs/function.h:
        * kjs/lookup.h:
        (KJS::lookupGetOwnProperty):
        (KJS::lookupGetOwnFunction):
        (KJS::lookupGetOwnValue):
        * kjs/math_object.cpp:
        (MathObjectImp::getOwnProperty):
        (MathObjectImp::getValueProperty):
        * kjs/math_object.h:
        * kjs/nodes.cpp:
        (ResolveNode::evaluate):
        * kjs/number_object.cpp:
        (NumberObjectImp::getOwnProperty):
        * kjs/number_object.h:
        * kjs/object.cpp:
        (KJS::ObjectImp::get):
        (KJS::ObjectImp::getOwnProperty):
        (KJS::ObjectImp::getProperty):
        * kjs/object.h:
        (KJS::ObjectImp::getProperty):
        (KJS::ObjectImp::getOwnProperty):
        * kjs/object_object.cpp:
        (ObjectProtoFuncImp::call):
        * kjs/regexp_object.cpp:
        (RegExpObjectImp::getOwnProperty):
        * kjs/regexp_object.h:
        * kjs/string_object.cpp:
        (StringInstanceImp::getOwnProperty):
        (StringPrototypeImp::getOwnProperty):
        * kjs/string_object.h:

2005-07-25  Geoffrey Garen  <ggaren@apple.com>

        - fixed http://bugs.webkit.org/show_bug.cgi?id=3971
        JS test suite depends on JS 1.2 behavior
        
        Reviewed by darin.

        * tests/mozilla/js1_2/Array/tostring_1.js: now tests only for JS 1.5 behavior
        * tests/mozilla/js1_2/Array/tostring_2.js: ditto
        * tests/mozilla/expected.html:

2005-07-24  Justin Garcia  <justin.garcia@apple.com>

        Reviewed by kevin.

        Fixes make clean problem introduced in xcode2.1 transition

        * Makefile.am:

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

        Reviewed by darin.

        * kjs/date_object.cpp: DatePrototypeImp now identifies itself as a
        child class of DateInstanceImp -- this enables calls to Date.ValueOf().
        
        fixes: ecma/Date/15.9.5.js (once we enable the date tests).

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

        
        Reviewed by darin.

        * tests/mozilla/jsDriver.pl: now takes the path to testkjs as a command-line argument
        * tests/mozilla/run-mozilla-tests: Removed.

2005-07-21  Geoffrey Garen  <ggaren@apple.com>

        * JavaScriptCore.xcodeproj/.cvsignore: Added.

2005-07-21  Geoffrey Garen  <ggaren@apple.com>

        * JavaScriptCore.pbproj/project.pbxproj: Removed.
        * JavaScriptCore.xcodeproj/ggaren.pbxuser: Added.
        * JavaScriptCore.xcodeproj/ggaren.perspective: Added.
        * JavaScriptCore.xcodeproj/project.pbxproj: Added.
        * Makefile.am:

2005-07-20  Maciej Stachowiak  <mjs@apple.com>

        Patch from Trey Matteson <trey@usa.net>, reviewed by me.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=3956
        some of WebKit builds with symbols, some doesn't
        
        * JavaScriptCore.pbproj/project.pbxproj: Generate symbols even for
        Deployment.

2005-07-19  Geoffrey Garen  <ggaren@apple.com>

        -fixed http://bugs.webkit.org/show_bug.cgi?id=3991
        JSC doesn't implement Array.prototype.toLocaleString()

        -test failure: ecma_3/Array/15.4.4.3-1.js

        Reviewed by mjs.

        * kjs/array_object.cpp:
        (ArrayProtoFuncImp::call): now searches for toString and
        toLocaleString overrides in the array's elements

        * tests/mozilla/expected.html: failures are under 100! woohoo!

2005-07-19  Darin Adler  <darin@apple.com>

        - fixed the build

        * kjs/lookup.h: (KJS::lookupPut): Remove bogus const; was preventing WebCore from
        compiling (not sure why this didn't affect my other build machine).

        - one other tiny tweak (so sue me)

        * bindings/runtime_root.cpp: Remove unneeded declaration.

2005-07-19  Darin Adler  <darin@apple.com>

        Reviewed by Geoff Garen.

        - eliminated try wrappers for get/put/call since we don't use C++ exceptions any more

        * kjs/lookup.h: Changed tryCall in IMPLEMENT_PROTOFUNC here to call. It doesn't make
        sense for this macro to use the name tryCall anyway, since that's specific to how
        WebCore used this, so this is good anyway. On the other hand, it might be a problem
        for KDOM or KSVG, in which case we'll need another macro for them, since JavaScriptCore
        should presumably not have the C++ exception support.

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

        -fixed http://bugs.webkit.org/show_bug.cgi?id=4008
        Error objects report incorrect length
        
        Reviewed by darin.

        * kjs/error_object.cpp: Error objects now include a length property
        (ErrorObjectImp::ErrorObjectImp):

        * tests/mozilla/expected.html: updated expected results to reflect fix
        * tests/mozilla/js1_5/Exceptions/regress-123002.js: test now expects 
        ecma compliant results

2005-07-15  Geoffrey Garen  <ggaren@apple.com>

        -rolled in KDE fixes for http://bugs.webkit.org/show_bug.cgi?id=3601
        Error instance type info
        
        Reviewed by mjs.

        * kjs/error_object.cpp:
        - Created ErrorInstanceImp class for Error() objects. 
        - Changed parent object for Native Errors to "Function" (matches
        ECMA spec).
        (ErrorInstanceImp::ErrorInstanceImp):
        (ErrorProtoFuncImp::call):
        (ErrorObjectImp::construct):
        (NativeErrorImp::construct):

        * kjs/error_object.h:
        (KJS::ErrorInstanceImp::classInfo):
        * kjs/object.h: made comment more informative about ClassInfo

        * tests/mozilla/expected.html:

2005-07-14  Geoffrey Garen  <ggaren@apple.com>

        - fixed: JS test suite expects an out of memory error
        that our memory efficiency avoids
        
        Reviewed by mjs.

        * tests/mozilla/js1_5/Array/regress-157652.js:
        test now expects normal execution
        
        * tests/mozilla/expected.html:

2005-07-14  Geoffrey Garen  <ggaren@apple.com>
        - fixed http://bugs.webkit.org/show_bug.cgi?id=4006
        testkjs doesn't implement gc()
        
        - test failure:
        ecma_3/Function/regress-104584.js
        
        Reviewed by mjs.

        * kjs/interpreter.cpp:
        (Interpreter::finalCheck): removed misleading while && comment

        * kjs/testkjs.cpp: added "gc" function to global object
        (TestFunctionImp::):
        (TestFunctionImp::call):
        (main):

        * tests/mozilla/expected.html:

2005-07-14  Geoffrey Garen  <ggaren@apple.com>

        -rolled in patches for http://bugs.webkit.org/show_bug.cgi?id=3945
        [PATCH] Safe merges of comments and other trivialities from KDE's kjs
        
        -patch by Martijn Klingens <klingens@kde.org>
        
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        * kjs/array_object.h:
        * kjs/bool_object.cpp:
        * kjs/bool_object.h:
        * kjs/collector.cpp:
        * kjs/collector.h:
        * kjs/completion.h:
        * kjs/context.h:
        * kjs/date_object.cpp:
        * kjs/date_object.h:
        * kjs/debugger.cpp:
        * kjs/debugger.h:
        * kjs/dtoa.h:
        * kjs/error_object.cpp:
        * kjs/error_object.h:
        * kjs/function.cpp:
        * kjs/function.h:
        * kjs/function_object.cpp:
        * kjs/function_object.h:
        * kjs/grammar.y:
        * kjs/identifier.cpp:
        * kjs/identifier.h:
        * kjs/internal.cpp:
        * kjs/internal.h:
        * kjs/interpreter.cpp:
        * kjs/interpreter.h:
        * kjs/interpreter_map.cpp:
        * kjs/interpreter_map.h:
        * kjs/lexer.cpp:
        * kjs/lexer.h:
        * kjs/list.cpp:
        * kjs/list.h:
        * kjs/lookup.cpp:
        * kjs/lookup.h:
        * kjs/math_object.cpp:
        * kjs/math_object.h:
        * kjs/nodes.cpp:
        * kjs/nodes.h:
        * kjs/nodes2string.cpp:
        * kjs/number_object.cpp:
        * kjs/number_object.h:
        * kjs/object.cpp:
        * kjs/object.h:
        * kjs/object_object.cpp:
        * kjs/object_object.h:
        * kjs/operations.cpp:
        * kjs/operations.h:
        * kjs/property_map.cpp:
        * kjs/property_map.h:
        * kjs/reference.cpp:
        * kjs/reference.h:
        * kjs/reference_list.cpp:
        * kjs/reference_list.h:
        * kjs/regexp.cpp:
        * kjs/regexp.h:
        * kjs/regexp_object.cpp:
        * kjs/regexp_object.h:
        * kjs/scope_chain.cpp:
        * kjs/scope_chain.h:
        * kjs/simple_number.h:
        * kjs/string_object.cpp:
        * kjs/string_object.h:
        * kjs/testkjs.cpp:
        * kjs/types.h:
        * kjs/ustring.cpp:
        * kjs/ustring.h:
        * kjs/value.cpp:
        * kjs/value.h:

2005-07-14  Geoffrey Garen  <ggaren@apple.com>

        -fixed http://bugs.webkit.org/show_bug.cgi?id=3970
        throw statements fail inside eval statements
        
        Reviewed by mjs.

        * kjs/function.cpp:
        (KJS::GlobalFuncImp::call):
        Big change since I fixed the tabbing. The important part is:
        if (c.complType() == Throw)
          exec->setException(c.value());

        * kjs/nodes.cpp:
        (ThrowNode::execute): removed duplicate KJS_CHECKEXCEPTION
        (TryNode::execute): 
        try now clears the exception state before the finally block executes,
        and checks the state after the block executes, so that exceptions in
        finally code get caught.

        * tests/mozilla/expected.html:

2005-07-14  Geoffrey Garen  <ggaren@apple.com>
        
        -landed fix for http://bugs.webkit.org/show_bug.cgi?id=3412
        Object.prototype is missing toLocaleString

        - patch by Mark Rowe (bdash) <opendarwin.org@bdash.net.nz>
        
        -layout test info in webcore changelog

        Reviewed by mjs.

        * kjs/object_object.cpp:
        (ObjectPrototypeImp::ObjectPrototypeImp):
        (ObjectProtoFuncImp::call):
        * kjs/object_object.h:
        (KJS::ObjectProtoFuncImp::):

2005-07-12  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by mjs.

        * kjs/function.cpp:
        (KJS::IndexToNameMap::operator[]): fixed infinite recursion
        bug in last checkin

2005-07-12  Geoffrey Garen  <ggaren@apple.com>

        -fixed http://bugs.webkit.org/show_bug.cgi?id=3881
        arguments object should share values with function parameters

        Reviewed by mjs.

        ArgumentsImp now uses a simple hash lookup to share values
        with the activation object.

        * kjs/function.cpp:
        (KJS::FunctionImp::getParameterName):
        (KJS::IndexToNameMap::IndexToNameMap):
        (KJS::IndexToNameMap::~IndexToNameMap):
        (KJS::IndexToNameMap::isMapped):
        (KJS::IndexToNameMap::unMap):
        (KJS::IndexToNameMap::operator[]):
        (KJS::ArgumentsImp::ArgumentsImp):
        (KJS::ArgumentsImp::mark):
        (KJS::ArgumentsImp::get):
        (KJS::ArgumentsImp::put):
        (KJS::ArgumentsImp::deleteProperty):
        (KJS::ArgumentsImp::hasOwnProperty):
        (KJS::ActivationImp::createArgumentsObject):
        * kjs/function.h:
        * tests/mozilla/expected.html: updated results

2005-07-09  Maciej Stachowiak  <mjs@apple.com>

        - backing out my earlier collector change, it causes a performance regression in TOT

        * kjs/collector.cpp:
        (KJS::Collector::allocate):

2005-07-08  Eric Seidel  <eseidel@apple.com>

        Reviewed by mjs/hyatt (only in concept).

        * JavaScriptCore.pbproj/project.pbxproj: Added JavaScriptCore+SVG
        Turns on RTTI support for JavaScriptCore.framework when
        building the JavaScriptCore+SVG target.  This is needed as
        kdom (part of WebCore+SVG) requires RTTI for the time being.

2005-07-08  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by hyatt.

        - When there are many live objects, GC less often, to try to make
        GC cost proportional to garbage, not proportional to total memory used.

        * kjs/collector.cpp:
        (KJS::Collector::allocate):

2005-07-08  Vicki Murley  <vicki@apple.com>

        Fix from Carsten Guenther, reviewed by Maciej

        - fixed http://bugs.webkit.org/show_bug.cgi?id=3644 (Error string representation)

        Switch from "-" to ":" in error strings.

        * kjs/error_object.cpp:
        (ErrorProtoFuncImp::call):
        * tests/mozilla/expected.html:

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

        -rolled in patch for http://bugs.webkit.org/show_bug.cgi?id=3878
        arguments object should be an object not an array

        Reviewed by mjs.

        * kjs/function.cpp:
        (KJS::ArgumentsImp::ArgumentsImp): now manually handles initialization
        we used to get for free by inheriting from ArrayInstanceImp
        * kjs/function.h: ArgumentsImp now inherits from ObjectImp
        * tests/mozilla/expected.html: updated expected test results

2005-07-07  Eric Seidel  <eseidel@apple.com>

        Reviewed by mjs.

        * kjs/grammar.y: removed #define YYMAXDEPTH 0 for bison 2.0
        http://bugs.webkit.org/show_bug.cgi?id=3882

2005-07-03  Maciej Stachowiak  <mjs@apple.com>

        Original patch from Mark Rowe <opendarwin.org@bdash.net.nz>, reviewed by me.
        Fixes to patch by me, reviewed by John Sullivan.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=3293

        Test cases added:
        * tests/mozilla/expected.html: Two tests newly pass.

        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::hasOwnProperty):
        * bindings/runtime_array.cpp:
        (RuntimeArrayImp::hasOwnProperty):
        * bindings/runtime_array.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::hasOwnProperty):
        * bindings/runtime_object.h:
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (ArrayInstanceImp::hasOwnProperty):
        * kjs/function.cpp:
        (KJS::FunctionImp::hasOwnProperty):
        (KJS::ActivationImp::hasOwnProperty):
        * kjs/function.h:
        * kjs/lookup.h:
        * kjs/object.cpp:
        (KJS::ObjectImp::hasProperty):
        (KJS::ObjectImp::hasOwnProperty):
        * kjs/object.h:
        (KJS::Object::hasOwnProperty):
        * kjs/object_object.cpp:
        (ObjectPrototypeImp::ObjectPrototypeImp):
        (ObjectProtoFuncImp::call):
        * kjs/object_object.h:
        (KJS::ObjectProtoFuncImp::):
        * kjs/string_object.cpp:
        (StringInstanceImp::hasOwnProperty):
        * kjs/string_object.h:

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

        -landed patch by Eric Seidel <macdome@opendarwin.org>
        
        -for http://bugs.webkit.org/show_bug.cgi?id=3657
        GroundWork:  Moving some functions from khtml->jsc following kjs TOT
        
        - no layout test necessary yet - only groundwork

        Reviewed by darin.

        * kjs/lookup.h:
        (KJS::cacheGlobalObject):

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

        -landed patch by Carsten Guenther <cguenther@gmail.com>

        -fixes http://bugs.webkit.org/show_bug.cgi?id=3477
        some US-centric date formats not parsed by JavaScript (clock at news8austin.com)

        -relevant tests:
               mozilla/ecma_3/Date/15.9.5.5.js 
               layout-tests/fast/js/date-parse-test.html

        Reviewed by darin.

        * kjs/date_object.cpp:
        (formatLocaleDate):
        (day):
        (dayFromYear):
        (daysInYear):
        (timeFromYear):
        (yearFromTime):
        (weekDay):
        (timeZoneOffset):
        (DateProtoFuncImp::call):
        (DateObjectImp::construct):
        (KJS::parseDate):
        (ymdhms_to_seconds):
        (KJS::makeTime):
        (findMonth):
        (KJS::KRFCDate_parseDate):
        * kjs/date_object.h:
        * tests/mozilla/expected.html: updated expected results to reflect fix

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

        -fixed <rdar://problem/4168186> JavaScript fails to throw exceptions 
        for invalid return statements
        
        relevant tests:
            ecma/Statements/12.9-1-n.js
            ecma_2/Exceptions/lexical-052.js
            ecma_2/Exceptions/statement-009.js

        Reviewed by sullivan.

        * kjs/nodes.cpp:
        (ReturnNode::execute): now throws exception if return is not inside
        a function.

        * tests/mozilla/expected.html: updated to reflect fix

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

        Reviewed by sullivan.

        * tests/mozilla/expected.html: Updated test results for last fix.

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

        -fixed <rdar://problem/4168161> JavaScript fails to throw an exception 
        for invalid function calls
        
        Reviewed by sullivan.

        Relevant mozilla test: ecma_3/Exceptions/regress-95101.js 

        * kjs/nodes.cpp:
        (FunctionCallNode::evaluate): evaluate now checks for an exception
        after resolving a function name (in case the function is undefined)

2005-07-01  Eric Seidel  <eseidel@apple.com>

        Reviewed by darin.

        * kjs/interpreter.h:
        (KJS::Context::curStmtFirstLine): stub for compatibility with KDE
        * kjs/value.h:
        (KJS::Value::isValid): compatibility with KDE
        http://bugs.webkit.org/show_bug.cgi?id=3687

2005-07-01  Eric Seidel  <eseidel@apple.com>

        Reviewed by darin.

        * kjs/create_hash_table: rolled in changes from KDE, including
        -n <namespace> support from KDOM and support for newer comments
        http://bugs.webkit.org/show_bug.cgi?id=3771

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

        -rolled in KDE fix to <rdar://problem/4167660> JavaScript fails to 
        throw exceptions for invalid break/continue statements

        No layout tests because it's already covered by the Mozilla suite

        Reviewed by mjs.

        * kjs/internal.h: LabelStack now tracks where you are relative to
        switch and iteration (loop) statements
        
        (KJS::LabelStack::LabelStack):
        (KJS::LabelStack::pushIteration):
        (KJS::LabelStack::popIteration):
        (KJS::LabelStack::inIteration):
        (KJS::LabelStack::pushSwitch):
        (KJS::LabelStack::popSwitch):
        (KJS::LabelStack::inSwitch):

        * kjs/nodes.cpp: 
        These files were updated to use the new LabelStack:
        (DoWhileNode::execute): 
        (WhileNode::execute):
        (ForNode::execute):
        (ForInNode::execute):
        (SwitchNode::execute):
        
        These files were updated to throw exceptions for invalid
        break/continue statements:
        (BreakNode::execute): 
        (ContinueNode::execute):

        * tests/mozilla/expected.html: Updated expected results to reflect fix

2005-06-30  Kevin Decker  <kdecker@apple.com>

        Reviewed by rjw.

        fixed: <rdar://problem/4166838> failed assertion in`Interpreter::lockCount() > 0

        no layout test added; this is in the bindings code.

        * bindings/objc/WebScriptObject.mm:
        (+[WebScriptObject _convertValueToObjcValue:KJS::originExecutionContext:Bindings::executionContext:Bindings::]): make sure to lock and unlock the interpreter around allocations. 

2005-06-29  Geoffrey Garen  <ggaren@apple.com>

        Patch by Francisco Tolmasky <tolmasky@gmail.com>

        - fixes http://bugs.webkit.org/show_bug.cgi?id=3667
        Core JavaScript 1.5 Reference:Objects:Array:forEach

        See WebCore Changelog for layout tests added.

        Reviewed by darin.

        * kjs/array_object.cpp:
        (ArrayProtoFuncImp::call):
        * kjs/array_object.h:
        (KJS::ArrayProtoFuncImp::):

2005-06-29  Geoffrey Garen  <ggaren@apple.com>

        Patch contributed by Oliver Hunt <ojh16@student.canterbury.ac.nz>

        -fixed http://bugs.webkit.org/show_bug.cgi?id=3743
        Incorrect error message given for certain calls

        See WebCore Changelog for layout test added.

        Reviewed by mjs.

        * kjs/object.cpp:
        (KJS::ObjectImp::defaultValue):

2005-06-29  Geoffrey Garen  <ggaren@apple.com>

        Rolling out date patch from 6-28-05 because it breaks 
        fast/js/date-parse-test

        * kjs/date_object.cpp:
        (formatLocaleDate):
        (DateProtoFuncImp::call):
        (DateObjectImp::construct):
        (KJS::parseDate):
        (ymdhms_to_seconds):
        (isSpaceOrTab):
        (KJS::KRFCDate_parseDate):
        * kjs/date_object.h:
        * tests/mozilla/expected.html:

2005-06-29  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin.

        -fixes http://bugs.webkit.org/show_bug.cgi?id=3750
        build fails with KJS_VERBOSE set

        * kjs/nodes.cpp: changed debug print statement to use UString
        (VarDeclNode::evaluate):
        * kjs/reference.cpp: ditto
        (KJS::Reference::putValue):

2005-06-28  Geoffrey Garen  <ggaren@apple.com>

        Patch contributed by Carsten Guenther <cguenther@gmail.com>.

        -fixes http://bugs.webkit.org/show_bug.cgi?id=3477
        some US-centric date formats not parsed by JavaScript (clock at news8austin.com)

        Reviewed by darin.

        * kjs/date_object.cpp:
        (formatLocaleDate):
        (day):
        (dayFromYear):
        (daysInYear):
        (timeFromYear):
        (yearFromTime):
        (weekDay):
        (timeZoneOffset):
        (DateProtoFuncImp::call):
        (DateObjectImp::construct):
        (KJS::parseDate):
        (ymdhms_to_seconds):
        (KJS::makeTime):
        (findMonth):
        (KJS::KRFCDate_parseDate):
        * kjs/date_object.h:
        * tests/mozilla/expected.html: updated expected test results to reflect fix

2005-06-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - replace hash functions  with better ones

        * JavaScriptCore.pbproj/project.pbxproj: Add new file to build.
        * kjs/interpreter_map.cpp:
        (KJS::InterpreterMap::computeHash): Use shared pointer hash.
        * kjs/pointer_hash.h: Added.
        (KJS::pointerHash): Pointer hash based on 32-bit mix and 64-bit mix hashes.
        * kjs/protected_values.cpp:
        (KJS::ProtectedValues::computeHash): Use shared pointer hash.
        * kjs/ustring.cpp:
        (KJS::UString::Rep::computeHash): Use SuperFastHash algorithm.

2005-06-22  Darin Adler  <darin@apple.com>

        Change by Anders Carlsson.
        Reviewed by me.

        - fixed <http://bugs.webkit.org/show_bug.cgi?id=3294>
          String.prototype.replace() fails with function as second param

        * kjs/string_object.cpp: (replace): Added code to handle functions.

        * tests/mozilla/expected.html: Updated since ecma_3/RegExp/regress-209067.js is fixed now.

        * tests/mozilla/run-mozilla-tests: Fix a minor coding style issue that leads to a warning each
        time we run the tests.

2005-06-21  Adele Peterson  <adele@apple.com>

        rolling out fix for http://bugs.webkit.org/show_bug.cgi?id=3293, since it caused layout test failures.
        fast/forms/element-by-name
        fast/loader/loadInProgress

        * ChangeLog:
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::hasProperty):
        * bindings/runtime_array.cpp:
        (RuntimeArrayImp::hasProperty):
        * bindings/runtime_array.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::hasProperty):
        * bindings/runtime_object.h:
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (ArrayInstanceImp::hasProperty):
        * kjs/function.cpp:
        (KJS::FunctionImp::hasProperty):
        (KJS::ActivationImp::hasProperty):
        * kjs/function.h:
        * kjs/object.cpp:
        (KJS::ObjectImp::hasProperty):
        * kjs/object.h:
        * kjs/object_object.cpp:
        (ObjectPrototypeImp::ObjectPrototypeImp):
        (ObjectProtoFuncImp::call):
        * kjs/object_object.h:
        (KJS::ObjectProtoFuncImp::):
        * kjs/string_object.cpp:
        (StringInstanceImp::hasProperty):
        * kjs/string_object.h:
        * tests/mozilla/expected.html:

2005-06-21  Darin Adler  <darin@apple.com>

        * JavaScriptCore.pbproj/project.pbxproj: Switched to a build rule rather than a build phase for
        .y files -- this gets rid of the problem where modifying the .y file would not cause sufficient
        compilation.

        * kjs/grammar_wrapper.cpp: Removed.

2005-06-21  Adele Peterson  <adele@apple.com>

        Patch from Anders Carlsson <andersca@mac.com>, reviewed by Darin.

        Fixed: <http://bugs.webkit.org/show_bug.cgi?id=3450>
        <rdar://problem/3881901> String.replace() method not working when regex pattern contains {n, m}

        * pcre/pcre.c: (pcre_compile): Remember the last char length so it can be subtracted correctly if needed.

2005-06-21  Geoffrey Garen  <ggaren@apple.com>

        - fixed <rdar://problem/4155532> 'delete' succeeds on functions
        - fixed <rdar://problem/4155049> javascript function named as "opener" doesn't get called because of window.opener property
        
        Reviewed by cblu.

        * kjs/nodes.cpp:
        (FuncDeclNode::processFuncDecl): Functions now have DontDelete and Internal attributes set when appropriate.

        Test cases:
        * tests/mozilla/expected.html: Updated for one new success.
        - see also test case added in WebCore.

2005-06-20  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin(first pass) and Hyatt.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=3576
        (roll in support for "const" keyword from KDE tree)
        - make processVarDecls handle deletability of variables declared
        in an eval block the same as evaluate would
        - make eval() call processVarDecls - needed to match mozilla and
        to make the second change testable

        I started with the KDE implementation of const but I ended up changing it a bit
        to avoid the use of a global variable. Now instead of the global variable it distinguishes
        const and var at the grammar level so the appropriate node can know the right kind of
        declaration.

        Test cases:
        * tests/mozilla/expected.html: Updated for one new test that is
        failing - we used to bail on it entirely because it checks for
        const support before starting.
        - see also test cases added in WebCore

        * kjs/grammar.y: Add rules for const declarations.
        * kjs/keywords.table: Add const keyword.
        * kjs/nodes.cpp:
        (VarDeclNode::VarDeclNode): Add parameter.
        (VarDeclNode::evaluate): Add const support.
        (VarDeclNode::processVarDecls): Add const support.
        (VarStatementNode::execute): Irrelevant change.
        (ForInNode::ForInNode): Tell our variable node that it's a variable.
        * kjs/nodes.h:
        (KJS::VarDeclNode::): Add declaration of type enum, extra constructor parameter.
        (KJS::VarStatementNode::VarStatementNode): Irrelevant change.
        * kjs/function.cpp:
        (KJS::GlobalFuncImp::call): Process var decls before evaluating.

2005-06-20  Maciej Stachowiak  <mjs@apple.com>

        Patch from Mark Rowe <opendarwin.org@bdash.net.nz>, reviewed by me.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=3293
        
        Test cases added: 
        * tests/mozilla/expected.html: Updated for two fixed tests.
        - also added a layout test

        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::hasOwnProperty):
        * bindings/runtime_array.cpp:
        (RuntimeArrayImp::hasOwnProperty):
        * bindings/runtime_array.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::hasOwnProperty):
        * bindings/runtime_object.h:
        * kjs/array_instance.h:
        * kjs/array_object.cpp:
        (ArrayInstanceImp::hasOwnProperty):
        * kjs/function.cpp:
        (KJS::FunctionImp::hasOwnProperty):
        (KJS::ActivationImp::hasOwnProperty):
        * kjs/function.h:
        * kjs/object.cpp:
        (KJS::ObjectImp::hasProperty):
        (KJS::ObjectImp::hasOwnProperty):
        * kjs/object.h:
        (KJS::Object::hasOwnProperty):
        * kjs/object_object.cpp:
        (ObjectPrototypeImp::ObjectPrototypeImp):
        (ObjectProtoFuncImp::call):
        * kjs/object_object.h:
        (KJS::ObjectProtoFuncImp::):
        * kjs/string_object.cpp:
        (StringInstanceImp::hasOwnProperty):
        * kjs/string_object.h:

2005-06-18  Darin Adler  <darin@apple.com>

        Reviewed by Eric Seidel.

        * pcre/get.c: (pcre_get_substring): Fix some computations so this works for UTF-16.
        This is unused in the current JavaScriptCore, but still good to fix.

2005-06-18  Darin Adler  <darin@apple.com>

        Change by Finlay Dobbie.
        Reviewed by me.

        - fixed <http://bugs.webkit.org/show_bug.cgi?id=3331>
          10.3.9 Build Failure: NSString may not respond to `+stringWithCString:encoding:'

        * bindings/objc/WebScriptObject.mm: (-[WebScriptObject stringRepresentation]):
        Undo change we did a while back to work around the gcc 3.3 compiler error.
        It no longer seems to happen, and the workaround code was 10.4-specific.

2005-06-16  Geoffrey Garen  <ggaren@apple.com>

        Fixed: <rdar://problem/4151759> 'delete' fails on variables declared inside 'eval' statements.

        Reviewed by cblu.

        * kjs/context.h:
        (KJS::ContextImp::codeType): Added code type accessor for execution context objects.
        * kjs/internal.cpp:
        (ContextImp::ContextImp): Reflects change to ContextImp::codeType.
        * kjs/nodes.cpp:
        (VarDeclNode::evaluate): Added separate code path for variable declarations inside 'eval' statements.
        * tests/mozilla/expected.html: Updated expected test results to reflect fix.

2005-06-14  Geoffrey Garen  <ggaren@apple.com>

        Updated expected.html to reflect fix to <rdar://problem/4147745>.

        Reviewed by cblu.

        * tests/mozilla/expected.html:

2005-06-14  Geoffrey Garen  <ggaren@apple.com>

        Fixed: <rdar://problem/4147745> JavaScript discards locally defined "arguments" property

        No layout tests added because this change fixes existing tests:
        ecma/ExecutionContexts/10.1.6.js
        ecma_3/Function/regress-94506.js
        js1_4/Functions/function-001.js

        Reviewed by cblu.

        * kjs/function.cpp:
        (KJS::ActivationImp::get): get now checks for an "arguments" property defined in the local variable object
        before trying to return the built-in arguments array.
        
        * kjs/function.h: ActivationImp::put no longer overrides ObjectImp::put

2005-06-10  Darin Adler  <darin@apple.com>

        Change by Mark Rowe <opendarwin.org@bdash.net.nz>.
        Reviewed by me.

        - further improvements to exception file/line number fix

        * kjs/nodes.h: Added setExceptionDetailsIfNeeded function.
        * kjs/nodes.cpp: Updated macros to call the new setExceptionDetailsIfNeeded function.
        (Node::setExceptionDetailsIfNeeded): Added.

2005-06-09  Darin Adler  <darin@apple.com>

        Change by Mark Rowe <opendarwin.org@bdash.net.nz>
        Reviewed by me.

        * kjs/nodes.cpp: Get rid of unneeded this->.

2005-06-08  Maciej Stachowiak  <mjs@apple.com>

        Change by Mark Rowe <opendarwin.org@bdash.net.nz>
        Reviewed by me.

        - fixed http://bugs.webkit.org/show_bug.cgi?id=3327
        (Exception When Setting Style to Invalid Value Lacks Line/File Information)

        * kjs/nodes.cpp: Include source file and line number when making exception in
        KJS_CHECKEXCEPTIONVALUE.

2005-06-07  Darin Adler  <darin@apple.com>

        Change by Toby Peterson <toby@opendarwin.org>.
        Reviewed by me.

        * JavaScriptCore.pbproj/project.pbxproj: Allow bison 2.0, which generates the file
        with a different name.

2005-06-07  Darin Adler  <darin@apple.com>

        Change by Toby Peterson <toby@opendarwin.org>.
        Reviewed by me.

        * kjs/grammar.y: Remove bogus extra line from grammar.y. Toby got this change from KDE KJS.

2005-06-06  Darin Adler  <darin@apple.com>

        * tests/mozilla/run-mozilla-tests: Wrote a perl version of this so we don't require
        the "jst" tool to run the tests.

2005-06-04  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - add libicu headers

        * JavaScriptCore.pbproj/project.pbxproj: Added icu directory to header search path.

        * icu/README: Added.
        * icu/unicode/platform.h: Added.
        * icu/unicode/uchar.h: Added.
        * icu/unicode/uconfig.h: Added.
        * icu/unicode/umachine.h: Added.
        * icu/unicode/urename.h: Added.
        * icu/unicode/utf.h: Added.
        * icu/unicode/utf16.h: Added.
        * icu/unicode/utf8.h: Added.
        * icu/unicode/utf_old.h: Added.
        * icu/unicode/utypes.h: Added.
        * icu/unicode/uversion.h: Added.

2005-05-19  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.
        
        - turned off exceptions and RTTI; seems to cut JavaScriptCore code size by about 22%

        * JavaScriptCore.pbproj/project.pbxproj: Turn off exceptions and RTTI for both
        the framework and testkjs tool.

2005-05-18  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - got rid of code that depended on RTTI

        * kjs/collector.cpp:
        (KJS::className): Added. Gets class name in a KJS way, rather than a C++ RTTI way.
        (KJS::Collector::rootObjectClasses): Use className instead of typeid names.

2005-05-18  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fix a failure seen in the Mozilla JavaScript tests where a live object was garbage-collected
          when the only reference to it was in an argList on the stack

        * kjs/list.h: Moved the operator= function into the .cpp file since it's too big to be
        a good choice to inline.
        * kjs/list.cpp: (KJS::List::operator=): Moved this formerly-inline function into a separate
        file and added missing code to update valueRefCount. It's the latter that fixes the bug.

2005-05-16  Darin Adler  <darin@apple.com>

        Reviewed by Adele.

        - fixed issues preventing us from compiling with newer versions of gcc 4.0

        * kjs/ustring.cpp:
        (KJS::operator==): Remove redundant and illegal KJS:: prefix on this function's definition.
        (KJS::operator<): Ditto.
        (KJS::compare): Ditto.

2005-05-09  Darin Adler  <darin@apple.com>

        Reviewed by John.

        - turn on conservative GC unconditionally and start on SPI changes to
          eliminate the now-unneeded smart pointers since we don't ref count any more

        * kjs/value.h: Removed macros to turn conservative GC on and off.
        Removed ref and deref functions.
        (KJS::ValueImp::ValueImp): Removed non-conservative-GC code path.
        (KJS::ValueImp::isUndefined): Added. New SPI to make it easier to deal with ValueImp directly.
        (KJS::ValueImp::isNull): Ditto.
        (KJS::ValueImp::isBoolean): Ditto.
        (KJS::ValueImp::isNumber): Ditto.
        (KJS::ValueImp::isString): Ditto.
        (KJS::ValueImp::isObject): Ditto.
        (KJS::Value::Value): Removed non-conservative-GC code path and made constructor no
        longer explicit so we can quietly create Value wrappers from ValueImp *; inexpensive with
        conservative GC and eases the transition.
        (KJS::Value::operator ValueImp *): Added. Quietly creates ValueImp * from Value.
        (KJS::ValueImp::marked): Removed non-conservative-GC code path.

        * kjs/value.cpp:
        (KJS::ValueImp::mark): Removed non-conservative-GC code path.
        (KJS::ValueImp::isUndefinedOrNull): Added. New SPI to make it easier to deal with ValueImp directly.
        (KJS::ValueImp::isBoolean): Ditto.
        (KJS::ValueImp::isNumber): Ditto.
        (KJS::ValueImp::isString): Ditto.
        (KJS::ValueImp::asString): Ditto.
        (KJS::ValueImp::isObject): Ditto.
        (KJS::undefined): Ditto.
        (KJS::null): Ditto.
        (KJS::boolean): Ditto.
        (KJS::string): Ditto.
        (KJS::zero): Ditto.
        (KJS::one): Ditto.
        (KJS::two): Ditto.
        (KJS::number): Ditto.

        * kjs/object.h: Made constructor no longer explicit so we can quietly create Object
        wrappers from ObjectImp *; inexpensive with conservative GC and eases the transition.
        (KJS::Object::operator ObjectImp *): Added. Quietly creates ObjectImp * from Object.
        (KJS::ValueImp::isObject): Added. Implementation of new object-related ValueImp function.
        (KJS::ValueImp::asObject): Ditto.

        * kjs/object.cpp:
        (KJS::ObjectImp::setInternalValue): Remove non-conservative-GC code path.
        (KJS::ObjectImp::putDirect): Ditto.
        (KJS::error): Added. Function in the new SPI style to create an error object.

        * kjs/internal.h: Added the new number-constructing functions as friends of NumberImp.
        There may be a more elegant way to do this later; what's important now is the new SPI.

        * kjs/collector.h:  Remove non-conservative-GC code path and also take out some
        unneeded APPLE_CHANGES.

        * bindings/runtime_root.cpp:
        (KJS::Bindings::addNativeReference): Remove non-conservative-GC code path.
        (KJS::Bindings::removeNativeReference): Ditto.
        (RootObject::removeAllNativeReferences): Ditto.
        * bindings/runtime_root.h:
        (KJS::Bindings::RootObject::~RootObject): Ditto.
        (KJS::Bindings::RootObject::setRootObjectImp): Ditto.
        * kjs/collector.cpp:
        (KJS::Collector::allocate): Ditto.
        (KJS::Collector::collect): Ditto.
        (KJS::Collector::numGCNotAllowedObjects): Ditto.
        (KJS::Collector::numReferencedObjects): Ditto.
        (KJS::Collector::rootObjectClasses): Ditto.
        * kjs/internal.cpp:
        (NumberImp::create): Ditto.
        (InterpreterImp::globalInit): Ditto.
        (InterpreterImp::globalClear): Ditto.
        * kjs/list.cpp:
        (KJS::List::markProtectedLists): Ditto.
        (KJS::List::clear): Ditto.
        (KJS::List::append): Ditto.
        * kjs/list.h:
        (KJS::List::List): Ditto.
        (KJS::List::deref): Ditto.
        (KJS::List::operator=): Ditto.
        * kjs/protect.h:
        (KJS::gcProtect): Ditto.
        (KJS::gcUnprotect): Ditto.

2005-05-09  Chris Blumenberg  <cblu@apple.com>

        Workaround gcc 3.3 internal compiler errors.

        Reviewed by darin.

        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject stringRepresentation]): call [NSString stringWithCString:encoding] rather than using @""

2005-05-09  Darin Adler  <darin@apple.com>

        * Makefile.am: Don't set up PBXIntermediatesDirectory explicitly;
        Not needed to make builds work, spews undesirable error messages too.

2005-05-06  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - make building multiple trees with make work better

        * Makefile.am: Set up Xcode build directory before invoking xcodebuild.

2005-05-04  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        <rdar://problem/4086570> Crash in JavaScriptCore with RSS Visualizer
        
        * kjs/internal.cpp:
        (InterpreterImp::mark): mark staticNaN, it is usually protected by the Number
        prototype but there is a small window where it can get collected.

2005-05-04  Darin Adler  <darin@apple.com>

        Reviewed by Dave Hyatt.

        - another gcc-4.0-related fix

        * bindings/runtime_root.h: Take off extra namespace prefixes that apparently cause problems
        compiling with gcc 4.0, although I have not observed the problems.

2005-05-04  Darin Adler  <darin@apple.com>

        Reviewed by Dave Hyatt.

        - fixed build rules to match other projects

        * JavaScriptCore.pbproj/project.pbxproj: Set deployment target to 10.3 in the build styles.
        When built without a build style (by Apple B&I) we want to get the target from the
        environment. But when built with a build style (by Safari engineers and others), we want
        to use 10.3.

        * Makefile.am: Took out extra parameters that make command-line building different from
        Xcode building. Now that this is fixed, you should not get a full rebuild if you switch
        from command line to Xcode or back.

2005-05-04  Maciej Stachowiak  <mjs@apple.com>

        - revert presumably accidental change to mozilla JS test expected results, this
        was making the tests fail.

        * tests/mozilla/expected.html:

2005-05-03  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/4102644> Crash in LiveConnect below KJS::Bindings::JavaInstance::stringValue() const

        Correctly handle accessing nil objects from a Java object array.

        Reviewed by John.

        * bindings/jni/jni_runtime.cpp:
        (JavaArray::valueAt):

2005-05-01  Darin Adler  <darin@apple.com>

        - move to Xcode native targets and stop checking in generated files

        * JavaScriptCore.pbproj/project.pbxproj: Updated to use native targets and generate all the generated
        files, so we don't have to check them in any more.
        * Info.plist: Added. Native targets use a separate file for this.

        * Makefile.am: Removed pcre and kjs SUBDIRS. Also removed code that deleted the embedded copy of this
        framework, since we haven't been embedding it for some time.

        * kjs/grammar_wrapper.cpp: Added. Shell used to compile grammar.cpp since we can't add a generated file
        easily to the list of files to be compiled.

        * kjs/.cvsignore: Removed.
        * kjs/Makefile.am: Removed.
        * kjs/array_object.lut.h: Removed.
        * kjs/date_object.lut.h: Removed.
        * kjs/grammar.cpp: Removed.
        * kjs/grammar.cpp.h: Removed.
        * kjs/grammar.h: Removed.
        * kjs/lexer.lut.h: Removed.
        * kjs/math_object.lut.h: Removed.
        * kjs/number_object.lut.h: Removed.
        * kjs/string_object.lut.h: Removed.
        * pcre/.cvsignore: Removed.
        * pcre/Makefile.am: Removed.
        * pcre/chartables.c: Removed.

2005-04-28  Darin Adler  <darin@apple.com>

        Reviewed by Dave Harrison.

        - fixed problems preventing us from compiling with gcc 4.0

        * JavaScriptCore.pbproj/project.pbxproj: Removed -Wmissing-prototypes from
        WARNING_CPLUSPLUSFLAGS since it's now a C-only warning.

        * bindings/jni/jni_jsobject.cpp:
        (JSObject::getSlot): Changed some %d to %ld where the parameters where long ints.
        (JSObject::setSlot): Ditto.
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::getJavaVM): Ditto.
        (KJS::Bindings::getJNIEnv): Ditto.
        * bindings/objc/objc_utility.mm: Fixed include of <JavascriptCore/internal.h> that needed the
        letter "S" capitalized.
        * kjs/bool_object.cpp: (BooleanProtoFuncImp::call): Rearranged how this function returns to
        avoid incorrect gcc 4.0 warning.
        * kjs/collector.cpp: (KJS::Collector::markStackObjectsConservatively): Changed code to check
        the alignment of the passed-in pointers to only require pointer-level alignment, not 8-byte alignment.
        Prevents a crash on garbage collect when compiled with gcc 4.0.
        * kjs/nodes.cpp:
        (WhileNode::execute): Added a redundant return after an infinite loop to work around incorrect gcc 4.0 warning.
        (ForNode::execute): Ditto.
        (SwitchNode::execute):Rearranged how this function returns to avoid incorrect gcc 4.0 warning.
        (LabelNode::execute): Ditto.
        * kjs/string_object.cpp: (replace): Ditto.

2005-04-26  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/4098713> Scripting API is incompatible with Mozilla
        
        We were incompatible with Mozilla's implementation of the scripting APIs in
        two ways:

        Their NPN_SetException has the following signature:

            void NPN_SetException(NPObject *npobj, const NPUTF8 *message);

        ours has:

            void NPN_SetException (NPObject * npobj, const NPString *message);

        Also, they expect the string returned from NPN_UTF8FromIdentifier() to be freed by caller.
        We do not.

        I changed both behaviors to match Mozilla.

        Reviewed by Chris.

        * bindings/NP_jsobject.cpp:
        (_NPN_SetException):
        * bindings/npruntime.cpp:
        (_NPN_UTF8FromIdentifier):
        (_NPN_IntFromIdentifier):
        (_NPN_SetExceptionWithUTF8):
        * bindings/npruntime.h:
        * bindings/npruntime_impl.h:

2005-04-26  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Chris.

        <rdar://problem/4092136> reproducible crash in KJS::kjs_fast_realloc loading maps.google.com
        
        * kjs/string_object.cpp:
        (StringObjectFuncImp::call): Allocate adopted ustring buffer properly.

2005-04-22  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        * kjs/ustring.cpp: (KJS::UString::UTF8String): Fix off-by-one error in surrogate pair logic.

2005-04-22  Darin Adler  <darin@apple.com>

        Reviewed by John.

        - fixed <rdar://problem/4090046> JavaScript throw statement causes parse error when no semicolon is present

        * kjs/grammar.y: Added an additional rule for throw like the ones we have for all the other semicolon rules.
        Not sure why we missed this one earlier.

        * kjs/grammar.cpp: Regenerated.

=== JavaScriptCore-412.1 ===

2005-04-20  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - speedups, total 12% on JavaScript iBench

        I ran the benchmark under Shark and followed its advice a lot, mainly.

        * kjs/collector.cpp:
        (KJS::Collector::allocate): Take out special case for 0; costing speed but unexercised.
        Use numLiveObjectsAtLastCollect instead of numAllocationsSinceLastCollect so we don't
        have to bump it each time we call allocate. Put numLiveObjects into a local variable to
        cut down on global variable accesses. Make "next" cell pointer be a byte offset rather
        than a pointer so we don't need a special case for NULL. Allow freeList to point to some
        bogus item when the entire block is full rather than going out of our way to make it
        point to NULL.
        (KJS::Collector::markProtectedObjects): Get table size and pointer into locals outside
        the loop to avoid re-loading them over and over again.
        (KJS::Collector::collect): Put numLiveObjects into a local variable to cut down on global
        variable accesses. Make "next" cell pointer be a byte offset as above. Put numLiveObjects
        into a local variable to cut down on global variable accesses. Set numLiveObjectsAtLastCollect
        rather than numAllocationsSinceLastCollect.
        (KJS::Collector::numReferencedObjects): Get table size and pointer into locals outside
        the loop to avoid re-loading them over and over again.
        (KJS::Collector::rootObjectClasses): Ditto.

        * kjs/internal.h: Make Value be a friend of NumberImp so it can construct number objects
        directly, avoiding the conversion from Number to Value.

        * kjs/internal.cpp: (StringImp::toObject): Don't use Object::dynamicCast, because we know
        the thing is an object and we don't want to do all the extra work; just cast directly.

        * kjs/list.cpp: (KJS::List::List): Construct valueRefCount in a way that avoids the need for
        a branch -- in the hot case this just meant avoiding checking a variable we just set to false.

        * kjs/lookup.cpp: (keysMatch): Marked this inline.

        * kjs/nodes.cpp: Disabled KJS_BREAKPOINT, to avoid calling hitStatement all the time.
        (BooleanNode::evaluate): Make a Value directly, rather than making a Boolean which is converted
        into a Value.
        (NumberNode::evaluate): Ditto.
        (StringNode::evaluate): Ditto.
        (ArrayNode::evaluate): Ditto.
        (FunctionCallNode::evaluate): Use new inline baseIfMutable to avoid unnecessary getBase function.
        Also just use a pointer for func, rather than an Object.
        (PostfixNode::evaluate): Change code so that it doesn't make an excess Number, and so that it
        passes a "known to be integer" boolean in, often avoiding a conversion from floating point to
        integer and back.
        (DeleteNode::evaluate): Make a Value directly.
        (TypeOfNode::evaluate): Use new inline baseIfMutable and make Value directly.
        (PrefixNode::evaluate): Change code so that it doesn't make an excess Number, and so that it
        passes a "known to be integer" boolean in, often avoiding a conversion from floating point to
        integer and back.
        (UnaryPlusNode::evaluate): Make a Value directly.
        (NegateNode::evaluate): Change code so that it doesn't make an excess Number, and so that it
        passes a "known to be integer" boolean in, often avoiding a conversion from floating point to
        integer and back.
        (BitwiseNotNode::evaluate): Make a Value directly.
        (LogicalNotNode::evaluate): Ditto.
        (ShiftNode::evaluate): Don't convert to a double before making a Value.
        (RelationalNode::evaluate): Make a Value directly.
        (EqualNode::evaluate): Ditto.
        (BitOperNode::evaluate): Ditto.
        (AssignNode::evaluate): Make a Value directly. Change code so that it passes a "known to be integer"
        boolean in, often avoiding a conversion from floating point to integer and back.
        (VarDeclNode::evaluate): Make a Value directly.
        (ForNode::execute): Remove unused local variable.

        * kjs/operations.h:
        (KJS::isNaN): Inlined.
        (KJS::isInf): Ditto.
        (KJS::isPosInf): Ditto.
        (KJS::isNegInf): Ditto.

        * kjs/operations.cpp: Change isNaN, isInf, isPosInf, and isNegInf to be inlines.
        (KJS::equal): Rewrite to avoid creating values and recursing back into the function.
        (KJS::relation): Rearranged code so that we don't need explicit isNaN checks.
        (KJS::add): Changed code to make Value directly, and so that it passes a "known to be integer"
        boolean in, often avoiding a conversion from floating point to integer and back.
        (KJS::mult): Ditto.

        * kjs/property_map.cpp:
        (KJS::PropertyMap::~PropertyMap): Get size and entries pointer outside loop to avoid
        re-getting them inside the loop.
        (KJS::PropertyMap::clear): Ditto. Clear value pointer in addition to key, so we can just
        look at the value pointer in the mark function.
        (KJS::PropertyMap::get): Get sizeMask and entries pointer outside loop to avoid
        re-getting them inside the loop.
        (KJS::PropertyMap::put): Ditto.
        (KJS::PropertyMap::insert): Ditto.
        (KJS::PropertyMap::remove): Ditto.
        (KJS::PropertyMap::mark): Get size and entries pointer outside loop to avoid
        re-getting them inside the loop. Don't bother checking key for 0, since we already have
        to check value for 0. (Also had to change clear() to set value to 0.)
        (KJS::PropertyMap::addEnumerablesToReferenceList): Get size and entries pointer outside
        loop to avoid re-getting them inside the loop.
        (KJS::PropertyMap::addSparseArrayPropertiesToReferenceList): Ditto.
        (KJS::PropertyMap::save): Ditto.

        - other changes

        * kjs/protected_values.h: Remove unneeded class name qualifiers.

        * kjs/reference.h:
        (KJS::Reference::baseIfMutable): New inline function: replaces isMutable().
        (KJS::Reference::Reference): Inlined.
        * kjs/reference.cpp:
        (KJS::Reference::getValue): Rewrite to not use getBase.
        (KJS::Reference::putValue): Ditto.
        (KJS::Reference::deleteValue): Dittol

        * kjs/simple_number.h:
        (KJS::SimpleNumber::integerFits): Added. For use when the parameter is known to be integral.

        * kjs/string_object.cpp: (StringProtoFuncImp::call): Create the number without first converting
        to double in various cases that involve integers.

        * kjs/ustring.h:
        (KJS::UString::attach): Inlined.
        (KJS::UString::release): Inlined.
        * kjs/ustring.cpp:
        (KJS::UString::find): Get first character outside the loop instead of re-fetching it each time.

        * kjs/value.cpp:
        (Value::Value): Added overloads for all the various specific types of values, so you don't have
        to convert from, say, Number to Value, just to create one.
        (Number::Number): Added an overload that takes a boolean to indicate the number is already
        known to be an integer.

        * kjs/value.h: Added more Value constructors, added a version of toNumber that returns
        a boolean to indicate if the number is known to be an integer (because it was a "simple number").
        (KJS::ValueImp::marked): Inlined.
        (KJS::ValueImp::dispatchType): Inlined.
        (KJS::ValueImp::dispatchToPrimitive): Inlined.
        (KJS::ValueImp::dispatchToBoolean): Inlined.
        (KJS::ValueImp::dispatchToNumber): Inlined.
        (KJS::ValueImp::dispatchToString): Inlined.
        (KJS::ValueImp::dispatchToUInt32): Inlined.

2005-04-14  Maciej Stachowiak  <mjs@apple.com>

        - make fast_malloc.h a private header, not project

        * JavaScriptCore.pbproj/project.pbxproj:

2005-04-12  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Richard.

        <rdar://problem/4089734> JavaScript iBench can be sped up ~10% with custom allocator

        - use custom single-threaded malloc for all non-GC JavaScriptCore
        allocations, for a 9.1% speedup on JavaScript iBench
        
        * JavaScriptCore.pbproj/project.pbxproj:
        * kjs/collector.cpp:
        (KJS::Collector::allocate): Use dlmalloc to allocate the collector blocks.
        (KJS::Collector::collect): And dlfree to free it.
        * kjs/fast_malloc.cpp: Added, just the standard dlmalloc here.
        * kjs/fast_malloc.h: Added. Declarations for the functions. Also added a handy
        macro to give a class custom operator new/delete
        * kjs/identifier.cpp:
        (KJS::Identifier::add): Use dlmalloc/dlfree.
        * kjs/nodes.h: make nodes KJS_FAST_ALLOCATED.
        * kjs/property_map.cpp:
        (KJS::PropertyMap::~PropertyMap): Use dlmalloc/dlfree.
        (KJS::PropertyMap::rehash): ditto
        * kjs/scope_chain.h:
        * kjs/ustring.cpp:
        (KJS::UString::Rep::createCopying): New named constructor that copies a passed-in
        buffer, to hide allocation details from webcore.
        (KJS::UString::UString): use createCopying when appropriate.
        (KJS::UString::Rep::destroy): Use dlmalloc/dlfree.
        (KJS::UString::expandedSize): likewise
        (KJS::UString::expandCapacity): likewise
        (KJS::UString::expandPreCapacity): likewise
        (KJS::UString::spliceSubstringsWithSeparators): likewise
        (KJS::UString::append): likewise
        (KJS::UString::operator=): likewise
        (KJS::UString::detach): likewise
        * kjs/ustring.h: make UString and UString::Rep KJS_FAST_ALLOCATED.

2005-04-11  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        <rdar://problem/4086819> Avoid using protect count hash table so much for 5.6% JS iBench speedup

        - Avoid using protected values hash for the two most common cases
        - Bump up ListImp high water mark, new testing shows 508 ListImps are
        created during JS iBench.

        Net result is a 5.6% speedup on JavaScript iBench
        
        * kjs/collector.cpp:
        (KJS::Collector::collect): mark protected lists as appropriate.
        * kjs/context.h:
        * kjs/list.cpp:
        (KJS::ListImp::markValues): Moved implementation from List::markValues
        (KJS::List::markProtectedLists): Implemented - scan pool and overflow
        list.
        (KJS::allocateListImp): link lists outside the pool into a separate
        doubly linked list to be able to mark protected lists
        (KJS::deallocateListImp): do the corresponding delinking
        (KJS::List::derefValues): do nothing in conservative GC mode
        (KJS::List::refValues): do nothing in conservative GC mode
        (KJS::List::markValues): call ListImp version
        (KJS::List::append):
        * kjs/list.h:

=== Safari-412 ===

=== Safari-411 ===

=== Safari-410 ===

=== Safari-409 ===

=== Safari-408 ===

=== Safari-407 ===

2005-03-16  Jens Alfke  <jens@apple.com>

        Reviewed by Kevin.

        Fix for <rdar://problem/4025212> "REGRESSION (163-164): search not performed correctly; united.com"
        JavaScript unescape("") was returning a messed-up String object that appeared identical to an empty string, but would in some cases act as 'null' when passed to native functions, in this case the Option() constructor.
        In the implementation of unescape, the UString holding the result was not initialized to "", so it started out as a null string. If nothing was appended to it, it remained null, resulting in a JavaScript String object with some bad behaviors (namely, converting it to a DOMStringImpl results in a NULL pointer.)
        Darin says this regression occurred when we replaced our own implementation of unescape() with code from KJS.

        * kjs/function.cpp:
        (KJS::GlobalFuncImp::call):

2005-03-15  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/4053276> WebScripting protocol in WebKit cannot convert Boolean in Javascript to BOOL in Objective-C

        Added JavaScript boolean to type that can be converted to
        ObjC scalar parameters.

        Reviewed by Ken Kocienda.

        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):

=== Safari-406 ===

=== Safari-405 ===

=== Safari-403 ===

=== Safari-402 ===

=== Safari-401 ===

=== Safari-400 ===

=== Safari-188 ===

2005-02-21  Darin Adler  <darin@apple.com>

        * kjs/date_object.cpp: (timetUsingCF): Fixed indenting.

2005-02-17  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/4003251> Safari crashed at www.icelandair.com in LiveConnect code converting a Java object to a string

        Added nil check.

        Reviewed by John Sullivan.

        * bindings/jni/jni_runtime.cpp:
        (JavaField::valueFromInstance):

=== Safari-187 ===

2005-02-11  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3985118> DOM objects not being marshaled on JS->native calls

        Re-factored how 'native' wrappers for JS objects are created.  The interpreter now
        creates these wrappers.  The WebCore subclass of the interpreter now overrides
        createLanguageInstanceForValue() and creates a DOM ObjC wrapper for DOM objects.

        Reviewed by Ken.

        * bindings/c/c_utility.cpp:
        (convertValueToNPVariant):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_objc.mm:
        (KJS::Bindings::dispatchJNICall):
        * bindings/jni/jni_runtime.cpp:
        (JavaField::valueFromInstance):
        (JavaArray::valueAt):
        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject _setExecutionContext:KJS::Bindings::]):
        (+[WebScriptObject _convertValueToObjcValue:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
        * bindings/objc/WebScriptObjectPrivate.h:
        * bindings/objc/objc_utility.h:
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertObjcValueToValue):
        (KJS::Bindings::createObjcInstanceForValue):
        * bindings/runtime.cpp:
        (Instance::createBindingForLanguageInstance):
        (Instance::createRuntimeObject):
        (Instance::createLanguageInstanceForValue):
        * bindings/runtime.h:
        * kjs/interpreter.cpp:
        (Interpreter::createLanguageInstanceForValue):
        * kjs/interpreter.h:

=== Safari-186 ===

2005-02-10  Darin Adler  <darin@apple.com>

        "Reviewed" by Richard (he told me the file was obsolete).

        - got rid of an obsolete file

        * bindings/npsap.h: Removed.

=== Safari-185 ===

=== Safari-183 ===

2005-02-03  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3972905> CrashTracer: ...36 crashes at com.apple.WebCore: khtml::CSSStyleSelector::applyDeclarations + 120

        Revert to old (and correct) behavior of returning runtime object
        when passed as a parameter, rather than it's corresponding DOM
        object.

        Reviewed by Chris.

        * bindings/objc/WebScriptObject.mm:
        (+[WebScriptObject _convertValueToObjcValue:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):

=== Safari-182 ===

2005-01-28  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3980389> JavaScript bindings access incorrect runtime object

        Only use special 'back door' property to get the runtime object if thisObj isn't
        already a runtime object.

        <gratuitous> Cleaned up a couple of strcmp on ClassInfo name.  Used == on
        ClassInfo pointer instead.

        Reviewed by Chris.

        * bindings/c/c_utility.cpp:
        (convertValueToNPVariant):
        * bindings/objc/WebScriptObject.mm:
        (+[WebScriptObject _convertValueToObjcValue:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::call):

=== Safari-181 ===

2005-01-26  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3972522> (179-180) 40% slowdown on iBench JavaScript test

        I added a member variable to ObjectImp.  This changed it's size and consequently
        hampered the optimizations built into the garbage collector.  Objects no longer
        fit within the allocators cell size, and thus allocation fell back to a slower
        allocator.

        As a result of this fix I also dramatically cleaned up how runtime objects are
        accessed.  The path mostly *removes* code.
        
        Reviewed by Chris.

        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::call):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::canPut):
        (RuntimeObjectImp::hasProperty):
        (RuntimeObjectImp::defaultValue):
        * bindings/runtime_object.h:
        * kjs/object.cpp:
        (KJS::ObjectImp::ObjectImp):
        * kjs/object.h:

2005-01-20  Darin Adler  <darin@apple.com>

        Reviewed by me, changes by Han Ming Ong.

        - <rdar://problem/3964302> SWB: A few files need to be updated to be compilable under GCC 4.0

        * bindings/objc/WebScriptObjectPrivate.h: Make members public.
        * kjs/lookup.h: Change "value.h" to "object.h" because we need KJS::Object to compile a template.

2005-01-20  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3964634> undefined property value from binding seems to evaluate to true in an if statement

        The comprehensive fix for this problem requires new API, as described in 3965326.  However,
        given that we can't add new API at this point, the 'ObjcFallbackObjectImp' will behave
        like and Undefined object if  invokeUndefinedMethodFromWebScript:withArguments: isn't
        implemented on the bound object.

        Reviewed by Chris.

        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::type):
        (ObjcFallbackObjectImp::implementsCall):
        (ObjcFallbackObjectImp::toBoolean):
        * bindings/testbindings.mm:
        (+[MyFirstInterface isSelectorExcludedFromWebScript:]):
        (+[MyFirstInterface isKeyExcludedFromWebScript:]):

=== Safari-180 ===

2005-01-19  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3853676> Browser Crash when accessing CCWeb Progress Page - KJS::Bindings::convertValueToJValue

        Fixed the following problems with LiveConnect that are demonstrated by the application
        described in 3853676.

        1.  If a nil object is passed in an array from Java to JavaScript we will crash.
        2.  We sometimes will incorrectly attempt to access a generic JavaScript as a Java runtime object wrapper.
        3.  We will sometimes fail to find the correct static method ID.

        Reviewed by Maciej.

        * bindings/jni/jni_jsobject.cpp:
        (JSObject::convertJObjectToValue):
        (JSObject::listFromJArray):
        * bindings/jni/jni_runtime.cpp:
        (JavaField::valueFromInstance):
        (JavaField::setValueToInstance):
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::getMethodID):
        (KJS::Bindings::convertValueToJValue):
        * bindings/runtime_array.h:

2005-01-18  Richard Williamson   <rjw@apple.com>

        Fixed several issues all arising from analysis of plugin detection code at ifilm.com:

        Fixed <rdar://problem/3958592> can't script plug-ins if plug-in is invoked with <object> element instead of <embed>
        Fixed <rdar://problem/3958597> <object> elements with IDs do not show up as named properties of the document
        Fixed <rdar://problem/3960973> DOM objects for plugin elements are not accessible
        Fixed <rdar://problem/3958601> need an additional class ID in WebCore for the Real plug-in

        We now support accessing scriptable plugin objects that are specified with <applet>, <embed>, or <object>
        tags.  Also, if any of these elements are named they can be accessed from the document or window objects.
        Finally, DOM methods are properties will be forwarded appropriately for the plugin's root scriptable object.

        Reviewed by Chris.

        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::supportsSetValueOfUndefinedField):
        * bindings/runtime.h:
        (KJS::Bindings::Instance::supportsSetValueOfUndefinedField):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::RuntimeObjectImp):
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::canPut):
        (RuntimeObjectImp::hasProperty):
        (RuntimeObjectImp::defaultValue):
        * bindings/runtime_object.h:
        (KJS::RuntimeObjectImp::fallbackObject):
        * kjs/object.cpp:
        (KJS::ObjectImp::ObjectImp):
        * kjs/object.h:
        (KJS::ObjectImp::forwardingScriptMessage):
        (KJS::ObjectImp::setForwardingScriptMessage):

2005-01-18  Richard Williamson   <rjw@apple.com>

        Back out a change that was incorrectly committed yesterday.

        Reviewed by Chris.

        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):

2005-01-17  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3753030> Need to ensure same origin for plugin binding invocations (origin security rules)

        Keep track of originating execution context and target execution
        context for native JS object wrappers, and perform appropriate
        security checks.

        Reviewed by David Harrison.

        * bindings/NP_jsobject.cpp:
        (_isSafeScript):
        (_NPN_CreateScriptObject):
        (_NPN_Invoke):
        (_NPN_Evaluate):
        (_NPN_GetProperty):
        (_NPN_SetProperty):
        (_NPN_RemoveProperty):
        (_NPN_HasProperty):
        (_NPN_HasMethod):
        (_NPN_SetException):
        * bindings/NP_jsobject.h:
        * bindings/c/c_instance.cpp:
        (CInstance::CInstance):
        (CInstance::stringValue):
        * bindings/c/c_instance.h:
        * bindings/c/c_utility.cpp:
        (convertValueToNPVariant):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::JavaInstance):
        (JavaInstance::valueOf):
        * bindings/jni/jni_instance.h:
        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject _initializeWithObjectImp:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
        (-[WebScriptObject _initWithObjectImp:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
        (-[WebScriptObject KJS::Bindings::]):
        (-[WebScriptObject _setOriginExecutionContext:KJS::Bindings::]):
        (-[WebScriptObject _isSafeScript]):
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject setValue:forKey:]):
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject removeWebScriptKey:]):
        (-[WebScriptObject stringRepresentation]):
        (-[WebScriptObject webScriptValueAtIndex:]):
        (-[WebScriptObject setWebScriptValueAtIndex:value:]):
        (+[WebScriptObject _convertValueToObjcValue:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
        * bindings/objc/WebScriptObjectPrivate.h:
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_runtime.mm:
        (convertValueToObjcObject):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        * bindings/runtime.cpp:
        (Instance::Instance):
        (Instance::operator=):
        * bindings/runtime.h:
        (KJS::Bindings::Instance::Instance):
        (KJS::Bindings::Instance::setExecutionContext):
        (KJS::Bindings::Instance::executionContext):
        * bindings/runtime_root.cpp:
        (RootObject::setInterpreter):
        * bindings/runtime_root.h:
        * kjs/interpreter.h:
        (KJS::Interpreter::isGlobalObject):
        (KJS::Interpreter::interpreterForGlobalObject):
        (KJS::Interpreter::isSafeScript):

=== Safari-179 ===

2005-01-13  Vicki Murley <vicki@apple.com>

        Reviewed by Adele.

        - fix <rdar://problem/3946836> Safari about box lists 2004 instead of 2005
 
        * JavaScriptCore.pbproj/project.pbxproj: bump "2004" to "2005"

2005-01-12  Richard Williamson   <rjw@apple.com>

        Avoid additional work on dealloc by adding early out to
        removeNativeReference().  (This will save time on dealloc
        for all ObjC DOM objects.)

        Reviewed by Darin.

        * bindings/runtime_root.cpp:
        (KJS::Bindings::removeNativeReference):

2005-01-12  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3923356> REGRESSION: Java/JavaScript security checks working incorrectly

        We were always returning the first "root" object for all runtime
        objects.  Changed 0 in loop to i, the index.

        Reviewed by David Harrison.

        * bindings/runtime_root.cpp:
        (KJS::Bindings::rootForImp):

2005-01-11  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3887930> Must use new Java plug-in API to get/set fields so exception handling works (fixes many LiveConnect crashes)

        Use the new dispatching API to invoke JNI, rather than calling JNI
        directly.

        Reviewed by David Harrison.

        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_runtime.cpp:
        (JavaField::dispatchValueFromInstance):
        (JavaField::valueFromInstance):
        (JavaField::dispatchSetValueToInstance):
        (JavaField::setValueToInstance):
        * bindings/jni/jni_runtime.h:
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::convertValueToJValue):

=== Safari-178 ===

=== Safari-177 ===

=== Safari-176 ===

2004-12-17  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Kevin.

        <rdar://problem/3926869> Opening caches window after running PLT causes crash
        
        * kjs/protected_values.cpp:
        (KJS::ProtectedValues::getProtectCount): Don't include simple numbers in
        the protected value table.
        (KJS::ProtectedValues::increaseProtectCount): Ditto.
        (KJS::ProtectedValues::decreaseProtectCount): Ditto.

2004-12-16  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed <rdar://problem/3920764> Unimplemented String methods toLocaleLowerCase and toLocaleUpperCase

        * kjs/string_object.h: Added toLocaleLowerCase and toLocaleUpperCase.
        * kjs/string_object.cpp: (StringProtoFuncImp::call): Made locale versions be synonmyms for the
        non-locale-specific versions.
        * kjs/string_object.lut.h: Regenerated.

2004-12-14  Richard Williamson   <rjw@apple.com>

        Pass URL of plugin view when call into JNI.

        Reviewed by Chris.

        * bindings/jni/jni_objc.mm:
        (KJS::Bindings::dispatchJNICall):

2004-12-13  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3827799> repro. crash with IBM Rational ClearCase Web under Safari (Java/LiveConnect-related)

        Add support for calling static Java methods from JavaScript.

        Reviewed by Maciej.

        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_runtime.cpp:
        (JavaMethod::JavaMethod):
        * bindings/jni/jni_runtime.h:
        (KJS::Bindings::JavaMethod::isStatic):
        * bindings/jni/jni_utility.cpp:
        (callJNIStaticMethod):
        (KJS::Bindings::callJNIBooleanMethod):
        (KJS::Bindings::callJNIStaticBooleanMethod):
        * bindings/jni/jni_utility.h:

2004-12-13  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3887767> LiveConnect doesn't propagate Java exceptions back to JavaScript (prevents security suite from running)

        Reviewed by John.

        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_objc.mm:
        (KJS::Bindings::dispatchJNICall):
        * bindings/jni/jni_runtime.h:
        * bindings/jni/jni_utility.h:

=== Safari-175 ===

2004-12-07  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        <rdar://problem/3908017> REGRESSION (172-173): assertion in ObjectImp::construct trying to create JS error (24hourfitness.com)

        The fix was to implement copy constructor and assignment operator,
        the ones that worked on the base class did not replace the
        defaults apparently!
        
        * kjs/protect.h:
        (KJS::ProtectedValue::ProtectedValue):
        (KJS::ProtectedValue::operator=):
        (KJS::ProtectedObject::ProtectedObject):
        (KJS::ProtectedObject::operator=):
        
        Also fixed a bug in the GC test mode that compares the results of
        the old collector and the new collector.

        * kjs/value.cpp:
        (ValueImp::mark):

=== Safari-173 ===

2004-11-23  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3890385> field and method cache incorrectly capped (c bindings)

        Reviewed by Ken.

        * bindings/c/c_class.cpp:
        (CClass::_commonInit):

2004-11-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Ken.

        <rdar://problem/3889696> Enable conservative garbage collection for JavaScript
        
        * kjs/collector.cpp:
        (KJS::Collector::Thread::Thread):
        (KJS::destroyRegisteredThread):
        (KJS::initializeRegisteredThreadKey):
        (KJS::Collector::registerThread):
        (KJS::Collector::markStackObjectsConservatively):
        (KJS::Collector::markCurrentThreadConservatively):
        (KJS::Collector::markOtherThreadConservatively):
        * kjs/collector.h:
        * kjs/internal.cpp:
        (lockInterpreter):
        * kjs/value.h:

=== Safari-172 ===

2004-11-15  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3880561> Default string value of ObjC object in JS should be [obj description].

        Reviewed by Hyatt.

        * bindings/objc/objc_instance.mm:
        (ObjcInstance::stringValue):
        * bindings/objc/objc_utility.h:
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertNSStringToString):
        (KJS::Bindings::convertObjcValueToValue):

=== Safari-171 ===

2004-11-09  Chris Blumenberg  <cblu@apple.com>

        Fixed: <rdar://problem/3872724> soft link against JavaVM to save ~2MB RSHRD

        Reviewed by rjw.

        * ChangeLog:
        * JavaScriptCore.pbproj/project.pbxproj: don't link against JavaVM
        * bindings/softlinking.c: Added.
        (loadFramework): new
        (getFunctionPointer): new
        (JNI_GetCreatedJavaVMs): load JavaVM if not already loaded, get _JNI_GetCreatedJavaVMs symbol if we don't already have it, call JNI_GetCreatedJavaVMs

=== Safari-170 ===

2004-11-04  Darin Adler  <darin@apple.com>

        Reviewed by Ken.

        - fixed <rdar://problem/3865365> since -[WebScriptObject dealloc] does not call [super dealloc], the build will fail due to a warning
        - fixed behavior so that [[WebScriptObject alloc] initWithCoder:] doesn't leak WebUndefined instances
          and incidentally so that [[WebScriptObject alloc] init] returns the single shared instance rather
          than allocating a new one

        * bindings/objc/WebScriptObject.mm: Removed some stray semicolons.
        (+[WebUndefined allocWithZone:]): Made this the common bottleneck that returns the single instance
        of WebUndefined, since it's the single method that normally allocates new instances. Calls super to
        actually allocate only the very first time it's called.
        (-[WebUndefined initWithCoder:]): Simplified to just return self (no reason to re-lookup the single
        shared instance since there can be only one).
        (-[WebUndefined copyWithZone:]): Ditto.
        (-[WebUndefined retain]): Ditto.
        (-[WebUndefined retainCount]): Use UINT_MAX constant here (matches usage in NSObject.m for retain count
        of class).
        (-[WebUndefined autorelease]): Simplified to just return self (see above).
        (-[WebUndefined copy]): No need to override this since it just turns around and calls copyWithZone:.
        (-[WebUndefined dealloc]): Added an assertion since this method should never be called. Also added
        a call to [super dealloc] after return; to make the new -Wdealloc-check compiler happy (fixing the
        bug mentioned above).
        (+[WebUndefined undefined]): Reimplemented; calls allocWithZone:NULL to get to the shared instance.
        No need to call init, since that's a no-op for this class.

2004-11-03  David Harrison  <harrison@apple.com>

        Reviewed by Darin.
        
        Eliminate the use of a marker file to determine how to build.

        * .cvsignore:
        * Makefile.am:

2004-11-01  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3861469> Latest Real player crashes Safari on some sites.

        Reviewed by Ken.

        * bindings/c/c_instance.cpp:
        (CInstance::invokeMethod):
        (CInstance::invokeDefaultMethod):
        Initialize out parameters to void type.

        * bindings/c/c_runtime.cpp:
        (CField::valueFromInstance):
        (CField::setValueToInstance):
        Initialize out parameters to void type.
        Also added additional checks to protect against classes that 
        don't implement all functions.

2004-11-01  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3861257> WebUndefined should be returned for undefined values

        Reviewed by John.

        * ChangeLog:
        * bindings/objc/WebScriptObject.mm:
        (+[WebScriptObject _convertValueToObjcValue:KJS::root:Bindings::]):
        Added additional conversion Undefined -> WebUndefined.
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertObjcValueToValue):
        Added additional conversion WebUndefined -> Undefined.

2004-11-01  Darin Adler  <darin@apple.com>

        - fixed <rdar://problem/3855573> Remove reference to "WebScriptMethods" from WebScriptObject.h comments

        * bindings/objc/WebScriptObject.h: Removed unneeded #ifdef protection for multiple includes (since
        this is an Objective-C header and we use #import for those). Fixed comments as requested in the bug
        report to match the contents of the file.

=== Safari-169 ===

=== Safari-168 ===

2004-10-22  Ken Kocienda  <kocienda@apple.com>

        Reviewed by me

        * JavaScriptCore.pbproj/project.pbxproj:  
        Add GCC_ENABLE_OBJC_GC and GCC_FAST_OBJC_DISPATCH flags.

=== Safari-167 ===

2004-10-13  Richard Williamson   <rjw@apple.com>

        Moved boolean checks prior to NSNumber checks.  booleans are
        NSNumbers.

        Follow on to <rdar://problem/3821515> binding layer needs to convert NSNumber-bools to js type boolean not number.

        Reviewed by John.

        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertObjcValueToValue):

2004-10-12  Richard Williamson   <rjw@apple.com>

        Fixed access to DOM object via WebScriptObject API.
        The execution context for DOM objects wasn't being found.
        <rdar://problem/3831372> The valueForKey method for @"offsetLeft" on a paragraph element causes a crash.

        Reviewed by Chris.

        * bindings/objc/WebScriptObject.mm:
        (_didExecute):
        (-[WebScriptObject KJS::Bindings::]):
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject setValue:forKey:]):
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject stringRepresentation]):
        * bindings/objc/WebScriptObjectPrivate.h:

2004-10-09  Darin Adler  <darin@apple.com>

        Reviewed by Kevin.

        - fixed <rdar://problem/3804661> REGRESSION: JavaScriptCore framework now has two init routines

        * bindings/NP_jsobject.cpp: Fixed unnecessarily-complex globals set up that was
        creating an init routine.

        * kjs/ustring.cpp: Changed around the UString::Rep::empty construction to not
        require a global constructor that creates an init routine.

2004-10-09  Darin Adler  <darin@apple.com>

        Reviewed by Kevin.

        - fixed <rdar://problem/3822618> REGRESSION (164-165): expedia.com's popup help doesn't work

        * kjs/reference.cpp: (Reference::putValue): Change so that references not found in any object
        work with the window object of the page the function is in, not the page of the caller. This
        is what all other browsers do. This code was hidden before by the "everything is defined on
        window object" hack in WebCore.

2004-10-07  Richard Williamson   <rjw@apple.com>

        Added simple JavaScript call tracing.  Very useful for
        debugging complex pages.

        Tracing is only available in development builds and is
        enabled by:

        (gdb) set traceJavaScript = 1

        or programatically

        setTraceJavaScript(true)

        Function, args, and return values are printed to console.  Very
        verbose.

        Reviewed by Ken.

        * kjs/function_object.cpp:
        (FunctionProtoFuncImp::call):
        * kjs/object.cpp:
        (KJS::Object::call):

=== Safari-166 ===

2004-10-05  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3819234> NPN_SetException (and throwException:) isn't implemented

        Reviewed by Chris.

        * bindings/NP_jsobject.cpp:
        (_NPN_SetException):
        * bindings/npruntime.cpp:
        (_NPN_SetExceptionWithUTF8):
        * bindings/objc/WebScriptObject.mm:
        (+[WebScriptObject throwException:]):
        * kjs/internal.h:
        (KJS::InterpreterImp::context):

2004-10-05  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3821515> binding layer needs to convert NSNumber-bools to js type boolean not number

        Reviewed by Ken.

        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertObjcValueToValue):

2004-10-04  Darin Adler  <darin@apple.com>

        Reviewed by Ken.

        - rolled in a fix the KDE folks did for the operations that generate HTML fragments

        * kjs/string_object.cpp: (StringProtoFuncImp::call): Added quote marks to generated HTML.

        - rolled out an old workaround we don't need any more

        * JavaScriptCore.pbproj/project.pbxproj: Remove -Wno-long-double because the <math.h> issue that
        required it is no longer there.

2004-09-30  Richard Williamson  <rjw@apple.com>

        Fixed <rdar://problem/3821215> NPN hasMethod and hasProperty functions should take NPObjects, not NPClass

        Reviewed by Chris.

        * bindings/NP_jsobject.cpp:
        (_NPN_GetProperty):
        (_NPN_HasProperty):
        (_NPN_HasMethod):
        * bindings/c/c_class.cpp:
        (CClass::methodsNamed):
        (CClass::fieldNamed):
        * bindings/c/c_class.h:
        * bindings/c/c_instance.cpp:
        (CInstance::invokeMethod):
        * bindings/jni/jni_class.cpp:
        (JavaClass::methodsNamed):
        * bindings/jni/jni_class.h:
        * bindings/npruntime.h:
        * bindings/objc/objc_class.h:
        * bindings/objc/objc_class.mm:
        (ObjcClass::methodsNamed):
        * bindings/runtime.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::hasProperty):

2004-09-29  Chris Blumenberg  <cblu@apple.com>

        Prepended underscores to NPN methods so that when the QT plug-in loads these symbols, it uses the non-underscore versions in WebKit. Without this, the QT plug-in was failing to load when launching Safari from the command-line.

        Reviewed by rjw.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/NP_jsobject.cpp:
        (_NPN_CreateScriptObject):
        (_NPN_InvokeDefault):
        (_NPN_Invoke):
        (_NPN_Evaluate):
        (_NPN_GetProperty):
        (_NPN_SetProperty):
        (_NPN_RemoveProperty):
        (_NPN_HasProperty):
        (_NPN_HasMethod):
        * bindings/c/c_class.cpp:
        (CClass::methodsNamed):
        (CClass::fieldNamed):
        * bindings/c/c_instance.cpp:
        (CInstance::CInstance):
        (CInstance::~CInstance):
        (CInstance::operator=):
        (CInstance::invokeMethod):
        (CInstance::invokeDefaultMethod):
        * bindings/c/c_runtime.cpp:
        * bindings/c/c_runtime.h:
        (KJS::Bindings::CField::name):
        (KJS::Bindings::CMethod::name):
        * bindings/npruntime.cpp:
        (_NPN_GetStringIdentifier):
        (_NPN_GetStringIdentifiers):
        (_NPN_GetIntIdentifier):
        (_NPN_IdentifierIsString):
        (_NPN_UTF8FromIdentifier):
        (_NPN_IntFromIdentifier):
        (NPN_InitializeVariantWithObject):
        (_NPN_ReleaseVariantValue):
        (_NPN_CreateObject):
        (_NPN_RetainObject):
        (_NPN_ReleaseObject):
        (_NPN_SetExceptionWithUTF8):
        (_NPN_SetException):

2004-09-26  Darin Adler  <darin@apple.com>

        * kjs/string_object.cpp: (StringProtoFuncImp::call): Remove strange use of high() and
        low() to get Unicode value of character, and just use unicode().

2004-09-26  Darin Adler  <darin@apple.com>

        - refine charAt/charCodeAt fix slightly

        * kjs/string_object.cpp: (StringProtoFuncImp::call): Treat undefined the same was as an
        omitted parameter, as we do everywhere else, and as other browsers do here.

2004-09-26  Darin Adler  <darin@apple.com>

        Reviewed by Kevin.

        - fixed <rdar://problem/3816097> REGRESSION: mailblocks, and presumably many other pages, failing because variable not found

        * kjs/internal.cpp: (InterpreterImp::evaluate): Process variable declarations before executing
        the program. We were doing this properly for functions, but not entire programs.

        - fixed <rdar://problem/3814706> REGRESSION: text fields in mailblocks wizards do not accept keystrokes due to use of charCodeAt()

        * kjs/string_object.cpp: (StringProtoFuncImp::call): Changed the implementation of charAt
        and charCodeAt to treat a missing parameter as an index of 0, rather than an invalid index.

        * tests/mozilla/expected.html: Update for two tests that now pass with these changes.

=== Safari-165 ===

=== Safari-164 ===

2004-09-14  Richard Williamson   <rjw@apple.com>

        1.  Add class parameter to object allocation function.  This is somewhat redundant, given that
        the allocation function is in the class function vector, but people wanted to use the same
        allocation function for different classes.
        
        2.  Renamed NPN_Class to NPN_Invoke to match the name in the function vector.
        
        3.  Add support for a default function on an object.  This is a feature that ActiveX supports,
        and will allow JavaScript code to be written that will look exactly the same for both ActiveX
        plugins and Netscape or WebKit plugins.  There are implementations included for the 'C' and
        'Objective-C' bindings.
        
        There bugs are covered by
        
        <rdar://problem/3776343> Support for default functions in the JavaScript bindings
        <rdar://problem/3779186> NPN_Call needs to be renamed to NPN_Invoke
        <rdar://problem/3674754> Need to implement latest npruntime.h

        Reviewed by John.

        * bindings/NP_jsobject.cpp:
        (jsAllocate):
        (NPN_InvokeDefault):
        (NPN_Invoke):
        * bindings/c/c_class.cpp:
        * bindings/c/c_instance.cpp:
        (CInstance::CInstance):
        (CInstance::operator=):
        (CInstance::invokeMethod):
        (CInstance::invokeDefaultMethod):
        * bindings/c/c_instance.h:
        * bindings/c/c_runtime.cpp:
        * bindings/c/c_runtime.h:
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeDefaultMethod):
        * bindings/jni/jni_instance.h:
        * bindings/npruntime.cpp:
        (NPN_CreateObject):
        * bindings/npruntime.h:
        * bindings/objc/WebScriptObject.h:
        * bindings/objc/objc_class.mm:
        (ObjcClass::fallbackObject):
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeDefaultMethod):
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::ObjcFallbackObjectImp):
        (ObjcFallbackObjectImp::get):
        (ObjcFallbackObjectImp::put):
        (ObjcFallbackObjectImp::canPut):
        (ObjcFallbackObjectImp::implementsCall):
        (ObjcFallbackObjectImp::call):
        (ObjcFallbackObjectImp::hasProperty):
        (ObjcFallbackObjectImp::deleteProperty):
        (ObjcFallbackObjectImp::defaultValue):
        * bindings/runtime.h:
        (KJS::Bindings::Class::fallbackObject):
        (KJS::Bindings::Instance::getValueOfUndefinedField):
        (KJS::Bindings::Instance::setValueOfUndefinedField):
        (KJS::Bindings::Instance::valueOf):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::implementsCall):
        (RuntimeObjectImp::call):
        * bindings/runtime_object.h:

2004-09-13  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        <rdar://problem/3794735> Gmail- sending a very long message with Safari is so slow it seems like a hang
        
        * kjs/string_object.cpp:
        (StringProtoFuncImp::call): Replaced implementation of replace()
        method with function below...
        (replace): In order to avoid excessive allocation and copying,
        figure out the ranges of the original string and replacement
        strings to be assembled, instead of constantly creating new
        strings at each substitution. The old behavior is basically O(N^2)
        for a global replace on a pattern that matches many places in the
        string.
        (regExpIsGlobal): Helper function for the above.
        (expandSourceRanges): ditto
        (pushSourceRange): ditto
        (expandReplacements): ditto
        (pushReplacement): ditto
        * kjs/ustring.cpp:
        (KJS::UString::spliceSubstringsWithSeparators): New method that
        pieces together substring ranges of this string together with
        specified separators, all at one go.
        * kjs/ustring.h:
        (KJS::UString::Range::Range): Added new helper class to represent
        substring choices.

2004-09-14  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - fixed <rdar://problem/3800315> encode-URI-test layout test is failing
        
        * kjs/function.cpp:
        (KJS::GlobalFuncImp::call): Make sure to escape null
        characters. This is a bug in the new code that made part of the
        test fail.

2004-09-13  Darin Adler  <darin@apple.com>

        Reviewed by Kevin and Maciej.

        - new function to support fix for DIG bug in WebCore

        * kjs/scope_chain.h: Added new push function that pushes another entire scope chain.
        * kjs/scope_chain.cpp: (KJS::ScopeChain::push): Ditto.

2004-09-12  Darin Adler  <darin@apple.com>

        * tests/mozilla/expected.html: Updated test results for 3 more tests that pass with the new version
        of escape and unescape.

2004-09-12  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed <rdar://problem/3798209> any non-ASCII characters are garbled in the result of toLocaleString

        * kjs/date_object.cpp:
        (formatLocaleDate): Replaced two old functions that used LongDateTime with this one new function that
        uses CFDateFormatter.
        (DateProtoFuncImp::call): Call the new formatLocaleDate instead of both formatLocaleDate and formatLocaleTime.

2004-09-09  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Richard.

        <rdar://problem/3493140> REGRESSION (85-100): cedille displays %-escaped in JavaScript message at hotmail.com

        * kjs/function.cpp:
        (KJS::GlobalFuncImp::call): Replace our escape() and unescape() implementations with
        ones from KDE KJS, which have the proper latin-1 behavior to match Win IE.
        * kjs/lexer.cpp:
        (Lexer::isHexDigit): Made static and non-const.
        * kjs/lexer.h:

=== Safari-163 ===

2004-09-06  Darin Adler  <darin@apple.com>

        * JavaScriptCore.pbproj/project.pbxproj: Bump MACOSX_DEPLOYMENT_TARGET to 10.3.

=== Safari-162 ===

2004-09-01  Richard Williamson   <rjw@apple.com>

        Add pid to exception messages (to help debug dashboard clients).

        Reviewed by Chris.

        * kjs/interpreter.cpp:
        (Interpreter::evaluate):

=== Safari-161 ===

2004-08-20  Richard Williamson   <rjw@apple.com>

        Implemented new JNI abstraction.  We no longer invoke Java methods
        directly with JNI, rather we call into the plugin.  This allows the
        plugin to dispatch the call to the appropriate VM thread.  This
        change should (will?) fix a whole class of threading related problems with
        the Java VM.

        Reviewed by Hyatt.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/c/c_instance.h:
        (KJS::Bindings::CInstance::setExecutionContext):
        (KJS::Bindings::CInstance::executionContext):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::JavaInstance):
        (JavaInstance::invokeMethod):
        (JavaInstance::setExecutionContext):
        (JavaInstance::executionContext):
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_jsobject.cpp:
        (JSObject::convertJObjectToValue):
        * bindings/jni/jni_runtime.cpp:
        (JavaField::JavaField):
        (JavaArray::convertJObjectToArray):
        (JavaField::valueFromInstance):
        (JavaArray::JavaArray):
        (JavaArray::valueAt):
        * bindings/jni/jni_runtime.h:
        (KJS::Bindings::JavaArray::operator=):
        (KJS::Bindings::JavaArray::executionContext):
        * bindings/jni/jni_utility.h:
        * bindings/objc/objc_instance.h:
        (KJS::Bindings::ObjcInstance::setExecutionContext):
        (KJS::Bindings::ObjcInstance::executionContext):
        * bindings/runtime.cpp:
        (Instance::createBindingForLanguageInstance):
        * bindings/runtime.h:
        * bindings/runtime_root.h:
        (KJS::Bindings::RootObject::nativeHandle):

=== Safari-158 ===

2004-08-19  Vicki Murley  <vicki@apple.com>

        Reviewed by John.

        * kjs/property_map.cpp:
        (KJS::PropertyMap::put): initialize deletedElementIndex to zero, to make the compiler happy

2004-08-17  Darin Adler  <darin@apple.com>

        Reviewed by Adele.

        - fixed <rdar://problem/3746676> SAP WebDynpro app hangs inside JavaScript property map hash table code (deleted sentinel problem)

        * kjs/property_map.h: Added some private functions.
        * kjs/property_map.cpp:
        (KJS::PropertyMap::clear): Set sentinelCount to 0.
        (KJS::PropertyMap::put): Complete search for the element before choosing to use the deleted-element sentinel.
        Also keep sentinel count up to date when we destroy a sentinel by overwriting with a new added element.
        (KJS::PropertyMap::expand): Added. Calls rehash with a size 2x the old size, or 16.
        (KJS::PropertyMap::rehash): Added. Refactored the rehash code into a separate function.
        (KJS::PropertyMap::remove): Add one to sentinelCount, and rehash if 1/4 or more of the elements are
        deleted-element sentinels.
        (KJS::PropertyMap::checkConsistency): Check the sentinelCount.

2004-08-16  Maciej Stachowiak  <mjs@apple.com>

        Code change by Eric Albert, reviewd by me.

        <rdar://problem/3571960> washingtonpost.com claims I don't have cookies enabled and won't let me read articles

        * kjs/date_object.cpp:
        (timetUsingCF): Clamp time to LONG_MAX (getting rid of time_t
        entirely would be even better, but is not required to fix this bug.

=== Safari-157 ===

2004-08-16  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3581092> cash in KJS::Bindings::JSObject::eval at tcvetantcvetkov.com

        Adds bullet proofing to protect against evaluation of bogus JS in all the flavors of bindings (Java, C, and ObjC).

        Reviewed by Chris.

        * bindings/NP_jsobject.cpp:
        (NPN_Evaluate):
        * bindings/jni/jni_jsobject.cpp:
        (JSObject::eval):
        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject evaluateWebScript:]):

2004-08-15  Richard Williamson   <rjw@apple.com>

        More updates to np headers.  Implemented new NPN functions.

        Reviewed by Darin.

        * bindings/NP_jsobject.cpp:
        (NPN_HasProperty):
        (NPN_HasMethod):
        * bindings/npapi.h:
        * bindings/npruntime.h:

2004-08-13  Darin Adler  <darin@apple.com>

        - fix build so we can compile again

        * bindings/npapi.h: Added. Richard forgot to check this in. The one I'm checking in here
        is good enough so that we can compile, but it's only a stopgap measure, because I think
        Richard has a newer one he wants to check in.

2004-08-12  Richard Williamson   <rjw@apple.com>

        Bring npruntime.h and friends closer to compliance with
        latest spec.

        Reviewed by Maciej.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/NP_jsobject.cpp:
        (jsAllocate):
        (_NPN_CreateScriptObject):
        (NPN_Call):
        (NPN_Evaluate):
        (NPN_GetProperty):
        (NPN_SetProperty):
        (NPN_RemoveProperty):
        * bindings/NP_jsobject.h:
        * bindings/c/c_instance.cpp:
        (CInstance::invokeMethod):
        * bindings/c/c_utility.cpp:
        (convertNPVariantToValue):
        * bindings/npruntime.cpp:
        (NPN_IdentifierIsString):
        (NPN_VariantIsVoid):
        (NPN_VariantIsNull):
        (NPN_VariantIsUndefined):
        (NPN_VariantIsBool):
        (NPN_VariantIsInt32):
        (NPN_VariantIsDouble):
        (NPN_VariantIsString):
        (NPN_VariantIsObject):
        (NPN_VariantToBool):
        (NPN_VariantToString):
        (NPN_VariantToInt32):
        (NPN_VariantToDouble):
        (NPN_VariantToObject):
        (NPN_InitializeVariantAsVoid):
        (NPN_InitializeVariantAsNull):
        (NPN_InitializeVariantAsUndefined):
        (NPN_InitializeVariantWithBool):
        (NPN_InitializeVariantWithInt32):
        (NPN_InitializeVariantWithDouble):
        (NPN_InitializeVariantWithString):
        (NPN_InitializeVariantWithStringCopy):
        (NPN_InitializeVariantWithObject):
        (NPN_InitializeVariantWithVariant):
        (NPN_ReleaseVariantValue):
        (NPN_CreateObject):
        * bindings/npruntime.h:
        (_NPString::):
        (_NPString::_NPVariant::):
        * bindings/npruntime_priv.h: Added.

2004-08-12  Darin Adler  <darin@apple.com>

        Reviewed by Adele.

        - fixed 3 problems with parse functions that I just wrote, fixing 3 more Mozilla JavaScript tests

        * kjs/function.cpp:
        (KJS::parseDigit): Fix typo, 'Z' instead of 'z', that prevented lowercase hex digits from working.
        (KJS::parseInt): Add octal support. Specification says it's optional, but I guess not.
        (KJS::parseFloat): Fix check for "0x" in parseFloat to return 0 rather than NaN. Also add code
        to skip leading "+" or "-".

=== Safari-156 ===

2004-08-12  Darin Adler  <darin@apple.com>

        Reviewed by Ken.

        - fixed 43 Mozilla JavaScript tests

        * kjs/date_object.h: Change parseDate and timeClip to take and return doubles.
        * kjs/date_object.cpp:
        (DateObjectImp::construct): Change to use a timeClip function that takes and returns a double rather
        than constructing a number object to pass to it.
        (DateObjectFuncImp::call): Change to use a parseDate function that returns a double.
        (KJS::parseDate): Change to return a double instead of creating the Number object here.
        (KJS::timeClip): Implement this as specified in the language standard.

        * kjs/error_object.cpp: (NativeErrorImp::NativeErrorImp): Set the DontDelete, ReadOnly, and DontEnum
        flags on the prototype property.

        * kjs/function.cpp:
        (KJS::FunctionImp::get): Return null rather than undefined for arguments when the function is not
        currently in scope.
        (KJS::isStrWhiteSpace): Added. Matches specification for StrWhiteSpace. Could move it to some utility
        file later.
        (KJS::parseDigit): Added. Helper function for parseInt.
        (KJS::parseInt): Added. Integer parser that puts result in a double so we're not limited to what
        strtoll can handle. Also matches standard more closely.
        (KJS::parseFloat): Added. Handles "0x" properly and passes flag to make empty string turn into NaN
        instead of 0.
        (KJS::GlobalFuncImp::call): Use the new parseInt and parseFloat.

        * kjs/function_object.cpp: (FunctionPrototypeImp::FunctionPrototypeImp): Add a length property.

        * kjs/lexer.h: Added error flag and sawError() function for detecting errors.
        * kjs/lexer.cpp:
        (Lexer::setCode): Clear error state.
        (Lexer::lex): Set error state if the lexer encounters an error

        * kjs/internal.cpp:
        (NumberImp::toString): Roll in change from KDE version to special case 0 so we handle -0 correctly.
        (Parser::parse): Use new lexer error method so those errors are treated like parser errors.

        * kjs/math_object.cpp: (MathFuncImp::call): Change min and max to treat -0 as less than +0.
        Change round to round values between -0.5 and -0 to -0 instead of +0.

        * kjs/nodes.h: Add evaluateReference function to GroupNode.
        * kjs/nodes.cpp: (GroupNode::evaluateReference): Pass references through groups (parenthesized
        expressions) properly so that expressions like "delete (x.y)" work. Before, the parentheses
        would change x.y into a value that can't be deleted as a side effect.

        * kjs/string_object.cpp: Change parameter count for indexOf and lastIndexOf from 2 to 1 to match
        the specification.

        * kjs/testkjs.cpp: Rolled in changes from KDE to add a "quit" function to the test tool and
        get rid of the fixed size limit for code.

        * kjs/ustring.cpp: (KJS::UString::substr): Added optimized case for substr(0, length) so it just
        returns the string without creating a new Rep, since I'm using substr in a place where it will
        often be passed a 0.

        * tests/mozilla/ecma/String/15.5.4.11-1.js: Fixed one wrong entry in the Unicode table I added to
        the other day that was making a couple tests fail.
        * tests/mozilla/ecma/String/15.5.4.12-1.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.12-2.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.12-3.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.12-4.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.12-5.js: Ditto.

        * kjs/string_object.lut.h: Regenerated.

2004-08-11  Darin Adler  <darin@apple.com>

        - fixed a tiny problem with the UTF-16 PCRE check-in

        * pcre/maketables.c: (pcre_maketables): Fix mistake in table-generating code that sometimes caused
        the ctype_meta flag to get set in items that should not have it.

        * pcre/chartables.c: Regenerated.

2004-08-10  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3674747> Need to implement invokeUndefinedMethodFromWebScript:withArguments:

        The following WebScripting methods are now supported on bound
        objects:

        - (id)invokeUndefinedMethodFromWebScript:(NSString *)name withArguments:(NSArray *)args;
        - (void)setValue:(id)value forUndefinedKey:(NSString *)key
        - (id)valueForUndefinedKey:(NSString *)key

        Reviewed by Chris.

        * bindings/c/c_class.cpp:
        (CClass::fieldNamed):
        * bindings/c/c_class.h:
        * bindings/jni/jni_class.cpp:
        (JavaClass::fieldNamed):
        * bindings/jni/jni_class.h:
        * bindings/objc/objc_class.h:
        (KJS::Bindings::ObjcClass::isa):
        * bindings/objc/objc_class.mm:
        (ObjcClass::methodsNamed):
        (ObjcClass::fieldNamed):
        (ObjcClass::fallbackObject):
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):
        (ObjcInstance::setValueOfField):
        (ObjcInstance::setValueOfUndefinedField):
        (ObjcInstance::getValueOfField):
        (ObjcInstance::getValueOfUndefinedField):
        * bindings/objc/objc_runtime.h:
        (KJS::Bindings::ObjcField::~ObjcField):
        (KJS::Bindings::ObjcField::ObjcField):
        (KJS::Bindings::ObjcField::operator=):
        (KJS::Bindings::FallbackObjectImp::classInfo):
        * bindings/objc/objc_runtime.mm:
        (ObjcField::ObjcField):
        (ObjcField::name):
        (ObjcField::type):
        (ObjcField::valueFromInstance):
        (ObjcField::setValueToInstance):
        (FallbackObjectImp::FallbackObjectImp):
        (FallbackObjectImp::get):
        (FallbackObjectImp::put):
        (FallbackObjectImp::canPut):
        (FallbackObjectImp::implementsCall):
        (FallbackObjectImp::call):
        (FallbackObjectImp::hasProperty):
        (FallbackObjectImp::deleteProperty):
        (FallbackObjectImp::defaultValue):
        * bindings/runtime.h:
        (KJS::Bindings::Class::fallbackObject):
        (KJS::Bindings::Instance::getValueOfUndefinedField):
        (KJS::Bindings::Instance::setValueOfUndefinedField):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::canPut):
        (RuntimeObjectImp::hasProperty):
        * bindings/testbindings.mm:
        (-[MyFirstInterface valueForUndefinedKey:]):
        (-[MyFirstInterface setValue:forUndefinedKey:]):

2004-08-10  Darin Adler  <darin@apple.com>

        Reviewed by Dave.

        - switch PCRE to do UTF-16 directly instead of converting to/from UTF-8 for speed

        * pcre/pcre.h: Added PCRE_UTF16 switch, set to 1. Added pcre_char typedef, which is char
        or uint16_t depending on the mode, and used appropriate in the 7 public functions
        that need to use it.
        * pcre/pcre.c: Add UTF-16 support to all functions.
        * pcre/study.c: Ditto.

        * pcre/internal.h: Added ichar typedef, which is unsigned char or uint16_t depending on
        the mode. Changed declarations to use symbolic constants and typedefs so we size
        things to ichar when needed.

        * pcre/maketables.c: (pcre_maketables): Change code to make tables that are
        sized to 16-bit characters instead of 8-bit.

        * pcre/get.c:
        (pcre_copy_substring): Use pcre_char instead of char.
        (pcre_get_substring_list): Ditto.
        (pcre_free_substring_list): Ditto.
        (pcre_get_substring): Ditto.
        (pcre_free_substring): Ditto.

        * pcre/dftables.c: (main): Used a bit more const, and use ICHAR sizes instead
        of hard-coding 8-bit table sizes.

        * pcre/chartables.c: Regenerated.

        * kjs/ustring.h: Remove functions that convert UTF-16 to/from UTF-8 offsets.
        * kjs/ustring.cpp: Change the shared empty string to have a unicode pointer that
        is not null. The null string still has a null pointer. This prevents us from
        passing a null through to the regular expression engine (which results in a null
        error even when the string length is 0).

        * kjs/regexp.cpp:
        (KJS::RegExp::RegExp): Null-terminate the pattern and pass it.
        (KJS::RegExp::match): Use the 16-bit string directly, no need to convert to UTF-8.

2004-08-09  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed 28 Mozilla JavaScript tests

        * kjs/array_object.cpp: (ArrayProtoFuncImp::call): Check for undefined rather than
        checking the number of arguments for the join method.

        * kjs/lexer.cpp: (Lexer::lex): Parse hexadecimal and octal constants in doubles rather
        than integers, so we aren't limited to 32 bits.

        * kjs/math_object.cpp: (MathFuncImp::call): Get rid of many unneeded special cases in
        the implementation of the pow operation. Also simplied a case that was handling positive
        and negative infinity separately.

        * kjs/nodes.cpp: (ShiftNode::evaluate): Keep the result of shifts in a double instead of
        putting them in a long, so that unsigned shift will work properly.

        * kjs/number_object.cpp: Add the DontDelete and ReadOnly flags to the numeric constants.

        * kjs/operations.cpp:
        (KJS::isPosInf): Added an implementation inside APPLE_CHANGES that does not depend on the
        sign of isinf; our isinf function returns +1 even for negative infinity.
        (KJS::isNegInf): And again.
        (KJS::relation): Put in a nice simple implementation of comparison inside APPLE_CHANGES.
        Our floating point already handles the various infinity cases correctly.

        * kjs/regexp_object.cpp:
        (RegExpProtoFuncImp::call): Add missing return before Null() in Exec method.
        (RegExpObjectImp::arrayOfMatches): Put undefined rather than an empty string into the
        array in cases where we did not match.
        (RegExpObjectImp::construct): Set the DontDelete, ReadOnly, and DontEnum flags for
        "global", "ignoreCase", "multiline", and "source".

        * kjs/string_object.cpp: (StringProtoFuncImp::call): For the match method, turn a null
        string into undefined rather than an empty string. For the slice method, handle an
        undefined parameter for the limit properly as decribed in the specification, and add
        the limit to one case that didn't have the limit at all. For the methods that generate
        HTML strings, use lowercase tags instead of uppercase.

        * kjs/ustring.cpp:
        (KJS::UChar::toLower): Use u_tolower from the ICU library.
        (KJS::UChar::toUpper): Use u_toupper from the ICU library.
        (KJS::UString::append): Fix some math that caused a buffer overflow.
        (KJS::convertUTF16OffsetsToUTF8Offsets): Ignore negative numbers (-1 is used as a special
        flag) rather than converting them all to 0.
        (KJS::convertUTF8OffsetsToUTF16Offsets): Ditto.

        * tests/mozilla/jsDriver.pl: Fixed the relative links to point to our actual test files.

        * tests/mozilla/ecma/String/15.5.4.11-1.js: Fixed the Unicode table in this test to match
        the Unicode specification in a few cases where it was wrong before.
        * tests/mozilla/ecma/String/15.5.4.11-2.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.11-3.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.11-5.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.11-6.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.12-1.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.12-2.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.12-3.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.12-4.js: Ditto.
        * tests/mozilla/ecma/String/15.5.4.12-5.js: Ditto.

        * JavaScriptCore.pbproj/project.pbxproj: Link to libicu.

        * kjs/number_object.lut.h: Regenerated.

2004-08-09  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed <rdar://problem/3753467> REGRESSION (137-138): reproducible buffer overrun in UString manipulation code

        * kjs/ustring.cpp: (KJS::UString::append): Fix incorrect size computation. Without it
        we get a buffer overflow.

=== Safari-155 ===

2004-08-05  Richard Williamson   <rjw@apple.com>

        Fixed part of 3674747.  The QT guys need this for feature freeze.

        This patch implements support for the

        - (id)invokeUndefinedMethodFromWebScript:(NSString *)name withArguments:(NSArray *)args

        method of objects bound to JavaScript.

        Reviewed by John.

        * ChangeLog:
        * bindings/objc/objc_class.mm:
        (ObjcClass::methodsNamed):
        (ObjcClass::fieldNamed):
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):
        * bindings/objc/objc_runtime.h:
        (KJS::Bindings::ObjcMethod::~ObjcMethod):
        (KJS::Bindings::ObjcMethod::isFallbackMethod):
        (KJS::Bindings::ObjcMethod::javaScriptName):
        * bindings/objc/objc_runtime.mm:
        (ObjcMethod::ObjcMethod):
        (ObjcMethod::getMethodSignature):
        (ObjcMethod::setJavaScriptName):
        * bindings/testbindings.mm:

2004-08-04  Vicki Murley  <vicki@apple.com>

        Reviewed by mjs.
 
        - fix <rdar://problem/3649789> SAP WebGUI has problems loading first page because of parse error        

        * kjs/lexer.cpp:
        (Lexer::lex): if the current character is a '\' and the next character is a line terminator,
        go to the next line and continue parsing the string (instead of failing).  This matches 
        behavior in Mac IE and Mozilla.

2004-08-03  Kevin Decker  <kdecker@apple.com>

        Reviewed by Darin.

        Rolled in changes from the latest KJS sources that support additional 
        Number.prototype functions. 

        Specifically this patch covers the follow parts of the ECMA 3 spec:
        15.7.4.5, 15.7.4.6, and 15.7.4.7 
        
        Fixes:
        <rdar://problem/3663716> missing Number.toFixed (and toPrecision, toExponential)
        <rdar://problem/3749492> missing Number.toPrecision prototype implementation
        <rdar://problem/3749591> missing Number.toExponential prototype implementation

        * kjs/identifier.h: Added toFixed, toPrecision, and toExponential to the
        list of supported identifiers (a macro).
        * kjs/number_object.cpp: Implemented support for toFixed(), toPrecision(),
        and toExponential(). 
        (NumberPrototypeImp::NumberPrototypeImp):
        (NumberProtoFuncImp::call):
        * kjs/number_object.h: Added property names for toFixed, toPrecision,
        and toExponential. 
        (KJS::NumberProtoFuncImp::):
        * tests/mozilla/expected.html: Update results.

2004-08-03  Darin Adler  <darin@apple.com>

        Reviewed by Ken.

        - added support for copying RegExp objects so 7 more Mozilla regexp tests pass

        * kjs/regexp_object.cpp: (RegExpObjectImp::construct): Check for case where
        we are supposed to just copy the regular expression object, and do so.
        Also tighten up arguments check to handle case where an actual "undefined"
        is passed rather than just omitting an argument.

        * tests/mozilla/expected.html: Update results.

2004-08-02  Darin Adler  <darin@apple.com>

        * tests/mozilla/.cvsignore: Added.
        * tests/mozilla/expected.html: Update results.

2004-08-02  Darin Adler  <darin@apple.com>

        Reviewed by Ken.

        - fixed RegExp.toString so 3 more Mozilla regexp tests pass

        * kjs/regexp_object.cpp: (RegExpProtoFuncImp::call):
        Append the flags here so more tests paseed.

2004-08-02  Darin Adler  <darin@apple.com>

        Reviewed by Ken.

        - fixed a couple things making 5 Mozilla regexp tests pass

        * kjs/regexp_object.cpp: (RegExpProtoFuncImp::call): Implement toString
        for the prototype.
        (RegExpObjectImp::construct): Fix bug where the string "undefined" would
        be used as the flags string when no parameter was passed.

        * kjs/regexp_object.h: (KJS::RegExpPrototypeImp::classInfo):
        Added a class info object for RegExp prototype so it can return
        a string instead of raising an exception when converting to a string.

        * tests/mozilla/expected.html: Update results.

2004-08-02  Darin Adler  <darin@apple.com>

        Reviewed by Kevin.

        - fix crashes in mozilla tests due to mishandling NaN

        * kjs/array_object.cpp: (ArrayProtoFuncImp::call): Rerranged range checks after
        calls to toInteger so that NaN will get turned into something that fits in an integer.
        These were the ones John already fixed, but his fix used isnan and the new fix is
        more efficient.

        * kjs/number_object.cpp: (NumberProtoFuncImp::call): Rearranged radix range checks
        after a call to toInteger to handle NaN properly. Also removed separate check
        for undefined that's not needed.

        * kjs/string_object.cpp: (StringProtoFuncImp::call): More of the same kinds of changes
        as in the above two files, but for a lot more functions. Also changed one place with
        an explicit check for undefined to instead just check isNaN.

        * tests/mozilla/run-mozilla-tests: Changed to invoke jst using $SYMROOTS for people
        like me who don't keep $SYMROOTS in their $PATH.

=== Safari-154 ===

=== Safari-153 ===

2004-07-26  Kevin Decker  <kdecker@apple.com>

        Changes done by Darin, reviewed by Kevin.

        - changed testkjs to build in Xcode rather than from Makefile

        * .cvsignore: Removed obsolete files from this list.
        * Makefile.am: Removed code to build testkjs; we do this in Xcode now.
        Changed to build target "All" rather than default target. This makes us
        build the testkjs test tool.
        * dummy.cpp: Removed.
        * kjs/.cvsignore: Removed obsolete files from this list, including
        the testkjs tool, which is now built in the symroots directory.
        * kjs/testkjs.cpp: Added copyright notice that was missing, since we have
        changed this file. Also this has the nice side effect of causing the tool
        to be rebuilt in the new location even if there are no other changes in
        your tree when you check this out.
        * tests/mozilla/run-mozilla-tests: Invoke perl explicitly so this works
        without setting the execute bit on jsDriver.pl.

2004-07-22  Kevin Decker  <kdecker@apple.com>

        Reviewed by Darin
        
        Fixed <rdar://problem/3682340> (error console does not include source urls or line numbers of event exceptions). 

        * kjs/function_object.cpp:
        (FunctionObjectImp::construct):
        * kjs/function_object.h:
        * kjs/object.cpp:
        (KJS::ObjectImp::construct):
        * kjs/object.h:
        (KJS::Object::construct):

2004-07-21  Darin Adler  <darin@apple.com>

        * bindings/npruntime.h: Fixed typo.

2004-07-19  John Sullivan  <sullivan@apple.com>

        Reviewed by Maciej.
        
        - bulletproofed array.slice() against NAN arguments. Harri noticed this
        vulnerability in my patch for 3714644

        * kjs/array_object.cpp:
        (ArrayProtoFuncImp::call):
        handle NAN parameters passed to slice() by clamping to 0 and length.

2004-07-19  Richard Williamson   <rjw@apple.com>

        Fixed 3733349.  Prevent Java applet callbacks into JavaScript after applet
        has been destroyed.

        Reviewed by John.

        * bindings/jni/jni_jsobject.cpp:
        (JSObject::invoke):
        (JSObject::JSObject):

2004-07-16  John Sullivan  <sullivan@apple.com>

        Reviewed by Maciej.
        
        - fixed <rdar://problem/3714644> REGRESSION (125.8-146): bugzilla submit link 
        hangs browser with javascript

        * kjs/array_object.cpp:
        (ArrayProtoFuncImp::call):
        Check for undefined type for args[0] the same way we were already checking
        for args[1]. In this case, args was zero-length, but we were treating
        args[0] like an integer anyway. Resulted in some code looping from a NAN
        value to 4, taking approximately forever.

        * JavaScriptCore.pbproj/project.pbxproj:
        version wars
        
=== Safari-152 ===

2004-07-14  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        <rdar://problem/3711474>: (REGRESSION (125-146): JavaScript 'toString(16)' is broken)
        <rdar://problem/3644873>: (REGRESSION (125-140u): secondary list doesn't fill in at Southwest.com)

        * kjs/number_object.cpp:
        (NumberProtoFuncImp::call): Initialize radix from dradix, not from itself!

2004-07-13  Kevin Decker  <kdecker@apple.com>

        Reviewed by kocienda.

        - made testkjs and JavaScriptCore a subtarget of 'All'
        - testkjs now builds in $SYMROOTS

        * JavaScriptCore.pbproj/project.pbxproj:

=== Safari-151 ===

2004-06-24  Chris Blumenberg  <cblu@apple.com>

        Ignore .mode1 files in JavaScriptCore.pbproj

        Reviewed by kocienda.

        * JavaScriptCore.pbproj/.cvsignore:

2004-06-23  Richard Williamson   <rjw@apple.com>

        Implemented changes for latest npruntime.h.
        
        Reviewed by Chris.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/NP_jsobject.cpp:
        (listFromVariantArgs):
        (identiferFromNPIdentifier):
        (_NPN_CreateScriptObject):
        (NPN_Call):
        (NPN_Evaluate):
        (NPN_GetProperty):
        (NPN_SetProperty):
        (NPN_RemoveProperty):
        * bindings/NP_jsobject.h:
        * bindings/c/c_class.cpp:
        (CClass::methodsNamed):
        (CClass::fieldNamed):
        * bindings/c/c_instance.cpp:
        (CInstance::invokeMethod):
        * bindings/c/c_utility.cpp:
        (convertNPVariantToValue):
        * bindings/c/c_utility.h:
        * bindings/npruntime.cpp:
        (stringIdentifierEqual):
        (stringIdentifierHash):
        (getStringIdentifierDictionary):
        (intIdentifierEqual):
        (intIdentifierHash):
        (getIntIdentifierDictionary):
        (NPN_GetStringIdentifier):
        (NPN_GetStringIdentifiers):
        (NPN_GetIntIdentifier):
        (NPN_IdentifierIsString):
        (NPN_UTF8FromIdentifier):
        (NPN_VariantToInt32):
        (NPN_VariantToDouble):
        (NPN_SetException):
        * bindings/npruntime.h:
        * bindings/objc/WebScriptObject.mm:
        (+[WebScriptObject _convertValueToObjcValue:KJS::root:Bindings::]):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::~RuntimeObjectImp):
        * bindings/runtime_root.cpp:
        (KJS::Bindings::rootForInterpreter):
        * bindings/testbindings.cpp:
        (initializeIdentifiers):
        (logMessage):
        (setDoubleValue):
        (setIntValue):
        (setBooleanValue):

=== JavaScriptCore-146.1 ===

2004-06-16  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3702287> Crash returning nil from bound ObjC

        This turned out to be a show stopper for Dashboard.  Accessing a nil
        ObjC property from JS caused a crash.  Similar to the problem
        3696112 fixed below.
        
        Reviewed by Trey.

        * bindings/objc/objc_runtime.mm:
        (KJS::Bindings::ObjcField::valueFromInstance):

=== Safari-146 ===

2004-06-16  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3696112>: nil from an Objective-C class seems to get wrapped as a JavaScript proxy that will not print.

        This turned out to be a show stopper for Dashboard.  We now
        return Undefined() when nil is returned from a ObjC method
        that returns an object type.
        
        Reviewed by Maciej.

        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertObjcValueToValue):

=== Safari-145 ===

2004-06-15  Richard Williamson   <rjw@apple.com>

        Fixed <rdar://problem/3695875>: Objective-C instances that are exported to JavaScript are too promiscuous

        No longer need to check respondsToSelector: for
        isSelectorExcludedFromWebScript: and isKeyExcludedFromWebScript:
        because these now have a default implementation on NSObject.

        Reviewed by Trey.

        * bindings/objc/objc_class.mm:
        (ObjcClass::methodsNamed):
        (ObjcClass::fieldNamed):

2004-06-14  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed some things for GC that Patrick missed, or that happened after the branch

        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject dealloc]): Moved removeNativeReference call here from private object.
        (-[WebScriptObject finalize]): Added.

        - added some missing nil checks

        * bindings/objc/objc_instance.mm:
        (ObjcInstance::ObjcInstance): Check for nil.
        (ObjcInstance::~ObjcInstance): Check for nil.
        (ObjcInstance::operator=): Check for nil.

2004-06-14  Darin Adler  <darin@apple.com>

        Reviewed by me, code changes by Patrick Beard.

        - fixed <rdar://problem/3671507>: (WebKit should adopt GC changes and compile with GC enabled)

        * bindings/objc/objc_instance.mm:
        (ObjcInstance::ObjcInstance): Use CFRetain instead of retain.
        (ObjcInstance::~ObjcInstance): Use CFRelease instead of release.
        (ObjcInstance::operator=): More of the same.
        (ObjcInstance::end): Use [pool drain] if compiling on Tiger.

        * bindings/objc/objc_runtime.mm:
        (ObjcArray::ObjcArray): Use CFRetain instead of retain.
        (ObjcArray::~ObjcArray): Use CFRelease instead of release.
        (ObjcArray::operator=): More of the same.

        * bindings/testbindings.mm: Fixed incorrect license.
        (main): Use [pool drain] if compiling on Tiger.

=== Safari-144 ===

2004-06-10  Kevin Decker  <kdecker@apple.com>

        Reviewed by John.

        * kjs/lexer.cpp: 
        (Lexer::setCode):
            - fixed <rdar://problem/3682398>: (error console line numbers are offset by 1)
        * kjs/lexer.h:
        (KJS::Lexer::lineNo):
            - fixed <rdar://problem/3682398>: (error console line numbers are offset by 1)

=== JavaScriptCore-143.2 ===

2004-06-07  Darin Adler  <darin@apple.com>

        - fixed <rdar://problem/3682489>: (JavaScriptGlue no longer compiles because Interpreter::evaluate parameters changed)

        * kjs/interpreter.h: Added an overload to make JavaScriptGlue compile.
        * kjs/interpreter.cpp: (KJS::Interpreter::evaluate): Implemented the overload.

=== JavaScriptCore-143.1 ===

2004-06-04  Kevin Decker  <kdecker@apple.com>

        Reviewed by Darin
        
        - fixed <rdar://problem/3680594>

        * kjs/object.cpp:
        (KJS::Error::create):

=== Safari-143 ===

2004-06-04  Darin Adler  <darin@apple.com>

        * kjs/testkjs.cpp: (main): Fix build breakage by adding URL and line number parameters.

2004-06-04  Kevin Decker  <kdecker@apple.com>

        Reviewed by Dave.

        - ObjC bindings do not (yet) pass along sourceurl or line numbers
        - we don't have a way as of yet to accomidate line numbers and urls for dynamic javascript
        - changed the wording of an error message
        - the lexer, parser, and interpreter have been made "sourceURL aware"
        - stored the url into Error
         
        * bindings/NP_jsobject.cpp:
        (NPN_Evaluate):
        * bindings/jni/jni_jsobject.cpp:
        (JSObject::eval):
        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject evaluateWebScript:]):
        * kjs/function.cpp:
        (GlobalFuncImp::call):
        * kjs/function_object.cpp:
        (FunctionObjectImp::construct):
        * kjs/internal.cpp:
        (Parser::parse):
        (InterpreterImp::checkSyntax):
        (InterpreterImp::evaluate):
        * kjs/internal.h:
        * kjs/interpreter.cpp:
        (Interpreter::evaluate):
        * kjs/interpreter.h:
        * kjs/lexer.cpp:
        (Lexer::setCode):
        * kjs/lexer.h:
        (KJS::Lexer::sourceURL):
        * kjs/nodes.cpp:
        (Node::Node):
        (Node::throwError):
        (FunctionCallNode::evaluate):
        * kjs/nodes.h:
        * kjs/object.cpp:
        (KJS::Error::create):
        * kjs/object.h:

2004-06-04  Richard Williamson   <rjw@apple.com>

        Fixed crash when attempting to access properties on nil
        object.
        
        Reviewed by John.

        * bindings/objc/objc_instance.mm:
        (ObjcInstance::getClass):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):
        * bindings/testM.js:
        * bindings/testbindings.mm:
        (-[MyFirstInterface getString]):

2004-05-27  Kevin Decker  <kdecker@apple.com>

        Reviewed by Ken.

        -revised generated error message content
        
        * kjs/error_object.cpp:
        (ErrorProtoFuncImp::call):
        * kjs/internal.cpp:
        (Parser::parse):
        * kjs/object.cpp:
        (KJS::Error::create):

=== Safari-142 ===

2004-05-27  Richard Williamson   <rjw@apple.com>

        Renamed WebScriptMethods to WebScripting based on feedback from Nancy.

        Reviewed by Chris.

        * bindings/objc/WebScriptObject.h:

2004-05-27  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - moved to new symlink technique for embedding frameworks

        * JavaScriptCore.pbproj/project.pbxproj: Get rid of embed-frameworks build step
        because we don't need it any more.

2004-05-24  Richard Williamson   <rjw@apple.com>

        Changed RuntimeArrayImp to inherit from ArrayInstanceImp and
        fixed ClassInfo to correctly reflect inheritance.  This is required
        because of the runtime checks in JSC for arrays, i.e. in
        the Function objects apply method.

        Reviewed by Ken.

        * bindings/jni/jni_runtime.cpp:
        (JavaArray::convertJObjectToArray):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertObjcValueToValue):
        * bindings/runtime_array.cpp:
        (RuntimeArrayImp::RuntimeArrayImp):
        * bindings/runtime_array.h:
        * bindings/testM.js: Added.
        * bindings/testbindings.mm:
        (+[MyFirstInterface webScriptNameForSelector:]):
        (-[MyFirstInterface logMessages:]):
        (-[MyFirstInterface logMessage:prefix:]):
        (-[MyFirstInterface callJSObject::]):

2004-05-22  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed <rdar://problem/3664260>: (JS needs to listen to timezone change notifications)

        * kjs/date_object.cpp: (CopyLocalTimeZone): As per Chris Kane and Jordan Hubbard, use <notify.h>
        with a hardcoded string of "com.apple.system.timezone", and do CFTimeZoneResetSystem since
        CoreFoundation doesn't do this itself. Turns out this affects the default time zone as long as
        it hasn't been set explicitly.

=== Safari-141 ===

2004-05-20  Richard Williamson   <rjw@apple.com>

        Implemented WebScriptObject/DOM wrapper voodoo.  DOM wrappers
        can now be referenced like any other WebScriptObject, meaning
        you can do JS operations on them.

        All added implementation of finalizeForWebScript.

        Reviewed by Ken.

        * bindings/objc/WebScriptObject.h:
        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject _initializeWithObjectImp:KJS::root:Bindings::]):
        (-[WebScriptObject _initWithObjectImp:KJS::root:Bindings::]):
        (-[WebScriptObject KJS::]):
        (-[WebScriptObject dealloc]):
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject setValue:forKey:]):
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject stringRepresentation]):
        * bindings/objc/WebScriptObjectPrivate.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::~ObjcInstance):

2004-05-19  Richard Williamson   <rjw@apple.com>

        Removed extraneous tabs that were added (by XCode?).

        * bindings/objc/WebScriptObject.h:

2004-05-19  Darin Adler  <darin@apple.com>

        - fixed headers with licenses mangled by Xcode auto-indenting

        * bindings/jni/jni_jsobject.cpp:
        * bindings/jni/jni_jsobject.h:
        * bindings/runtime_array.h:
        * bindings/runtime_root.cpp:
        * bindings/runtime_root.h:

2004-05-18  Richard Williamson   <rjw@apple.com>

        Added exception logging.  Also check for exception and
        set results as appropriate.

        Reviewed by Maciej (partially reviewed).

        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject setValue:forKey:]):
        (-[WebScriptObject valueForKey:]):

2004-05-18  Richard Williamson   <rjw@apple.com>

        Finsished implementing support for windowScriptObject.
        Had to make WebScriptObjectPrivate.h accessible from
        WebCore.

        Reviewed by Maciej.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/objc/WebScriptObjectPrivate.h:

2004-05-18  Richard Williamson   <rjw@apple.com>

        Use KVC to set/get values instead of directly accessing
        ivars.

        Reviewed by Maciej.

        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (+[WebScriptObject _convertValueToObjcValue:KJS::root:Bindings::]):
        * bindings/objc/objc_runtime.mm:
        (ObjcField::valueFromInstance):
        (convertValueToObjcObject):
        (ObjcField::setValueToInstance):

2004-05-17  Richard Williamson   <rjw@apple.com>

        Implemented new API for WebScriptObject.

        Fixed <rdar://problem/3657145>: (objc to javascript method calls do not cause updates.)
        Fixed <rdar://problem/3654887>: (Update to JSC to refer to new JSObject LiveConnect object)  (w/ help from Vicki)

        Reviewed by Hyatt.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/c/c_instance.cpp:
        (CInstance::invokeMethod):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_jsobject.cpp:
        (JSObject::convertValueToJObject):
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::getJNIField):
        * bindings/objc/WebScriptObject.mm:
        (_didExecute):
        (-[WebScriptObject _initWithObjectImp:KJS::root:Bindings::]):
        (-[WebScriptObject KJS::]):
        (-[WebScriptObject dealloc]):
        (+[WebScriptObject throwException:]):
        (listFromNSArray):
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject setValue:forKey:]):
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject stringRepresentation]):
        (+[WebScriptObject _convertValueToObjcValue:KJS::root:Bindings::]):
        (+[WebUndefined undefined]):
        (-[WebUndefined initWithCoder:]):
        (-[WebUndefined encodeWithCoder:]):
        (-[WebUndefined copyWithZone:]):
        (-[WebUndefined retain]):
        (-[WebUndefined release]):
        (-[WebUndefined retainCount]):
        (-[WebUndefined autorelease]):
        (-[WebUndefined dealloc]):
        (-[WebUndefined copy]):
        (-[WebUndefined replacementObjectForPortCoder:]):
        * bindings/objc/WebScriptObjectPrivate.h: Added.
        * bindings/objc/objc_class.mm:
        (ObjcClass::methodsNamed):
        (ObjcClass::fieldNamed):
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):
        * bindings/objc/objc_jsobject.h:
        * bindings/objc/objc_jsobject.mm:
        * bindings/objc/objc_runtime.mm:
        (ObjcField::valueFromInstance):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::JSMethodNameToObjCMethodName):
        (KJS::Bindings::convertValueToObjcValue):
        (KJS::Bindings::convertObjcValueToValue):
        * bindings/runtime.cpp:
        (Instance::setDidExecuteFunction):
        (Instance::didExecuteFunction):
        (Instance::setValueOfField):
        * bindings/runtime.h:
        * bindings/testbindings.mm:
        (+[MyFirstInterface webScriptNameForSelector:]):
        (-[MyFirstInterface callJSObject::]):

2004-05-14  Vicki Murley  <vicki@apple.com>

        Reviewed by mjs.
 
        <rdar://problem/3642427>: framework marketing number should be 2.0 for DoubleBarrel release

        * JavaScriptCore.pbproj/project.pbxproj: change CFBundleShortVersionString to 2.0

=== Safari-140 ===

2004-05-13  Richard Williamson   <rjw@apple.com>

        Fixed indentation.

        Reviewed by Chris.

        * ChangeLog:
        * bindings/objc/WebScriptObject.h:

2004-05-13  Richard Williamson   <rjw@apple.com>

        Approved API changes.  Currently unimplemented.

        Reviewed by Chris.

        * ChangeLog:
        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/objc/WebScriptObject.h: Added.
        * bindings/objc/WebScriptObject.mm: Added.
        (+[WebScriptObject throwException:]):
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject stringRepresentation]):
        (+[WebUndefined undefined]):
        (-[WebUndefined initWithCoder:]):
        (-[WebUndefined encodeWithCoder:]):
        (-[WebUndefined copyWithZone:]):

2004-05-07  Vicki Murley  <vicki@apple.com>

        Reviewed by darin.

        Turn off GC since it uses ppc only instructions (which breaks 
        the B&I build).   
    
        * kjs/value.h: set USE_CONSERVATIVE_GC to 0

=== Safari-139 ===

2004-05-07  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - add -funroll-loops=16 compiler option for approx .5% speedup on
        HTML iBench and .5-1% speedup on JS iBench.
        
        * JavaScriptCore.pbproj/project.pbxproj:

2004-04-25  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        Enable full conservative GC mode in addition to test mode. When
        conservative GC is enabled, we now get an 11% speed improvement on
        the iBench. Also fix some spots I missed before.

        Specific noteworth changes:
        
        * kjs/collector.cpp:
        (KJS::Collector::markStackObjectsConservatively): Check possible
        cell pointers for 8-byte aligment and verify they are not 0.

        * kjs/protected_values.cpp:
        (KJS::ProtectedValues::increaseProtectCount): Move null-tolerance from here...
        (KJS::ProtectedValues::decreaseProtectCount): ...and here...
        * kjs/protect.h:
        (KJS::gcProtectNullTolerant): ...to here...
        (KJS::gcUnprotectNullTolerant): ...and here, because not all callers need the null
        tolerance, and doing the check is expensive.

        * kjs/protected_values.cpp:
        (KJS::ProtectedValues::computeHash): Replace hash function with a much faster one
        that is still very good.

        * kjs/protect.h:
        (KJS::gcProtect):
        (KJS::gcUnprotect):
        (KJS::ProtectedValue::ProtectedValue):
        (KJS::ProtectedValue::~ProtectedValue):
        (KJS::ProtectedValue::operator=):
        (KJS::ProtectedObject::ProtectedObject):
        (KJS::ProtectedObject::~ProtectedObject):
        (KJS::ProtectedObject::operator=):
        (KJS::ProtectedReference::ProtectedReference):
        (KJS::ProtectedReference::~ProtectedReference):
        (KJS::ProtectedReference::operator=):
        * kjs/protected_values.cpp:
        (KJS::ProtectedValues::getProtectCount):
        (KJS::ProtectedValues::increaseProtectCount):
        (KJS::ProtectedValues::decreaseProtectCount):
        (KJS::ProtectedValues::computeHash):
        * bindings/runtime_root.cpp:
        (KJS::Bindings::addNativeReference):
        (KJS::Bindings::removeNativeReference):
        (RootObject::removeAllNativeReferences):
        * bindings/runtime_root.h:
        (KJS::Bindings::RootObject::~RootObject):
        (KJS::Bindings::RootObject::setRootObjectImp):
        * kjs/collector.cpp:
        (KJS::Collector::allocate):
        (KJS::Collector::collect):
        * kjs/collector.h:
        * kjs/internal.cpp:
        (NumberImp::create):
        (InterpreterImp::globalInit):
        (InterpreterImp::globalClear):
        (InterpreterImp::mark):
        * kjs/list.cpp:
        (KJS::List::derefValues):
        (KJS::List::refValues):
        (KJS::List::append):
        * kjs/object.cpp:
        (KJS::ObjectImp::setInternalValue):
        (KJS::ObjectImp::putDirect):
        * kjs/value.cpp:
        (ValueImp::mark):
        (ValueImp::marked):
        * kjs/value.h:
        (KJS::ValueImp::ValueImp):
        (KJS::ValueImp::~ValueImp):
        (KJS::ValueImp::):
        (KJS::Value::Value):
        (KJS::Value::~Value):
        (KJS::Value::operator=):

2004-04-30  Richard Williamson   <rjw@apple.com>

        Asking an NSInvocation for it's return value when return type
        is void throws an exception.  Added check for void return types
        to avoid this exception.

        Reviewed by Ken.

        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeMethod):

2004-04-29  Richard Williamson   <rjw@apple.com>

        Fixed several bad problems with the ObjC bindings.  In particular, conversion
        to/from JavaScriptObject (soon to be WebScriptObject) was completely broken.

        Reviewed by Chris.

        * bindings/objc/objc_jsobject.h:
        * bindings/objc/objc_jsobject.mm:
        (-[JavaScriptObject initWithObjectImp:KJS::root:Bindings::]):
        (-[JavaScriptObject KJS::]):
        (+[JavaScriptObject _convertValueToObjcValue:KJS::root:Bindings::]):
        (-[JavaScriptObject call:arguments:]):
        (-[JavaScriptObject evaluate:]):
        (-[JavaScriptObject getMember:]):
        (-[JavaScriptObject getSlot:]):
        * bindings/objc/objc_runtime.mm:
        (ObjcField::valueFromInstance):
        (ObjcField::setValueToInstance):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        (KJS::Bindings::convertObjcValueToValue):
        * bindings/runtime.h:
        * bindings/runtime_root.cpp:
        (KJS::Bindings::rootForInterpreter):
        (KJS::Bindings::addNativeReference):
        (KJS::Bindings::removeNativeReference):
        * bindings/runtime_root.h:
        * bindings/testbindings.mm:
        (-[MyFirstInterface logMessage:]):
        (-[MyFirstInterface setJSObject:]):
        (-[MyFirstInterface callJSObject::]):

2004-04-24  Darin Adler  <darin@apple.com>

        Reviewed by Dave.

        * kjs/ustring.cpp: (KJS::UString::append): Fix one case that was allocating a buffer
        that is 2x too big.

2004-04-23  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        Implementation of conservative GC, based partly on code from
        Darin. It's turned off for now, so it shouldn't have any effect on
        the normal build.
        
        * JavaScriptCore.pbproj/project.pbxproj:
        * kjs/collector.cpp:
        (KJS::Collector::markStackObjectsConservatively):
        (KJS::Collector::markProtectedObjects):
        (KJS::Collector::collect):
        * kjs/collector.h:
        * kjs/protect.h:
        (KJS::gcProtect):
        (KJS::gcUnprotect):
        * kjs/protected_values.cpp: Added.
        (KJS::ProtectedValues::getProtectCount):
        (KJS::ProtectedValues::increaseProtectCount):
        (KJS::ProtectedValues::insert):
        (KJS::ProtectedValues::decreaseProtectCount):
        (KJS::ProtectedValues::expand):
        (KJS::ProtectedValues::shrink):
        (KJS::ProtectedValues::rehash):
        (KJS::ProtectedValues::computeHash):
        * kjs/protected_values.h: Added.
        * kjs/value.cpp:
        (ValueImp::useConservativeMark):
        (ValueImp::mark):
        (ValueImp::marked):
        * kjs/value.h:
        (KJS::ValueImp::):

=== Safari-138 ===

2004-04-22  Richard Williamson   <rjw@apple.com>

        Fixed build snafu (re-declaration of NPBool in npruntime.h and
        npapi.h).

        * bindings/npruntime.h:

2004-04-22  Richard Williamson   <rjw@apple.com>

        Updated plugin binding API to reflect latest revision from
        working group.
        
        Biggest change is the introduction of NPVariant used to represent
        value types.  NPVariant replaces the use of NPObject for the
        exchange of values between scripting environment and native code.

        Reviewed by John.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/NP_jsobject.cpp:
        (identiferFromNPIdentifier):
        (NPN_Call):
        (NPN_Evaluate):
        (NPN_GetProperty):
        (NPN_SetProperty):
        (NPN_ToString):
        (NPN_GetPropertyAtIndex):
        (NPN_SetPropertyAtIndex):
        * bindings/c/c_class.cpp:
        (CClass::methodsNamed):
        (CClass::fieldNamed):
        * bindings/c/c_instance.cpp:
        (CInstance::invokeMethod):
        (CInstance::defaultValue):
        * bindings/c/c_runtime.cpp:
        (CField::valueFromInstance):
        (CField::setValueToInstance):
        * bindings/c/c_utility.cpp:
        (convertNPStringToUTF16):
        (convertUTF8ToUTF16):
        (coerceValueToNPVariantStringType):
        (convertValueToNPVariant):
        (convertNPVariantToValue):
        * bindings/c/c_utility.h:
        * bindings/npruntime.cpp:
        (NPN_GetIdentifier):
        (NPN_GetIdentifiers):
        (NPN_UTF8FromIdentifier):
        (NPN_VariantIsVoid):
        (NPN_VariantIsNull):
        (NPN_VariantIsUndefined):
        (NPN_VariantIsBool):
        (NPN_VariantIsInt32):
        (NPN_VariantIsDouble):
        (NPN_VariantIsString):
        (NPN_VariantIsObject):
        (NPN_VariantToBool):
        (NPN_VariantToString):
        (NPN_VariantToInt32):
        (NPN_VariantToDouble):
        (NPN_VariantToObject):
        (NPN_InitializeVariantAsVoid):
        (NPN_InitializeVariantAsNull):
        (NPN_InitializeVariantAsUndefined):
        (NPN_InitializeVariantWithBool):
        (NPN_InitializeVariantWithInt32):
        (NPN_InitializeVariantWithDouble):
        (NPN_InitializeVariantWithString):
        (NPN_InitializeVariantWithStringCopy):
        (NPN_InitializeVariantWithObject):
        (NPN_InitializeVariantWithVariant):
        (NPN_ReleaseVariantValue):
        (NPN_CreateObject):
        (NPN_RetainObject):
        (NPN_ReleaseObject):
        (NPN_IsKindOfClass):
        (NPN_SetExceptionWithUTF8):
        (NPN_SetException):
        * bindings/npruntime.h:
        (_NPString::):
        (_NPString::_NPVariant::):
        * bindings/testbindings.cpp:
        (logMessage):
        (setDoubleValue):
        (setIntValue):
        (setStringValue):
        (setBooleanValue):
        (getDoubleValue):
        (getIntValue):
        (getStringValue):
        (getBooleanValue):
        (myGetProperty):
        (mySetProperty):
        (myInvoke):
        (myAllocate):

2004-04-22  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed <rdar://problem/3627473>: "REGRESSION (125-137): memory trasher in UString::append, causing many different crashes"

        * kjs/ustring.cpp:
        (KJS::UString::expandCapacity): Fix sizeof(UChar *) that should be sizeof(UChar).
        Was resulting in a buffer 2x the needed size.
        (KJS::UString::expandPreCapacity): Ditto.
        (KJS::UString::append): Fix malloc that is missing a sizeof(UChar).

2004-04-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        Preliminary change for conservative GC. Create "protected"
        subclasses to GC-protect objects when on heap, since we will soon
        remove the built-in refcounting of the normal wrapper classes. Use
        them where needed.
        
        * JavaScriptCore.pbproj/project.pbxproj:
        * kjs/context.h:
        * kjs/internal.h:
        (KJS::InterpreterImp::globalObject):
        * kjs/interpreter.h:
        * kjs/property_map.cpp:
        * kjs/reference.h:
        * kjs/reference_list.cpp:

2004-04-19  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Dave.

        Optimize prepend using the shared substring optimization. Also,
        limit the applicability of shared append and shared prepend. If
        you overdo it, it does more harm than good, because you create a
        bunch of strings that are disqualified from future shared
        append/prepend, for not much immediate savings in allocate/copy
        expense.
        
        * kjs/ustring.cpp:
        (KJS::):
        (KJS::UString::Rep::create):
        (KJS::UString::expandedSize):
        (KJS::UString::usedPreCapacity):
        (KJS::UString::expandCapacity):
        (KJS::UString::expandPreCapacity):
        (KJS::UString::UString):
        (KJS::UString::append):
        (KJS::UString::operator=):
        * kjs/ustring.h:
        (KJS::UString::Rep::data):

2004-04-16  Maciej Stachowiak  <mjs@apple.com>
        Reviewed by Richard.

        No more need for Completion or Reference to privately inherit from
        Value, none of the superclass functionality is used.

        * kjs/completion.h:
        * kjs/reference.h:

=== Safari-137 ===

2004-04-16  Richard Williamson   <rjw@apple.com>

        Added interpreter lock protection around object creation.

        Reviewed by Chris.

        * bindings/runtime.cpp:
        (Instance::createRuntimeObject):

2004-04-16  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Ken.

        Another JavaScript speed improvement: use the mechanism from
        string append optimization to make taking a substring fast, again
        sharing the buffer.

        A further 22% improvement on the 24fun string speed test.
        
        * kjs/ustring.cpp:
        (KJS::):
        (KJS::UString::Rep::create):
        (KJS::UString::UString):
        (KJS::UString::append):
        (KJS::UString::operator=):
        (KJS::UString::substr):
        * kjs/ustring.h:
        (KJS::UString::Rep::data):

2004-04-13  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - fixed <rdar://problem/3600695>: String manipulation in JavaScript 24fun test is very slow (slow)
        - fixed <rdar://problem/3600691>: Table generation test is really slow
        - fixed <rdar://problem/3600661>: 24fun date test is really slow

        80% speedup on the string test, lesser speedups on the other two.
        
        Two different optimizations here:

        1) Avoid large overhead of scanning strings to see if they are all
        ASCII before numeric conversion.
        
        * kjs/nodes.cpp:
        (AssignNode::evaluate): Don't convert to integer until we know for
        sure the operation will need it. Attempting to convert strings to
        numbers is a waste when they are being appended with +=.

        2) Avoid huge cost of appending strings.

        This is done by allowing multiple strings to share a buffer but
        actually use different ranges of it. The first time a string is
        appended to, we start leaving at least 10% extra space in the
        buffer, so doing N appends to the same string takes O(log N)
        mallocs instead of O(N).
        
        * kjs/identifier.cpp:
        (KJS::Identifier::equal):
        (KJS::Identifier::add):
        * kjs/ustring.cpp:
        (KJS::):
        (KJS::UCharReference::operator=):
        (KJS::UCharReference::ref):
        (KJS::UString::Rep::create):
        (KJS::UString::Rep::destroy):
        (KJS::UString::expandedSize):
        (KJS::UString::usedCapacity):
        (KJS::UString::expandCapacity):
        (KJS::UString::UString):
        (KJS::UString::null):
        (KJS::UString::append):
        (KJS::UString::operator=):
        (KJS::UString::toStrictUInt32):
        (KJS::UString::detach):
        (KJS::KJS::operator==):
        * kjs/ustring.h:
        (KJS::UString::Rep::data):
        (KJS::UString::Rep::hash):

2004-04-09  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        - fix deployment build by avoiding deployment-only warning.

        * kjs/scope_chain.cpp:
        (KJS::ScopeChain::bottom):

2004-04-09  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        Changed things so that newly created objects get a prototype based
        on the scope chain of the current function, rather than the
        interpreter that started execution. This fixes the following bugs:
        
        <rdar://problem/3368523>: ARCH: wrong prototype used to create new objects (hang on lookup.atomica.com)
        <rdar://problem/3559173>: ARCH: Cannot scan using a HP Jetdirect product (JS object prototypes bind incorrectly)

        * JavaScriptCore.pbproj/project.pbxproj:
        * kjs/array_object.cpp:
        (CompareWithCompareFunctionArguments::CompareWithCompareFunctionArguments):
        (ArrayProtoFuncImp::ArrayProtoFuncImp):
        (ArrayProtoFuncImp::call):
        (ArrayObjectImp::construct):
        * kjs/bool_object.cpp:
        (BooleanObjectImp::construct):
        * kjs/date_object.cpp:
        (DateProtoFuncImp::DateProtoFuncImp):
        (DateProtoFuncImp::call):
        (DateObjectImp::construct):
        * kjs/error_object.cpp:
        (ErrorObjectImp::construct):
        * kjs/function.cpp:
        (FunctionImp::FunctionImp):
        (FunctionImp::call):
        (DeclaredFunctionImp::construct):
        (ArgumentsImp::ArgumentsImp):
        (GlobalFuncImp::call):
        * kjs/function_object.cpp:
        (FunctionProtoFuncImp::call):
        (FunctionObjectImp::construct):
        * kjs/internal.cpp:
        (BooleanImp::toObject):
        (StringImp::toObject):
        (NumberImp::toObject):
        (InterpreterImp::InterpreterImp):
        (InterpreterImp::clear):
        (InterpreterImp::interpreterWithGlobalObject):
        * kjs/internal.h:
        * kjs/interpreter.cpp:
        (ExecState::lexicalInterpreter):
        * kjs/interpreter.h:
        (KJS::ExecState::dynamicInterpreter):
        (KJS::ExecState::interpreter):
        * kjs/math_object.cpp:
        (MathFuncImp::MathFuncImp):
        * kjs/nodes.cpp:
        (StatementNode::hitStatement):
        (StatementNode::abortStatement):
        (RegExpNode::evaluate):
        (ElementNode::evaluate):
        (ArrayNode::evaluate):
        (ObjectLiteralNode::evaluate):
        (PropertyValueNode::evaluate):
        (FunctionCallNode::evaluate):
        (FuncDeclNode::processFuncDecl):
        (FuncExprNode::evaluate):
        * kjs/number_object.cpp:
        (NumberObjectImp::construct):
        * kjs/object.cpp:
        (KJS::ObjectImp::defaultValue):
        (KJS::Error::create):
        * kjs/object_object.cpp:
        (ObjectObjectImp::construct):
        * kjs/reference.cpp:
        (Reference::putValue):
        * kjs/regexp_object.cpp:
        (RegExpProtoFuncImp::call):
        (RegExpObjectImp::arrayOfMatches):
        (RegExpObjectImp::construct):
        * kjs/scope_chain.cpp:
        (KJS::ScopeChain::bottom):
        * kjs/scope_chain.h:
        * kjs/string_object.cpp:
        (StringProtoFuncImp::StringProtoFuncImp):
        (StringProtoFuncImp::call):
        (StringObjectImp::construct):

=== Safari-136 ===

=== Safari-135 ===

2004-03-31  Richard Williamson   <rjw@apple.com>

        Tedious renames based on feedback from plugin-futures list.
        NP_ functions are renamed with NPN_ prefix.
        Types prefix renamed from NP_ to NP.
        NPN_CreateStringWithUTF8 and NPN_SetExceptionWithUTF8 now take a length, optionally -1 if string is null terminated. 
        
        No review because this was just a renaming patch.

        * bindings/NP_jsobject.cpp:
        (listFromNPArray):
        (jsAllocate):
        (identiferFromNPIdentifier):
        (NPN_Call):
        (NPN_Evaluate):
        (NPN_GetProperty):
        (NPN_SetProperty):
        (NPN_RemoveProperty):
        (NPN_ToString):
        (NPN_GetPropertyAtIndex):
        (NPN_SetPropertyAtIndex):
        * bindings/NP_jsobject.h:
        * bindings/c/c_class.cpp:
        (CClass::_commonInit):
        (CClass::classForIsA):
        (CClass::CClass):
        (CClass::methodsNamed):
        (CClass::fieldNamed):
        * bindings/c/c_class.h:
        * bindings/c/c_instance.cpp:
        (CInstance::CInstance):
        (CInstance::~CInstance):
        (CInstance::operator=):
        (CInstance::invokeMethod):
        (CInstance::defaultValue):
        * bindings/c/c_instance.h:
        (KJS::Bindings::CInstance::getObject):
        * bindings/c/c_runtime.cpp:
        (CField::valueFromInstance):
        (CField::setValueToInstance):
        * bindings/c/c_runtime.h:
        (KJS::Bindings::CField::CField):
        (KJS::Bindings::CField::name):
        (KJS::Bindings::CMethod::CMethod):
        (KJS::Bindings::CMethod::name):
        * bindings/c/c_utility.cpp:
        (coerceValueToNPString):
        (convertValueToNPValueType):
        (convertNPValueTypeToValue):
        * bindings/c/c_utility.h:
        * bindings/npruntime.cpp:
        (NPN_IdentifierFromUTF8):
        (NPN_IsValidIdentifier):
        (NPN_GetIdentifiers):
        (NPN_UTF8FromIdentifier):
        (NPN_CreateObject):
        (NPN_RetainObject):
        (NPN_ReleaseObject):
        (NPN_IsKindOfClass):
        (NPN_SetExceptionWithUTF8):
        (NPN_SetException):
        (numberAllocate):
        (NPN_CreateNumberWithInt):
        (NPN_CreateNumberWithFloat):
        (NPN_CreateNumberWithDouble):
        (NPN_IntFromNumber):
        (NPN_FloatFromNumber):
        (NPN_DoubleFromNumber):
        (stringAllocate):
        (NPN_CreateStringWithUTF8):
        (NPN_CreateStringWithUTF16):
        (NPN_DeallocateUTF8):
        (NPN_UTF8FromString):
        (NPN_UTF16FromString):
        (NPN_StringLength):
        (booleanAllocate):
        (NPN_CreateBoolean):
        (NPN_BoolFromBoolean):
        (nullAllocate):
        (NPN_GetNull):
        (undefinedAllocate):
        (NPN_GetUndefined):
        (arrayAllocate):
        (arrayDeallocate):
        (NPN_CreateArray):
        (NPN_CreateArrayV):
        (NPN_ObjectAtIndex):
        * bindings/npruntime.h:
        * bindings/runtime.cpp:
        (Instance::createBindingForLanguageInstance):
        * bindings/testbindings.cpp:
        (initializeIdentifiers):
        (myHasProperty):
        (myHasMethod):
        (myGetProperty):
        (mySetProperty):
        (logMessage):
        (setDoubleValue):
        (setIntValue):
        (setStringValue):
        (setBooleanValue):
        (getDoubleValue):
        (getIntValue):
        (getStringValue):
        (getBooleanValue):
        (myInvoke):
        (myAllocate):
        (myInvalidate):
        (myDeallocate):
        (main):

2004-03-31  Richard Williamson   <rjw@apple.com>

        Changed references to NP_runtime.h to npruntime.h
        
        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/NP_jsobject.h:
        * bindings/c/c_class.h:
        * bindings/c/c_instance.h:
        * bindings/c/c_runtime.h:
        * bindings/c/c_utility.h:
        * bindings/npruntime.cpp:

2004-03-31  Richard Williamson   <rjw@apple.com>

        Renamed NP_runtime.h to npruntime.h to match Netscape SDK.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/NP_jsobject.h:
        * bindings/npruntime.cpp:

=== Safari-134 ===

2004-03-23  Richard Williamson   <rjw@apple.com>

        Added implementation of KJS::Value <-> NP_Object conversion functions.
        Augmented test program for 'C' bindings.
        Added asserts and parameter checking to all public API.        

        Reviewed by Ken.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/NP_jsobject.cpp:
        (NP_ToString):
        * bindings/NP_jsobject.h: Added.
        * bindings/NP_runtime.cpp:
        (NP_IdentifierFromUTF8):
        (NP_IsValidIdentifier):
        (NP_GetIdentifiers):
        (NP_CreateObject):
        (NP_RetainObject):
        (NP_ReleaseObject):
        (NP_IsKindOfClass):
        (NP_SetExceptionWithUTF8):
        (NP_SetException):
        (NP_IntFromNumber):
        (NP_FloatFromNumber):
        (NP_DoubleFromNumber):
        (NP_CreateStringWithUTF8):
        (NP_CreateStringWithUTF16):
        (NP_DeallocateUTF8):
        (NP_UTF8FromString):
        (NP_UTF16FromString):
        (NP_StringLength):
        (NP_BoolFromBoolean):
        * bindings/NP_runtime.h:
        * bindings/c/c_instance.cpp:
        (CInstance::invokeMethod):
        * bindings/c/c_utility.cpp:
        (coerceValueToNPString):
        (convertValueToNPValueType):
        (convertNPValueTypeToValue):
        * bindings/c/c_utility.h:
        * bindings/test.js:
        * bindings/testC.js: Added.
        * bindings/testbindings.cpp:
        (logMessage):
        (setDoubleValue):
        (setIntValue):
        (setStringValue):
        (setBooleanValue):
        (getDoubleValue):
        (getIntValue):
        (getStringValue):
        (getBooleanValue):
        (myInterfaceInvoke):
        (myInterfaceAllocate):

=== Safari-133 ===

2004-03-19  Darin Adler  <darin@apple.com>

        Reviewed by Ken.

        - fixed problem with methods like setUTCHour

        * kjs/date_object.cpp: (DateProtoFuncImp::call): Fix conversion back to time_t to use the appropriate
        GMT vs. local time function based on the utc flag.

2004-03-17  Richard Williamson   <rjw@apple.com>

        Added a context parameter to result callbacks use by JavaScriptObject functions.  This was a change requested by Eric Carlson on the QT plugin team.

        Reviewed by Ken.

        * bindings/NP_jsobject.cpp:
        (NP_Call):
        (NP_Evaluate):
        (NP_GetProperty):
        (NP_ToString):
        (NP_GetPropertyAtIndex):
        * bindings/NP_runtime.h:

2004-03-16  Richard Williamson   <rjw@apple.com>

        Fixed 3590169.  Regression (crash) caused by the switch to MethodLists.  Crash when attempting to invoke a method from JavaScript to Java that is not implemented.

        Reviewed by John.

        * bindings/jni/jni_class.cpp:
        (JavaClass::methodsNamed):

2004-03-15  Richard Williamson   <rjw@apple.com>

        Fixed 3570854.  Don't attempt to convert Null to strings.  We
        were incorrectly converting to "Null".

        Actually fixed by Scott Kovatch.

        Reviewed by Richard.

        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::convertValueToJValue):

=== Safari-132 ===

2004-03-11  Richard Williamson   <rjw@apple.com>

        Stitched together the NP stuff to our language independent
        JavaScript binding stuff.  Very close to being done.
        
        Added program to test C bindings (and NP stuff).  Just tests
        properties.  Will add methods and JavaScript access, etc.

        Updated Makefile.am to account for new bindings/c directory.

        Change NP_UTF8 from "const char *" to "char" to allow for
        declarations like "const NP_UTF8 *" and "NP_UTF8 *".  Ditto
        for NP_UTF16.

        Added NP_IsValidIdentifier().

        Reviewed by Chris.

        * JavaScriptCore.pbproj/project.pbxproj:
        * Makefile.am:
        * bindings/NP_jsobject.cpp:
        (identiferFromNPIdentifier):
        (NP_Evaluate):
        * bindings/NP_runtime.cpp:
        (NP_IdentifierFromUTF8):
        (NP_IsValidIdentifier):
        (NP_GetIdentifiers):
        (NP_UTF8FromIdentifier):
        (NP_SetExceptionWithUTF8):
        (NP_SetException):
        (NP_CreateStringWithUTF8):
        (NP_CreateStringWithUTF16):
        (NP_UTF8FromString):
        (NP_UTF16FromString):
        * bindings/NP_runtime.h:
        * bindings/c/c_class.cpp: Added.
        (CClass::_commonDelete):
        (CClass::_commonCopy):
        (CClass::_commonInit):
        (_createClassesByIsAIfNecessary):
        (CClass::classForIsA):
        (CClass::CClass):
        (CClass::name):
        (CClass::methodsNamed):
        (CClass::fieldNamed):
        * bindings/c/c_class.h: Added.
        (KJS::Bindings::CClass::~CClass):
        (KJS::Bindings::CClass::CClass):
        (KJS::Bindings::CClass::operator=):
        (KJS::Bindings::CClass::constructorAt):
        (KJS::Bindings::CClass::numConstructors):
        * bindings/c/c_instance.cpp: Added.
        (CInstance::CInstance):
        (CInstance::~CInstance):
        (CInstance::operator=):
        (CInstance::getClass):
        (CInstance::begin):
        (CInstance::end):
        (CInstance::invokeMethod):
        (CInstance::defaultValue):
        (CInstance::stringValue):
        (CInstance::numberValue):
        (CInstance::booleanValue):
        (CInstance::valueOf):
        * bindings/c/c_instance.h: Added.
        (KJS::Bindings::CInstance::getObject):
        * bindings/c/c_runtime.cpp: Added.
        (CField::valueFromInstance):
        (CField::setValueToInstance):
        * bindings/c/c_runtime.h: Added.
        (KJS::Bindings::CField::CField):
        (KJS::Bindings::CField::name):
        (KJS::Bindings::CField::type):
        (KJS::Bindings::CMethod::CMethod):
        (KJS::Bindings::CMethod::name):
        (KJS::Bindings::CMethod::numParameters):
        * bindings/c/c_utility.cpp: Added.
        (coerceValueToNPValueType):
        (convertValueToNPValueType):
        (convertNPValueTypeToValue):
        * bindings/c/c_utility.h: Added.
        * bindings/make_testbindings:
        * bindings/runtime.cpp:
        (Instance::createBindingForLanguageInstance):
        * bindings/runtime.h:
        (KJS::Bindings::Instance::):
        * bindings/testbindings.cpp: Added.
        (initializeIdentifiers):
        (myInterfaceHasProperty):
        (myInterfaceHasMethod):
        (myInterfaceGetProperty):
        (myInterfaceSetProperty):
        (myInterfaceInvoke):
        (myInterfaceAllocate):
        (myInterfaceInvalidate):
        (myInterfaceDeallocate):
        (GlobalImp::className):
        (readJavaScriptFromFile):
        (main):

2004-03-10  Richard Williamson   <rjw@apple.com>

        Made changes to support new asychronous approach to calls from
        plugin to JavaScript

        Reviewed by Chris.

        * bindings/NP_jsobject.cpp:
        (NP_Call):
        (NP_Evaluate):
        (NP_GetProperty):
        (NP_ToString):
        (NP_GetPropertyAtIndex):
        * bindings/NP_runtime.h:
        * bindings/make_testbindings:
        * bindings/runtime.cpp:
        (Instance::createBindingForLanguageInstance):

2004-03-10  Richard Williamson   <rjw@apple.com>

        Updated header to include proposed changes from
        plugin-futures list.  Calls from plugin to JavaScript
        are now asynchronous.

        Reviewed by Chris.

        * bindings/NP_runtime.h:

=== Safari-131 ===

2004-03-04  Richard Williamson   <rjw@apple.com>

        Implementation of NP_JavaScriptObject.  This is the 'C' class
        that wraps a JavaScript object.

        Reviewed by Chris.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/NP_jsobject.cpp: Added.
        (coerceValueToNPValueType):
        (convertValueToNPValueType):
        (convertNPValueTypeToValue):
        (listFromNPArray):
        (jsAllocate):
        (jsDeallocate):
        (identiferFromNPIdentifier):
        (NP_Call):
        (NP_Evaluate):
        (NP_GetProperty):
        (NP_SetProperty):
        (NP_RemoveProperty):
        (NP_ToString):
        (NP_GetPropertyAtIndex):
        (NP_SetPropertyAtIndex):
        * bindings/NP_runtime.cpp:
        (NP_ObjectAtIndex):
        * bindings/NP_runtime.h:
        * bindings/runtime_object.h:

2004-03-04  Richard Williamson   <rjw@apple.com>

        Added NP_Array implementation.  

        Changed NP_Boolean to just depend on two static instances, no
        space is required for values.

        Reviewed by Chris.

        * bindings/NP_runtime.cpp:
        (NP_CreateBoolean):
        (NP_BoolFromBoolean):
        (arrayAllocate):
        (arrayDeallocate):
        (NP_CreateArray):
        (NP_CreateArrayV):
        (NP_ObjectAtIndex):
        * bindings/NP_runtime.h:

2004-03-03  Darin Adler  <darin@apple.com>

        Reviewed by Vicki.

        * English.lproj/InfoPlist.strings: Removed. No need to localize the version and
        copyright string, and that's all that was in here.
        * JavaScriptCore.pbproj/project.pbxproj: Removed InfoPlist.strings from build.

2004-03-03  Richard Williamson   <rjw@apple.com>

        More 'C' binding implementation.  Fleshed out all the
        'primitive' data types.

        Reviewed by Chris.

        * bindings/NP_runtime.cpp:
        (NP_ReleaseObject):
        (numberAllocate):
        (stringAllocate):
        (stringDeallocate):
        (NP_CreateStringWithUTF8):
        (NP_CreateStringWithUTF16):
        (NP_UTF8FromString):
        (NP_UTF16FromString):
        (NP_StringLength):
        (booleanAllocate):
        (booleanDeallocate):
        (NP_CreateBoolean):
        (NP_BoolFromBoolean):
        (nullAllocate):
        (nullDeallocate):
        (NP_GetNull):
        (undefinedAllocate):
        (undefinedDeallocate):
        (NP_GetUndefined):
        * bindings/NP_runtime.h:

2004-03-03  Richard Williamson   <rjw@apple.com>

        More 'C' binding implementation.

        Reviewed by Chris.

        * bindings/NP_runtime.cpp:
        (identifierEqual):
        (identifierHash):
        (getIdentifierDictionary):
        (NP_IdentifierFromUTF8):
        (NP_UTF8FromIdentifier):
        (NP_CreateObject):
        (NP_ReleaseObject):
        (NP_IsKindOfClass):
        (numberCreate):
        (NP_CreateNumberWithInt):
        (NP_CreateNumberWithFloat):
        (NP_CreateNumberWithDouble):
        (NP_IntFromNumber):
        (NP_FloatFromNumber):
        (NP_DoubleFromNumber):
        * bindings/NP_runtime.h:

2004-03-02  Richard Williamson   <rjw@apple.com>

        Removed retain/release from NP_Class.  Classes will not be allowed to implement their
        own customer retain/release scheme.

        Reviewed by Chris.

        * bindings/NP_runtime.cpp:
        (NP_RetainObject):
        (NP_ReleaseObject):
        * bindings/NP_runtime.h:

2004-03-02  Richard Williamson   <rjw@apple.com>

        C binding API.  Partial implementation.

        Completed ObjectiveC bindings (not based on the C API).  These will re-implemented over the C binding API, but I wanted to get this code in the tree.

        Factored root object reference counting scheme.  It is now useful independent
        of LiveConnect.

        Reviewed by Chris.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/NP_runtime.cpp: Added.
        (NP_IdentifierFromUTF8):
        (NP_GetIdentifiers):
        (NP_UTF8FromIdentifier):
        (NP_CreateObject):
        (NP_RetainObject):
        (NP_ReleaseObject):
        (NP_IsKindOfClass):
        (NP_SetException):
        (NP_Call):
        (NP_Evaluate):
        (NP_GetProperty):
        (NP_SetProperty):
        (NP_RemoveProperty):
        (NP_ToString):
        (NP_GetPropertyAtIndex):
        (NP_SetPropertyAtIndex):
        (NP_CreateNumberWithInt):
        (NP_CreateNumberWithFloat):
        (NP_CreateNumberWithDouble):
        (NP_IntFromNumber):
        (NP_FloatFromNumber):
        (NP_DoubleFromNumber):
        (NP_CreateStringWithUTF8):
        (NP_CreateStringWithUTF16):
        (NP_UTF8FromString):
        (NP_UTF16FromString):
        (NP_CreateBoolean):
        (NP_BoolFromBoolean):
        (NP_GetNull):
        (NP_GetUndefined):
        (NP_CreateArray):
        (NP_CreateArrayV):
        (NP_ObjectAtIndex):
        * bindings/NP_runtime.h: Added.
        * bindings/jni/jni_jsobject.cpp:
        (JSObject::invoke):
        (JSObject::finalize):
        (JSObject::createNative):
        (JSObject::convertValueToJObject):
        * bindings/jni/jni_jsobject.h:
        * bindings/objc/objc_jsobject.h:
        * bindings/objc/objc_jsobject.mm:
        (rootForView):
        (windowJavaScriptObject):
        (-[JavaScriptObject initWithObjectImp:KJS::root:Bindings::]):
        (-[JavaScriptObject dealloc]):
        (-[JavaScriptObject _convertValueToObjcValue:KJS::]):
        (-[JavaScriptObject call:arguments:]):
        (-[JavaScriptObject evaluate:]):
        (-[JavaScriptObject getMember:]):
        (-[JavaScriptObject setMember:value:]):
        (-[JavaScriptObject removeMember:]):
        (-[JavaScriptObject toString]):
        (-[JavaScriptObject getSlot:]):
        (-[JavaScriptObject setSlot:value:]):
        * bindings/objc/objc_utility.h:
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        * bindings/runtime_root.cpp: Added.
        (getReferencesByRootDictionary):
        (getReferencesDictionary):
        (KJS::Bindings::findReferenceDictionary):
        (KJS::Bindings::rootForImp):
        (KJS::Bindings::addNativeReference):
        (KJS::Bindings::removeNativeReference):
        (completedJavaScriptAccess):
        (initializeJavaScriptAccessLock):
        (lockJavaScriptAccess):
        (unlockJavaScriptAccess):
        (RootObject::dispatchToJavaScriptThread):
        (performJavaScriptAccess):
        (RootObject::setFindRootObjectForNativeHandleFunction):
        (RootObject::removeAllNativeReferences):
        * bindings/runtime_root.h: Added.
        (KJS::Bindings::RootObject::RootObject):
        (KJS::Bindings::RootObject::~RootObject):
        (KJS::Bindings::RootObject::setRootObjectImp):
        (KJS::Bindings::RootObject::rootObjectImp):
        (KJS::Bindings::RootObject::setInterpreter):
        (KJS::Bindings::RootObject::interpreter):
        (KJS::Bindings::RootObject::findRootObjectForNativeHandleFunction):
        (KJS::Bindings::RootObject::runLoop):
        (KJS::Bindings::RootObject::performJavaScriptSource):

=== Safari-130 ===

=== Safari-129 ===

2004-02-18  Richard Williamson   <rjw@apple.com>

        Added NSNumber/Number conversion.

        Removed some unnecessary KJS:: namespace specifiers.

        Reviewed by Ken.

        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        (KJS::Bindings::convertObjcValueToValue):
        * bindings/runtime_array.h:

2004-02-18  Richard Williamson   <rjw@apple.com>

        Added support for export NSArrays.

        Updated valueAt() to take an ExecState so we can throw
        JS exceptions.

        Implemented excludeSelectorFromJavaScript: in ObjcClass.  This allows
        ObjectiveC classes to control the visibility of their methods in 
        JavaScript.

        Reviewed by Ken.

        * bindings/jni/jni_runtime.cpp:
        (JavaField::valueFromInstance):
        (JavaArray::valueAt):
        * bindings/jni/jni_runtime.h:
        * bindings/objc/objc_class.mm:
        (ObjcClass::methodsNamed):
        * bindings/objc/objc_runtime.h:
        (KJS::Bindings::ObjcArray::getObjcArray):
        * bindings/objc/objc_runtime.mm:
        (ObjcField::valueFromInstance):
        (ObjcField::setValueToInstance):
        (ObjcArray::ObjcArray):
        (ObjcArray::~ObjcArray):
        (ObjcArray::operator=):
        (ObjcArray::setValueAt):
        (ObjcArray::valueAt):
        (ObjcArray::getLength):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        (KJS::Bindings::convertObjcValueToValue):
        * bindings/runtime.cpp:
        (Instance::getValueOfField):
        * bindings/runtime.h:
        * bindings/runtime_array.cpp:
        (RuntimeArrayImp::get):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):

2004-02-17  Richard Williamson   <rjw@apple.com>

        Added String <-> NSString conversion.
        Added tests of String <-> NSString conversion to test program.

        Reviewed by Chris.

        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        (KJS::Bindings::convertObjcValueToValue):
        * bindings/test.js:
        * bindings/testbindings.mm:
        (-[MyFirstInterface getString]):

2004-02-15  Darin Adler  <darin@apple.com>

        Reviewed by Dave.

        * JavaScriptCore.pbproj/project.pbxproj: Tweak build styles a bit, fixing OptimizedWithSymbols,
        and removing redundant settings of things that match defaults in other build styles.

2004-02-13  Richard Williamson   <rjw@apple.com>

        Work towards the JavaScript ObjC bindings.  The bindings now work for 
        simple scalar types.  testbindings.mm is an illustration of how the 
        bindings work.

        Reviewed by Ken.

        * JavaScriptCore.pbproj/project.pbxproj:
        * Makefile.am:
        * bindings/jni/jni_class.cpp:
        (JavaClass::methodsNamed):
        * bindings/jni/jni_class.h:
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_runtime.h:
        (KJS::Bindings::JavaMethod::returnType):
        * bindings/make_testbindings: Added.
        * bindings/objc/objc_class.h: Added.
        (KJS::Bindings::ObjcClass::~ObjcClass):
        (KJS::Bindings::ObjcClass::ObjcClass):
        (KJS::Bindings::ObjcClass::operator=):
        (KJS::Bindings::ObjcClass::constructorAt):
        (KJS::Bindings::ObjcClass::numConstructors):
        * bindings/objc/objc_class.mm: Added.
        (ObjcClass::_commonDelete):
        (ObjcClass::_commonCopy):
        (ObjcClass::_commonInit):
        (_createClassesByIsAIfNecessary):
        (ObjcClass::classForIsA):
        (ObjcClass::ObjcClass):
        (ObjcClass::name):
        (ObjcClass::methodsNamed):
        (ObjcClass::fieldNamed):
        * bindings/objc/objc_header.h: Added.
        * bindings/objc/objc_instance.h: Added.
        (KJS::Bindings::ObjcInstance::getObject):
        * bindings/objc/objc_instance.mm: Added.
        (ObjcInstance::ObjcInstance):
        (ObjcInstance::~ObjcInstance):
        (ObjcInstance::operator=):
        (ObjcInstance::begin):
        (ObjcInstance::end):
        (ObjcInstance::getClass):
        (ObjcInstance::invokeMethod):
        (ObjcInstance::defaultValue):
        (ObjcInstance::stringValue):
        (ObjcInstance::numberValue):
        (ObjcInstance::booleanValue):
        (ObjcInstance::valueOf):
        * bindings/objc/objc_jsobject.h: Added.
        * bindings/objc/objc_jsobject.mm: Added.
        * bindings/objc/objc_runtime.h:
        (KJS::Bindings::ObjcField::~ObjcField):
        (KJS::Bindings::ObjcField::ObjcField):
        (KJS::Bindings::ObjcField::operator=):
        (KJS::Bindings::ObjcMethod::ObjcMethod):
        (KJS::Bindings::ObjcMethod::~ObjcMethod):
        (KJS::Bindings::ObjcMethod::operator=):
        * bindings/objc/objc_runtime.mm: Added.
        (ObjcMethod::ObjcMethod):
        (ObjcMethod::name):
        (ObjcMethod::numParameters):
        (ObjcMethod::getMethodSignature):
        (ObjcField::ObjcField):
        (ObjcField::name):
        (ObjcField::type):
        (ObjcField::valueFromInstance):
        (ObjcField::setValueToInstance):
        * bindings/objc/objc_utility.h: Added.
        (KJS::Bindings::):
        * bindings/objc/objc_utility.mm: Added.
        (KJS::Bindings::JSMethodNameToObjCMethodName):
        (KJS::Bindings::convertValueToObjcValue):
        (KJS::Bindings::convertObjcValueToValue):
        (KJS::Bindings::objcValueTypeForType):
        * bindings/runtime.cpp:
        (MethodList::MethodList):
        (MethodList::operator=):
        (Instance::setValueOfField):
        (Instance::createBindingForLanguageInstance):
        (Instance::createRuntimeObject):
        * bindings/runtime.h:
        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::RuntimeMethodImp):
        (RuntimeMethodImp::get):
        (RuntimeMethodImp::call):
        * bindings/runtime_method.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::hasProperty):
        * bindings/test.js: Added.
        * bindings/testbindings.mm: Added.
        (-[MySecondInterface init]):
        (-[MyFirstInterface init]):
        (-[MyFirstInterface dealloc]):
        (+[MyFirstInterface JavaScriptNameForSelector:]):
        (-[MyFirstInterface getInt]):
        (-[MyFirstInterface setInt:]):
        (-[MyFirstInterface getMySecondInterface]):
        (-[MyFirstInterface logMessage:]):
        (GlobalImp::className):
        (readJavaScriptFromFile):
        (main):

=== Safari-128 ===

2004-02-08  Darin Adler  <darin@apple.com>

        Reviewed by Dave.

        - fixed things seen in the profile, for a total speedup of 4% on cvs-base (including changes across all projects)

        * JavaScriptCorePrefix.h: Add a workaround for a bug in our system headers that prevents the <ctype.h>
        macros from working right in C++ code that uses the <cctype> header.

        * kjs/ustring.cpp:
        (KJS::inlineUTF8SequenceLengthNonASCII): Added.
        (KJS::UTF8SequenceLengthNonASCII): Added.
        (KJS::inlineUTF8SequenceLength): Added.
        (KJS::UTF8SequenceLength): Calls inlineUTF8SequenceLengthNonASCII now.
        (KJS::decodeUTF8Sequence): Use new inlineUTF8SequenceLengthNonASCII; faster for ASCII.
        (KJS::createSortedOffsetsArray): Add special case for 1, 2, and 3 offsets, so we don't do qsort for those.
        (KJS::convertUTF16OffsetsToUTF8Offsets): Use new inlineUTF8SequenceLengthNonASCII; faster for ASCII.
        (KJS::convertUTF8OffsetsToUTF16Offsets): Use new inlineUTF8SequenceLengthNonASCII; faster for ASCII.

        - fixed the test program so it won't hit the interpreter lock assertion

        * kjs/testkjs.cpp: (main): Just lock around the whole thing, since the test is singly threaded.

=== Safari-127 ===

2004-02-06  Richard Williamson   <rjw@apple.com>

        Fixed 3550242 and 3546977.  The first diff prevents an assert from firing.  The second diff prevents a JavaScript exception, caused be an invalid conversion, which has a downstream consequence of preventing a valid conversion.

        Reviewed by John.

        * bindings/jni/jni_jsobject.cpp:
        (JSObject::toString):
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::convertValueToJValue):

2004-02-02  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed <rdar://problem/3546613>: array of negative size leads to crash (test page at oscar.the-rileys.net)

        * kjs/array_object.cpp:
        (ArrayInstanceImp::ArrayInstanceImp): If the length is greater than 10,000, don't allocate an array until
        we start putting values in. This prevents new Array(2147483647) from causing trouble.
        (ArrayObjectImp::construct): Check number as described in specification, and raise a range error if the
        number is out of range. This prevents new Array(-1) from causing trouble.

        - fixed <rdar://problem/3545756>: Math.round screws up on numbers bigger than 2^31 (incorrect results on HP-35 calculator page)

        * kjs/math_object.cpp: (MathFuncImp::call): Change implementation to be much simpler and not involve
        casting to int. Results now match those in other browsers.

2004-02-02  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed <rdar://problem/3519285>: integer operations on large negative numbers yield bad results (discovered with "HTMLCrypt")
        - fixed other related overflow issues

        * kjs/value.h: Changed return types of toInteger, toInt32, toUInt32, and toUInt16.
        * kjs/value.cpp:
        (ValueImp::toInteger): Change to return a double, since this operation, from the ECMA specification,
        must not restrict values to the range of a particular integer type.
        (ValueImp::toInt32): Used a sized integer type for the result of this function, and also added
        proper handling for negative results from fmod.
        (ValueImp::toUInt32): Ditto.
        (ValueImp::toUInt16): Ditto.
        (ValueImp::dispatchToUInt32): Changed result type from unsigned to uint32_t.

        * kjs/array_object.cpp: (ArrayProtoFuncImp::call): Use a double instead of an int to handle
        out-of-integer-range values better in the slice function.
        * kjs/internal.cpp: (KJS::roundValue): Streamline the function, handling NAN and infinity properly.
        * kjs/number_object.cpp: (NumberProtoFuncImp::call): Use a double instead of an int to handle
        out-of-integer-range values better in the toString function.
        * kjs/string_object.cpp: (StringProtoFuncImp::call): Use a double instead of an int to handle
        out-of-integer-range values better in the charAt, charCodeAt, indexOf, lastIndexOf, slice,
        and substr functions.

=== Safari-126 ===

2004-01-30  Richard Williamson   <rjw@apple.com>

        Fixed 3542044.  Create KJS::String using UString constructor instead of passing UTF8 string to char* constructor.

        Reviewed by Darin.

        * bindings/jni/jni_instance.cpp:
        (JavaInstance::stringValue):

2004-01-26  Darin Adler  <darin@apple.com>

        * Makefile.am: Switch from pbxbuild to xcodebuild.

2004-01-22  Richard Williamson   <rjw@apple.com>

        Added stubs for ObjC language binding to JavaScript.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/jni/jni_runtime.h:
        * bindings/objc/objc_runtime.h: Added.
        (KJS::Bindings::ObjcParameter::ObjcParameter):
        (KJS::Bindings::ObjcParameter::~ObjcParameter):
        (KJS::Bindings::ObjcParameter::operator=):
        (KJS::Bindings::ObjcParameter::type):
        (KJS::Bindings::ObjcConstructor::ObjcConstructor):
        (KJS::Bindings::ObjcConstructor::~ObjcConstructor):
        (KJS::Bindings::ObjcConstructor::_commonCopy):
        (KJS::Bindings::ObjcConstructor::operator=):
        (KJS::Bindings::ObjcConstructor::value):
        (KJS::Bindings::ObjcConstructor::parameterAt):
        (KJS::Bindings::ObjcConstructor::numParameters):
        (KJS::Bindings::ObjcField::ObjcField):
        (KJS::Bindings::ObjcField::~ObjcField):
        * bindings/runtime.h:

2004-01-22  Richard Williamson   <rjw@apple.com>

        Simplified JavaString by using UString as backing store.  This
        revealed a bug in CString's assignment operator which I fixed.

        Removed some dead code.
 
        Reviewed by John.

        * bindings/jni/jni_runtime.h:
        (KJS::Bindings::JavaString::JavaString):
        (KJS::Bindings::JavaString::_commonInit):
        (KJS::Bindings::JavaString::UTF8String):
        (KJS::Bindings::JavaString::uchars):
        (KJS::Bindings::JavaString::length):
        (KJS::Bindings::JavaString::ustring):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::RuntimeObjectImp):
        * bindings/runtime_object.h:
        * kjs/ustring.cpp:
        (KJS::CString::CString):
        (KJS::CString::operator=):

=== Safari-125 ===

=== Safari-124 ===

2004-01-16  Richard Williamson   <rjw@apple.com>

        Fixed 3525853.  We weren't handling mapping to overloaded Java
        methods very well.  Even though this is undefined the other
        browsers support it.  Also fixed a bug with returning arrays
        from Java functions.

        Reviewed by John.

        * bindings/jni/jni_class.cpp:
        (JavaClass::_commonInit):
        (JavaClass::methodsNamed):
        * bindings/jni/jni_class.h:
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_runtime.cpp:
        (JavaArray::convertJObjectToArray):
        (JavaField::valueFromInstance):
        (JavaMethod::signature):
        (JavaArray::valueAt):
        * bindings/jni/jni_runtime.h:
        * bindings/jni_jsobject.cpp:
        (JSObject::call):
        (JSObject::convertJObjectToValue):
        * bindings/runtime.cpp:
        (MethodList::addMethod):
        (MethodList::length):
        (MethodList::methodAt):
        (MethodList::~MethodList):
        * bindings/runtime.h:
        (KJS::Bindings::MethodList::MethodList):
        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::RuntimeMethodImp):
        (RuntimeMethodImp::get):
        (RuntimeMethodImp::call):
        * bindings/runtime_method.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::hasProperty):

2004-01-16  Richard Williamson   <rjw@apple.com>

        Fixed 3531229.  Another place that needs the  Push/PopLocalFrame
        protection implemented for 3530401.

        Reviewed by John.

        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::call):

2004-01-15  Richard Williamson   <rjw@apple.com>

        Fixed 3530401.  JNI doesn't cleanup local refs created on the
        main thread.   IMO this is a bad bug in our JMI implementation.

        To work-around the problem I explicitly delete all local refs.
        Further, I've added Push/PopLocalFrame calls to catch any refs
        that I may have missed.  This will guarantee that we don't leak
        any Java references.

        Reviewed by John.

        * bindings/jni/jni_class.cpp:
        (JavaClass::_commonInit):
        (JavaClass::JavaClass):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::begin):
        (JavaInstance::end):
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_runtime.cpp:
        (JavaConstructor::JavaConstructor):
        (JavaMethod::JavaMethod):
        * bindings/jni_jsobject.cpp:
        (JSObject::listFromJArray):
        * bindings/runtime.h:
        (KJS::Bindings::Instance::begin):
        (KJS::Bindings::Instance::end):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::canPut):
        (RuntimeObjectImp::hasProperty):
        (RuntimeObjectImp::defaultValue):

2004-01-15  Vicki Murley  <vicki@apple.com>

        Reviewed by Darin.

        * JavaScriptCore.pbproj/project.pbxproj: Update copyright date to 2004.

2004-01-14  Richard Williamson   <rjw@apple.com>
        
        Fixed 3529466.  With recent changes to Java plugin we must no
        longer call DeleteLocalRef().  Not a problem, it was an optimization anyway.

        Reviewed by John.

        * bindings/jni/jni_instance.cpp:
        (JObjectWrapper::JObjectWrapper):

=== Safari-122 ===

2004-01-14  Richard Williamson   <rjw@apple.com>

        Fixed 3529010.

        Finalize may be called on an JSObject after we've already remove all our references.  The assert in this case is firing because we've received a finalize call from Java for an instance that we no longer know about.  The fix is to check in finalize that we're getting a call on an instance that we still care about.

        Reviewed by John.

        * bindings/jni_jsobject.cpp:
        (addJavaReference):
        (removeJavaReference):
        (RootObject::removeAllJavaReferencesForRoot):
        (JSObject::invoke):

2004-01-13  Richard Williamson   <rjw@apple.com>

        Fixed 3528324. 

        The run loop that is used to execute JavaScript (in practice, always the main run loop) is held in a class variable.  It is set and retained once and should not be released.  Unfortunately is it being released when the 'root' object on a LiveConnect applet is released.  This has the symptom of eventually causing an deallocation of the main run loop!  Usually after about 5 instantiations/destructions of a LiveConnect applet.  The CFRelease of the run loop was removed.

        Reviewed by Hyatt.

        * bindings/jni_jsobject.h:
        (KJS::Bindings::RootObject::~RootObject):

=== Safari-121 ===

=== Safari-120 ===

2004-01-06  Richard Williamson   <rjw@apple.com>

        Fixed 3521814.  Finalize messages weren't being dispatched!

        Reviewed by John.

        * bindings/jni_jsobject.cpp:
        (JSObject::invoke):

2004-01-05  Richard Williamson   <rjw@apple.com>

        Added cache of JNI method IDs to minimize allocations.  This mitigates the problem
        described by 3515579.

        Also cleanup up logging of Java exceptions.

        Reviewed by John.

        * bindings/jni/jni_class.cpp:
        (JavaClass::classForInstance):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::JavaInstance):
        (JavaInstance::getClass):
        (JavaInstance::invokeMethod):
        (JObjectWrapper::JObjectWrapper):
        (JObjectWrapper::~JObjectWrapper):
        * bindings/jni/jni_instance.h:
        (KJS::Bindings::JavaInstance::operator=):
        * bindings/jni/jni_runtime.cpp:
        (JavaMethod::JavaMethod):
        (JavaMethod::methodID):
        * bindings/jni/jni_runtime.h:
        (KJS::Bindings::JavaMethod::JavaMethod):
        * bindings/jni/jni_utility.cpp:
        (callJNIMethod):
        (callJNIMethodIDA):
        (callJNIMethodA):
        (KJS::Bindings::getMethodID):
        (KJS::Bindings::callJNIVoidMethodIDA):
        (KJS::Bindings::callJNIObjectMethodIDA):
        (KJS::Bindings::callJNIByteMethodIDA):
        (KJS::Bindings::callJNICharMethodIDA):
        (KJS::Bindings::callJNIShortMethodIDA):
        (KJS::Bindings::callJNIIntMethodIDA):
        (KJS::Bindings::callJNILongMethodIDA):
        (KJS::Bindings::callJNIFloatMethodIDA):
        (KJS::Bindings::callJNIDoubleMethodIDA):
        (KJS::Bindings::callJNIBooleanMethodIDA):
        (KJS::Bindings::getCharactersFromJStringInEnv):
        (KJS::Bindings::getUCharactersFromJStringInEnv):
        (KJS::Bindings::getJNIField):
        * bindings/jni/jni_utility.h:

l2003-12-23  John Sullivan  <sullivan@apple.com>

        * JavaScriptCore.pbproj/project.pbxproj:
        Xcode version wars, harmless

2003-12-23  Darin Adler  <darin@apple.com>

        Reviewed by John (concept, not code, which is just the old code coming back).

        - fixed 3518092: REGRESSION (100-119): getting NaN instead of HH:MM times

        * kjs/date_object.cpp: Added back our CF-based implementations of gmtime, localtime,
        mktime, timegm, and time, because mktime, at least, won't handle a year of 0.

2003-12-19  Richard Williamson   <rjw@apple.com>

        Fixed 3515597.  When an error occurs we need
        to make sure result values are zeroed.

        Cleaned up logs by adding a newline.

        Reviewed by John.

        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::getJavaVM):
        (KJS::Bindings::getJNIEnv):
        (callJNIMethod):
        (callJNIMethodA):
        (KJS::Bindings::getJNIField):
        * bindings/jni_jsobject.cpp:
        (JSObject::convertValueToJObject):

=== Safari-119 ===

2003-12-17  Richard Williamson   <rjw@apple.com>

        Ensure that all the symbols we export are in the KJS
        namespace (3512245).

        Also renamed JavaString.characters() to JavaString.UTF8String()
        for enhanced clarity.

        Added some sanity checking to constructor of JObjectWrapper.

        Reviewed by Dave.

        * ChangeLog:
        * bindings/jni/jni_class.cpp:
        * bindings/jni/jni_class.h:
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        (JObjectWrapper::JObjectWrapper):
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_runtime.cpp:
        (JavaParameter::JavaParameter):
        (JavaField::JavaField):
        (JavaMethod::JavaMethod):
        (JavaMethod::signature):
        * bindings/jni/jni_runtime.h:
        (KJS::Bindings::JavaString::ascii):
        (KJS::Bindings::JavaString::UTF8String):
        (KJS::Bindings::JavaString::JavaString):
        (KJS::Bindings::JavaString::_commonInit):
        (KJS::Bindings::JavaString::uchars):
        (KJS::Bindings::JavaString::length):
        (KJS::Bindings::JavaString::ustring):
        (KJS::Bindings::JavaParameter::type):
        (KJS::Bindings::JavaField::name):
        (KJS::Bindings::JavaField::type):
        (KJS::Bindings::JavaMethod::name):
        (KJS::Bindings::JavaMethod::returnType):
        * bindings/jni/jni_utility.cpp:
        (KJS::Bindings::getJavaVM):
        (KJS::Bindings::getJNIEnv):
        (KJS::Bindings::callJNIVoidMethod):
        (KJS::Bindings::callJNIObjectMethod):
        (KJS::Bindings::callJNIBooleanMethod):
        (KJS::Bindings::callJNIByteMethod):
        (KJS::Bindings::callJNICharMethod):
        (KJS::Bindings::callJNIShortMethod):
        (KJS::Bindings::callJNIIntMethod):
        (KJS::Bindings::callJNILongMethod):
        (KJS::Bindings::callJNIFloatMethod):
        (KJS::Bindings::callJNIDoubleMethod):
        (KJS::Bindings::callJNIVoidMethodA):
        (KJS::Bindings::callJNIObjectMethodA):
        (KJS::Bindings::callJNIByteMethodA):
        (KJS::Bindings::callJNICharMethodA):
        (KJS::Bindings::callJNIShortMethodA):
        (KJS::Bindings::callJNIIntMethodA):
        (KJS::Bindings::callJNILongMethodA):
        (KJS::Bindings::callJNIFloatMethodA):
        (KJS::Bindings::callJNIDoubleMethodA):
        (KJS::Bindings::callJNIBooleanMethodA):
        (KJS::Bindings::getCharactersFromJString):
        (KJS::Bindings::releaseCharactersForJString):
        (KJS::Bindings::getCharactersFromJStringInEnv):
        (KJS::Bindings::releaseCharactersForJStringInEnv):
        (KJS::Bindings::getUCharactersFromJStringInEnv):
        (KJS::Bindings::releaseUCharactersForJStringInEnv):
        (KJS::Bindings::JNITypeFromClassName):
        (KJS::Bindings::signatureFromPrimitiveType):
        (KJS::Bindings::JNITypeFromPrimitiveType):
        (KJS::Bindings::getJNIField):
        (KJS::Bindings::convertValueToJValue):
        * bindings/jni/jni_utility.h:
        * bindings/jni_jsobject.cpp:
        (KJS::Bindings::JSObject::invoke):
        (KJS::Bindings::JSObject::JSObject):
        (KJS::Bindings::JSObject::call):
        (KJS::Bindings::JSObject::eval):
        (KJS::Bindings::JSObject::getMember):
        (KJS::Bindings::JSObject::setMember):
        (KJS::Bindings::JSObject::removeMember):
        (KJS::Bindings::JSObject::getSlot):
        (KJS::Bindings::JSObject::setSlot):
        (KJS::Bindings::JSObject::toString):
        (KJS::Bindings::JSObject::finalize):
        (KJS::Bindings::JSObject::createNative):
        (KJS::Bindings::JSObject::convertValueToJObject):
        (KJS::Bindings::JSObject::convertJObjectToValue):
        (KJS::Bindings::JSObject::listFromJArray):
        * bindings/jni_jsobject.h:
        * bindings/runtime.cpp:
        * bindings/runtime.h:
        * bindings/runtime_method.cpp:
        * bindings/runtime_method.h:

=== Safari-118 ===

2003-12-16  Richard Williamson   <rjw@apple.com>

        Ack!  More assertions.  Lock ALL entry points into the interpreter!
        (3511733).

        Reviewed by Ken.

        * bindings/jni_jsobject.cpp:
        (Bindings::JSObject::call):
        (Bindings::JSObject::eval):
        (Bindings::JSObject::getMember):
        (Bindings::JSObject::setMember):
        (Bindings::JSObject::removeMember):
        (Bindings::JSObject::getSlot):
        (Bindings::JSObject::setSlot):
        (Bindings::JSObject::convertJObjectToValue):

2003-12-15  Richard Williamson   <rjw@apple.com>

        Fixed a couple of snafus and removed some logging.

        Reviewed by Maciej.

        * bindings/jni_jsobject.cpp:
        (Bindings::performJavaScriptAccess):
        (Bindings::completedJavaScriptAccess):
        (Bindings::dispatchToJavaScriptThread):
        Removed some annoying JS_LOG clutter.

        (Bindings::RootObject::removeAllJavaReferencesForRoot):
        Fixed allocation of key buffer that was called after it was needed.

        (Bindings::JSObject::invoke):
        (Bindings::JSObject::JSObject):
        (Bindings::JSObject::getMember):
        (Bindings::JSObject::getSlot):
        Added additional interpreter locks around getMember and getSlot. 
        These functions may cause allocation of JS impls.  

2003-12-15  Richard Williamson   <rjw@apple.com>

        args weren't passed to 'call' invocation.  d'oh.
        lock interpreter when we create instances of JS impls.        

        Reviewed by Maciej.

        * bindings/jni_jsobject.cpp:
        (Bindings::JSObject::call):
        (Bindings::JSObject::eval):
        (Bindings::JSObject::getMember):
        (Bindings::JSObject::setMember):
        (Bindings::JSObject::getSlot):
        (Bindings::JSObject::convertValueToJObject):
        (Bindings::JSObject::convertJObjectToValue):
        (Bindings::JSObject::listFromJArray):
        * bindings/jni_jsobject.h:

2003-12-15  Richard Williamson   <rjw@apple.com>

        Last piece of LiveConnect!  This checkin adds implementation
        of the Java to JavaScript object conversion functions.

        Reviewed by John.

        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_utility.cpp:
        * bindings/jni/jni_utility.h:
        * bindings/jni_jsobject.cpp:
        (Bindings::JSObject::invoke):
        (Bindings::JSObject::call):
        (Bindings::JSObject::eval):
        (Bindings::JSObject::getMember):
        (Bindings::JSObject::setMember):
        (Bindings::JSObject::getSlot):
        (Bindings::JSObject::setSlot):
        (Bindings::JSObject::createNative):
        (Bindings::JSObject::convertValueToJObject):
        (Bindings::JSObject::convertJObjectToValue):
        (Bindings::JSObject::listFromJArray):
        * bindings/jni_jsobject.h:
        (Bindings::):
        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::get):
        (RuntimeMethodImp::codeType):
        (RuntimeMethodImp::execute):

2003-12-12  Richard Williamson   <rjw@apple.com>

        Added implementation of stubs in JSObject.  All that
        remains is a couple of simple conversion functions stubs and
        we're done with LiveConnect.  Also, changed string passing to
        JS to use uchars instead of chars.  

        Reviewed by Maciej.

        * bindings/jni/jni_runtime.h:
        (Bindings::JavaString::JavaString):
        (Bindings::JavaString::_commonInit):
        (Bindings::JavaString::_commonCopy):
        (Bindings::JavaString::_commonDelete):
        (Bindings::JavaString::~JavaString):
        (Bindings::JavaString::operator=):
        (Bindings::JavaString::uchars):
        (Bindings::JavaString::length):
        (Bindings::JavaString::ustring):
        * bindings/jni/jni_utility.cpp:
        (getUCharactersFromJStringInEnv):
        (releaseUCharactersForJStringInEnv):
        (convertValueToJObject):
        (convertJObjectToValue):
        * bindings/jni/jni_utility.h:
        * bindings/jni_jsobject.cpp:
        (Bindings::JSObject::invoke):
        (Bindings::JSObject::call):
        (Bindings::JSObject::eval):
        (Bindings::JSObject::getMember):
        (Bindings::JSObject::setMember):
        (Bindings::JSObject::removeMember):
        (Bindings::JSObject::getSlot):
        (Bindings::JSObject::setSlot):
        * bindings/jni_jsobject.h:

2003-12-12  Richard Williamson   <rjw@apple.com>

        Ensure that all calls from Java into JavaScript are
        performed on a designated thread (the main thread).

        Reviewed by Ken.

        * bindings/jni_jsobject.cpp:
        (isJavaScriptThread):
        (rootForImp):
        (Bindings::performJavaScriptAccess):
        (Bindings::completedJavaScriptAccess):
        (Bindings::initializeJavaScriptAccessLock):
        (Bindings::lockJavaScriptAccess):
        (Bindings::unlockJavaScriptAccess):
        (Bindings::dispatchToJavaScriptThread):
        (Bindings::RootObject::setFindRootObjectForNativeHandleFunction):
        (Bindings::RootObject::removeAllJavaReferencesForRoot):
        (Bindings::JSObject::invoke):
        (Bindings::JSObject::JSObject):
        (Bindings::JSObject::call):
        (Bindings::JSObject::eval):
        (Bindings::JSObject::getMember):
        (Bindings::JSObject::setMember):
        (Bindings::JSObject::removeMember):
        (Bindings::JSObject::getSlot):
        (Bindings::JSObject::setSlot):
        (Bindings::JSObject::toString):
        (Bindings::JSObject::finalize):
        (Bindings::JSObject::getWindow):
        * bindings/jni_jsobject.h:
        (Bindings::RootObject::~RootObject):
        (Bindings::RootObject::findRootObjectForNativeHandleFunction):
        (Bindings::RootObject::runLoop):
        (Bindings::RootObject::performJavaScriptSource):
        (Bindings::):

2003-12-11  Richard Williamson   <rjw@apple.com>

        Added support for calling a JavaScript function from
        Java.  Right now this only works for void func(void)
        functions, but the conversion of args and return values
        will come shortly.

        Cleaned up and verified reference counting scheme, and
        dereferencing of vended JavaScript objects when applet is
        destroyed (actually when part is destroyed).
        
        Removed link hack for testkjs now that the Java folks think
        they have a solution for the 1.4.2 JavaVM link problem.  Although
        Greg B. thinks his solution may cause problems for the 1.3.1
        version of the VM!?!

        Reviewed by Ken.

        * Makefile.am:
        * bindings/jni/jni_runtime.h:
        (Bindings::JavaString::JavaString):
        * bindings/jni/jni_utility.cpp:
        (convertValueToJValue):
        (convertValueToJObject):
        (listFromJArray):
        * bindings/jni/jni_utility.h:
        * bindings/jni_jsobject.cpp:
        (KJS_setFindRootObjectForNativeHandleFunction):
        (KJS_findRootObjectForNativeHandleFunction):
        (getReferencesByRootDictionary):
        (getReferencesDictionary):
        (findReferenceDictionary):
        (rootForImp):
        (addJavaReference):
        (removeJavaReference):
        * bindings/jni_jsobject.h:
        (Bindings::RootObject::RootObject):
        (Bindings::RootObject::~RootObject):
        (Bindings::RootObject::setRootObjectImp):
        (Bindings::RootObject::rootObjectImp):
        (Bindings::RootObject::setInterpreter):
        (Bindings::RootObject::interpreter):

=== Safari-117 ===

2003-12-10  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed regression in JavaScript tests reported by the KDE guys
        - fixed 3506345: REGRESSION (115-116): VIP: chordfind.com no longer displays chords

        * kjs/ustring.h: Add tolerateEmptyString parameter to toDouble and toULong.
        * kjs/ustring.cpp:
        (KJS::UString::toDouble): Separate the "tolerant" parameter into two separate ones:
        tolerateTrailingJunk and tolerateEmptyString. Add new overloads; better for code size
        and binary compatibility than default parameter values.
        (KJS::UString::toULong): Pass tolerateEmptyString down to toDouble. Add new overload.

        * kjs/string_object.cpp: (StringProtoFuncImp::call): Pass false for the new
        "tolerate empty string" parameter.

2003-12-10  Richard Williamson   <rjw@apple.com>

        Added code to manage reference counting of JavaScript
        objects passed to Java.   Also added implementation of
        KJS_JSCreateNativeJSObject.  This is the function that
        provides the root object to Java (KJS::Window).

        Reviewed by Hyatt.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/jni_jsobject.cpp:
        (KJS_setFindObjectForNativeHandleFunction):
        (KJS_findObjectForNativeHandleFunction):
        (getReferencesByOwnerDictionary):
        (getReferencesDictionary):
        (findReferenceDictionary):
        (addJavaReference):
        (removeJavaReference):
        (removeAllJavaReferencesForOwner):
        * bindings/jni_jsobject.h:

2003-12-09  Richard Williamson   <rjw@apple.com>

        LiveConnect stubs that correspond to the native methods
        on JSObject.  These will be called from the new Java plugin
        when an instance of JSObject is instantiated and messaged.
        When these are implemented the Java will be able to originate
        calls into JavaScript.

        Also a temporary work-around added to Makefile.am to solve
        a link problem.  The 1.4.2 JavaVM accidentally links against
        libobjc.  This call a failure linking testkjs.  Mike Hay is
        working with someone to fix the problem (3505587).

        Reviewed by Chris.

        * JavaScriptCore.pbproj/project.pbxproj:
        * Makefile.am:
        * bindings/jni_jsobject.cpp: Added.
        (KJS_JSCreateNativeJSObject):
        (KJS_JSObject_JSFinalize):
        (KJS_JSObject_JSObjectCall):
        (KJS_JSObject_JSObjectEval):
        (KJS_JSObject_JSObjectGetMember):
        (KJS_JSObject_JSObjectSetMember):
        (KJS_JSObject_JSObjectRemoveMember):
        (KJS_JSObject_JSObjectGetSlot):
        (KJS_JSObject_JSObjectSetSlot):
        (KJS_JSObject_JSObjectToString):
        * bindings/jni_jsobject.h: Added.

2003-12-09  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        <rdar://problem/3505183>: JavaScriptCore should assert that interpreter is locked in collector

        * kjs/collector.cpp:
        (KJS::Collector::allocate): Assert that interpreter lock count is not 0.
        (KJS::Collector::collect): likewise

2003-12-08  Richard Williamson   <rjw@apple.com>

        LiveConnect:  The last piece of the JavaScript side of the
        LiveConnect implementation.  This change adds support for
        setting/getting values from Java arrays in JavaScript.

        Reviewed by John.

        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_runtime.cpp:
        (JavaField::JavaField):
        (convertJObjectToArray):
        (JavaArray::JavaArray):
        (JavaArray::~JavaArray):
        (JavaArray::setValueAt):
        (JavaArray::valueAt):
        (JavaArray::getLength):
        * bindings/jni/jni_runtime.h:
        (Bindings::JavaArray::operator=):
        (Bindings::JavaArray::javaArray):
        * bindings/jni/jni_utility.cpp:
        (JNITypeFromPrimitiveType):
        (convertValueToJValue):
        * bindings/jni/jni_utility.h:
        * bindings/runtime.h:
        * bindings/runtime_array.cpp:
        (RuntimeArrayImp::RuntimeArrayImp):
        (RuntimeArrayImp::~RuntimeArrayImp):
        (RuntimeArrayImp::get):
        (RuntimeArrayImp::put):
        (RuntimeArrayImp::hasProperty):
        * bindings/runtime_array.h:
        (KJS::RuntimeArrayImp::getLength):
        (KJS::RuntimeArrayImp::getConcreteArray):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::canPut):
        (RuntimeObjectImp::hasProperty):

2003-12-05  Richard Williamson   <rjw@apple.com>

        LiveConnect:  Part 1 of supporting JS bindings to
        native language arrays.

        Reviewed by Chris.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/jni/jni_runtime.cpp:
        (JavaField::JavaField):
        (convertJObjectToArray):
        (JavaField::valueFromInstance):
        (JavaField::setValueToInstance):
        * bindings/jni/jni_runtime.h:
        * bindings/runtime.cpp:
        (Instance::setValueOfField):
        * bindings/runtime.h:
        (Bindings::Array::~Array):

2003-12-04  Richard Williamson   <rjw@apple.com>

        LiveConnect:  Moved defaultValue into concrete implementation because
        more intelligent conversion can be perform with knowledge
        of the class of the original instance.

        Reviewed by Chris.

        * bindings/jni/jni_class.cpp:
        (JavaClass::isNumberClass):
        (JavaClass::isBooleanClass):
        (JavaClass::isStringClass):
        * bindings/jni/jni_class.h:
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::defaultValue):
        (JavaInstance::valueOf):
        * bindings/jni/jni_instance.h:
        (Bindings::JavaInstance::javaInstance):
        * bindings/runtime.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::defaultValue):

2003-12-04  Richard Williamson   <rjw@apple.com>

        LiveConnect:  Added support for setting the value of Java
        fields.

        Reviewed by Chris.

        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_runtime.cpp:
        (JavaParameter::JavaParameter):
        (JavaField::JavaField):
        (JavaField::valueFromInstance):
        (JavaField::setValueToInstance):
        (JavaMethod::JavaMethod):
        * bindings/jni/jni_runtime.h:
        (Bindings::JavaField::getJNIType):
        * bindings/jni/jni_utility.cpp:
        (JNITypeFromClassName):
        (convertValueToJValue):
        * bindings/jni/jni_utility.h:
        * bindings/runtime.cpp:
        (Instance::setValueOfField):
        * bindings/runtime.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::defaultValue):

2003-12-04  Richard Williamson   <rjw@apple.com>

        Added support for string conversions.
        Changed various JavaString member variables to be inline.
        Implemented defaultValue for context relevant type coercion.

        Reviewed by Chris.

        * bindings/jni/jni_class.cpp:
        (JavaClass::JavaClass):
        (JavaClass::setClassName):
        (JavaClass::classForInstance):
        * bindings/jni/jni_class.h:
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::stringValue):
        (JavaInstance::numberValue):
        (JavaInstance::booleanValue):
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_runtime.cpp:
        (JavaParameter::JavaParameter):
        (JavaField::JavaField):
        (JavaMethod::JavaMethod):
        (appendClassName):
        (JavaMethod::signature):
        * bindings/jni/jni_runtime.h:
        (Bindings::JavaString::JavaString):
        (Bindings::JavaString::~JavaString):
        (Bindings::JavaString::operator=):
        (Bindings::JavaString::characters):
        (Bindings::JavaParameter::JavaParameter):
        (Bindings::JavaParameter::~JavaParameter):
        (Bindings::JavaParameter::operator=):
        (Bindings::JavaParameter::type):
        (Bindings::JavaField::JavaField):
        (Bindings::JavaField::~JavaField):
        (Bindings::JavaField::operator=):
        (Bindings::JavaField::name):
        (Bindings::JavaField::type):
        (Bindings::JavaMethod::JavaMethod):
        (Bindings::JavaMethod::_commonDelete):
        (Bindings::JavaMethod::name):
        (Bindings::JavaMethod::returnType):
        * bindings/jni/jni_utility.cpp:
        (convertValueToJValue):
        * bindings/runtime.h:
        (Bindings::Instance::valueOf):
        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::call):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::RuntimeObjectImp):
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::defaultValue):
        * bindings/runtime_object.h:
        (KJS::RuntimeObjectImp::classInfo):

=== Safari-116 ===

2003-12-03  Richard Williamson   <rjw@apple.com>

        LiveConnect:  Added support for parameter passing to Java and conversion
        of return values.

        Reviewed by Chris.

        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_runtime.cpp:
        (JavaParameter::JavaParameter):
        (JavaMethod::JavaMethod):
        (JavaMethod::signature):
        * bindings/jni/jni_runtime.h:
        (Bindings::JavaParameter::JavaParameter):
        (Bindings::JavaParameter::operator=):
        (Bindings::JavaParameter::getJNIType):
        * bindings/jni/jni_utility.cpp:
        (callJNIBooleanMethodA):
        (convertValueToJValue):
        * bindings/jni/jni_utility.h:
        * bindings/runtime.h:
        * bindings/runtime_method.cpp:
        (RuntimeMethodImp::call):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):

2003-12-02  Richard Williamson   <rjw@apple.com>

        Added support for calling simple methods in Java from JavaScript.
        (void return and no parameters).  Yay, LiveConnect lives.

        Still need write argument and return value conversion code.

        Reviewed by Chris.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::getClass):
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_instance.h:
        * bindings/jni/jni_runtime.cpp:
        (JavaMethod::JavaMethod):
        (JavaMethod::signature):
        (JavaMethod::JNIReturnType):
        * bindings/jni/jni_runtime.h:
        (Bindings::JavaMethod::_commonDelete):
        (Bindings::JavaMethod::_commonCopy):
        (Bindings::JavaMethod::name):
        * bindings/jni/jni_utility.cpp:
        (signatureFromPrimitiveType):
        * bindings/jni/jni_utility.h:
        * bindings/runtime.h:
        * bindings/runtime_method.cpp: Added.
        (RuntimeMethodImp::RuntimeMethodImp):
        (RuntimeMethodImp::~RuntimeMethodImp):
        (RuntimeMethodImp::get):
        (RuntimeMethodImp::implementsCall):
        (RuntimeMethodImp::call):
        (RuntimeMethodImp::codeType):
        (RuntimeMethodImp::execute):
        * bindings/runtime_method.h: Added.
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::RuntimeObjectImp):
        (RuntimeObjectImp::get):
        * bindings/runtime_object.h:
        * kjs/function.cpp:
        (FunctionImp::FunctionImp):
        * kjs/interpreter.h:

2003-12-01  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - fixed 3493799: JavaScript string.replace expands $ if it's the last character in replacement string

        * kjs/ustring.cpp: (KJS::UString::toDouble): Fix backwards handling of the "tolerant" boolean.
        This indirectly caused the string.replace bug.

2003-12-02  Maciej Stachowiak  <mjs@apple.com>

        Merged patches from Harri Porten and David Faure to fix:

        <rdar://problem/3497643>: reproducible crash printing self-referential array
        
        * kjs/array_object.cpp:
        (ArrayProtoFuncImp::call): Break out of the loop if an exception was thrown.
        * kjs/nodes.cpp:
        (FunctionCallNode::evaluate): Move function call depth check from here...
        * kjs/object.cpp:
        (KJS::Object::call): ...to here.
        * kjs/object.h: Un-inline Object::call now that it does more.

2003-12-01  Richard Williamson   <rjw@apple.com>

        Fixed mistake in method signatures used to get boolean and integer fields.

        Reviewed by Chris.

        * bindings/jni/jni_runtime.cpp:
        (JavaField::valueFromInstance):

2003-12-01  Richard Williamson   <rjw@apple.com>

Fixed parameter passing to applet.  Child elements are NOT valid in setStyle().  So we now create the widget before needed with createWidgetIfNecessary.  This either happens when doing the first layout, or when JavaScript first references the applet element.

Fixed early delete of the the main applet instance.  When the JS collector cleaned up the last JS object referring to the applet instance we were deleting the java instance.  This caused the applet instance cached on the applet element to be invalid.  The applet instance is the only Java object not to be cleaned up by the JS collector.

Added support for getting at Java object fields.

        Reviewed by Chris.

        * JavaScriptCore.pbproj/project.pbxproj:
        * Makefile.am:
        * bindings/jni/jni_instance.cpp:
        (JObjectWrapper::JObjectWrapper):
        * bindings/jni/jni_instance.h:
        (Bindings::JObjectWrapper::~JObjectWrapper):
        * bindings/jni/jni_runtime.cpp:
        (JavaField::valueFromInstance):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::~RuntimeObjectImp):
        (RuntimeObjectImp::RuntimeObjectImp):
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::deleteProperty):
        * bindings/runtime_object.h:

=== Safari-115 ===

2003-11-21  Maciej Stachowiak  <mjs@apple.com>

        Patch from Harri Porten, reviewed by me.

        - fixed 3491712 - String slice with negative arguments does not offset from end of string
        
        * kjs/string_object.cpp:
        (StringProtoFuncImp::call): Handle negative arguments as offsets from end by
        adding length and clamping to [0,length-1].

2003-11-21  Maciej Stachowiak  <mjs@apple.com>

        Patch from Harri Porten, reviewed by me.

        - fixed 3491709 - using Function.apply with a primitive type as the arg list causes crash
        
        * kjs/function_object.cpp:
        (FunctionProtoFuncImp::call): Nest parentheses properly.

2003-11-20  Richard Williamson   <rjw@apple.com>

        More LiveConnect stuff.  Primitive Java fields are now
        accessible from JavaScript!  Yay!

        Reviewed by Maciej.

        * bindings/jni/jni_class.cpp:
        (JavaClass::methodNamed):
        (JavaClass::fieldNamed):
        * bindings/jni/jni_class.h:
        (Bindings::JavaClass::_commonDelete):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::JavaInstance):
        (JavaInstance::~JavaInstance):
        (JavaInstance::getClass):
        * bindings/jni/jni_instance.h:
        (Bindings::JavaInstance::javaInstance):
        * bindings/jni/jni_runtime.cpp:
        (JavaField::JavaField):
        (JavaField::valueFromInstance):
        * bindings/jni/jni_runtime.h:
        (Bindings::JavaField::JavaField):
        (Bindings::JavaField::~JavaField):
        (Bindings::JavaField::operator=):
        * bindings/jni/jni_utility.cpp:
        (callJNIMethod):
        (callJNIMethodA):
        (callJNIVoidMethod):
        (callJNIObjectMethod):
        (callJNIBooleanMethod):
        (callJNIByteMethod):
        (callJNICharMethod):
        (callJNIShortMethod):
        (callJNIIntMethod):
        (callJNILongMethod):
        (callJNIFloatMethod):
        (callJNIDoubleMethod):
        (callJNIVoidMethodA):
        (callJNIObjectMethodA):
        (callJNIByteMethodA):
        (callJNICharMethodA):
        (callJNIShortMethodA):
        (callJNIIntMethodA):
        (callJNILongMethodA):
        (callJNIFloatMethodA):
        (callJNIDoubleMethodA):
        (releaseCharactersForJStringInEnv):
        (primitiveTypeFromClassName):
        (getJNIField):
        * bindings/jni/jni_utility.h:
        * bindings/runtime.cpp:
        (Instance::createBindingForLanguageInstance):
        (Instance::getValueOfField):
        * bindings/runtime.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::get):

2003-11-20  Richard Williamson   <rjw@apple.com>

        More LiveConnect stuff.

        Reviewed by Chris.

        * bindings/jni/jni_class.cpp:
        (JavaClass::classForName):
        (JavaClass::classForInstance):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::getValueOfField):
        * bindings/jni/jni_instance.h:
        (Bindings::JObjectWrapper::JObjectWrapper):
        * bindings/jni/jni_runtime.h:
        (Bindings::JavaConstructor::~JavaConstructor):
        (Bindings::JavaConstructor::operator=):
        (Bindings::JavaMethod::JavaMethod):
        (Bindings::JavaMethod::_commonDelete):
        (Bindings::JavaMethod::signature):
        * bindings/jni/jni_utility.cpp:
        (getJNIEnv):
        (attachToJavaVM):
        * bindings/jni/jni_utility.h:
        * bindings/runtime.h:
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::~RuntimeObjectImp):
        (RuntimeObjectImp::get):
        * bindings/runtime_object.h:

2003-11-19  Richard Williamson   <rjw@apple.com>

        More LiveConnect stuff.

        Reviewed by Ken.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/jni/jni_class.cpp: Added.
        (JavaClass::_commonInit):
        (JavaClass::JavaClass):
        (_createClassesByNameIfNecessary):
        (JavaClass::classForName):
        (JavaClass::classForInstance):
        (JavaClass::methodNamed):
        (JavaClass::fieldNamed):
        * bindings/jni/jni_class.h: Added.
        (Bindings::JavaClass::_commonDelete):
        (Bindings::JavaClass::~JavaClass):
        (Bindings::JavaClass::_commonCopy):
        (Bindings::JavaClass::JavaClass):
        (Bindings::JavaClass::operator=):
        (Bindings::JavaClass::name):
        (Bindings::JavaClass::constructorAt):
        (Bindings::JavaClass::numConstructors):
        * bindings/jni/jni_instance.cpp: Added.
        (JavaInstance::JavaInstance):
        (JavaInstance::~JavaInstance):
        * bindings/jni/jni_instance.h: Added.
        (Bindings::JObjectWrapper::JObjectWrapper):
        (Bindings::JObjectWrapper::~JObjectWrapper):
        (Bindings::JObjectWrapper::ref):
        (Bindings::JObjectWrapper::deref):
        (Bindings::JavaInstance::getClass):
        (Bindings::JavaInstance::operator=):
        * bindings/jni/jni_runtime.cpp:
        (JavaMethod::JavaMethod):
        * bindings/jni/jni_runtime.h:
        (Bindings::JavaString::JavaString):
        (Bindings::JavaString::~JavaString):
        (Bindings::JavaString::operator=):
        * bindings/jni/jni_utility.cpp:
        (getJavaVM):
        (getJNIEnv):
        (getCharactersFromJString):
        (releaseCharactersForJString):
        (getCharactersFromJStringInEnv):
        (releaseCharactersForJStringInEnv):
        * bindings/jni/jni_utility.h:
        * bindings/runtime.cpp:
        (Instance::createBindingForLanguageInstance):
        * bindings/runtime.h:
        (Bindings::Instance::):

2003-11-18  Richard Williamson   <rjw@apple.com>

        More live connect stubs.  We're getting close.

        Reviewed by Chris.

        * JavaScriptCore.pbproj/project.pbxproj:
        * bindings/jni/jni_runtime.cpp:
        (JavaClass::JavaClass):
        (JavaInstance::JavaInstance):
        (JavaInstance::~JavaInstance):
        * bindings/jni/jni_runtime.h:
        (Bindings::JavaConstructor::value):
        (Bindings::JavaField::value):
        (Bindings::JavaMethod::value):
        (Bindings::JavaClass::_commonDelete):
        (Bindings::JavaClass::_commonCopy):
        (Bindings::JavaClass::methodNamed):
        (Bindings::JavaClass::fieldNamed):
        (Bindings::JavaInstance::getClass):
        * bindings/runtime.cpp: Added.
        * bindings/runtime.h:
        (Bindings::Instance::~Instance):
        * bindings/runtime_object.cpp: Added.
        (RuntimeObjectImp::classInfo):
        (RuntimeObjectImp::RuntimeObjectImp):
        (RuntimeObjectImp::get):
        (RuntimeObjectImp::put):
        (RuntimeObjectImp::canPut):
        (RuntimeObjectImp::hasProperty):
        (RuntimeObjectImp::deleteProperty):
        (RuntimeObjectImp::defaultValue):
        (RuntimeObjectImp::_initializeClassInfoFromInstance):
        * bindings/runtime_object.h: Added.
        (KJS::RuntimeObjectImp::setInternalInstance):
        (KJS::RuntimeObjectImp::getInternalInstance):
        * kjs/object.cpp:
        (KJS::ObjectImp::get):
        (KJS::ObjectImp::hasProperty):
        * kjs/value.h:
        (KJS::):

2003-11-17  Maciej Stachowiak  <mjs@apple.com>

        Patch from Harri, reviewed by me.

        - fixed 3487375 - backwards array slice causes infinite loop
        
        * kjs/array_object.cpp:
        (ArrayProtoFuncImp::call):

2003-11-17  Maciej Stachowiak  <mjs@apple.com>

        Patch from Harri Porten reviewed by me.

        - fixed 3487371 - operator precedence for bitwise or, xor and and is wrong

        * kjs/grammar.y: Correct the precedence.

2003-11-16  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        - fixed 3483829 - JavaScriptCore needs workaround to compile on Merlot
        
        * JavaScriptCore.pbproj/project.pbxproj: Add -Wno-long-double to
        warning flags.

=== Safari-114 ===

2003-11-13  Richard Williamson   <rjw@apple.com>

        Factored common code between copy constructor and assignment operator.

        Reviewed by Chris.

        * ChangeLog:
        * bindings/jni/jni_runtime.h:
        (Bindings::JavaConstructor::_commonCopy):
        (Bindings::JavaConstructor::JavaConstructor):
        (Bindings::JavaConstructor::operator=):
        (Bindings::JavaField::type):
        * bindings/runtime.h:

2003-11-13  Richard Williamson   <rjw@apple.com>

        More LiveConnect stuff.  This checkin adds abstract classes to model
        language runtimes and a JNI based set of concrete implementations for
        Java.

        Reviewed by Chris.

        * JavaScriptCore.pbproj/project.pbxproj:
        * Makefile.am:
        * bindings/Makefile.am: Removed.
        * bindings/jni/Makefile.am: Removed.
        * bindings/jni/jni_runtime.cpp: Added.
        (JavaField::JavaField):
        (JavaConstructor::JavaConstructor):
        (JavaMethod::JavaMethod):
        (JavaClass::JavaClass):
        * bindings/jni/jni_runtime.h: Added.
        (Bindings::JavaString::JavaString):
        (Bindings::JavaString::~JavaString):
        (Bindings::JavaString::operator=):
        (Bindings::JavaString::characters):
        (Bindings::JavaParameter::JavaParameter):
        (Bindings::JavaParameter::~JavaParameter):
        (Bindings::JavaParameter::operator=):
        (Bindings::JavaParameter::type):
        (Bindings::JavaConstructor::JavaConstructor):
        (Bindings::JavaConstructor::~JavaConstructor):
        (Bindings::JavaConstructor::operator=):
        (Bindings::JavaConstructor::parameterAt):
        (Bindings::JavaConstructor::numParameters):
        (Bindings::JavaField::JavaField):
        (Bindings::JavaField::~JavaField):
        (Bindings::JavaField::operator=):
        (Bindings::JavaField::name):
        (Bindings::JavaField::type):
        (Bindings::JavaMethod::JavaMethod):
        (Bindings::JavaMethod::_commonDelete):
        (Bindings::JavaMethod::~JavaMethod):
        (Bindings::JavaMethod::_commonCopy):
        (Bindings::JavaMethod::operator=):
        (Bindings::JavaMethod::name):
        (Bindings::JavaMethod::returnType):
        (Bindings::JavaMethod::parameterAt):
        (Bindings::JavaMethod::numParameters):
        (Bindings::JavaClass::_commonDelete):
        (Bindings::JavaClass::~JavaClass):
        (Bindings::JavaClass::_commonCopy):
        (Bindings::JavaClass::JavaClass):
        (Bindings::JavaClass::operator=):
        (Bindings::JavaClass::name):
        (Bindings::JavaClass::methodAt):
        (Bindings::JavaClass::numMethods):
        (Bindings::JavaClass::constructorAt):
        (Bindings::JavaClass::numConstructors):
        (Bindings::JavaClass::fieldAt):
        (Bindings::JavaClass::numFields):
        * bindings/jni/jni_utility.cpp:
        (callJNIMethod):
        (callJNIMethodA):
        (callJNIObjectMethod):
        (callJNIByteMethod):
        (callJNICharMethod):
        (callJNIShortMethod):
        (callJNIIntMethod):
        (callJNILongMethod):
        (callJNIFloatMethod):
        (callJNIDoubleMethod):
        (callJNIVoidMethodA):
        (callJNIObjectMethodA):
        (callJNIByteMethodA):
        (callJNICharMethodA):
        (callJNIShortMethodA):
        (callJNIIntMethodA):
        (callJNILongMethodA):
        (callJNIFloatMethodA):
        (callJNIDoubleMethodA):
        (getCharactersFromJString):
        (releaseCharactersForJString):
        * bindings/jni/jni_utility.h:
        * bindings/objc/Makefile.am: Removed.
        * bindings/runtime.h: Added.
        (Bindings::Parameter::~Parameter):
        (Bindings::Constructor::~Constructor):
        (Bindings::Field::~Field):
        (Bindings::Method::~Method):
        (Bindings::Class::~Class):

2003-11-13  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by John.

        - fixed 3472562 - Null or Undefined variables passed to IN operator cause javascript exceptions
        
        * kjs/nodes.cpp:
        (ForInNode::execute): If the in value is null or undefined, bail
        out early, since attempting to iterate its properties will throw
        an exception.

2003-11-12  Darin Adler  <darin@apple.com>

        - fixed the build

        * Makefile.am: Fix the build by removing the bindings directory from SUBDIRS.
        Later, we can either add this back and add the Makefile.am files to the top
        level configure.in or leave it out and remove the Makefile.am files.

2003-11-12  Richard Williamson   <rjw@apple.com>

        Added utility functions for calling JNI methods.

        Reviewed by Chris.

        * JavaScriptCore.pbproj/project.pbxproj:
        * Makefile.am:
        * bindings/Makefile.am: Added.
        * bindings/jni/Makefile.am: Added.
        * bindings/jni/jni_utility.cpp: Added.
        (attachToJavaVM):
        (callJNIMethod):
        (callJNIVoidMethod):
        (callJNIObjectMethod):
        (callJNIByteMethod):
        (callJNICharMethod):
        (callJNIShortMethod):
        (callJNIIntMethod):
        (callJNILongMethod):
        (callJNIFloatMethod):
        (callJNIDoubleMethod):
        * bindings/jni/jni_utility.h: Added.
        * bindings/objc/Makefile.am: Added.

2003-11-08  Darin Adler  <darin@apple.com>

        Reviewed by John.

        - fixed 3477528 -- array.sort(function) fails if the function returns a non-zero value that rounds to zero

        * kjs/array_object.cpp:
        (compareByStringForQSort): Added checks for undefined values to match what the specification calls for.
        (compareWithCompareFunctionForQSort): Added checks for undefined values as above, and also changed the
        code that looks at the compare function result to look at the number returned without rounding to an integer.
        (ArrayProtoFuncImp::call): Changed the code that looks at the compare function result to look at the number
        returned without rounding to an integer.

=== Safari-113 ===

2003-11-03  Vicki Murley <vicki@apple.com>

        Reviewed by kocienda.

        - fixed <rdar://problem/3471096>: non-B&I builds should not use order files, because they cause false "regressions" in perf.

        * JavaScriptCore.pbproj/project.pbxproj: added empty SECTORDER_FLAGS variables to the Development and Deployment build styles

2003-11-02  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        - changed list manipulation to use Harri Porten's idea of a circular
          linked list that is built from head to tail rather than building the
          list backwards and reversing the list when done

        * kjs/grammar.y: Handle CatchNode and FinallyNode in a type-safe way.
        Change many places that passed 0L to pass nothing at all, or to pass 0.

        * kjs/nodes.h:
        (KJS::ElementNode::ElementNode): Build a circular list instead of a 0-terminated
        backwards list.
        (KJS::ArrayNode::ArrayNode): Break the circular list instead of reversing the list.
        (KJS::PropertyValueNode::PropertyValueNode): Moved before ObjectLiteralNode so the
        inline code in ObjectLiteralNode works. Build a circular list instead of a 0-terminated
        backwards list. Made the case for the first node separate so we don't need a nil check.
        (KJS::ObjectLiteralNode::ObjectLiteralNode): Break the circular list instead of
        reversing the list.
        (KJS::ArgumentListNode::ArgumentListNode): Build a circular list instead of a 0-terminated
        backwards list. Also, made the constructors inline (moved here from .cpp file).
        (KJS::ArgumentsNode::ArgumentsNode): Break the circular list instead of
        reversing the list.
        (KJS::NewExprNode::NewExprNode): Changed a 0L to 0.
        (KJS::StatListNode::StatListNode): Make this constructor no longer inline (moved into
        .cpp file). The one in the .cpp file builds a circular list instead of a 0-terminated
        backwards list.
        (KJS::VarDeclListNode::VarDeclListNode): Build a circular list instead of a 0-terminated
        backwards list.
        (KJS::VarStatementNode::VarStatementNode): Break the circular list instead of reversing
        the list.
        (KJS::BlockNode::BlockNode): Make this constructor no longer inline (moved into .cpp file).
        The one in the .cpp file breaks the list instead of reversing it.
        (KJS::ForNode::ForNode): Break the circular list instead of reversing the list.
        (KJS::CaseClauseNode::CaseClauseNode): Break the circular list instead of reversing the
        list.
        (KJS::ClauseListNode::ClauseListNode): Build a circular list instead of a 0-terminated
        backwards list.
        (KJS::CaseBlockNode::CaseBlockNode): Make this constructor no longer inline (moved into
        .cpp file). The one in the .cpp file breaks the list instead of reversing it.
        (KJS::TryNode::TryNode): Changed constructor to take typed parameters for the catch and
        finally nodes rather than just Node.
        (KJS::ParameterNode::ParameterNode): Build a circular list instead of a 0-terminated
        backwards list.
        (KJS::FuncDeclNode::FuncDeclNode): Break the circular list instead of reversing the
        list.
        (KJS::FuncExprNode::FuncExprNode): Break the circular list instead of reversing the
        list.

        * kjs/nodes.cpp:
        (StatListNode::StatListNode): Moved this constructor here, no longer inline.
        Did the "break circular list" thing instead of the "reverse list" thing.
        Added setLoc calls to match KJS in the KDE tree; since we don't currently
        use the JavaScript debugging support, it's unclear whether there's any benefit, but
        later we might be using it and it's good to be as close as possible.
        (BlockNode::BlockNode): Moved this constructor here, no longer inline.
        Did the "break circular list" thing instead of the "reverse list" thing.
        Added setLoc calls.
        (CaseBlockNode::CaseBlockNode): Moved this constructor here, no longer inline.
        Did the "break circular list" thing instead of the "reverse list" thing.
        (SourceElementsNode::SourceElementsNode): Moved this constructor here, no longer inline.
        Did the "break circular list" thing instead of the "reverse list" thing.
        Added setLoc calls.

        * kjs/grammar.cpp: Regenerated.
        * kjs/grammar.cpp.h: Regenerated.
        * kjs/grammar.h: Regenerated.

=== Safari-112 ===

2003-10-30  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Ken.

        - fixed 3427069 - browsing mp3.com causes leaks (KJS)
        
        * kjs/string_object.cpp:
        (StringProtoFuncImp::call): Don't do an early return, since that
        could leak a temporary regexp.

2003-10-29  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - fixed 3426076 - Leak of JS lexer data visiting http://www.ebay.com
        
        * kjs/grammar.cpp:
        (yyerror): Updated the commented code.
        * kjs/grammar.y: Don't delete string and identifier tokens when done
        with them any more, they'll get cleaned up by the lexer now.
        * kjs/internal.cpp:
        (Parser::parse): Tell lexer when done parsing.
        * kjs/lexer.cpp:
        (Lexer::Lexer): Initialize new data members.
        (Lexer::lex): Use new methods to make strings and identifiers, and
        save them.
        (Lexer::makeIdentifier): Make a new Identifier and save it in an
        auto-growing array.
        (Lexer::makeUString): Likewise for UStrings.
        (Lexer::doneParsing): Clean up arrays of Ifentifiers and UStrings.
        * kjs/lexer.h:

2003-10-28  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Ken.

        - fixed 3413962 -  malicious web pages can kill all future JavaScript execution by breaking recursion limit check
        
        * kjs/nodes.cpp:
        (FunctionCallNode::evaluate): If we're going to return early due
        to breaking the recursion limit, make sure to lower it again, or
        it will creep up by one each time it's exceeded.

2003-10-26  Darin Adler  <darin@apple.com>

        * JavaScriptCorePrefix.h: Added a C case to the NULL definition since we use C as well
        as C++ in this project.

2003-10-26  Darin Adler  <darin@apple.com>

        - rolled in some CString changes Harri Porten did on the KDE side

        * kjs/ustring.cpp:
        (KJS::CString::CString): Use memcpy instead of strcpy for speed. Fix an off by one error
        in the copy constructor.
        (KJS::CString::operator=): Use memcpy instead of strcpy for speed.

        * JavaScriptCorePrefix.h: Add a definition of NULL here that takes advantage of the GNU
        __null feature even if the system C library doesn't.

== Rolled over to ChangeLog-2003-10-25 ==
