2009-01-19  Sam Weinig  <sam@webkit.org>

        Rubber-stamped by Gavin Barraclough.

        Remove temporary operator-> from JSValuePtr.

        * JSUtils.cpp:
        (KJSValueToJSObject):
        (KJSValueToCFTypeInternal):
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        (JSValueWrapper::JSObjectMark):
        * UserObjectImp.cpp:
        (UserObjectImp::getOwnPropertySlot):

2009-01-14  Dan Bernstein  <mitz@apple.com>

        Reviewed by John Sullivan.

        - update copyright

        * Info.plist:

2009-01-09  David Levin  <levin@chromium.org>

        Reviewed by Oliver Hunt.

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

        Added forwarding header.

        * ForwardingHeaders/wtf/PtrAndFlags.h: Added.

2009-01-05  Gavin Barraclough  <baraclough@apple.com>

        Rubber Stamped by Oliver Hunt.

        Replace all uses of JSValue* with new wrapper class, JSValuePtr.
        See JavaScriptCore/ChangeLog for more detailed description.

        * JSObject.cpp:
        (nativeCallFunction):
        * JSUtils.cpp:
        (KJSValueToJSObject):
        (JSObjectKJSValue):
        (KJSValueToCFTypeInternal):
        (KJSValueToCFType):
        * JSUtils.h:
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSValueWrapper):
        (JSValueWrapper::GetValue):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        * JSValueWrapper.h:
        * UserObjectImp.cpp:
        (UserObjectImp::callAsFunction):
        (UserObjectImp::userObjectGetter):
        (UserObjectImp::getOwnPropertySlot):
        (UserObjectImp::put):
        (UserObjectImp::toPrimitive):
        * UserObjectImp.h:
        (UserObjectImp::createStructure):

2008-12-15  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Cameron Zwarich.

        <rdar://problem/6289933> Change WebKit-related projects to build with GCC 4.2 on Leopard.

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

2008-12-08  David Kilzer  <ddkilzer@apple.com>

        Bug 22555: Sort "children" sections in Xcode project files

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

        Reviewed by Eric Seidel.

        * JavaScriptGlue.xcodeproj/project.pbxproj: Sorted.

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

        Reviewed by Sam Weinig.
        
        Updated for JavaScriptCore rename.

        * ForwardingHeaders/runtime/CallFrame.h: Copied from JavaScriptGlue/ForwardingHeaders/runtime/ExecState.h.
        * ForwardingHeaders/runtime/ExecState.h: Removed.
        * config.h:

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

        Reviewed by Sam Weinig.
        
        Updated for JavaScriptCore rename.

        * ForwardingHeaders/interpreter: Added.
        * ForwardingHeaders/interpreter/CallFrame.h: Copied from ForwardingHeaders/runtime/ExecState.h.
        * ForwardingHeaders/runtime/ExecState.h: Removed.

2008-11-15  Darin Adler  <darin@apple.com>

        Rubber stamped by Geoff Garen.

        - do the long-planned StructureID -> Structure rename

        * JSRun.cpp:
        (JSGlueGlobalObject::JSGlueGlobalObject):
        (JSRun::JSRun):
        * JSRun.h:
        (JSGlueGlobalObject::userObjectStructure):
        * JSUtils.cpp:
        (getThreadGlobalObject):
        * UserObjectImp.cpp:
        (UserObjectImp::UserObjectImp):
        * UserObjectImp.h:
        (UserObjectImp::createStructure):

2008-11-15  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Sam Weinig.
        
        Updated for JavaScriptCore renames.

        * JSRun.cpp:
        (JSRun::Evaluate):
        (JSRun::CheckSyntax):

2008-11-05  Cameron Zwarich  <zwarich@apple.com>

        Not reviewed.

        Fix the JavaScriptGlue build. This wouldn't show up unless one was
        doing a clean build, because changes in JavaScriptCore don't cause
        anything in JavaScriptGlue to get rebuilt.

        * JSRun.cpp:
        * JSUtils.h:
        * JavaScriptGlue.cpp:

2008-11-04  Cameron Zwarich  <zwarich@apple.com>

        Reviewed by Mark Rowe.

        Remove JavaScriptGlue forwarding headers that are no longer necessary,
        and correct the path of the ExecState.h forwarding header.

        * ForwardingHeaders/kjs: Removed.
        * ForwardingHeaders/kjs/CTI.h: Removed.
        * ForwardingHeaders/kjs/ExecState.h: Removed.
        * ForwardingHeaders/kjs/JSValue.h: Removed.
        * ForwardingHeaders/kjs/PutPropertySlot.h: Removed.
        * ForwardingHeaders/kjs/ustring.h: Removed.
        * ForwardingHeaders/runtime: Added.
        * ForwardingHeaders/runtime/ExecState.h: Copied from ForwardingHeaders/kjs/ExecState.h.
        * config.h:

2008-10-31  Stephanie Lewis  <slewis@apple.com>

        Fix build by including right files.

        * JSRun.cpp:

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

        Reviewed by Jon Homeycutt.

        Explicitly default to building for only the native architecture in debug and release builds.

        * Configurations/DebugRelease.xcconfig:

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

        - finish rolling out https://bugs.webkit.org/show_bug.cgi?id=21732

        * JSObject.cpp:
        (nativeCallFunction):
        * JSUtils.cpp:
        (KJSValueToJSObject):
        (JSObjectKJSValue):
        (KJSValueToCFTypeInternal):
        (KJSValueToCFType):
        * JSUtils.h:
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSValueWrapper):
        (JSValueWrapper::GetValue):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        * JSValueWrapper.h:
        * UserObjectImp.cpp:
        (UserObjectImp::callAsFunction):
        (UserObjectImp::userObjectGetter):
        (UserObjectImp::getOwnPropertySlot):
        (UserObjectImp::put):
        (UserObjectImp::toPrimitive):
        * UserObjectImp.h:
        (UserObjectImp::createStructureID):
        Use JSValue* instead of JSValuePtr.

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

        - roll out https://bugs.webkit.org/show_bug.cgi?id=21732

        * JSValueWrapper.cpp:
        (JSValueWrapper::GetValue): Added missing call to .get().
        * JSValueWrapper.h: ProtectedPtr<JSValue> instead of ProtectedPtr<JSValuePtr>.

2008-10-22  Darin Adler  <darin@apple.com>

        Reviewed by Sam Weinig.

        - fix https://bugs.webkit.org/show_bug.cgi?id=21294
          Bug 21294: Devirtualize getOwnPropertySlot()

        * JSRun.cpp:
        (JSGlueGlobalObject::JSGlueGlobalObject): Moved constructor here.
        Set up flags in its new location in global object data, and set up
        a structure for UserObjectImp too.
        (JSRun::JSRun): Added code to give the JSGlueGlobalObject its own unique
        structure, rather than using the default one from JSGlobalObject.

        * JSRun.h: Made JSGlueGlobalObject take a structure ID. Also moved
        the data into a separate data object. And added userObjectStructure,
        a Structure to be used by UserObjectImp.

        * JSUtils.cpp: Removed unused sharedGlobalData global.
        (JSObjectKJSValue): Pass Structure in when creating UserObjectImp.
        (unprotectGlobalObject): Use JSGlueGLobalObject type specifically.
        (initializeGlobalObjectKey): Removed code to set up unused sharedGlobalData.
        (getThreadGlobalObject): Added. Shared by JSObjectKJSValue and
        getThreadGlobalExecState. Also now passes in a structure ID when creating
        the global object.
        (getThreadGlobalExecState): Changed to call getThreadGlobalObject.

        * UserObjectImp.cpp:
        (UserObjectImp::UserObjectImp): Changed to take a structure.
        * UserObjectImp.h:
        (UserObjectImp::createStructureID): Added. Returns a structure without
        HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot.

2008-10-20  Sam Weinig  <sam@webkit.org>

        Reviewed by Cameron Zwarich.

        Fix for https://bugs.webkit.org/show_bug.cgi?id=21766
        REGRESSION: 12 JSC tests fail

        The JSGlobalObject constructor no longer takes a JSGlobalData
        as an argument.

        * JSRun.cpp:
        (JSRun::JSRun):
        * JSRun.h:
        (JSGlueGlobalObject::JSGlueGlobalObject):
        * JSUtils.cpp:
        (getThreadGlobalExecState):

2008-10-19  Darin Adler  <darin@apple.com>

        Reviewed by Oliver Hunt.

        - next step of https://bugs.webkit.org/show_bug.cgi?id=21732
          improve performance by eliminating JSValue as a base class for JSCell

        Remove most uses of JSValue, which will be removed in a future patch.

        * JSValueWrapper.h: Use JSValuePtr instead of JSValue*.

2008-10-18  Darin Adler  <darin@apple.com>

        Reviewed by Oliver Hunt.

        - next step of https://bugs.webkit.org/show_bug.cgi?id=21732
          improve performance by eliminating JSValue as a base class for JSCell

        Tweak a little more to get closer to where we can make JSValuePtr a class.

        * JSObject.cpp:
        (nativeCallFunction): Call asObject.

        * JSUtils.cpp:
        (KJSValueToJSObject): Use JSValuePtr and asObject.
        (JSObjectKJSValue): Ditto.
        (KJSValueToCFTypeInternal): Ditto.
        (KJSValueToCFType): Ditto.
        * JSUtils.h: Ditto.

        * UserObjectImp.cpp:
        (UserObjectImp::callAsFunction): Use JSValuePtr and asObject.
        (UserObjectImp::userObjectGetter): Ditto.
        (UserObjectImp::getOwnPropertySlot): Ditto.
        (UserObjectImp::put): Ditto.
        (UserObjectImp::toPrimitive): Ditto.
        * UserObjectImp.h: Ditto.

2008-10-18  Darin Adler  <darin@apple.com>

        Reviewed by Cameron Zwarich.

        - next step on https://bugs.webkit.org/show_bug.cgi?id=21732
          improve performance by eliminating JSValue as a base class for JSCell

        Use JSValuePtr everywhere instead of JSValue*. In the future, we'll be
        changing JSValuePtr to be a class, and then eventually renaming it
        to JSValue once that's done.

        * JSObject.cpp:
        * JSValueWrapper.cpp:
        * UserObjectImp.cpp:
        * UserObjectImp.h:
        Replace JSValue* with JSValuePtr.

2008-10-13  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Mark Rowe.
        
        - use gcc 4.2 when building with Xcode 3.1 or newer on Leopard, even though this is not the default

        * Configurations/DebugRelease.xcconfig:

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

        Not reviewed. Build fix.

        - revert toBoolean changes (r37333 and r37335); need to make WebCore work with these

        * JSUtils.cpp:
        (KJSValueToCFTypeInternal):

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

        Not reviewed.
        
        - fix build; toBoolean no longer takes an ExecState

        * JSUtils.cpp:
        (KJSValueToCFTypeInternal):

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

        Reviewed by Tim Hatcher.

        Add a 'Check For Weak VTables' build phase to catch weak vtables as early as possible.

        * JavaScriptGlue.xcodeproj/project.pbxproj:

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

        Reviewed by Darin Adler and Cameron Zwarich.

        * JSRun.cpp:
        (JSRun::Evaluate):
        (JSRun::CheckSyntax): Provide a SourceCode to the Interpreter, since
        other APIs are no longer supported.

2008-09-29  Geoffrey Garen  <ggaren@apple.com>

        Not reviewed.
        
        Forwarding headers to fix the build.

        * ForwardingHeaders/kjs/CTI.h: Copied from ForwardingHeaders/kjs/ExecState.h.
        * ForwardingHeaders/kjs/ustring.h: Copied from ForwardingHeaders/kjs/ExecState.h.
        * ForwardingHeaders/masm: Added.
        * ForwardingHeaders/masm/X86Assembler.h: Added.
        * ForwardingHeaders/profiler: Added.
        * ForwardingHeaders/profiler/Profiler.h: Added.

2008-09-08  Sam Weinig  <sam@webkit.org>

        Reviewed by Maciej Stachowiak and Oliver Hunt.

        Add forwarding headers.

        * ForwardingHeaders/wtf/HashFunctions.h: Added.
        * ForwardingHeaders/wtf/HashTraits.h: Added.

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

        Reviewed by Sam Weinig.
        
        Implemented the rest of Darin's review comments for the 09-01 inline
        caching patch.
        
        * ForwardingHeaders/kjs/PutPropertySlot.h: Added.

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

        Reviewed by Darin Adler.

        First cut at inline caching for access to vanilla JavaScript properties.
        
        Updated for JavaScriptCore changes. Mostly mechanical addition of StructureIDs
        to JavaScriptGlue classes, and PutPropertySlot& arguments to put functions.

2008-08-22  Anders Carlsson  <andersca@apple.com>

        Fix build for real this time.
        
        * UserObjectImp.h:

2008-08-22  Anders Carlsson  <andersca@apple.com>

        Fix build.
        
        * UserObjectImp.cpp:
        (UserObjectImp::toPrimitive):
        * UserObjectImp.h:

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

        Reviewed by Geoff Garen.

        Bring back shared JSGlobalData and implicit locking, because too many clients rely on it.

        * JSBase.cpp:
        (JSBase::Release):
        * JSUtils.cpp:
        (JSObjectKJSValue):
        (KJSValueToCFTypeInternal):
        (unprotectGlobalObject):
        * JSUtils.h:
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        (JSValueWrapper::JSObjectCopyCFValue):
        * JavaScriptGlue.cpp:
        (JSRunCreate):
        (JSRunEvaluate):
        (JSRunCheckSyntax):
        (JSCollect):
        (JSLockInterpreter):
        (JSUnlockInterpreter):
        * UserObjectImp.cpp:
        (UserObjectImp::callAsFunction):

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

        Reviewed by Geoff.

        - eliminate JSValue::type()

        * JSUtils.cpp:
        (KJSValueToCFTypeInternal): Replaced uses of JSValue::type() with
        JSValue::is functions.
        * UserObjectImp.cpp:
        (UserObjectImp::getOwnPropertySlot): Ditto.
        (UserObjectImp::toPrimitive): Take PreferredPrimitiveType argument
        instead of JSType argument.
        * UserObjectImp.h: Ditto.

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

        Reviewed by Cameron Zwarich.
        
        Updated project files to XCode 3.1.

        * JavaScriptGlue.xcodeproj/project.pbxproj:

2008-08-15  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Geoff Garen.

        <rdar://problem/6139914> Please include a _debug version of JavaScriptCore framework

        * Configurations/Base.xcconfig: Factor out the debug-only settings so that they can shared
        between the Debug configuration and debug Production variant.
        * JavaScriptGlue.xcodeproj/project.pbxproj: Enable the debug variant.

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

        Rubber-stamped by Maciej.

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

        * JSBase.cpp:
        (JSBase::Release):
        * JSUtils.cpp:
        (JSObjectKJSValue):
        (KJSValueToCFTypeInternal):
        (unprotectGlobalObject):
        * JSUtils.h:
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        (JSValueWrapper::JSObjectCopyCFValue):
        * JavaScriptGlue.cpp:
        (JSRunCreate):
        (JSRunEvaluate):
        (JSRunCheckSyntax):
        (JSCollect):
        (JSLockInterpreter):
        (JSUnlockInterpreter):
        * UserObjectImp.cpp:
        (UserObjectImp::callAsFunction):

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

        Reviewed by Geoff Garen.

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

        * JSRun.cpp:
        (JSRun::JSRun):
        * JSUtils.cpp:
        (getThreadGlobalExecState):
        Changed JavaScriptGlue to use a JSGlobalData of its own, now that there is no shared
        instance.

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

        Reviewed by Geoff Garen.

        Make JSClassRef work with any context, not just the first one it was used in.

        * ForwardingHeaders/wtf/HashMap.h: Added.

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

        Reviewed by Oliver Hunt and Sam Weinig.

        Next step toward putting doubles in registers: Prepare the Register class
        and its clients for registers that don't contain JSValue*s.
        
2008-07-21  Mark Rowe  <mrowe@apple.com>

        Reviewed by Sam Weinig.

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

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

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

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

        * ChangeLog:
        * JSObject.cpp:
        (JSUserObject::getCallData):

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

        Reviewed by Geoff Garen.

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

        * ForwardingHeaders/wtf/ThreadSpecific.h: Added.
        * JSRun.cpp:
        (JSRun::JSRun):
        * JSUtils.cpp:
        (getThreadGlobalExecState):
        Adapt to the new way of asking for shared JSGlobalData.

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

        Reviewed by Sam Weinig.

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

        * Configurations/JavaScriptGlue.xcconfig:

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

        Reviewed by Geoff Garen.

        Don't warn about deprecated functions in production builds.

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

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

        Reviewed by Darin Adler.

        <rdar://problem/6058368> REGRESSION: Crash occurs in KJS::Machine after launching
        Apple Installer

        The problem was that JSUserObject::getCallData() was setting call type to native, but
        left callData.native.function uninitialized.

        * JSObject.cpp:
        (JSUserObject::getCallData): Initialize callData.native.function.
        (nativeCallFunction): Call UserObjectImp::callAsFunction().

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

        Rubber-stamped by Dan Bernstein.

        * JSObject.h: Rename the header guard as it now conflicts with the
        JSObject in JavaScriptCore.

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

        Reviewed by Darin Adler.

        Disable JSLock for per-thread contexts.

        * ForwardingHeaders/wtf/Locker.h: Added.
        * ForwardingHeaders/wtf/Threading.h: Added.
        * JSBase.cpp:
        (JSBase::Release):
        * JSUtils.cpp:
        (JSObjectKJSValue):
        (KJSValueToCFTypeInternal):
        (unprotectGlobalObject):
        * JSUtils.h:
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        (JSValueWrapper::JSObjectCopyCFValue):
        * JavaScriptGlue.cpp:
        (JSRunCreate):
        (JSRunEvaluate):
        (JSRunCheckSyntax):
        (JSCollect):
        (JSLockInterpreter):
        (JSUnlockInterpreter):
        * UserObjectImp.cpp:
        (UserObjectImp::callAsFunction):
        Pass a parameter (always true) to JSLock and JSLock::DropAllLocks to indicate that JSG
        clients always need implicit mutex protection.
        Added includes that are now needed.

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

        Reviewed by Geoff.

        * JSUtils.cpp: Added include of <JavaScriptCore/JSString.h> since jsString
        will soon be changed to return a JSString*.
        * UserObjectImp.cpp: Ditto.

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

        Reviewed by Geoff.

        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCallFunction): Updated to use getCallData and call instead
        of the old callAsFunction.

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

        Reviewed by Darin Adler.

        Prepare JavaScript heap for being per-thread.

        * JSRun.cpp: (JSRun::JSRun): Create JSGlueGlobalObject in a shared JS heap.

        * JSUtils.h: Made getThreadGlobalExecState available throughout JSGlue.

        * JSUtils.cpp:
        (JSObjectKJSValue): Pass an ExecState where now required.
        (unprotectGlobalObject):
        (initializeGlobalObjectKey):
        (getThreadGlobalExecState):
        Moved these functions from JSValueWrapper.cpp, as the global exec state is now needed
        elsewhere. I'm not quite sure how this relates to the global object from JSRun, but
        since the new uses are all for Heap access, there doesn't seem to be any behavior change.

        * JavaScriptGlue.cpp:
        (JSLockInterpreter): Don't call registerThread explicitly, as JSLock will do that.

        * UserObjectImp.cpp: (UserObjectImp::toPrimitive): Pass ExecState* where now required.

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

        Reviewed by Darin Adler.

        <rdar://problem/5775802> JavaScriptGlue should not force use of GCC 4.0.

        * JavaScriptGlue.xcodeproj/project.pbxproj:

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

        Reviewed by Alexey.

        - removed nearly unused types.h and LocalStorageEntry.h headers

        * JSUtils.h:

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

        Reviewed by Geoff Garen.

        Make Identifier construction use an explicitly passed IdentifierTable.

        * JSUtils.cpp:
        (CFStringToIdentifier):
        (KJSValueToCFTypeInternal):
        * JSUtils.h:
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        * UserObjectImp.cpp:
        (UserObjectImp::getPropertyNames):
        Pass ExecState or JSGlobalData everywhere.

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

        - rename KJS::List to KJS::ArgList

        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCallFunction):
        * UserObjectImp.cpp:
        (UserObjectImp::callAsFunction):
        * UserObjectImp.h:

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

        - new names for a few key JavaScriptCore files

        * ForwardingHeaders/kjs/JSValue.h: Copied from JavaScriptGlue/ForwardingHeaders/kjs/value.h.
        * ForwardingHeaders/kjs/value.h: Removed.
        * JSUtils.h:

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

        - update for JavaScriptCore changes for https://bugs.webkit.org/show_bug.cgi?id=19269
          speed up SunSpider by eliminating the toObject call for most get/put/delete

        * UserObjectImp.cpp:
        (UserObjectImp::userObjectGetter): Removed originalObject argument.
        * UserObjectImp.h: Ditto.

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

        Reviewed by Alexey Proskuryakov.

        Removed JSObject::call, since it just called JSObject::callAsFunction.

        SunSpider reports no change.

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

        Reviewed by Oliver Hunt.
        
        Fixed total destruction in Software Update.app.
        
        Updated JavaScriptGlue to honor squirrelfish's new getCallData mechanism for
        indicating that an object can be called as a function.

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

        Reviewed by Oliver.

        - JavaScriptGlue part of fix for: "SQUIRRELFISH: function toString broken after calling"
        https://bugs.webkit.org/show_bug.cgi?id=18869
        
        * JSRun.cpp:
        (JSRun::Evaluate): Use UString version of eveluate() instead of
        the now departed UChar*/length variant; use of the lower-level
        version was gratuitous in any case.
        (JSRun::CheckSyntax): Ditto for checkSyntax().

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

        Build fix: supply missing parameter that used to be implicit.

        * JSRun.cpp:
        (JSRun::Evaluate):

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

        Reviewed by Oliver Hunt.
        
        Build fix.

        * ForwardingHeaders/wtf/UnusedParam.h: Copied from ForwardingHeaders/wtf/OwnPtr.h.

2008-05-12  Alexey Proskuryakov  <ap@webkit.org>

        Roll out recent  threading changes (r32807, r32810, r32819, r32822) to simplify
        SquirrelFish merging.

        * JSUtils.cpp:
        (JSObjectKJSValue):
        * JSUtils.h:
        * JSValueWrapper.cpp:
        (unprotectGlobalObject):
        (initializeGlobalObjectKey):
        (getThreadGlobalExecState):
        * JavaScriptGlue.cpp:
        (JSCollect):
        (JSLockInterpreter):
        * UserObjectImp.cpp:
        (UserObjectImp::toPrimitive):

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

        Reviewed by Darin Adler.

        Make JavaScriptGlue and JavaScriptCore API functions implicitly call initializeThreading
        for the sake of non-WebKit clients.

        * JavaScriptGlue.cpp:
        (JSRunCreate):
        (JSCollect):
        (JSCreateJSArrayFromCFArray):
        (JSLockInterpreter):
        These are all possible JavaScriptGlue entry points.

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

        Reviewed by Geoffrey Garen.

        https://bugs.webkit.org/show_bug.cgi?id=18826
        Make JavaScript heap per-thread

        * JSValueWrapper.cpp:
        * JSUtils.h:
        Moved getThreadGlobalExecState() to JSUtils and made it extern, as ExecState is now needed
        for all JS allocations.

        * JSUtils.cpp:
        (JSObjectKJSValue): Pass ExecState to functions that now need it.
        (unprotectGlobalObject): Moved from JSValueWrapper.cpp.
        (initializeGlobalObjectKey): Ditto.
        (getThreadGlobalExecState): Ditto.

        * UserObjectImp.cpp: (UserObjectImp::toPrimitive): Pass ExecState to jsString and jsNumber.

        * JavaScriptGlue.cpp:
        (JSCollect): Use current thread's heap.
        (JSLockInterpreter): Removed JSLock::registerThread(), because a JS heap doesn't need to
        know about other threads.

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

        Reviewed by Darin Adler.

        Fix run-webkit-tests --threading
        and provisionally fix <https://bugs.webkit.org/show_bug.cgi?id=18661>
        Proxy server issue in Sunday's Nightly

        * UserObjectImp.cpp: Adjusted for the new member added to ClassInfo.

2008-04-25  Mark Rowe  <mrowe@apple.com>

        Reviewed by Adele Peterson.

        <rdar://problem/5891264> Don't install the JavaScriptGlue headers

        * JavaScriptGlue.xcodeproj/project.pbxproj:

2008-04-25  Mark Rowe  <mrowe@apple.com>

        Rubber-stamped by Sam Weinig.

        Add some content to an empty ICU header file to prevent verification errors.

        * icu/unicode/utf_old.h:

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

        Reviewed by Oliver Hunt.

        Ensure that debug symbols are generated for x86_64 and ppc64 builds.

        * Configurations/Base.xcconfig:

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

        - fix build

        * ForwardingHeaders/wtf/ListRefPtr.h: Added.

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

        Reviewed by Tim Hatcher.

        Update Xcode configuration to support building debug and release from the mysterious future.

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

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

        Reviewed by David Harrison.
        
        Fixed <rdar://problem/5765063> TOT REGRESSION: Software Update crash in
        KJS::Collector::collect() (missing JSLock)

        * JSValueWrapper.cpp:
        (unprotectGlobalObject): Added missing JSLock.

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

        Reviewed by Oliver Hunt.

        Update versioning to support the mysterious future.

        * Configurations/Version.xcconfig: Add SYSTEM_VERSION_PREFIX_1060.

2008-01-28  Eric Seidel  <eric@webkit.org>

        Reviewed by darin.
        
        Add icu headers to JSG in preparation for depending on ::UChar.

        * Configurations/Base.xcconfig:
        * ForwardingHeaders/wtf/unicode: Added.
        * ForwardingHeaders/wtf/unicode/Unicode.h: Added.
        * ForwardingHeaders/wtf/unicode/icu: Added.
        * ForwardingHeaders/wtf/unicode/icu/UnicodeIcu.h: Added.
        * icu: Copied from ../JavaScriptCore/icu.

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

        Build fix.

        * ForwardingHeaders/wtf/VectorTraits.h: Added.

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

        Reviewed by Mark Rowe.

        <rdar://problem/5639463> Bundle versions on Tiger should be 4523.x not 523.x

        * Configurations/Version.xcconfig: Some Tiger versions of Xcode don't set MAC_OS_X_VERSION_MAJOR,
          so assume Tiger and use a 4 for the SYSTEM_VERSION_PREFIX.

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

        Reviewed by Darin Adler.

        Third step in refactoring JSGlobalObject: Moved data members and data
        member access from Interpreter to JSGlobalObject. Replaced JSInterpreter
        subclass with JSGlobalObject subclass.
        
        * JSRun.cpp:
        (JSRun::JSRun):
        (JSRun::Evaluate):
        (JSRun::CheckSyntax):
        * JSRun.h:
        (JSGlueGlobalObject::JSGlueGlobalObject):
        * JSUtils.cpp:
        (KJSValueToCFTypeInternal):
        * JSValueWrapper.cpp:
        (getThreadGlobalExecState):

2007-12-02  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Eric Seidel.

        Updated to match the JavaScriptCore change to move virtual methods from
        Interpreter to JSGlobalObject.
        
        * JSRun.cpp:
        * JSRun.h:
        * JSValueWrapper.cpp:
        (getThreadGlobalExecState):
        * JavaScriptGlue.cpp:
        (JSRunCopyGlobalObject):
        (JSRunEvaluate):

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

        Reviewed by Beth Dakin.
        
        Modified to follow new JSGlobalObject/Interpreter ownership rules 
        in JavaScriptCore.

        * JSRun.cpp:
        (JSRun::JSRun):
        (JSRun::GetInterpreter):
        (JSRun::Evaluate):
        (JSRun::CheckSyntax):
        * JSRun.h:
        * JSValueWrapper.cpp:
        (unprotectGlobalObject):
        (initializeGlobalObjectKey):
        (getThreadGlobalExecState):

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

        Reviewed by Maciej.

        Fix REGRESSION(r27885): Installer hits assertion failure in JavaScriptGlue.

        * JSValueWrapper.cpp:
        (getThreadGlobalExecState): Set the global object on the Interpreter before using it.

2007-11-27  Anders Carlsson  <andersca@apple.com>
        
        Build fix.
        
        * JSUtils.cpp:
        (KJSValueToCFTypeInternal):
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):

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

        Reviewed by Eric.

        Fix JavaScriptGlue to build without warnings using GCC 4.2.

        * Configurations/Base.xcconfig:
        * JSRun.h:

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

        Reviewed by Darin Adler.

        Fix: <rdar://problem/5607032> REGRESSION: testapi exits with assertion failure in debug build
             <rdar://problem/5440659> JSGlobalContextCreate throws away globalObjectClass's prototype
             http://bugs.webkit.org/show_bug.cgi?id=16033

        Update for changes in Interpreter method signatures.

        * JSRun.h:

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

        Reviewed by Anders Carlsson.

        Renamed Shared to RefCounted.

        * ForwardingHeaders/wtf/RefCounted.h: Copied from JavaScriptGlue/ForwardingHeaders/wtf/Shared.h.
        * ForwardingHeaders/wtf/Shared.h: Removed.

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

        Reviewed by Sam Weinig.

        Moved Shared.h into wtf so it could be used in more places.

        * ForwardingHeaders/wtf/Shared.h: Added.

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

        Build fix.

        * ForwardingHeaders/wtf/MathExtras.h: Copied from WebCore/ForwardingHeaders/wtf/MathExtras.h.

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

        Build fix.

        * ForwardingHeaders/kjs/value.h: Added.

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

        Build-fix.

        * UserObjectImp.cpp:

2007-11-03  David D. Kilzer  <ddkilzer@webkit.org>

        Sort files(...); sections of Xcode project files.

        Rubber-stamped by Darin Adler.

        * JavaScriptGlue.xcodeproj/project.pbxproj:

2007-10-25  Eric Seidel  <eric@webkit.org>

        Reviewed by Geoff.
        
        Make JSG build again after JSGlobalObject change.

        * JSRun.cpp:
        (JSRun::JSRun):
        (JSRun::GlobalObject):
        * JSRun.h:
        (JSInterpreter::JSInterpreter):
        * JSUtils.h:

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-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-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:
        * JavaScriptGlue.xcodeproj/project.pbxproj:

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:
        * JavaScriptGlue.xcodeproj/project.pbxproj: Add a shell script phase to make to dependency between
        Version.xcconfig and Info.plist explicit to Xcode.

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-04-27  Mark Rowe  <mrowe@apple.com>

        Reviewed by Oliver.

        * JavaScriptGlue.xcodeproj/project.pbxproj: Improve dependencies in Xcode project
        by marking JavaScriptGlue as a dependency of testjsglue.

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

        Reviewed by Dave Hyatt.

        * JavaScriptGlue.xcodeproj/project.pbxproj: Use GCC 4.0 for testjsglue.

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

        Rubber-stamped by Darin Adler.

        * Configurations/JavaScriptGlue.xcconfig: Remove unnecessary INFOPLIST_PREPROCESS.

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)

        * JavaScriptGlue.xcodeproj/project.pbxproj:

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)

        * JavaScriptGlue.xcodeproj/project.pbxproj:

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/JavaScriptGlue.xcconfig:
        * Configurations/Version.xcconfig:

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/JavaScriptGlue.xcconfig: Added.
        * Configurations/Version.xcconfig: Added.
        * Info.plist:
        * JavaScriptGlue.xcodeproj/project.pbxproj:

=== Safari-5522.4 ===

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

        Reviewed by Oliver Hunt.
        
        Updated in light of fix for <rdar://problem/4681051> Installer crashes 
        in KJS::Collector::markOtherThreadConservatively(KJS::Collector::Thread*) 
        trying to install iLife 06 using Rosetta on an Intel Machine
        
        * JavaScriptGlue.cpp:
        (JSLockInterpreter): Ensure backwards compatibility by calling 
        registerThread() when explicitly taking the JSLock. (This doesn't happen 
        automatically anymore.) I doubt this actally matters, but in JavaScriptGlue
        territory, that kind of thinking will get you killed.

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

        Reviewed by Maciej Stachowiak.

        Fixed all known crashers exposed by run-webkit-tests --threaded while using
        a PAC file (for maximum carnage). See JavaScriptCore ChangeLog for 
        more details.

        * JSBase.cpp:
        (JSBase::Release): Lock when deleting, because we may be deleting an object
        (like a JSRun) that holds thread-unsafe data.

        * JSUtils.cpp:
        (CFStringToUString): Don't lock, because our caller locks. Also, locking
        inside a function that returns thread-unsafe data by copy will only mask
        threading problems.

        * JavaScriptGlue.cpp:
        (JSRunEvaluate): Added missing JSLock.
        (JSRunCheckSyntax): Converted to JSLock.
        * JavaScriptGlue.xcodeproj/project.pbxproj:

2007-02-22  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.
        
        Fixed <rdar://problem/4942528> Installer.app Stuck "Examining additional 
        volumes..."
        
        The problem was that JavaScriptGlue held a JSObject in a static pointer
        without protecting it from garbage collection. 
        
            sUserObjectPrototypeImp  = new UserObjectPrototypeImp();
            static ProtectedPtr<UserObjectPrototypeImp> protectPrototype; // valiant, brave, but useless

        Through an interesting comedy of errors, this object would be collected 
        and then assigned as the prototype of another object allocated at the 
        same address, thus becoming its own prototype. (See http://www.ziplo.com/grandpa.htm
        for further explanation of this phenomenon.) Hence the infinte loop in 
        property lookup.
        
        The solution is equally humorous: all of this code was completely useless --
        it only served to create an empty object in the prototype chain -- so
        I just removed it.

        * UserObjectImp.cpp:
        (UserObjectImp::UserObjectImp):
        * UserObjectImp.h:

2007-02-19  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Geoff.

        <rdar://problem/4636301> Deprecate JavaScriptGlue

        * JavaScriptGlue.h: adds DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER to everything
        * JavaScriptGlue.xcodeproj/project.pbxproj: use -Wno-deprecated-declarations to keep the project building
        * config.h: define DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER as empty on other systems

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

        Reviewed by Anders.

        - fix <rdar://problem/5000216> JavaScriptGlue framework started turning all CFNumbers
          into signed 32bit values

        Circumstantial evidence seems to indicate that JavaScriptGlue was depending on a bug
        in CFNumber where CFNumberIsFloatType was returning true for 64-bit integer values.

        * JSUtils.cpp: (JSObjectKJSValue): Removed the call to CFNumberIsFloatType in the
        conversion of numeric values, and always use kCFNumberDoubleType, since double is
        the internal format of numbers in JavaScriptCore. There's no value to having a
        separate code path for integers. There's also no reason to check the return value
        from CFNumberGetValue -- if it returns false it still does the best it can to convert
        to a double, which is what we want.

        * UserObjectImp.cpp: (UserObjectImp::toString): Removed a similar code path that
        tried to handle integers separate from double. Instead, always use a double. For
        compatibility, use a format without a decimal point when CFNumberIsFloatType returns
        false. Also removed a bogus cast to float; the "%f" format string takes a double,
        not a float, so all the cast did was cut down on precision.

2007-01-25  Mark Rowe  <mrowe@apple.com>

        Reviewed by Maciej.

        * Info.plist: Update copyright string.

2006-12-19  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin Adler.

        <rdar://problem/4891774> Local WebCore/WebBrowser builds fail in 9A328 due to warning about ObjC-2.0 language features

        * JavaScriptGlue.xcodeproj/project.pbxproj:

=== Safari-521.26 ===

2006-08-15  Mark Rowe  <opendarwin.org@bdash.net.nz>

        Reviewed by Tim H.

        Build fix:  DWARF and -gfull are incompatible with symbol separation.

        * JavaScriptGlue.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

        * JavaScriptGlue.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

        * JavaScriptGlue.xcodeproj/project.pbxproj:

2006-08-04  Sam Weinig  <sam.weinig@gmail.com>

        Reviewed by Darin Adler.

        - 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.

        * JavaScriptGlue.xcodeproj/project.pbxproj:

2006-08-03  Sam Weinig  <sam.weinig@gmail.com>

        Reviewed by Darin Adler.

        - patch for http://bugs.webkit.org/show_bug.cgi?id=10176
          Make WebCore compile with -Wundef

          * Adds -Wundef flag to Xcode project

        * JavaScriptGlue.xcodeproj/project.pbxproj:

2006-07-29  Sam Weinig  <sam.weinig@gmail.com>

        Reviewed by Darin Adler.

        - 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:
          * Turning on gcc warning for missing newline at the end of a source file
            (GCC_WARN_ABOUT_MISSING_NEWLINE in Xcode, -Wnewline in gcc).

        * JavaScriptGlue.xcodeproj/project.pbxproj:

=== Safari-521.19 ===

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

        Fixed by Darin & Maciej, reviewed by me.
        
        - Fixed <rdar://problem/4638934> Leopard 9A227: Installer crashes right 
        after LCA and while preparing Installation

        Compile release/production with NDEBUG set, to ensure binary compatibility
        between JavaScriptGlue and JavaScriptCore. In debug builds, JavaScriptCore 
        includes an extra debug data member in HashSet.
        
        * JavaScriptGlue.xcodeproj/project.pbxproj:

=== Safari-521.18 ===

2006-07-15  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin Adler.

        - switch property lists to be vector+set of Identifiers instead of list of References
        
        * JSUtils.cpp:
        (KJSValueToCFTypeInternal): updated for JSC SPI changes
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames): ditto
        * UserObjectImp.cpp:
        (UserObjectImp::getPropertyNames): ditto
        * UserObjectImp.h:

=== Safari-521.17 ===

2006-07-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.
        
        - Updated JSInterpreter to work with Interpreter ref-counting in JavaScriptCore.

        (JSInterpreter::JSInterpreter::~JSInterpreter): Now protected to catch
        manual delete.

2006-07-12  Anders Carlsson  <acarlsson@apple.com>

        Build fix
        
        * JSUtils.cpp:
        (KJSValueToCFTypeInternal):
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):
        * UserObjectImp.cpp:
        (UserObjectImp::getPropertyList):
        
=== Safari-521.15 ===

2006-07-07  Geoffrey Garen  <ggaren@apple.com>

        - build fix

        * JSUtils.cpp:
        (KJSValueToCFTypeInternal):
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):

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

        Reviewed by Maciej.
        
        * JSRun.cpp:
        (JSRun::CheckSyntax): Updated to use new checkSyntax syntax in JSC.
        * JavaScriptGlue.xcodeproj/project.pbxproj:

=== Safari-521.14 ===

2006-06-28  Timothy Hatcher  <timothy@apple.com>

        Prefer the Stabs debugging symbols format until DWARF bugs are fixed.

        * JavaScriptGlue.xcodeproj/project.pbxproj:

2006-06-24  David Kilzer  <ddkilzer@kilzer.net>

        Reviewed by Timothy.

        * Info.plist: Fixed copyright to include 2003-2006.

=== JavaScriptGlue-521.13 ===
        
2006-06-20  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Anders.
        
        - Required for JS API: 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.

        * JSUtils.cpp:
        (KJSValueToCFTypeInternal):
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):
        * UserObjectImp.cpp:
        (UserObjectImp::getPropertyList):
        * UserObjectImp.h:

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.

        * JavaScriptGlue.xcodeproj/project.pbxproj:

2006-06-12  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by TimO, Maciej.
        
        - JSGlue part of merging InterpreterImp into Interpreter.
        
        Since there's now a kjs forwarding header, I moved all forwarding
        headers into a "ForwardingHeaders" directory, like in WebCore.

        * ForwardingHeaders: Added.
        * ForwardingHeaders/kjs: Added.
        * ForwardingHeaders/kjs/ExecState.h: Added.
        * ForwardingHeaders/wtf: Added.
        * JavaScriptGlue.xcodeproj/project.pbxproj:
        * config.h:
        * wtf: Removed.
        * wtf/AlwaysInline.h: Removed.
        * wtf/Assertions.h: Removed.
        * wtf/FastMalloc.h: Removed.
        * wtf/Forward.h: Removed.
        * wtf/HashCountedSet.h: Removed.
        * wtf/HashSet.h: Removed.
        * wtf/Noncopyable.h: Removed.
        * wtf/OwnArrayPtr.h: Removed.
        * wtf/OwnPtr.h: Removed.
        * wtf/PassRefPtr.h: Removed.
        * wtf/Platform.h: Removed.
        * wtf/RefPtr.h: Removed.
        * wtf/Vector.h: Removed.

=== JavaScriptGlue-521.10 ===

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

        Rubber stamped by Anders.
        
        - renamed kxmlcore to wtf
        
        kxmlcore --> wtf
        KXMLCore --> WTF
        KXC --> WTF

        * config.h:
        * kxmlcore: Removed.
        * kxmlcore/AlwaysInline.h: Removed.
        * kxmlcore/Assertions.h: Removed.
        * kxmlcore/FastMalloc.h: Removed.
        * kxmlcore/Forward.h: Removed.
        * kxmlcore/HashCountedSet.h: Removed.
        * kxmlcore/HashSet.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/Vector.h: Removed.
        * wtf: Added.

2006-04-11  Darin Adler  <darin@apple.com>

        - try to fix Windows build

        * kxmlcore/HashForward.h: Removed.

2006-04-10  Darin Adler  <darin@apple.com>

        Rubber-stamped by John Sullivan.

        - added forwarding headers for the new Forward.h and HashForward.h files

        * kxmlcore/Forward.h: Added.
        * kxmlcore/HashForward.h: Added.

2006-04-04  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin Adler.

        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. 

        * JavaScriptGlue.xcodeproj/project.pbxproj:

2006-04-02  Eric Seidel  <eseidel@apple.com>

        Reviewed by andersca.

        Add missing forwarding header.

        * kxmlcore/Vector.h: Added.

2006-03-31  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler.

        - Fixed <rdar://problem/4430836> JavaScript patch crashing Quartz
        Composer

        JSValueWrappers used to hold on to the ExecState that pertained at
        the time of their creation. Since ExecStates are transient, that
        design was totally bogus, and it would crash once the ExecState had
        been deallocated.

        Unfortunately, there's no clean solution to this problem, since
        the JSGlue API has no notion of state. The solution here is to use
        a shared, global ExecState for the purpose of JSGlue calls. Given
        the pre-existing limitations in the JSGlue API, this design
        shouldn't actually introduce any new limitations (see comments in
        JSValueWrapper.cpp).

        I tested with Quartz Composer and PAC files, neither of which are
        layout-testable.
        
        * JSUtils.cpp:
        (KJSValueToJSObject):
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSValueWrapper):
        (JSValueWrapper::GetValue):
        (getProcessGlobalExecState):
        (JSValueWrapper::JSObjectCopyPropertyNames):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        (JSValueWrapper::JSObjectCopyCFValue):
        * JSValueWrapper.h:

        Also added a test harness file. It was helpful while I was testing,
        and may come in handy in the future:
        
        * JavaScriptGlue.xcodeproj/project.pbxproj:
        testjsglue.cpp: Added.

2006-03-28  Darin Adler  <darin@apple.com>

        Reviewed by Geoff.

        - added a build step that checks for init routines

        * JavaScriptGlue.xcodeproj/project.pbxproj: Added a custom build phase that invokes the
        check-for-global-initializers script.

2006-03-02  Maciej Stachowiak  <mjs@apple.com>

        Not reviewed, but I noticed these trivial extra changes were needed to avoid
        breaking the build with my reviewed patch for:
        
        http://bugs.webkit.org/show_bug.cgi?id=7387
        
        Add config.h, includes of it, and Platform.h forwarding header.

        * JSBase.cpp:
        * JSObject.cpp:
        * JSRun.cpp:
        * JSUtils.cpp:
        * JSValueWrapper.cpp:
        * JavaScriptGlue.cpp:
        * UserObjectImp.cpp:
        * config.h: Added.
        * kxmlcore/Platform.h: Added.

=== JavaScriptGlue-521.7 ===

2006-02-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by eric.

        - Fixed build.

        * UserObjectImp.cpp:
        (UserObjectImp::toPrimitive):
        * UserObjectImp.h:

2006-02-03  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Justin.

        Renamed configuration names to Debug, Release and Production.

        * JavaScriptGlue.xcodeproj/project.pbxproj:

2006-02-01  Darin Adler  <darin@apple.com>

        - added some forwarding headers to make new JavaScriptCore changes work

        * kxmlcore/Assertions.h: Added.
        * kxmlcore/Noncopyable.h: Added.
        * kxmlcore/OwnPtr.h: Added.
        * kxmlcore/OwnArrayPtr.h: Added.

2006-01-16  Timothy Hatcher  <timothy@apple.com>

        Adding the license header to all files so we can
        move JavaScriptGlue into the open source repository.

        * LICENSE: Added.
        * JSBase.cpp: license header added.
        * JSBase.h: ditto.
        * JSObject.cpp: ditto.
        * JSObject.h: ditto.
        * JSRun.cpp: ditto.
        * JSRun.h: ditto.
        * JSUtils.cpp: ditto.
        * JSUtils.h: ditto.
        * JSValueWrapper.cpp: ditto.
        * JSValueWrapper.h: ditto.
        * JavaScriptGlue.cpp: ditto.
        * JavaScriptGlue.h: ditto.
        * UserObjectImp.cpp: ditto.
        * UserObjectImp.h: ditto.

2005-12-21  Timothy Hatcher  <timothy@apple.com>

        * JavaScriptGlue.xcodeproj/project.pbxproj:
          Set tab width to 8, indent width to 4 and uses tabs to false per file.

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

        * kxmlcore/AlwaysInline.h: Added.

2005-12-15  Darin Adler  <darin@apple.com>

        Reviewed by Maciej.

        * JSRun.cpp: (JSRun::Evaluate): Updated for change to Interpreter::evaluate.

2005-12-15  Darin Adler  <darin@apple.com>

        Reviewed by Tim Hatcher.

        * JavaScriptGlue.xcodeproj/project.pbxproj: Removed some redundant build
        settings, turned off prebinding explicitly for our Development and
        Deployment builds, remove .exp file from sources. All "clean-up".

=== Safari-521~5 ===

2005-12-13  Geoffrey Garen  <ggaren@apple.com>

    - Fixed build after Anders's last checkin to JavaScriptCore.
    
        Reviewed by darin.

        * UserObjectImp.cpp:
        (UserObjectImp::userObjectGetter): Updated to reflect new argument that 
    getters take (unused here).
        * UserObjectImp.h:

2005-12-13  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric.

    - added forwarding header for HashCountedSet

        * kxmlcore/HashCountedSet.h: Added.

2005-12-10  Darin Adler  <darin@apple.com>

        Rubber stamped by Maciej.

        - updated for KJS class renaming

        * many 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().

        * JSUtils.cpp:
        (JSObjectKJSValue):
        * UserObjectImp.cpp:
        (UserObjectImp::callAsFunction):
        (UserObjectImp::toPrimitive):

2005-12-05  Maciej Stachowiak  <mjs@apple.com>

        - added new forwarding headers

        * kxmlcore/PassRefPtr.h: Added.
        * kxmlcore/RefPtr.h: Added.

2005-12-05  Maciej Stachowiak  <mjs@apple.com>

        * kxmlcore/PassRefPtr.h: Added.

2005-11-26  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by Eric.

    - renamed InterpreterLock to JSLock

        * JSUtils.cpp:
        (CFStringToUString):
        (JSObjectKJSValue):
        (KJSValueToCFTypeInternal):
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        (JSValueWrapper::JSObjectCopyCFValue):
        * JavaScriptGlue.cpp:
        (JSRunCreate):
        (JSCollect):
        (JSLockInterpreter):
        (JSUnlockInterpreter):
        * UserObjectImp.cpp:
        (UserObjectImp::callAsFunction):

2005-11-16  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Geoff.

    Updated to use new API to drop all locks.

        * JavaScriptGlue.cpp:
        (JSLockInterpreter):
        (JSUnlockInterpreter):
        * UserObjectImp.cpp:
        (UserObjectImp::callAsFunction):

2005-11-14  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by mjs.

        - Part of the fix for <rdar://problem/4342216> Installer crash in 
          KJS::ValueImp::marked() when garbage collector runs inside call to 
          ConstantValues::init()
          
        Added locking in JSRunCreate, since JSRun::JSRun constructs an object.
        
        * JavaScriptGlue.cpp:
        (JSRunCreate):

2005-11-10  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Maciej.

        - Fixed <rdar://problem/4334445> installer crashed on my 
          dual g4 450Mhz after clicking language

        - Reversed backwards NULL check.
        - Inserted guards against NULL fJSUserObject data member.
        - Cleaned up some style.

        * JSUtils.cpp:
        (KJSValueToCFTypeInternal):
        * UserObjectImp.cpp:
        (UserObjectImp::~UserObjectImp):
        (UserObjectImp::callAsFunction):
        (UserObjectImp::userObjectGetter):
        (UserObjectImp::getOwnPropertySlot):
        (UserObjectImp::put):
        (UserObjectImp::mark):

2005-11-04  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin Adler.

        * JavaScriptGlue.xcodeproj/project.pbxproj:
          Fixed the FRAMEWORK_SEARCH_PATHS to look in the WebKit
          Frameworks for the Default config.

2005-11-03  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Darin and Vicki.

        * JavaScriptGlue.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-01  Maciej Stachowiak  <mjs@apple.com>

    Reviewed by: Eric.
    
        <rdar://problem/4324107> get JavaScriptGlue working with TOT JavaScriptCore again

    - reverted all this stuff to use ReferenceList instead of IdentifierSequencedSet

        * JSUtils.cpp:
        (KJSValueToCFTypeInternal):
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):
        * UserObjectImp.cpp:
        (UserObjectImp::propList):
        * UserObjectImp.h:

2005-10-11  Timothy Hatcher  <timothy@apple.com>

        Setup the proper Framework search path for the Default config.
        Prepping for a TOT submission and build by B&I.

        * JavaScriptGlue.xcodeproj/project.pbxproj:

2005-10-10  Darin Adler  <darin@apple.com>

        Reviewed by Eric.

        - converted tabs to spaces, NULL to 0, added some (void), got rid of __ prefixes
          in headers (reserved for compiler/library)

        * Info.plist:
        * JSBase.cpp:
        * JSBase.h:
        * JSObject.cpp:
        * JSObject.h:
        * JSRun.cpp:
        * JSRun.h:
        * JSUtils.cpp:
        * JSUtils.h:
        * JSValueWrapper.cpp:
        * JSValueWrapper.h:
        * JavaScriptGlue.cpp:
        * JavaScriptGlue.h:
        * UserObjectImp.cpp:
        * UserObjectImp.h:

2005-10-10  Darin Adler  <darin@apple.com>

        * .cvsignore: Added. Ignore Makefile.in and Makefile.

2005-10-07  Timothy Hatcher  <timothy@apple.com>

        Reviewed by Maciej.
        
        Build fix, needed to disable RTTI. Upgraded to a native target.

        * JavaScriptGlue.xcodeproj/project.pbxproj:
        * Info.plist

2005-10-05  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Eric and Darin.

    <rdar://problem/4260506> Port JavaScriptGlue to TOT JavaScriptCore

        * JSRun.cpp:
        (JSRun::JSRun):
        (JSRun::GlobalObject):
        * JSRun.h:
        (JSInterpreter::JSInterpreter):
        * JSUtils.cpp:
        (KJSValueToJSObject):
        (JSObjectKJSValue):
        (KJSValueToCFTypeInternal):
        (KJSValueToCFType):
        * JSUtils.h:
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSValueWrapper):
        (JSValueWrapper::GetValue):
        (JSValueWrapper::JSObjectCopyPropertyNames):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        (JSValueWrapper::JSObjectMark):
        * JSValueWrapper.h:
        * JavaScriptGlue.cpp:
        (JSRunCopyGlobalObject):
        * JavaScriptGlue.xcodeproj/project.pbxproj:
        * Makefile.am: Added.
        * UserObjectImp.cpp:
        (UserObjectPrototypeImp::GlobalUserObjectPrototypeImp):
        (UserObjectImp::UserObjectImp):
        (UserObjectImp::callAsFunction):
        (UserObjectImp::getPropertyNames):
        (UserObjectImp::userObjectGetter):
        (UserObjectImp::getOwnPropertySlot):
        (UserObjectImp::put):
        (UserObjectImp::toPrimitive):
        (UserObjectImp::mark):
        * UserObjectImp.h:
        * kxmlcore/FastMalloc.h: Added.
        * kxmlcore/HashSet.h: Added.

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).

        * JSUtils.cpp:
        (CFStringToUString):
        (JSObjectKJSValue):
        (KJSValueToCFTypeInternal):
        * JSUtils.h:
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        (JSValueWrapper::JSObjectCopyCFValue):
        * JavaScriptGlue.cpp:
        (JSCollect):

2005-09-27  Adele Peterson  <adele@apple.com>

        Reviewed by Maciej.

        <rdar://problem/4223297> JavaScriptGlue: Submit 64-bit compatible versions of your API and SPIs by September 15

        * JavaScriptGlue.h: Changed UInt32 to CFTypeID for JSTypeID

2005-09-06  Geoffrey Garen  <ggaren@apple.com>

        -upgraded project files to XCode 2.1

        * JavaScriptGlue.pbproj/project.pbxproj: Removed.
        * JavaScriptGlue.xcodeproj/.cvsignore: Added.
        * JavaScriptGlue.xcodeproj/project.pbxproj: Added.

2005-09-01  Maciej Stachowiak  <mjs@apple.com>

        Rubber stamped by hyatt.

    - initial import of JavaScriptGlue into our repository

        * English.lproj/InfoPlist.strings: Added.
        * JSBase.cpp: Added.
        (JSBase::JSBase):
        (JSBase::~JSBase):
        (JSBase::Retain):
        (JSBase::Release):
        (JSBase::RetainCount):
        (JSBase::GetTypeID):
        (JSBase::CopyDescription):
        (JSBase::Equal):
        * JSBase.h: Added.
        * JSObject.cpp: Added.
        (JSUserObject::JSUserObject):
        (JSUserObject::~JSUserObject):
        (JSUserObject::CopyPropertyNames):
        (JSUserObject::CopyProperty):
        (JSUserObject::SetProperty):
        (JSUserObject::ImplementsCall):
        (JSUserObject::CallFunction):
        (JSUserObject::CopyCFValue):
        (JSUserObject::Equal):
        (JSUserObject::Mark):
        (JSUserObject::GetData):
        * JSObject.h: Added.
        (JSUserObject::DataType):
        * JSRun.cpp: Added.
        (JSRun::JSRun):
        (JSRun::~JSRun):
        (JSRun::Flags):
        (JSRun::GetSource):
        (JSRun::GlobalObject):
        (JSRun::GetInterpreter):
        (JSRun::Evaluate):
        (JSRun::CheckSyntax):
        * JSRun.h: Added.
        (JSInterpreter::JSInterpreter):
        (JSInterpreter::JSInterpreter::~JSInterpreter):
        (JSInterpreter::Flags):
        * JSUtils.cpp: Added.
        (CFStringToUString):
        (UStringToCFString):
        (CFStringToIdentifier):
        (IdentifierToCFString):
        (KJSValueToJSObject):
        (JSObjectKJSValue):
        (KJSValueToCFTypeInternal):
        (KJSValueToCFType):
        (GetCFNull):
        * JSUtils.h: Added.
        (RetainCFType):
        (ReleaseCFType):
        * JSValueWrapper.cpp: Added.
        (JSValueWrapper::JSValueWrapper):
        (JSValueWrapper::~JSValueWrapper):
        (JSValueWrapper::GetValue):
        (JSValueWrapper::GetExecState):
        (JSValueWrapper::GetJSObectCallBacks):
        (JSValueWrapper::JSObjectDispose):
        (JSValueWrapper::JSObjectCopyPropertyNames):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        (JSValueWrapper::JSObjectCopyCFValue):
        (JSValueWrapper::JSObjectMark):
        * JSValueWrapper.h: Added.
        * JavaScriptGlue.cpp: Added.
        (JSSetCFNull):
        (JSGetCFNull):
        (JSRetain):
        (JSRelease):
        (JSCopyDescription):
        (JSEqual):
        (JSGetTypeID):
        (JSGetRetainCount):
        (JSObjectCreate):
        (JSObjectCreateInternal):
        (JSObjectCopyCFValue):
        (JSObjectGetData):
        (JSObjectCopyProperty):
        (JSObjectSetProperty):
        (JSObjectCallFunction):
        (JSRunCreate):
        (JSRunCopySource):
        (JSRunCopyGlobalObject):
        (JSRunEvaluate):
        (JSRunCheckSyntax):
        (JSCollect):
        (JSTypeGetCFArrayCallBacks):
        (JSCFRetain):
        (JSCFRelease):
        (JSObjectCreateWithCFType):
        (CFJSObjectDispose):
        (JSObjectCopyPropertyNames):
        (CFJSObjectCopyProperty):
        (CFJSObjectSetProperty):
        (CFJSObjectCopyCFValue):
        (CFJSObjectEqual):
        (CFJSObjectCopyPropertyNames):
        (JSCreateCFArrayFromJSArray):
        (JSCreateJSArrayFromCFArray):
        (JSLockInterpreter):
        (JSUnlockInterpreter):
        * JavaScriptGlue.exp: Added.
        * JavaScriptGlue.h: Added.
        * JavaScriptGlue.pbproj/project.pbxproj: Added.
        * UserObjectImp.cpp: Added.
        (UserObjectPrototypeImp::UserObjectPrototypeImp):
        (UserObjectPrototypeImp::GlobalUserObjectPrototypeImp):
        (UserObjectImp::UserObjectImp):
        (UserObjectImp::~UserObjectImp):
        (UserObjectImp::classInfo):
        (UserObjectImp::implementsCall):
        (UserObjectImp::call):
        (UserObjectImp::propList):
        (UserObjectImp::hasProperty):
        (UserObjectImp::get):
        (UserObjectImp::put):
        (UserObjectImp::GetJSUserObject):
        (UserObjectImp::toPrimitive):
        (UserObjectImp::toBoolean):
        (UserObjectImp::toNumber):
        (UserObjectImp::toString):
        (UserObjectImp::mark):
        * UserObjectImp.h: Added.

