[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

darin darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 06:30:49 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 07f7cce07fa3c1628dc50a3a87e207384a090dfd
Author: darin <darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Aug 12 20:14:02 2002 +0000

    top level:
    
            * Tests/WebFoundation-Misc/ifnsurlextensions-test.m: (TestURLCommon):
    	Add tests for the new WebNSURLExtras methods.
    
            * Tests/libiftest/IFCheckLeaks.c: (IFCheckLeaksAtExit): Remove workaround for
    	CFPreferences race condition; it's now in WebFoundation.
    
    JavaScriptCore:
    
    	Speed improvements. 19% faster on cvs-js-performance, 1% on cvs-static-urls.
    
    	Use global string objects for length and other common property names rather
    	than constantly making and destroying them. Use integer versions of get() and
    	other related calls rather than always making a string.
    
    	Also get rid of many unneeded constructors, destructors, copy constructors, and
    	assignment operators. And make some functions non-virtual.
    
            * kjs/internal.h:
            * kjs/internal.cpp:
            (NumberImp::toUInt32): Implement.
            (ReferenceImp::ReferenceImp): Special case for numeric property names.
            (ReferenceImp::getPropertyName): Moved guts here from ValueImp. Handle numeric case.
            (ReferenceImp::getValue): Moved guts here from ValueImp. Handle numeric case.
            (ReferenceImp::putValue): Moved guts here from ValueImp. Handle numeric case.
            (ReferenceImp::deleteValue): Added. Handle numeric case.
    
            * kjs/array_object.h:
            * kjs/array_object.cpp: All-new array implementation that stores the elements
    	in a C++ array rather than in a property map.
            (ArrayInstanceImp::ArrayInstanceImp): Allocate the C++ array.
            (ArrayInstanceImp::~ArrayInstanceImp): Delete the C++ array.
            (ArrayInstanceImp::get): Implement both the old version and the new overload that
    	takes an unsigned index for speed.
            (ArrayInstanceImp::put): Implement both the old version and the new overload that
    	takes an unsigned index for speed.
            (ArrayInstanceImp::hasProperty): Implement both the old version and the new overload that
    	takes an unsigned index for speed.
            (ArrayInstanceImp::deleteProperty): Implement both the old version and the new overload that
    	takes an unsigned index for speed.
            (ArrayInstanceImp::setLength): Added. Used by the above to resize the array.
            (ArrayInstanceImp::mark): Mark the elements of the array too.
            (ArrayPrototypeImp::ArrayPrototypeImp): Pass the length to the array instance constructor.
    
            * kjs/bool_object.cpp:
            * kjs/date_object.cpp:
            * kjs/error_object.cpp:
            * kjs/function.cpp:
            * kjs/function_object.cpp:
            * kjs/math_object.cpp:
            * kjs/nodes.cpp:
            * kjs/nodes.h:
            * kjs/number_object.cpp:
            * kjs/object_object.cpp:
            * kjs/regexp_object.cpp:
            * kjs/string_object.cpp:
    
            * kjs/nodes2string.cpp: (SourceStream::operator<<): Add a special case for char now that
    	you can't create a UString from a char implicitly.
    
            * kjs/object.h:
            * kjs/object.cpp:
            (ObjectImp::get): Call through to the string version if the numeric version is not implemented.
            (ObjectImp::put): Call through to the string version if the numeric version is not implemented.
            (ObjectImp::hasProperty): Call through to the string version if the numeric version is not implemented.
            (ObjectImp::deleteProperty): Call through to the string version if the numeric version is not implemented.
    
            * kjs/types.h:
            * kjs/types.cpp:
            (Reference::Reference): Added constructors for the numeric property name case.
    
            * kjs/ustring.h: Made the constructor that turns a character into a string be explicit so we
    	don't get numbers that turn themselves into strings.
            * kjs/ustring.cpp:
            (UString::UString): Detect the empty string case, and use a shared empty string.
            (UString::find): Add an overload for single character finds.
            (UString::rfind): Add an overload for single character finds.
            (KJS::operator==): Fix bug where it would call strlen(0) if the first string was not null.
    	Also handle non-ASCII characters consistently with the rest of the code by casting to unsigned char
    	just in case.
    
            * kjs/value.h: Make ValueImp and all subclasses non-copyable and non-assignable.
            * kjs/value.cpp:
            (ValueImp::toUInt32): New interface, mainly useful so we can detect array indices and not turn
    	them into strings and back.
            (ValueImp::toInteger): Use the new toUInt32. Probably can use more improvement.
            (ValueImp::toInt32): Use the new toUInt32. Probably can use more improvement.
            (ValueImp::toUInt16): Use the new toUInt32. Probably can use more improvement.
            (ValueImp::getBase): Remove handling of the Reference case. That's in ReferenceImp now.
            (ValueImp::getPropertyName): Remove handling of the Reference case. That's in ReferenceImp now.
            (ValueImp::getValue): Remove handling of the Reference case. That's in ReferenceImp now.
            (ValueImp::putValue): Remove handling of the Reference case. That's in ReferenceImp now.
            (ValueImp::deleteValue): Added. Used so we can do delete the same way we do put.
    
    WebFoundation:
    
            * CacheLoader.subproj/WebHTTPResourceLoader.m:
            (-[WebHTTPProtocolHandler createWFLoadRequest]): Fix handling of paths with queries
    	and some other subtle path and port number handling issues by using _web_hostWithPort
    	and _web_pathWithQuery.
    
            * Misc.subproj/WebNSURLExtras.h:
            * Misc.subproj/WebNSURLExtras.m:
            (-[NSURL _web_hostWithPort]): Added.
            (-[NSURL _web_pathWithQuery]): Added.
    
            * CacheLoader.subproj/WebResourceLoad.m:
            (initLoader): Get some random preference before creating threads. This makes it impossible
    	to run into the CFPreferences race condition.
    
    WebCore:
    
            * force-clean-timestamp: Need a full build because of KJS changes.
            * khtml/ecma/kjs_window.h: Need to store an Object, not an ObjectImp, because there's no way
    	to copy an ObjectImp. KJS changes caught this mistake.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@1799 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog
index 481cf27..8f69ec1 100644
--- a/JavaScriptCore/ChangeLog
+++ b/JavaScriptCore/ChangeLog
@@ -1,3 +1,90 @@
+2002-08-12  Darin Adler  <darin at apple.com>
+
+	Speed improvements. 19% faster on cvs-js-performance, 1% on cvs-static-urls.
+
+	Use global string objects for length and other common property names rather
+	than constantly making and destroying them. Use integer versions of get() and
+	other related calls rather than always making a string.
+
+	Also get rid of many unneeded constructors, destructors, copy constructors, and
+	assignment operators. And make some functions non-virtual.
+
+        * kjs/internal.h:
+        * kjs/internal.cpp:
+        (NumberImp::toUInt32): Implement.
+        (ReferenceImp::ReferenceImp): Special case for numeric property names.
+        (ReferenceImp::getPropertyName): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::getValue): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::putValue): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::deleteValue): Added. Handle numeric case.
+
+        * kjs/array_object.h:
+        * kjs/array_object.cpp: All-new array implementation that stores the elements
+	in a C++ array rather than in a property map.
+        (ArrayInstanceImp::ArrayInstanceImp): Allocate the C++ array.
+        (ArrayInstanceImp::~ArrayInstanceImp): Delete the C++ array.
+        (ArrayInstanceImp::get): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::put): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::hasProperty): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::deleteProperty): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::setLength): Added. Used by the above to resize the array.
+        (ArrayInstanceImp::mark): Mark the elements of the array too.
+        (ArrayPrototypeImp::ArrayPrototypeImp): Pass the length to the array instance constructor.
+
+        * kjs/bool_object.cpp:
+        * kjs/date_object.cpp:
+        * kjs/error_object.cpp:
+        * kjs/function.cpp:
+        * kjs/function_object.cpp:
+        * kjs/math_object.cpp:
+        * kjs/nodes.cpp:
+        * kjs/nodes.h:
+        * kjs/number_object.cpp:
+        * kjs/object_object.cpp:
+        * kjs/regexp_object.cpp:
+        * kjs/string_object.cpp:
+
+        * kjs/nodes2string.cpp: (SourceStream::operator<<): Add a special case for char now that
+	you can't create a UString from a char implicitly.
+
+        * kjs/object.h:
+        * kjs/object.cpp:
+        (ObjectImp::get): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::put): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::hasProperty): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::deleteProperty): Call through to the string version if the numeric version is not implemented.
+
+        * kjs/types.h:
+        * kjs/types.cpp:
+        (Reference::Reference): Added constructors for the numeric property name case.
+
+        * kjs/ustring.h: Made the constructor that turns a character into a string be explicit so we
+	don't get numbers that turn themselves into strings.
+        * kjs/ustring.cpp:
+        (UString::UString): Detect the empty string case, and use a shared empty string.
+        (UString::find): Add an overload for single character finds.
+        (UString::rfind): Add an overload for single character finds.
+        (KJS::operator==): Fix bug where it would call strlen(0) if the first string was not null.
+	Also handle non-ASCII characters consistently with the rest of the code by casting to unsigned char
+	just in case.
+
+        * kjs/value.h: Make ValueImp and all subclasses non-copyable and non-assignable.
+        * kjs/value.cpp:
+        (ValueImp::toUInt32): New interface, mainly useful so we can detect array indices and not turn
+	them into strings and back.
+        (ValueImp::toInteger): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::toInt32): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::toUInt16): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::getBase): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::getPropertyName): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::getValue): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::putValue): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::deleteValue): Added. Used so we can do delete the same way we do put.
+
 === Alexander-17 ===
 
 2002-08-09  Darin Adler  <darin at apple.com>
diff --git a/JavaScriptCore/ChangeLog-2002-12-03 b/JavaScriptCore/ChangeLog-2002-12-03
index 481cf27..8f69ec1 100644
--- a/JavaScriptCore/ChangeLog-2002-12-03
+++ b/JavaScriptCore/ChangeLog-2002-12-03
@@ -1,3 +1,90 @@
+2002-08-12  Darin Adler  <darin at apple.com>
+
+	Speed improvements. 19% faster on cvs-js-performance, 1% on cvs-static-urls.
+
+	Use global string objects for length and other common property names rather
+	than constantly making and destroying them. Use integer versions of get() and
+	other related calls rather than always making a string.
+
+	Also get rid of many unneeded constructors, destructors, copy constructors, and
+	assignment operators. And make some functions non-virtual.
+
+        * kjs/internal.h:
+        * kjs/internal.cpp:
+        (NumberImp::toUInt32): Implement.
+        (ReferenceImp::ReferenceImp): Special case for numeric property names.
+        (ReferenceImp::getPropertyName): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::getValue): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::putValue): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::deleteValue): Added. Handle numeric case.
+
+        * kjs/array_object.h:
+        * kjs/array_object.cpp: All-new array implementation that stores the elements
+	in a C++ array rather than in a property map.
+        (ArrayInstanceImp::ArrayInstanceImp): Allocate the C++ array.
+        (ArrayInstanceImp::~ArrayInstanceImp): Delete the C++ array.
+        (ArrayInstanceImp::get): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::put): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::hasProperty): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::deleteProperty): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::setLength): Added. Used by the above to resize the array.
+        (ArrayInstanceImp::mark): Mark the elements of the array too.
+        (ArrayPrototypeImp::ArrayPrototypeImp): Pass the length to the array instance constructor.
+
+        * kjs/bool_object.cpp:
+        * kjs/date_object.cpp:
+        * kjs/error_object.cpp:
+        * kjs/function.cpp:
+        * kjs/function_object.cpp:
+        * kjs/math_object.cpp:
+        * kjs/nodes.cpp:
+        * kjs/nodes.h:
+        * kjs/number_object.cpp:
+        * kjs/object_object.cpp:
+        * kjs/regexp_object.cpp:
+        * kjs/string_object.cpp:
+
+        * kjs/nodes2string.cpp: (SourceStream::operator<<): Add a special case for char now that
+	you can't create a UString from a char implicitly.
+
+        * kjs/object.h:
+        * kjs/object.cpp:
+        (ObjectImp::get): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::put): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::hasProperty): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::deleteProperty): Call through to the string version if the numeric version is not implemented.
+
+        * kjs/types.h:
+        * kjs/types.cpp:
+        (Reference::Reference): Added constructors for the numeric property name case.
+
+        * kjs/ustring.h: Made the constructor that turns a character into a string be explicit so we
+	don't get numbers that turn themselves into strings.
+        * kjs/ustring.cpp:
+        (UString::UString): Detect the empty string case, and use a shared empty string.
+        (UString::find): Add an overload for single character finds.
+        (UString::rfind): Add an overload for single character finds.
+        (KJS::operator==): Fix bug where it would call strlen(0) if the first string was not null.
+	Also handle non-ASCII characters consistently with the rest of the code by casting to unsigned char
+	just in case.
+
+        * kjs/value.h: Make ValueImp and all subclasses non-copyable and non-assignable.
+        * kjs/value.cpp:
+        (ValueImp::toUInt32): New interface, mainly useful so we can detect array indices and not turn
+	them into strings and back.
+        (ValueImp::toInteger): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::toInt32): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::toUInt16): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::getBase): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::getPropertyName): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::getValue): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::putValue): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::deleteValue): Added. Used so we can do delete the same way we do put.
+
 === Alexander-17 ===
 
 2002-08-09  Darin Adler  <darin at apple.com>
diff --git a/JavaScriptCore/ChangeLog-2003-10-25 b/JavaScriptCore/ChangeLog-2003-10-25
index 481cf27..8f69ec1 100644
--- a/JavaScriptCore/ChangeLog-2003-10-25
+++ b/JavaScriptCore/ChangeLog-2003-10-25
@@ -1,3 +1,90 @@
+2002-08-12  Darin Adler  <darin at apple.com>
+
+	Speed improvements. 19% faster on cvs-js-performance, 1% on cvs-static-urls.
+
+	Use global string objects for length and other common property names rather
+	than constantly making and destroying them. Use integer versions of get() and
+	other related calls rather than always making a string.
+
+	Also get rid of many unneeded constructors, destructors, copy constructors, and
+	assignment operators. And make some functions non-virtual.
+
+        * kjs/internal.h:
+        * kjs/internal.cpp:
+        (NumberImp::toUInt32): Implement.
+        (ReferenceImp::ReferenceImp): Special case for numeric property names.
+        (ReferenceImp::getPropertyName): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::getValue): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::putValue): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::deleteValue): Added. Handle numeric case.
+
+        * kjs/array_object.h:
+        * kjs/array_object.cpp: All-new array implementation that stores the elements
+	in a C++ array rather than in a property map.
+        (ArrayInstanceImp::ArrayInstanceImp): Allocate the C++ array.
+        (ArrayInstanceImp::~ArrayInstanceImp): Delete the C++ array.
+        (ArrayInstanceImp::get): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::put): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::hasProperty): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::deleteProperty): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::setLength): Added. Used by the above to resize the array.
+        (ArrayInstanceImp::mark): Mark the elements of the array too.
+        (ArrayPrototypeImp::ArrayPrototypeImp): Pass the length to the array instance constructor.
+
+        * kjs/bool_object.cpp:
+        * kjs/date_object.cpp:
+        * kjs/error_object.cpp:
+        * kjs/function.cpp:
+        * kjs/function_object.cpp:
+        * kjs/math_object.cpp:
+        * kjs/nodes.cpp:
+        * kjs/nodes.h:
+        * kjs/number_object.cpp:
+        * kjs/object_object.cpp:
+        * kjs/regexp_object.cpp:
+        * kjs/string_object.cpp:
+
+        * kjs/nodes2string.cpp: (SourceStream::operator<<): Add a special case for char now that
+	you can't create a UString from a char implicitly.
+
+        * kjs/object.h:
+        * kjs/object.cpp:
+        (ObjectImp::get): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::put): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::hasProperty): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::deleteProperty): Call through to the string version if the numeric version is not implemented.
+
+        * kjs/types.h:
+        * kjs/types.cpp:
+        (Reference::Reference): Added constructors for the numeric property name case.
+
+        * kjs/ustring.h: Made the constructor that turns a character into a string be explicit so we
+	don't get numbers that turn themselves into strings.
+        * kjs/ustring.cpp:
+        (UString::UString): Detect the empty string case, and use a shared empty string.
+        (UString::find): Add an overload for single character finds.
+        (UString::rfind): Add an overload for single character finds.
+        (KJS::operator==): Fix bug where it would call strlen(0) if the first string was not null.
+	Also handle non-ASCII characters consistently with the rest of the code by casting to unsigned char
+	just in case.
+
+        * kjs/value.h: Make ValueImp and all subclasses non-copyable and non-assignable.
+        * kjs/value.cpp:
+        (ValueImp::toUInt32): New interface, mainly useful so we can detect array indices and not turn
+	them into strings and back.
+        (ValueImp::toInteger): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::toInt32): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::toUInt16): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::getBase): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::getPropertyName): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::getValue): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::putValue): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::deleteValue): Added. Used so we can do delete the same way we do put.
+
 === Alexander-17 ===
 
 2002-08-09  Darin Adler  <darin at apple.com>
diff --git a/JavaScriptCore/kjs/array_object.cpp b/JavaScriptCore/kjs/array_object.cpp
index 00e27f9..9c549a1 100644
--- a/JavaScriptCore/kjs/array_object.cpp
+++ b/JavaScriptCore/kjs/array_object.cpp
@@ -39,64 +39,157 @@ using namespace KJS;
 
 const ClassInfo ArrayInstanceImp::info = {"Array", 0, 0, 0};
 
-ArrayInstanceImp::ArrayInstanceImp(const Object &proto)
+ArrayInstanceImp::ArrayInstanceImp(const Object &proto, unsigned initialLength)
   : ObjectImp(proto)
+  , length(initialLength)
+  , capacity(length)
+  , storage(length ? new Undefined[length] : 0)
 {
 }
 
+ArrayInstanceImp::ArrayInstanceImp(const Object &proto, const List &list)
+  : ObjectImp(proto)
+  , length(list.size())
+  , capacity(length)
+  , storage(length ? new Undefined[length] : 0)
+{
+  ListIterator it = list.begin();
+  const unsigned l = length;
+  for (unsigned i = 0; i < l; ++i) {
+    storage[i] = it++;
+  }
+}
+
+ArrayInstanceImp::~ArrayInstanceImp()
+{
+  delete [] storage;
+}
+
+Value ArrayInstanceImp::get(ExecState *exec, const UString &propertyName) const
+{
+  if (propertyName == lengthPropertyName)
+    return Number(length);
+
+  bool ok;
+  unsigned index = propertyName.toULong(&ok);
+  if (ok) {
+    if (index >= length)
+      return Undefined();
+    return storage[index];
+  }
+
+  return ObjectImp::get(exec, propertyName);
+}
+
+Value ArrayInstanceImp::get(ExecState *exec, unsigned index) const
+{
+  if (index >= length)
+    return Undefined();
+  return storage[index];
+}
+
 // Special implementation of [[Put]] - see ECMA 15.4.5.1
 void ArrayInstanceImp::put(ExecState *exec, const UString &propertyName, const Value &value, int attr)
 {
-  if ((attr == None || attr == DontDelete) && !canPut(exec,propertyName))
+  if (propertyName == lengthPropertyName) {
+    setLength(value.toUInt32(exec));
     return;
+  }
+  
+  bool ok;
+  unsigned index = propertyName.toULong(&ok);
+  if (ok) {
+    setLength(index + 1);
+    storage[index] = value;
+    return;
+  }
+  
+  ObjectImp::put(exec, propertyName, value, attr);
+}
 
-  if (hasProperty(exec,propertyName)) {
-    if (propertyName == "length") {
-      Value len = get(exec,"length");
-      unsigned int oldLen = len.toUInt32(exec);
-      unsigned int newLen = value.toUInt32(exec);
-      // shrink array
-      for (unsigned int u = newLen; u < oldLen; u++) {
-	UString p = UString::from(u);
-	if (hasOwnProperty(exec, p))
-	  deleteProperty(exec, p);
-      }
-      ObjectImp::put(exec, "length", Number(newLen), DontEnum | DontDelete);
-      return;
-    }
-    //    put(p, v);
-  } //  } else
-    ObjectImp::put(exec, propertyName, value, attr);
+void ArrayInstanceImp::put(ExecState *exec, unsigned index, const Value &value, int attr)
+{
+  setLength(index + 1);
+  storage[index] = value;
+}
 
-  // array index ?
-  unsigned int idx;
-  if (!sscanf(propertyName.cstring().c_str(), "%u", &idx)) /* TODO */
-    return;
+bool ArrayInstanceImp::hasProperty(ExecState *exec, const UString &propertyName) const
+{
+  if (propertyName == lengthPropertyName)
+    return true;
+  
+  bool ok;
+  unsigned index = propertyName.toULong(&ok);
+  if (ok) {
+    if (index >= length)
+      return false;
+    return !storage[index].isA(UndefinedType);
+  }
+  
+  return ObjectImp::hasProperty(exec, propertyName);
+}
 
-  // do we need to update/create the length property ?
-  if (hasOwnProperty(exec, "length")) {
-    Value len = get(exec, "length");
-    if (idx < len.toUInt32(exec))
-      return;
+bool ArrayInstanceImp::hasProperty(ExecState *exec, unsigned index) const
+{
+  if (index >= length)
+    return false;
+  return !storage[index].isA(UndefinedType);
+}
+
+bool ArrayInstanceImp::deleteProperty(ExecState *exec, const UString &propertyName)
+{
+  if (propertyName == lengthPropertyName)
+    return false;
+  
+  bool ok;
+  unsigned index = propertyName.toULong(&ok);
+  if (ok) {
+    if (index >= length)
+      return true;
+    storage[index] = Undefined();
+    return true;
   }
+  
+  return ObjectImp::deleteProperty(exec, propertyName);
+}
 
-  ObjectImp::put(exec, "length", Number(idx+1), DontDelete | DontEnum);
+bool ArrayInstanceImp::deleteProperty(ExecState *exec, unsigned index)
+{
+  if (index >= length)
+    return true;
+  storage[index] = Undefined();
+  return true;
 }
 
-void ArrayInstanceImp::putDirect(ExecState *exec, const UString &propertyName, const Value &value, int attr)
+void ArrayInstanceImp::setLength(unsigned newLength)
 {
-  ObjectImp::put(exec,propertyName,value,attr);
+  if (newLength < length) {
+    const unsigned l = length;
+    for (unsigned i = newLength; i < l; ++i)
+      storage[i] = Undefined();
+  }
+  if (newLength > capacity) {
+    unsigned newCapacity = (newLength * 3 + 1) / 2;
+    Value *newStorage = new Undefined [newCapacity];
+    const unsigned l = length;
+    for (unsigned i = 0; i < l; ++i)
+      newStorage[i] = storage[i];
+    delete [] storage;
+    storage = newStorage;
+    capacity = newCapacity;
+  }
+  length = newLength;
 }
 
-bool ArrayInstanceImp::hasOwnProperty(ExecState *exec,
-                                      const UString &propertyName)
+void ArrayInstanceImp::mark()
 {
-  // disable this object's prototype temporarily for the hasProperty() call
-  Value protoBackup = prototype();
-  setPrototype(Undefined());
-  bool b = hasProperty(exec, propertyName);
-  setPrototype(protoBackup);
-  return b;
+  ObjectImp::mark();
+  const unsigned l = length;
+  for (unsigned i = 0; i < l; ++i) {
+    ValueImp *imp = storage[i].imp();
+    if (!imp->marked())
+      imp->mark();
+  }
 }
 
 // ------------------------------ ArrayPrototypeImp ----------------------------
@@ -123,13 +216,10 @@ const ClassInfo ArrayPrototypeImp::info = {"Array", &ArrayInstanceImp::info, &ar
 // ECMA 15.4.4
 ArrayPrototypeImp::ArrayPrototypeImp(ExecState *exec,
                                      ObjectPrototypeImp *objProto)
-  : ArrayInstanceImp(Object(objProto))
+  : ArrayInstanceImp(Object(objProto), 0)
 {
   Value protect(this);
   setInternalValue(Null());
-
-  // The constructor will be added later, by InterpreterImp, once ArrayObjectImp has been constructed.
-  put(exec,"length", Number(0), DontEnum | DontDelete);
 }
 
 Value ArrayPrototypeImp::get(ExecState *exec, const UString &propertyName) const
@@ -146,7 +236,7 @@ ArrayProtoFuncImp::ArrayProtoFuncImp(ExecState *exec, int i, int len)
     ), id(i)
 {
   Value protect(this);
-  put(exec,"length",Number(len),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
 }
 
 bool ArrayProtoFuncImp::implementsCall() const
@@ -157,7 +247,7 @@ bool ArrayProtoFuncImp::implementsCall() const
 // ECMA 15.4.4
 Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args)
 {
-  unsigned int length = thisObj.get(exec,"length").toUInt32(exec);
+  unsigned int length = thisObj.get(exec,lengthPropertyName).toUInt32(exec);
 
   Value result;
   switch (id) {
@@ -183,7 +273,7 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
     for (unsigned int k = 0; k < length; k++) {
       if (k >= 1)
         str += separator;
-      Value element = thisObj.get(exec,UString::from(k));
+      Value element = thisObj.get(exec,k);
       if (element.type() != UndefinedType && element.type() != NullType)
         str += element.toString(exec);
     }
@@ -201,16 +291,15 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
           curObj.inherits(&ArrayInstanceImp::info)) {
         unsigned int k = 0;
         if (n > 0)
-          length = curObj.get(exec,"length").toUInt32(exec);
+          length = curObj.get(exec,lengthPropertyName).toUInt32(exec);
         while (k < length) {
-          UString p = UString::from(k);
-          if (curObj.hasProperty(exec,p))
-            arr.put(exec,UString::from(n), curObj.get(exec,p));
+          if (curObj.hasProperty(exec,k))
+            arr.put(exec, n, curObj.get(exec, k));
           n++;
           k++;
         }
       } else {
-        arr.put(exec,UString::from(n), curArg);
+        arr.put(exec, n, curArg);
         n++;
       }
       if (it == args.end())
@@ -218,29 +307,26 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
       curArg = *it;
       curObj = Object::dynamicCast(it++); // may be 0
     }
-    arr.put(exec,"length", Number(n), DontEnum | DontDelete);
+    arr.put(exec,lengthPropertyName, Number(n), DontEnum | DontDelete);
 
     result = arr;
     break;
   }
   case Pop:{
-
     if (length == 0) {
-      thisObj.put(exec, "length", Number(length), DontEnum | DontDelete);
+      thisObj.put(exec, lengthPropertyName, Number(length), DontEnum | DontDelete);
       result = Undefined();
     } else {
-      UString str = UString::from(length - 1);
-      result = thisObj.get(exec,str);
-      thisObj.deleteProperty(exec, str);
-      thisObj.put(exec, "length", Number(length - 1), DontEnum | DontDelete);
+      result = thisObj.get(exec, length - 1);
+      thisObj.put(exec, lengthPropertyName, Number(length - 1), DontEnum | DontDelete);
     }
     break;
   }
   case Push: {
     for (int n = 0; n < args.size(); n++)
-      thisObj.put(exec,UString::from(length + n), args[n]);
+      thisObj.put(exec, length + n, args[n]);
     length += args.size();
-    thisObj.put(exec,"length", Number(length), DontEnum | DontDelete);
+    thisObj.put(exec,lengthPropertyName, Number(length), DontEnum | DontDelete);
     result = Number(length);
     break;
   }
@@ -249,26 +335,25 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
     unsigned int middle = length / 2;
 
     for (unsigned int k = 0; k < middle; k++) {
-      UString str = UString::from(k);
-      UString str2 = UString::from(length - k - 1);
-      Value obj = thisObj.get(exec,str);
-      Value obj2 = thisObj.get(exec,str2);
-      if (thisObj.hasProperty(exec,str2)) {
-        if (thisObj.hasProperty(exec,str)) {
-          thisObj.put(exec, str, obj2);
-          thisObj.put(exec, str2, obj);
+      unsigned lk1 = length - k - 1;
+      Value obj = thisObj.get(exec,k);
+      Value obj2 = thisObj.get(exec,lk1);
+      if (thisObj.hasProperty(exec,lk1)) {
+        if (thisObj.hasProperty(exec,k)) {
+          thisObj.put(exec, k, obj2);
+          thisObj.put(exec, lk1, obj);
         } else {
-          thisObj.put(exec, str, obj2);
-          thisObj.deleteProperty(exec, str2);
+          thisObj.put(exec, k, obj2);
+          thisObj.deleteProperty(exec, lk1);
         }
       } else {
-        if (thisObj.hasProperty(exec, str)) {
-          thisObj.deleteProperty(exec, str);
-          thisObj.put(exec, str2, obj);
+        if (thisObj.hasProperty(exec, k)) {
+          thisObj.deleteProperty(exec, k);
+          thisObj.put(exec, lk1, obj);
         } else {
           // why delete something that's not there ? Strange.
-          thisObj.deleteProperty(exec, str);
-          thisObj.deleteProperty(exec, str2);
+          thisObj.deleteProperty(exec, k);
+          thisObj.deleteProperty(exec, lk1);
         }
       }
     }
@@ -277,21 +362,19 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
   }
   case Shift: {
     if (length == 0) {
-      thisObj.put(exec, "length", Number(length), DontEnum | DontDelete);
+      thisObj.put(exec, lengthPropertyName, Number(length), DontEnum | DontDelete);
       result = Undefined();
     } else {
-      result = thisObj.get(exec, "0");
+      result = thisObj.get(exec, 0);
       for(unsigned int k = 1; k < length; k++) {
-        UString str = UString::from(k);
-        UString str2 = UString::from(k-1);
-        if (thisObj.hasProperty(exec, str)) {
-          Value obj = thisObj.get(exec, str);
-          thisObj.put(exec, str2, obj);
+        if (thisObj.hasProperty(exec, k)) {
+          Value obj = thisObj.get(exec, k);
+          thisObj.put(exec, k-1, obj);
         } else
-          thisObj.deleteProperty(exec, str2);
+          thisObj.deleteProperty(exec, k-1);
       }
-      thisObj.deleteProperty(exec, UString::from(length - 1));
-      thisObj.put(exec, "length", Number(length - 1), DontEnum | DontDelete);
+      thisObj.deleteProperty(exec, length - 1);
+      thisObj.put(exec, lengthPropertyName, Number(length - 1), DontEnum | DontDelete);
     }
     break;
   }
@@ -318,21 +401,19 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
 
     //printf( "Slicing from %d to %d \n", begin, end );
     for(unsigned int k = 0; k < (unsigned int) end-begin; k++) {
-      UString str = UString::from(k+begin);
-      if (thisObj.hasProperty(exec,str)) {
-        UString str2 = UString::from(k);
-        Value obj = thisObj.get(exec, str);
-        resObj.put(exec, str2, obj);
+      if (thisObj.hasProperty(exec,k+begin)) {
+        Value obj = thisObj.get(exec, k+begin);
+        resObj.put(exec, k, obj);
       }
     }
-    resObj.put(exec, "length", Number(end - begin), DontEnum | DontDelete);
+    resObj.put(exec, lengthPropertyName, Number(end - begin), DontEnum | DontDelete);
     break;
   }
   case Sort:{
 #if 0
     printf("KJS Array::Sort length=%d\n", length);
     for ( unsigned int i = 0 ; i<length ; ++i )
-      printf("KJS Array::Sort: %d: %s\n", i, thisObj.get(UString::from(i)).toString().value().ascii() );
+      printf("KJS Array::Sort: %d: %s\n", i, thisObj.get(i).toString().value().ascii() );
 #endif
     Object sortFunction;
     bool useSortFunction = (args[0].type() != UndefinedType);
@@ -344,7 +425,7 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
       }
 
     if (length == 0) {
-      thisObj.put(exec, "length", Number(0), DontEnum | DontDelete);
+      thisObj.put(exec, lengthPropertyName, Number(0), DontEnum | DontDelete);
       result = Undefined();
       break;
     }
@@ -353,12 +434,12 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
     // or quicksort, and much less swapping than bubblesort/insertionsort.
     for ( unsigned int i = 0 ; i<length-1 ; ++i )
       {
-        Value iObj = thisObj.get(exec,UString::from(i));
+        Value iObj = thisObj.get(exec,i);
         unsigned int themin = i;
         Value minObj = iObj;
         for ( unsigned int j = i+1 ; j<length ; ++j )
           {
-            Value jObj = thisObj.get(exec,UString::from(j));
+            Value jObj = thisObj.get(exec,j);
             int cmp;
             if (jObj.type() == UndefinedType) {
               cmp = 1;
@@ -383,14 +464,14 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
         if ( themin > i )
           {
             //printf("KJS Array::Sort: swapping %d and %d\n", i, themin );
-            thisObj.put( exec, UString::from(i), minObj );
-            thisObj.put( exec, UString::from(themin), iObj );
+            thisObj.put( exec, i, minObj );
+            thisObj.put( exec, themin, iObj );
           }
       }
 #if 0
     printf("KJS Array::Sort -- Resulting array:\n");
     for ( unsigned int i = 0 ; i<length ; ++i )
-      printf("KJS Array::Sort: %d: %s\n", i, thisObj.get(UString::from(i)).toString().value().ascii() );
+      printf("KJS Array::Sort: %d: %s\n", i, thisObj.get(i).toString().value().ascii() );
 #endif
     result = thisObj;
     break;
@@ -408,14 +489,12 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
 
     //printf( "Splicing from %d, deleteCount=%d \n", begin, deleteCount );
     for(unsigned int k = 0; k < deleteCount; k++) {
-      UString str = UString::from(k+begin);
-      if (thisObj.hasProperty(exec,str)) {
-        UString str2 = UString::from(k);
-        Value obj = thisObj.get(exec, str);
-        resObj.put(exec, str2, obj);
+      if (thisObj.hasProperty(exec,k+begin)) {
+        Value obj = thisObj.get(exec, k+begin);
+        resObj.put(exec, k, obj);
       }
     }
-    resObj.put(exec, "length", Number(deleteCount), DontEnum | DontDelete);
+    resObj.put(exec, lengthPropertyName, Number(deleteCount), DontEnum | DontDelete);
 
     unsigned int additionalArgs = maxInt( args.size() - 2, 0 );
     if ( additionalArgs != deleteCount )
@@ -424,57 +503,51 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
       {
         for ( unsigned int k = begin; k < length - deleteCount; ++k )
         {
-          UString str = UString::from(k+deleteCount);
-          UString str2 = UString::from(k+additionalArgs);
-          if (thisObj.hasProperty(exec,str)) {
-            Value obj = thisObj.get(exec, str);
-            thisObj.put(exec, str2, obj);
+          if (thisObj.hasProperty(exec,k+deleteCount)) {
+            Value obj = thisObj.get(exec, k+deleteCount);
+            thisObj.put(exec, k+additionalArgs, obj);
           }
           else
-            thisObj.deleteProperty(exec, str2);
+            thisObj.deleteProperty(exec, k+additionalArgs);
         }
         for ( unsigned int k = length ; k > length - deleteCount + additionalArgs; --k )
-          thisObj.deleteProperty(exec, UString::from(k-1));
+          thisObj.deleteProperty(exec, k-1);
       }
       else
       {
         for ( unsigned int k = length - deleteCount; (int)k > begin; --k )
         {
-          UString str = UString::from(k+deleteCount-1);
-          UString str2 = UString::from(k+additionalArgs-1);
-          if (thisObj.hasProperty(exec,str)) {
-            Value obj = thisObj.get(exec, str);
-            thisObj.put(exec, str2, obj);
+          if (thisObj.hasProperty(exec,k+deleteCount-1)) {
+            Value obj = thisObj.get(exec, k+deleteCount-1);
+            thisObj.put(exec, k+additionalArgs-1, obj);
           }
           else
-            thisObj.deleteProperty(exec, str2);
+            thisObj.deleteProperty(exec, k+additionalArgs-1);
         }
       }
     }
     for ( unsigned int k = 0; k < additionalArgs; ++k )
     {
-      thisObj.put(exec, UString::from(k+begin), args[k+2]);
+      thisObj.put(exec, k+begin, args[k+2]);
     }
-    thisObj.put(exec, "length", Number(length - deleteCount + additionalArgs), DontEnum | DontDelete);
+    thisObj.put(exec, lengthPropertyName, Number(length - deleteCount + additionalArgs), DontEnum | DontDelete);
     break;
   }
   case UnShift: { // 15.4.4.13
     unsigned int nrArgs = args.size();
     for ( unsigned int k = length; k > 0; --k )
     {
-      UString str = UString::from(k-1);
-      UString str2 = UString::from(k+nrArgs-1);
-      if (thisObj.hasProperty(exec,str)) {
-        Value obj = thisObj.get(exec, str);
-        thisObj.put(exec, str2, obj);
+      if (thisObj.hasProperty(exec,k-1)) {
+        Value obj = thisObj.get(exec, k-1);
+        thisObj.put(exec, k+nrArgs-1, obj);
       } else {
-        thisObj.deleteProperty(exec, str2);
+        thisObj.deleteProperty(exec, k+nrArgs-1);
       }
     }
     for ( unsigned int k = 0; k < nrArgs; ++k )
-      thisObj.put(exec, UString::from(k), args[k]);
+      thisObj.put(exec, k, args[k]);
     result = Number(length + nrArgs);
-    thisObj.put(exec, "length", result, DontEnum | DontDelete);
+    thisObj.put(exec, lengthPropertyName, result, DontEnum | DontDelete);
     break;
   }
   default:
@@ -493,10 +566,10 @@ ArrayObjectImp::ArrayObjectImp(ExecState *exec,
 {
   Value protect(this);
   // ECMA 15.4.3.1 Array.prototype
-  put(exec,"prototype", Object(arrayProto), DontEnum|DontDelete|ReadOnly);
+  put(exec,prototypePropertyName, Object(arrayProto), DontEnum|DontDelete|ReadOnly);
 
   // no. of arguments for constructor
-  put(exec,"length", Number(1), ReadOnly|DontDelete|DontEnum);
+  put(exec,lengthPropertyName, Number(1), ReadOnly|DontDelete|DontEnum);
 }
 
 bool ArrayObjectImp::implementsConstruct() const
@@ -507,25 +580,12 @@ bool ArrayObjectImp::implementsConstruct() const
 // ECMA 15.4.2
 Object ArrayObjectImp::construct(ExecState *exec, const List &args)
 {
-  Object result(new ArrayInstanceImp(exec->interpreter()->builtinArrayPrototype()));
-
-  unsigned int len;
-  ListIterator it = args.begin();
-  // a single argument might denote the array size
-  if (args.size() == 1 && it->type() == NumberType)
-    len = it->toUInt32(exec);
-  else {
-    // initialize array
-    len = args.size();
-    for (unsigned int u = 0; it != args.end(); it++, u++)
-      result.put(exec, UString::from(u), *it);
-  }
+  // a single numeric argument denotes the array size (!)
+  if (args.size() == 1 && args[0].type() == NumberType)
+    return Object(new ArrayInstanceImp(exec->interpreter()->builtinArrayPrototype(), args[0].toUInt32(exec)));
 
-  // array size
-  result.put(exec, "length", Number(len), DontEnum | DontDelete);
-  static_cast<ArrayInstanceImp*>(result.imp())->putDirect(exec, "length", Number(len), DontEnum | DontDelete);
-
-  return result;
+  // otherwise the array is constructed with the arguments in it
+  return Object(new ArrayInstanceImp(exec->interpreter()->builtinArrayPrototype(), args));
 }
 
 bool ArrayObjectImp::implementsCall() const
diff --git a/JavaScriptCore/kjs/array_object.h b/JavaScriptCore/kjs/array_object.h
index ee40346..a11f5a4 100644
--- a/JavaScriptCore/kjs/array_object.h
+++ b/JavaScriptCore/kjs/array_object.h
@@ -29,18 +29,32 @@ namespace KJS {
 
   class ArrayInstanceImp : public ObjectImp {
   public:
-    ArrayInstanceImp(const Object &proto);
+    ArrayInstanceImp(const Object &proto, unsigned initialLength);
+    ArrayInstanceImp(const Object &proto, const List &initialValues);
+    ~ArrayInstanceImp();
 
+    virtual Value get(ExecState *exec, const UString &propertyName) const;
+    virtual Value get(ExecState *exec, unsigned propertyName) const;
     virtual void put(ExecState *exec, const UString &propertyName, const Value &value, int attr = None);
-    virtual void putDirect(ExecState *exec, const UString &propertyName, const Value &value, int attr = None);
-    /**
-     * A shallow hasProperty() variant that doesn't look at the prototype's
-     * properties.
-     */
-    virtual bool hasOwnProperty(ExecState *exec, const UString &propertyName);
+    virtual void put(ExecState *exec, unsigned propertyName, const Value &value, int attr = None);
+    virtual bool hasProperty(ExecState *exec, const UString &propertyName) const;
+    virtual bool hasProperty(ExecState *exec, unsigned propertyName) const;
+    virtual bool deleteProperty(ExecState *exec, const UString &propertyName);
+    virtual bool deleteProperty(ExecState *exec, unsigned propertyName);
+
+    virtual void mark();
 
     virtual const ClassInfo *classInfo() const { return &info; }
     static const ClassInfo info;
+    
+    unsigned getLength() const { return length; }
+    
+  private:
+    void setLength(unsigned newLength);
+    
+    unsigned length;
+    unsigned capacity;
+    Value *storage;
   };
 
  class ArrayPrototypeImp : public ArrayInstanceImp {
diff --git a/JavaScriptCore/kjs/bool_object.cpp b/JavaScriptCore/kjs/bool_object.cpp
index 7e10643..607aeab 100644
--- a/JavaScriptCore/kjs/bool_object.cpp
+++ b/JavaScriptCore/kjs/bool_object.cpp
@@ -52,8 +52,8 @@ BooleanPrototypeImp::BooleanPrototypeImp(ExecState *exec,
   Value protect(this);
   // The constructor will be added later by InterpreterImp::InterpreterImp()
 
-  put(exec,"toString", Object(new BooleanProtoFuncImp(exec,funcProto,BooleanProtoFuncImp::ToString,0)), DontEnum);
-  put(exec,"valueOf",  Object(new BooleanProtoFuncImp(exec,funcProto,BooleanProtoFuncImp::ValueOf,0)),  DontEnum);
+  put(exec,toStringPropertyName, Object(new BooleanProtoFuncImp(exec,funcProto,BooleanProtoFuncImp::ToString,0)), DontEnum);
+  put(exec,valueOfPropertyName,  Object(new BooleanProtoFuncImp(exec,funcProto,BooleanProtoFuncImp::ValueOf,0)),  DontEnum);
   setInternalValue(Boolean(false));
 }
 
@@ -65,7 +65,7 @@ BooleanProtoFuncImp::BooleanProtoFuncImp(ExecState *exec,
   : InternalFunctionImp(funcProto), id(i)
 {
   Value protect(this);
-  put(exec,"length",Number(len),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
 }
 
 
@@ -104,10 +104,10 @@ BooleanObjectImp::BooleanObjectImp(ExecState *exec, FunctionPrototypeImp *funcPr
   : InternalFunctionImp(funcProto)
 {
   Value protect(this);
-  put(exec,"prototype", Object(booleanProto),DontEnum|DontDelete|ReadOnly);
+  put(exec,prototypePropertyName, Object(booleanProto),DontEnum|DontDelete|ReadOnly);
 
   // no. of arguments for constructor
-  put(exec,"length", Number(1), ReadOnly|DontDelete|DontEnum);
+  put(exec,lengthPropertyName, Number(1), ReadOnly|DontDelete|DontEnum);
 }
 
 
diff --git a/JavaScriptCore/kjs/date_object.cpp b/JavaScriptCore/kjs/date_object.cpp
index 427eccb..398b5f6 100644
--- a/JavaScriptCore/kjs/date_object.cpp
+++ b/JavaScriptCore/kjs/date_object.cpp
@@ -147,7 +147,7 @@ DateProtoFuncImp::DateProtoFuncImp(ExecState *exec, int i, int len)
   // We use a negative ID to denote the "UTC" variant.
 {
   Value protect(this);
-  put(exec,"length",Number(len),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
 }
 
 bool DateProtoFuncImp::implementsCall() const
@@ -321,13 +321,13 @@ DateObjectImp::DateObjectImp(ExecState *exec,
 {
   Value protect(this);
   // ECMA 15.9.4.1 Date.prototype
-  put(exec,"prototype", Object(dateProto), DontEnum|DontDelete|ReadOnly);
+  put(exec,prototypePropertyName, Object(dateProto), DontEnum|DontDelete|ReadOnly);
 
   put(exec,"parse", Object(new DateObjectFuncImp(exec,funcProto,DateObjectFuncImp::Parse, 1)), DontEnum);
   put(exec,"UTC",   Object(new DateObjectFuncImp(exec,funcProto,DateObjectFuncImp::UTC,   7)),   DontEnum);
 
   // no. of arguments for constructor
-  put(exec,"length", Number(7), ReadOnly|DontDelete|DontEnum);
+  put(exec,lengthPropertyName, Number(7), ReadOnly|DontDelete|DontEnum);
 }
 
 bool DateObjectImp::implementsConstruct() const
@@ -416,7 +416,7 @@ DateObjectFuncImp::DateObjectFuncImp(ExecState *exec, FunctionPrototypeImp *func
   : InternalFunctionImp(funcProto), id(i)
 {
   Value protect(this);
-  put(exec,"length",Number(len),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
 }
 
 bool DateObjectFuncImp::implementsCall() const
diff --git a/JavaScriptCore/kjs/error_object.cpp b/JavaScriptCore/kjs/error_object.cpp
index 3bf338b..ad3dce6 100644
--- a/JavaScriptCore/kjs/error_object.cpp
+++ b/JavaScriptCore/kjs/error_object.cpp
@@ -43,7 +43,7 @@ ErrorPrototypeImp::ErrorPrototypeImp(ExecState *exec,
 
   put(exec, "name",     String("Error"), DontEnum);
   put(exec, "message",  String("Unknown error"), DontEnum);
-  put(exec, "toString", Object(new ErrorProtoFuncImp(exec,funcProto)), DontEnum);
+  put(exec, toStringPropertyName, Object(new ErrorProtoFuncImp(exec,funcProto)), DontEnum);
 }
 
 // ------------------------------ ErrorProtoFuncImp ----------------------------
@@ -52,7 +52,7 @@ ErrorProtoFuncImp::ErrorProtoFuncImp(ExecState *exec, FunctionPrototypeImp *func
   : InternalFunctionImp(funcProto)
 {
   Value protect(this);
-  put(exec,"length",Number(0),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(0),DontDelete|ReadOnly|DontEnum);
 }
 
 bool ErrorProtoFuncImp::implementsCall() const
@@ -86,7 +86,7 @@ ErrorObjectImp::ErrorObjectImp(ExecState *exec, FunctionPrototypeImp *funcProto,
 {
   Value protect(this);
   // ECMA 15.11.3.1 Error.prototype
-  put(exec, "prototype", Object(errorProto), DontEnum|DontDelete|ReadOnly);
+  put(exec, prototypePropertyName, Object(errorProto), DontEnum|DontDelete|ReadOnly);
   //put(exec, "name", String(n));
 }
 
@@ -143,8 +143,8 @@ NativeErrorImp::NativeErrorImp(ExecState *exec, FunctionPrototypeImp *funcProto,
   Value protect(this);
   proto = static_cast<ObjectImp*>(prot.imp());
 
-  put(exec,"length",Number(1),DontDelete|ReadOnly|DontEnum); // ECMA 15.11.7.5
-  put(exec,"prototype",prot);
+  put(exec,lengthPropertyName,Number(1),DontDelete|ReadOnly|DontEnum); // ECMA 15.11.7.5
+  put(exec,prototypePropertyName,prot);
 }
 
 bool NativeErrorImp::implementsConstruct() const
diff --git a/JavaScriptCore/kjs/function.cpp b/JavaScriptCore/kjs/function.cpp
index 03fadbb..9b5c890 100644
--- a/JavaScriptCore/kjs/function.cpp
+++ b/JavaScriptCore/kjs/function.cpp
@@ -274,7 +274,7 @@ bool DeclaredFunctionImp::implementsConstruct() const
 Object DeclaredFunctionImp::construct(ExecState *exec, const List &args)
 {
   Object proto;
-  Value p = get(exec,"prototype");
+  Value p = get(exec,prototypePropertyName);
   if (p.type() == ObjectType)
     proto = Object(static_cast<ObjectImp*>(p.imp()));
   else
@@ -314,11 +314,11 @@ ArgumentsImp::ArgumentsImp(ExecState *exec, FunctionImp *func, const List &args)
 {
   Value protect(this);
   put(exec,"callee", Object(func), DontEnum);
-  put(exec,"length", Number(args.size()), DontEnum);
+  put(exec,lengthPropertyName, Number(args.size()), DontEnum);
   if (!args.isEmpty()) {
     ListIterator arg = args.begin();
     for (int i = 0; arg != args.end(); arg++, i++) {
-      put(exec,UString::from(i), *arg, DontEnum);
+      put(exec,i, *arg, DontEnum);
     }
   }
 }
@@ -348,7 +348,7 @@ GlobalFuncImp::GlobalFuncImp(ExecState *exec, FunctionPrototypeImp *funcProto, i
   : InternalFunctionImp(funcProto), id(i)
 {
   Value protect(this);
-  put(exec,"length",Number(len),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
 }
 
 CodeType GlobalFuncImp::codeType() const
diff --git a/JavaScriptCore/kjs/function_object.cpp b/JavaScriptCore/kjs/function_object.cpp
index c0e0429..15ecf27 100644
--- a/JavaScriptCore/kjs/function_object.cpp
+++ b/JavaScriptCore/kjs/function_object.cpp
@@ -40,7 +40,7 @@ FunctionPrototypeImp::FunctionPrototypeImp(ExecState *exec)
   : InternalFunctionImp(0)
 {
   Value protect(this);
-  put(exec, "toString", Object(new FunctionProtoFuncImp(exec, this, FunctionProtoFuncImp::ToString, 0)), DontEnum);
+  put(exec, toStringPropertyName, Object(new FunctionProtoFuncImp(exec, this, FunctionProtoFuncImp::ToString, 0)), DontEnum);
   put(exec, "apply",    Object(new FunctionProtoFuncImp(exec, this, FunctionProtoFuncImp::Apply,    2)), DontEnum);
   put(exec, "call",     Object(new FunctionProtoFuncImp(exec, this, FunctionProtoFuncImp::Call,     1)), DontEnum);
 }
@@ -67,7 +67,7 @@ FunctionProtoFuncImp::FunctionProtoFuncImp(ExecState *exec,
   : InternalFunctionImp(funcProto), id(i)
 {
   Value protect(this);
-  put(exec,"length",Number(len),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
 }
 
 
@@ -129,9 +129,9 @@ Value FunctionProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &a
            Object::dynamicCast(argArray).inherits(&ArgumentsImp::info)) {
 
         Object argArrayObj = Object::dynamicCast(argArray);
-        unsigned int length = argArrayObj.get(exec,"length").toUInt32(exec);
+        unsigned int length = argArrayObj.get(exec,lengthPropertyName).toUInt32(exec);
         for (unsigned int i = 0; i < length; i++)
-          applyArgs.append(argArrayObj.get(exec,UString::from(i)));
+          applyArgs.append(argArrayObj.get(exec,i));
       }
       else {
         Object err = Error::create(exec,TypeError);
@@ -174,10 +174,10 @@ FunctionObjectImp::FunctionObjectImp(ExecState *exec, FunctionPrototypeImp *func
   : InternalFunctionImp(funcProto)
 {
   Value protect(this);
-  put(exec,"prototype", Object(funcProto), DontEnum|DontDelete|ReadOnly);
+  put(exec,prototypePropertyName, Object(funcProto), DontEnum|DontDelete|ReadOnly);
 
   // no. of arguments for constructor
-  put(exec,"length", Number(1), ReadOnly|DontDelete|DontEnum);
+  put(exec,lengthPropertyName, Number(1), ReadOnly|DontDelete|DontEnum);
 }
 
 FunctionObjectImp::~FunctionObjectImp()
@@ -275,14 +275,14 @@ Object FunctionObjectImp::construct(ExecState *exec, const List &args)
       return err;
   }
 
-  fimp->put(exec,"length", Number(params),ReadOnly|DontDelete|DontEnum);
+  fimp->put(exec,lengthPropertyName, Number(params),ReadOnly|DontDelete|DontEnum);
   List consArgs;
 
   Object objCons = exec->interpreter()->builtinObject();
   Object prototype = objCons.construct(exec,List::empty());
   prototype.put(exec, "constructor",
 		Object(fimp), DontEnum|DontDelete|ReadOnly);
-  fimp->put(exec,"prototype",prototype,DontEnum|DontDelete|ReadOnly);
+  fimp->put(exec,prototypePropertyName,prototype,DontEnum|DontDelete|ReadOnly);
   fimp->put(exec,"arguments",Null(),DontEnum|DontDelete|ReadOnly);
   return ret;
 }
diff --git a/JavaScriptCore/kjs/internal.cpp b/JavaScriptCore/kjs/internal.cpp
index 4844c24..0c74e8d 100644
--- a/JavaScriptCore/kjs/internal.cpp
+++ b/JavaScriptCore/kjs/internal.cpp
@@ -192,11 +192,6 @@ Object BooleanImp::toObject(ExecState *exec) const
 
 // ------------------------------ StringImp ------------------------------------
 
-StringImp::StringImp(const UString& v)
-  : val(v)
-{
-}
-
 Value StringImp::toPrimitive(ExecState */*exec*/, Type) const
 {
   return Value((ValueImp*)this);
@@ -220,17 +215,12 @@ UString StringImp::toString(ExecState */*exec*/) const
 Object StringImp::toObject(ExecState *exec) const
 {
   List args;
-  args.append(String(const_cast<StringImp*>(this)));
+  args.append(Value(const_cast<StringImp*>(this)));
   return Object::dynamicCast(exec->interpreter()->builtinString().construct(exec,args));
 }
 
 // ------------------------------ NumberImp ------------------------------------
 
-NumberImp::NumberImp(double v)
-  : val(v)
-{
-}
-
 Value NumberImp::toPrimitive(ExecState *, Type) const
 {
   return Number((NumberImp*)this);
@@ -258,10 +248,21 @@ Object NumberImp::toObject(ExecState *exec) const
   return Object::dynamicCast(exec->interpreter()->builtinNumber().construct(exec,args));
 }
 
+bool NumberImp::toUInt32(unsigned& uint32) const
+{
+  uint32 = (unsigned)val;
+  return (double)uint32 == val;
+}
+
 // ------------------------------ ReferenceImp ---------------------------------
 
+ReferenceImp::ReferenceImp(const Value& v, unsigned p)
+  : base(v.imp()), propertyNameIsNumber(true), propertyNameAsNumber(p)
+{
+}
+
 ReferenceImp::ReferenceImp(const Value& v, const UString& p)
-  : base(v.imp()), prop(p)
+  : base(v.imp()), propertyNameIsNumber(false), prop(p)
 {
 }
 
@@ -307,6 +308,65 @@ Object ReferenceImp::toObject(ExecState */*exec*/) const
   return Object();
 }
 
+UString ReferenceImp::getPropertyName(ExecState *) const
+{
+  if (propertyNameIsNumber && prop.isNull())
+    prop = UString::from(propertyNameAsNumber);
+  return prop;
+}
+
+Value ReferenceImp::getValue(ExecState *exec) const
+{
+  Value o = getBase(exec);
+
+  if (o.isNull() || o.type() == NullType) {
+    UString m = I18N_NOOP("Can't find variable: ") + getPropertyName(exec);
+    Object err = Error::create(exec, ReferenceError, m.ascii());
+    exec->setException(err);
+    return err;
+  }
+
+  if (o.type() != ObjectType) {
+    UString m = I18N_NOOP("Base is not an object");
+    Object err = Error::create(exec, ReferenceError, m.ascii());
+    exec->setException(err);
+    return err;
+  }
+
+  if (propertyNameIsNumber)
+    return static_cast<ObjectImp*>(o.imp())->get(exec,propertyNameAsNumber);
+  return static_cast<ObjectImp*>(o.imp())->get(exec,prop);
+}
+
+void ReferenceImp::putValue(ExecState *exec, const Value& w)
+{
+#ifdef KJS_VERBOSE
+  printInfo(exec,(UString("setting property ")+getPropertyName(exec)).cstring().c_str(),w);
+#endif
+  Value o = getBase(exec);
+  if (o.type() == NullType)
+    o = exec->interpreter()->globalObject();
+
+  if (propertyNameIsNumber)
+    return static_cast<ObjectImp*>(o.imp())->put(exec,propertyNameAsNumber, w);
+  return static_cast<ObjectImp*>(o.imp())->put(exec,prop, w);
+}
+
+bool ReferenceImp::deleteValue(ExecState *exec)
+{
+  Value b = getBase(exec);
+
+  // The spec doesn't mention what to do if the base is null... just return true
+  if (b.type() != ObjectType) {
+    assert(b.type() == NullType);
+    return true;
+  }
+
+  if (propertyNameIsNumber)
+    return static_cast<ObjectImp*>(b.imp())->deleteProperty(exec,propertyNameAsNumber);
+  return static_cast<ObjectImp*>(b.imp())->deleteProperty(exec,prop);
+}
+
 // ------------------------------ LabelStack -----------------------------------
 
 LabelStack::LabelStack(const LabelStack &other)
@@ -1119,7 +1179,7 @@ Boolean InternalFunctionImp::hasInstance(ExecState *exec, const Value &value)
   if (value.type() != ObjectType)
     return Boolean(false);
 
-  Value prot = get(exec,"prototype");
+  Value prot = get(exec,prototypePropertyName);
   if (prot.type() != ObjectType && prot.type() != NullType) {
     Object err = Error::create(exec, TypeError, "Invalid prototype encountered "
                                "in instanceof operation.");
diff --git a/JavaScriptCore/kjs/internal.h b/JavaScriptCore/kjs/internal.h
index a65a10a..22dc403 100644
--- a/JavaScriptCore/kjs/internal.h
+++ b/JavaScriptCore/kjs/internal.h
@@ -49,9 +49,6 @@ namespace KJS {
 
   class UndefinedImp : public ValueImp {
   public:
-    UndefinedImp() {}
-    virtual ~UndefinedImp() { }
-
     Type type() const { return UndefinedType; }
 
     Value toPrimitive(ExecState *exec, Type preferred = UnspecifiedType) const;
@@ -63,11 +60,10 @@ namespace KJS {
     static UndefinedImp *staticUndefined;
   };
 
+  inline Undefined::Undefined(UndefinedImp *imp) : Value(imp) { }
+
   class NullImp : public ValueImp {
   public:
-    NullImp() {}
-    virtual ~NullImp() { }
-
     Type type() const { return NullType; }
 
     Value toPrimitive(ExecState *exec, Type preferred = UnspecifiedType) const;
@@ -79,9 +75,10 @@ namespace KJS {
     static NullImp *staticNull;
   };
 
+  inline Null::Null(NullImp *imp) : Value(imp) { }
+
   class BooleanImp : public ValueImp {
   public:
-    virtual ~BooleanImp() { }
     BooleanImp(bool v = false) : val(v) { }
     bool value() const { return val; }
 
@@ -98,11 +95,12 @@ namespace KJS {
   private:
     bool val;
   };
+  
+  inline Boolean::Boolean(BooleanImp *imp) : Value(imp) { }
 
   class StringImp : public ValueImp {
   public:
-    StringImp(const UString& v);
-    virtual ~StringImp() { }
+    StringImp(const UString& v) : val(v) { }
     UString value() const { return val; }
 
     Type type() const { return StringType; }
@@ -117,10 +115,11 @@ namespace KJS {
     UString val;
   };
 
+  inline String::String(StringImp *imp) : Value(imp) { }
+
   class NumberImp : public ValueImp {
   public:
-    NumberImp(double v);
-    virtual ~NumberImp() { }
+    NumberImp(double v) : val(v) { }
     double value() const { return val; }
 
     Type type() const { return NumberType; }
@@ -131,19 +130,22 @@ namespace KJS {
     UString toString(ExecState *exec) const;
     Object toObject(ExecState *exec) const;
 
+    virtual bool toUInt32(unsigned&) const;
+
   private:
     double val;
   };
 
+  inline Number::Number(NumberImp *imp) : Value(imp) { }
+
   // ---------------------------------------------------------------------------
   //                            Internal type impls
   // ---------------------------------------------------------------------------
 
   class ReferenceImp : public ValueImp {
   public:
-
     ReferenceImp(const Value& v, const UString& p);
-    virtual ~ReferenceImp() { }
+    ReferenceImp(const Value& v, unsigned p);
     virtual void mark();
 
     Value toPrimitive(ExecState *exec, Type preferred = UnspecifiedType) const;
@@ -152,15 +154,22 @@ namespace KJS {
     UString toString(ExecState *exec) const;
     Object toObject(ExecState *exec) const;
 
-    Value getBase() const { return Value(base); }
-    UString getPropertyName() const { return prop; }
+    Value getBase(ExecState *) const { return Value(base); }
+    UString getPropertyName(ExecState *) const;
+    Value getValue(ExecState *exec) const;
+    void putValue(ExecState *exec, const Value& w);
+    bool deleteValue(ExecState *exec);
 
     Type type() const { return ReferenceType; }
 
   private:
     ValueImp *base;
-    UString prop;
+    bool propertyNameIsNumber;
+    unsigned propertyNameAsNumber;
+    mutable UString prop;
   };
+  
+  inline Reference::Reference(ReferenceImp *imp) : Value(imp) { }
 
   class CompletionImp : public ValueImp {
   public:
@@ -186,6 +195,8 @@ namespace KJS {
     UString tar;
   };
 
+  inline Completion::Completion(CompletionImp *imp) : Value(imp) { }
+
   /**
    * @internal
    */
@@ -243,6 +254,8 @@ namespace KJS {
     ListNode *hook;
     static ListImp *emptyList;
   };
+  
+  inline List::List(ListImp *imp) : Value(imp) { }
 
   /**
    * @short The "label set" in Ecma-262 spec
diff --git a/JavaScriptCore/kjs/math_object.cpp b/JavaScriptCore/kjs/math_object.cpp
index 4f40456..6ca32d6 100644
--- a/JavaScriptCore/kjs/math_object.cpp
+++ b/JavaScriptCore/kjs/math_object.cpp
@@ -130,7 +130,7 @@ MathFuncImp::MathFuncImp(ExecState *exec, int i, int l)
     ), id(i)
 {
   Value protect(this);
-  put(exec,"length",Number(l),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(l),DontDelete|ReadOnly|DontEnum);
 }
 
 bool MathFuncImp::implementsCall() const
diff --git a/JavaScriptCore/kjs/nodes.cpp b/JavaScriptCore/kjs/nodes.cpp
index 3da5576..f43a4a2 100644
--- a/JavaScriptCore/kjs/nodes.cpp
+++ b/JavaScriptCore/kjs/nodes.cpp
@@ -117,10 +117,6 @@ StatementNode::StatementNode() : l0(-1), l1(-1), sid(-1), breakPoint(false)
 {
 }
 
-StatementNode::~StatementNode()
-{
-}
-
 void StatementNode::setLoc(int line0, int line1, int sourceId)
 {
     l0 = line0;
@@ -226,10 +222,6 @@ Value ResolveNode::evaluate(ExecState *exec)
 
 // ------------------------------ GroupNode ------------------------------------
 
-GroupNode::~GroupNode()
-{
-}
-
 void GroupNode::ref()
 {
   Node::ref();
@@ -252,10 +244,6 @@ Value GroupNode::evaluate(ExecState *exec)
 
 // ------------------------------ ElisionNode ----------------------------------
 
-ElisionNode::~ElisionNode()
-{
-}
-
 void ElisionNode::ref()
 {
   Node::ref();
@@ -281,10 +269,6 @@ Value ElisionNode::evaluate(ExecState *exec)
 
 // ------------------------------ ElementNode ----------------------------------
 
-ElementNode::~ElementNode()
-{
-}
-
 void ElementNode::ref()
 {
   Node::ref();
@@ -320,7 +304,7 @@ Value ElementNode::evaluate(ExecState *exec)
     array = Object(static_cast<ObjectImp*>(list->evaluate(exec).imp()));
     KJS_CHECKEXCEPTIONVALUE
     val = node->evaluate(exec).getValue(exec);
-    length = array.get(exec,"length").toInt32(exec);
+    length = array.get(exec,lengthPropertyName).toInt32(exec);
   } else {
     Value newArr = exec->interpreter()->builtinArray().construct(exec,List::empty());
     array = Object(static_cast<ObjectImp*>(newArr.imp()));
@@ -328,17 +312,13 @@ Value ElementNode::evaluate(ExecState *exec)
     KJS_CHECKEXCEPTIONVALUE
   }
 
-  array.put(exec, UString::from(elisionLen + length), val);
+  array.put(exec, elisionLen + length, val);
 
   return array;
 }
 
 // ------------------------------ ArrayNode ------------------------------------
 
-ArrayNode::~ArrayNode()
-{
-}
-
 void ArrayNode::ref()
 {
   Node::ref();
@@ -368,7 +348,7 @@ Value ArrayNode::evaluate(ExecState *exec)
   if (element) {
     array = Object(static_cast<ObjectImp*>(element->evaluate(exec).imp()));
     KJS_CHECKEXCEPTIONVALUE
-    length = opt ? array.get(exec,"length").toInt32(exec) : 0;
+    length = opt ? array.get(exec,lengthPropertyName).toInt32(exec) : 0;
   } else {
     Value newArr = exec->interpreter()->builtinArray().construct(exec,List::empty());
     array = Object(static_cast<ObjectImp*>(newArr.imp()));
@@ -376,17 +356,13 @@ Value ArrayNode::evaluate(ExecState *exec)
   }
 
   if (opt)
-    array.put(exec,"length", Number(elisionLen + length), DontEnum | DontDelete);
+    array.put(exec,lengthPropertyName, Number(elisionLen + length), DontEnum | DontDelete);
 
   return array;
 }
 
 // ------------------------------ ObjectLiteralNode ----------------------------
 
-ObjectLiteralNode::~ObjectLiteralNode()
-{
-}
-
 void ObjectLiteralNode::ref()
 {
   Node::ref();
@@ -412,10 +388,6 @@ Value ObjectLiteralNode::evaluate(ExecState *exec)
 
 // ------------------------------ PropertyValueNode ----------------------------
 
-PropertyValueNode::~PropertyValueNode()
-{
-}
-
 void PropertyValueNode::ref()
 {
   Node::ref();
@@ -478,10 +450,6 @@ Value PropertyNode::evaluate(ExecState */*exec*/)
 
 // ------------------------------ AccessorNode1 --------------------------------
 
-AccessorNode1::~AccessorNode1()
-{
-}
-
 void AccessorNode1::ref()
 {
   Node::ref();
@@ -510,16 +478,15 @@ Value AccessorNode1::evaluate(ExecState *exec)
   KJS_CHECKEXCEPTIONVALUE
   Value v2 = e2.getValue(exec);
   Object o = v1.toObject(exec);
+  unsigned i;
+  if (v2.toUInt32(i))
+    return Reference(o, i);
   String s = v2.toString(exec);
   return Reference(o, s.value());
 }
 
 // ------------------------------ AccessorNode2 --------------------------------
 
-AccessorNode2::~AccessorNode2()
-{
-}
-
 void AccessorNode2::ref()
 {
   Node::ref();
@@ -555,10 +522,6 @@ ArgumentListNode::ArgumentListNode(ArgumentListNode *l, Node *e)
 {
 }
 
-ArgumentListNode::~ArgumentListNode()
-{
-}
-
 void ArgumentListNode::ref()
 {
   Node::ref();
@@ -607,10 +570,6 @@ ArgumentsNode::ArgumentsNode(ArgumentListNode *l) : list(l)
 {
 }
 
-ArgumentsNode::~ArgumentsNode()
-{
-}
-
 void ArgumentsNode::ref()
 {
   Node::ref();
@@ -644,10 +603,6 @@ List ArgumentsNode::evaluateList(ExecState *exec)
 
 // ECMA 11.2.2
 
-NewExprNode::~NewExprNode()
-{
-}
-
 void NewExprNode::ref()
 {
   Node::ref();
@@ -694,10 +649,6 @@ Value NewExprNode::evaluate(ExecState *exec)
 
 // ------------------------------ FunctionCallNode -----------------------------
 
-FunctionCallNode::~FunctionCallNode()
-{
-}
-
 void FunctionCallNode::ref()
 {
   Node::ref();
@@ -787,10 +738,6 @@ Value FunctionCallNode::evaluate(ExecState *exec)
 
 // ------------------------------ PostfixNode ----------------------------------
 
-PostfixNode::~PostfixNode()
-{
-}
-
 void PostfixNode::ref()
 {
   Node::ref();
@@ -823,10 +770,6 @@ Value PostfixNode::evaluate(ExecState *exec)
 
 // ------------------------------ DeleteNode -----------------------------------
 
-DeleteNode::~DeleteNode()
-{
-}
-
 void DeleteNode::ref()
 {
   Node::ref();
@@ -846,30 +789,11 @@ Value DeleteNode::evaluate(ExecState *exec)
 {
   Value e = expr->evaluate(exec);
   KJS_CHECKEXCEPTIONVALUE
-  if (e.type() != ReferenceType)
-    return Boolean(true);
-  Value b = e.getBase(exec);
-  UString n = e.getPropertyName(exec);
-
-  // The spec doesn't mention what to do if the base is null... just return true
-  if (b.type() != ObjectType) {
-    assert(b.type() == NullType);
-    return Boolean(true);
-  }
-
-  Object o = Object(static_cast<ObjectImp*>(b.imp()));
-
-  bool ret = o.deleteProperty(exec,n);
-
-  return Boolean(ret);
+  return Boolean(e.deleteValue(exec));
 }
 
 // ------------------------------ VoidNode -------------------------------------
 
-VoidNode::~VoidNode()
-{
-}
-
 void VoidNode::ref()
 {
   Node::ref();
@@ -896,10 +820,6 @@ Value VoidNode::evaluate(ExecState *exec)
 
 // ------------------------------ TypeOfNode -----------------------------------
 
-TypeOfNode::~TypeOfNode()
-{
-}
-
 void TypeOfNode::ref()
 {
   Node::ref();
@@ -956,10 +876,6 @@ Value TypeOfNode::evaluate(ExecState *exec)
 
 // ------------------------------ PrefixNode -----------------------------------
 
-PrefixNode::~PrefixNode()
-{
-}
-
 void PrefixNode::ref()
 {
   Node::ref();
@@ -992,10 +908,6 @@ Value PrefixNode::evaluate(ExecState *exec)
 
 // ------------------------------ UnaryPlusNode --------------------------------
 
-UnaryPlusNode::~UnaryPlusNode()
-{
-}
-
 void UnaryPlusNode::ref()
 {
   Node::ref();
@@ -1022,10 +934,6 @@ Value UnaryPlusNode::evaluate(ExecState *exec)
 
 // ------------------------------ NegateNode -----------------------------------
 
-NegateNode::~NegateNode()
-{
-}
-
 void NegateNode::ref()
 {
   Node::ref();
@@ -1055,10 +963,6 @@ Value NegateNode::evaluate(ExecState *exec)
 
 // ------------------------------ BitwiseNotNode -------------------------------
 
-BitwiseNotNode::~BitwiseNotNode()
-{
-}
-
 void BitwiseNotNode::ref()
 {
   Node::ref();
@@ -1086,10 +990,6 @@ Value BitwiseNotNode::evaluate(ExecState *exec)
 
 // ------------------------------ LogicalNotNode -------------------------------
 
-LogicalNotNode::~LogicalNotNode()
-{
-}
-
 void LogicalNotNode::ref()
 {
   Node::ref();
@@ -1117,10 +1017,6 @@ Value LogicalNotNode::evaluate(ExecState *exec)
 
 // ------------------------------ MultNode -------------------------------------
 
-MultNode::~MultNode()
-{
-}
-
 void MultNode::ref()
 {
   Node::ref();
@@ -1155,10 +1051,6 @@ Value MultNode::evaluate(ExecState *exec)
 
 // ------------------------------ AddNode --------------------------------------
 
-AddNode::~AddNode()
-{
-}
-
 void AddNode::ref()
 {
   Node::ref();
@@ -1193,10 +1085,6 @@ Value AddNode::evaluate(ExecState *exec)
 
 // ------------------------------ ShiftNode ------------------------------------
 
-ShiftNode::~ShiftNode()
-{
-}
-
 void ShiftNode::ref()
 {
   Node::ref();
@@ -1248,10 +1136,6 @@ Value ShiftNode::evaluate(ExecState *exec)
 
 // ------------------------------ RelationalNode -------------------------------
 
-RelationalNode::~RelationalNode()
-{
-}
-
 void RelationalNode::ref()
 {
   Node::ref();
@@ -1323,10 +1207,6 @@ Value RelationalNode::evaluate(ExecState *exec)
 
 // ------------------------------ EqualNode ------------------------------------
 
-EqualNode::~EqualNode()
-{
-}
-
 void EqualNode::ref()
 {
   Node::ref();
@@ -1370,10 +1250,6 @@ Value EqualNode::evaluate(ExecState *exec)
 
 // ------------------------------ BitOperNode ----------------------------------
 
-BitOperNode::~BitOperNode()
-{
-}
-
 void BitOperNode::ref()
 {
   Node::ref();
@@ -1416,10 +1292,6 @@ Value BitOperNode::evaluate(ExecState *exec)
 
 // ------------------------------ BinaryLogicalNode ----------------------------
 
-BinaryLogicalNode::~BinaryLogicalNode()
-{
-}
-
 void BinaryLogicalNode::ref()
 {
   Node::ref();
@@ -1457,10 +1329,6 @@ Value BinaryLogicalNode::evaluate(ExecState *exec)
 
 // ------------------------------ ConditionalNode ------------------------------
 
-ConditionalNode::~ConditionalNode()
-{
-}
-
 void ConditionalNode::ref()
 {
   Node::ref();
@@ -1502,10 +1370,6 @@ Value ConditionalNode::evaluate(ExecState *exec)
 
 // ------------------------------ AssignNode -----------------------------------
 
-AssignNode::~AssignNode()
-{
-}
-
 void AssignNode::ref()
 {
   Node::ref();
@@ -1596,10 +1460,6 @@ Value AssignNode::evaluate(ExecState *exec)
 
 // ------------------------------ CommaNode ------------------------------------
 
-CommaNode::~CommaNode()
-{
-}
-
 void CommaNode::ref()
 {
   Node::ref();
@@ -1632,10 +1492,6 @@ Value CommaNode::evaluate(ExecState *exec)
 
 // ------------------------------ StatListNode ---------------------------------
 
-StatListNode::~StatListNode()
-{
-}
-
 void StatListNode::ref()
 {
   Node::ref();
@@ -1697,10 +1553,6 @@ void StatListNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ AssignExprNode -------------------------------
 
-AssignExprNode::~AssignExprNode()
-{
-}
-
 void AssignExprNode::ref()
 {
   Node::ref();
@@ -1728,10 +1580,6 @@ VarDeclNode::VarDeclNode(const UString *id, AssignExprNode *in)
 {
 }
 
-VarDeclNode::~VarDeclNode()
-{
-}
-
 void VarDeclNode::ref()
 {
   Node::ref();
@@ -1780,10 +1628,6 @@ void VarDeclNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ VarDeclListNode ------------------------------
 
-VarDeclListNode::~VarDeclListNode()
-{
-}
-
 void VarDeclListNode::ref()
 {
   Node::ref();
@@ -1826,10 +1670,6 @@ void VarDeclListNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ VarStatementNode -----------------------------
 
-VarStatementNode::~VarStatementNode()
-{
-}
-
 void VarStatementNode::ref()
 {
   Node::ref();
@@ -1862,10 +1702,6 @@ void VarStatementNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ BlockNode ------------------------------------
 
-BlockNode::~BlockNode()
-{
-}
-
 void BlockNode::ref()
 {
   Node::ref();
@@ -1907,10 +1743,6 @@ Completion EmptyStatementNode::execute(ExecState */*exec*/)
 
 // ------------------------------ ExprStatementNode ----------------------------
 
-ExprStatementNode::~ExprStatementNode()
-{
-}
-
 void ExprStatementNode::ref()
 {
   Node::ref();
@@ -1939,10 +1771,6 @@ Completion ExprStatementNode::execute(ExecState *exec)
 
 // ------------------------------ IfNode ---------------------------------------
 
-IfNode::~IfNode()
-{
-}
-
 void IfNode::ref()
 {
   Node::ref();
@@ -1997,10 +1825,6 @@ void IfNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ DoWhileNode ----------------------------------
 
-DoWhileNode::~DoWhileNode()
-{
-}
-
 void DoWhileNode::ref()
 {
   Node::ref();
@@ -2054,10 +1878,6 @@ void DoWhileNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ WhileNode ------------------------------------
 
-WhileNode::~WhileNode()
-{
-}
-
 void WhileNode::ref()
 {
   Node::ref();
@@ -2118,10 +1938,6 @@ void WhileNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ ForNode --------------------------------------
 
-ForNode::~ForNode()
-{
-}
-
 void ForNode::ref()
 {
   Node::ref();
@@ -2211,10 +2027,6 @@ ForInNode::ForInNode(const UString *i, AssignExprNode *in, Node *e, StatementNod
   lexpr = new ResolveNode(&ident);
 }
 
-ForInNode::~ForInNode()
-{
-}
-
 void ForInNode::ref()
 {
   Node::ref();
@@ -2332,10 +2144,6 @@ Completion BreakNode::execute(ExecState *exec)
 
 // ------------------------------ ReturnNode -----------------------------------
 
-ReturnNode::~ReturnNode()
-{
-}
-
 void ReturnNode::ref()
 {
   Node::ref();
@@ -2367,10 +2175,6 @@ Completion ReturnNode::execute(ExecState *exec)
 
 // ------------------------------ WithNode -------------------------------------
 
-WithNode::~WithNode()
-{
-}
-
 void WithNode::ref()
 {
   Node::ref();
@@ -2413,10 +2217,6 @@ void WithNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ CaseClauseNode -------------------------------
 
-CaseClauseNode::~CaseClauseNode()
-{
-}
-
 void CaseClauseNode::ref()
 {
   Node::ref();
@@ -2462,10 +2262,6 @@ void CaseClauseNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ ClauseListNode -------------------------------
 
-ClauseListNode::~ClauseListNode()
-{
-}
-
 void ClauseListNode::ref()
 {
   Node::ref();
@@ -2512,10 +2308,6 @@ void ClauseListNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ CaseBlockNode --------------------------------
 
-CaseBlockNode::~CaseBlockNode()
-{
-}
-
 void CaseBlockNode::ref()
 {
   Node::ref();
@@ -2619,10 +2411,6 @@ void CaseBlockNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ SwitchNode -----------------------------------
 
-SwitchNode::~SwitchNode()
-{
-}
-
 void SwitchNode::ref()
 {
   Node::ref();
@@ -2664,10 +2452,6 @@ void SwitchNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ LabelNode ------------------------------------
 
-LabelNode::~LabelNode()
-{
-}
-
 void LabelNode::ref()
 {
   Node::ref();
@@ -2707,10 +2491,6 @@ void LabelNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ ThrowNode ------------------------------------
 
-ThrowNode::~ThrowNode()
-{
-}
-
 void ThrowNode::ref()
 {
   Node::ref();
@@ -2742,10 +2522,6 @@ Completion ThrowNode::execute(ExecState *exec)
 
 // ------------------------------ CatchNode ------------------------------------
 
-CatchNode::~CatchNode()
-{
-}
-
 void CatchNode::ref()
 {
   Node::ref();
@@ -2790,10 +2566,6 @@ void CatchNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ FinallyNode ----------------------------------
 
-FinallyNode::~FinallyNode()
-{
-}
-
 void FinallyNode::ref()
 {
   Node::ref();
@@ -2821,10 +2593,6 @@ void FinallyNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ TryNode --------------------------------------
 
-TryNode::~TryNode()
-{
-}
-
 void TryNode::ref()
 {
   Node::ref();
@@ -2885,10 +2653,6 @@ void TryNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ ParameterNode --------------------------------
 
-ParameterNode::~ParameterNode()
-{
-}
-
 void ParameterNode::ref()
 {
   Node::ref();
@@ -2930,11 +2694,6 @@ FunctionBodyNode::FunctionBodyNode(SourceElementsNode *s)
   //fprintf(stderr,"FunctionBodyNode::FunctionBodyNode %p\n",this);
 }
 
-FunctionBodyNode::~FunctionBodyNode()
-{
-  //fprintf(stderr,"FunctionBodyNode::~FunctionBodyNode %p\n",this);
-}
-
 void FunctionBodyNode::ref()
 {
   Node::ref();
@@ -2977,10 +2736,6 @@ void FunctionBodyNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ FuncDeclNode ---------------------------------
 
-FuncDeclNode::~FuncDeclNode()
-{
-}
-
 void FuncDeclNode::ref()
 {
   Node::ref();
@@ -3011,13 +2766,13 @@ void FuncDeclNode::processFuncDecl(ExecState *exec)
   //  Value proto = exec->interpreter()->builtinObject().construct(exec,List::empty());
   List empty;
   Value proto = exec->interpreter()->builtinObject().construct(exec,empty);
-  func.put(exec, "prototype", proto, Internal|DontDelete);
+  func.put(exec, prototypePropertyName, proto, Internal|DontDelete);
 
   int plen = 0;
   for(ParameterNode *p = param; p != 0L; p = p->nextParam(), plen++)
     fimp->addParameter(p->ident());
 
-  func.put(exec, "length", Number(plen), ReadOnly|DontDelete|DontEnum);
+  func.put(exec, lengthPropertyName, Number(plen), ReadOnly|DontDelete|DontEnum);
 
   exec->context().imp()->variableObject().put(exec,ident,func);
 
@@ -3035,10 +2790,6 @@ void FuncDeclNode::processFuncDecl(ExecState *exec)
 
 // ------------------------------ FuncExprNode ---------------------------------
 
-FuncExprNode::~FuncExprNode()
-{
-}
-
 void FuncExprNode::ref()
 {
   Node::ref();
@@ -3066,22 +2817,18 @@ Value FuncExprNode::evaluate(ExecState *exec)
   Value ret(fimp);
   List empty;
   Value proto = exec->interpreter()->builtinObject().construct(exec,empty);
-  fimp->put(exec, "prototype", proto, Internal|DontDelete);
+  fimp->put(exec, prototypePropertyName, proto, Internal|DontDelete);
 
   int plen = 0;
   for(ParameterNode *p = param; p != 0L; p = p->nextParam(), plen++)
     fimp->addParameter(p->ident());
-  fimp->put(exec,"length", Number(plen), ReadOnly|DontDelete|DontEnum);
+  fimp->put(exec,lengthPropertyName, Number(plen), ReadOnly|DontDelete|DontEnum);
 
   return ret;
 }
 
 // ------------------------------ SourceElementNode ----------------------------
 
-SourceElementNode::~SourceElementNode()
-{
-}
-
 void SourceElementNode::ref()
 {
   Node::ref();
@@ -3124,10 +2871,6 @@ void SourceElementNode::processVarDecls(ExecState *exec)
 
 // ------------------------------ SourceElementsNode ---------------------------
 
-SourceElementsNode::~SourceElementsNode()
-{
-}
-
 void SourceElementsNode::ref()
 {
   Node::ref();
@@ -3187,7 +2930,3 @@ void SourceElementsNode::processVarDecls(ExecState *exec)
 ProgramNode::ProgramNode(SourceElementsNode *s): FunctionBodyNode(s) {
     //fprintf(stderr,"ProgramNode::ProgramNode %p\n",this);
 }
-
-ProgramNode::~ProgramNode() {
-    //fprintf(stderr,"ProgramNode::~ProgramNode %p\n",this);
-}
diff --git a/JavaScriptCore/kjs/nodes.h b/JavaScriptCore/kjs/nodes.h
index 42bb2a6..482425f 100644
--- a/JavaScriptCore/kjs/nodes.h
+++ b/JavaScriptCore/kjs/nodes.h
@@ -111,7 +111,6 @@ namespace KJS {
   class StatementNode : public Node {
   public:
     StatementNode();
-    ~StatementNode();
     void setLoc(int line0, int line1, int sourceId);
     int firstLine() const { return l0; }
     int lastLine() const { return l1; }
@@ -196,7 +195,6 @@ namespace KJS {
     GroupNode(Node *g) : group(g) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~GroupNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const { group->streamTo(s); }
   private:
@@ -208,7 +206,6 @@ namespace KJS {
     ElisionNode(ElisionNode *e) : elision(e) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~ElisionNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -222,7 +219,6 @@ namespace KJS {
       : list(l), elision(e), node(n) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~ElementNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -240,7 +236,6 @@ namespace KJS {
       : element(ele), elision(eli), opt(true) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~ArrayNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -254,7 +249,6 @@ namespace KJS {
     ObjectLiteralNode(Node *l) : list(l) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~ObjectLiteralNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -267,7 +261,6 @@ namespace KJS {
       : name(n), assign(a), list(l) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~PropertyValueNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -290,7 +283,6 @@ namespace KJS {
     AccessorNode1(Node *e1, Node *e2) : expr1(e1), expr2(e2) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~AccessorNode1();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -303,7 +295,6 @@ namespace KJS {
     AccessorNode2(Node *e, const UString *s) : expr(e), ident(*s) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~AccessorNode2();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -317,7 +308,6 @@ namespace KJS {
     ArgumentListNode(ArgumentListNode *l, Node *e);
     virtual void ref();
     virtual bool deref();
-    virtual ~ArgumentListNode();
     Value evaluate(ExecState *exec);
     List evaluateList(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -331,7 +321,6 @@ namespace KJS {
     ArgumentsNode(ArgumentListNode *l);
     virtual void ref();
     virtual bool deref();
-    virtual ~ArgumentsNode();
     Value evaluate(ExecState *exec);
     List evaluateList(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -345,7 +334,6 @@ namespace KJS {
     NewExprNode(Node *e, ArgumentsNode *a) : expr(e), args(a) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~NewExprNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -358,7 +346,6 @@ namespace KJS {
     FunctionCallNode(Node *e, ArgumentsNode *a) : expr(e), args(a) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~FunctionCallNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -371,7 +358,6 @@ namespace KJS {
     PostfixNode(Node *e, Operator o) : expr(e), oper(o) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~PostfixNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -384,7 +370,6 @@ namespace KJS {
     DeleteNode(Node *e) : expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~DeleteNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -396,7 +381,6 @@ namespace KJS {
     VoidNode(Node *e) : expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~VoidNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -408,7 +392,6 @@ namespace KJS {
     TypeOfNode(Node *e) : expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~TypeOfNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -420,7 +403,6 @@ namespace KJS {
     PrefixNode(Operator o, Node *e) : oper(o), expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~PrefixNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -433,7 +415,6 @@ namespace KJS {
     UnaryPlusNode(Node *e) : expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~UnaryPlusNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -445,7 +426,6 @@ namespace KJS {
     NegateNode(Node *e) : expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~NegateNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -457,7 +437,6 @@ namespace KJS {
     BitwiseNotNode(Node *e) : expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~BitwiseNotNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -469,7 +448,6 @@ namespace KJS {
     LogicalNotNode(Node *e) : expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~LogicalNotNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -481,7 +459,6 @@ namespace KJS {
     MultNode(Node *t1, Node *t2, char op) : term1(t1), term2(t2), oper(op) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~MultNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -494,7 +471,6 @@ namespace KJS {
     AddNode(Node *t1, Node *t2, char op) : term1(t1), term2(t2), oper(op) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~AddNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -508,7 +484,6 @@ namespace KJS {
       : term1(t1), term2(t2), oper(o) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~ShiftNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -522,7 +497,6 @@ namespace KJS {
       expr1(e1), expr2(e2), oper(o) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~RelationalNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -536,7 +510,6 @@ namespace KJS {
       : expr1(e1), expr2(e2), oper(o) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~EqualNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -550,7 +523,6 @@ namespace KJS {
       expr1(e1), expr2(e2), oper(o) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~BitOperNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -567,7 +539,6 @@ namespace KJS {
       expr1(e1), expr2(e2), oper(o) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~BinaryLogicalNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -584,7 +555,6 @@ namespace KJS {
       logical(l), expr1(e1), expr2(e2) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~ConditionalNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -596,7 +566,6 @@ namespace KJS {
     AssignNode(Node *l, Operator o, Node *e) : left(l), oper(o), expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~AssignNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -610,7 +579,6 @@ namespace KJS {
     CommaNode(Node *e1, Node *e2) : expr1(e1), expr2(e2) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~CommaNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -623,7 +591,6 @@ namespace KJS {
     StatListNode(StatListNode *l, StatementNode *s) : statement(s), list(l) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~StatListNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -637,7 +604,6 @@ namespace KJS {
     AssignExprNode(Node *e) : expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~AssignExprNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -649,7 +615,6 @@ namespace KJS {
     VarDeclNode(const UString *id, AssignExprNode *in);
     virtual void ref();
     virtual bool deref();
-    virtual ~VarDeclNode();
     Value evaluate(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -664,7 +629,6 @@ namespace KJS {
     VarDeclListNode(Node *l, VarDeclNode *v) : list(l), var(v) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~VarDeclListNode();
     Value evaluate(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -678,7 +642,6 @@ namespace KJS {
     VarStatementNode(VarDeclListNode *l) : list(l) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~VarStatementNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -691,7 +654,6 @@ namespace KJS {
     BlockNode(SourceElementsNode *s) : source(s) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~BlockNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -711,7 +673,6 @@ namespace KJS {
     ExprStatementNode(Node *e) : expr(e) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~ExprStatementNode();
     virtual Completion execute(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -724,7 +685,6 @@ namespace KJS {
       : expr(e), statement1(s1), statement2(s2) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~IfNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -738,7 +698,6 @@ namespace KJS {
     DoWhileNode(StatementNode *s, Node *e) : statement(s), expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~DoWhileNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -752,7 +711,6 @@ namespace KJS {
     WhileNode(Node *e, StatementNode *s) : expr(e), statement(s) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~WhileNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -767,7 +725,6 @@ namespace KJS {
       expr1(e1), expr2(e2), expr3(e3), statement(s) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~ForNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -782,7 +739,6 @@ namespace KJS {
     ForInNode(const UString *i, AssignExprNode *in, Node *e, StatementNode *s);
     virtual void ref();
     virtual bool deref();
-    virtual ~ForInNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -819,7 +775,6 @@ namespace KJS {
     ReturnNode(Node *v) : value(v) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~ReturnNode();
     virtual Completion execute(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -831,7 +786,6 @@ namespace KJS {
     WithNode(Node *e, StatementNode *s) : expr(e), statement(s) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~WithNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -845,7 +799,6 @@ namespace KJS {
     CaseClauseNode(Node *e, StatListNode *l) : expr(e), list(l) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~CaseClauseNode();
     Value evaluate(ExecState *exec);
     Completion evalStatements(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
@@ -860,7 +813,6 @@ namespace KJS {
     ClauseListNode(CaseClauseNode *c) : cl(c), nx(0L) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~ClauseListNode();
     ClauseListNode* append(CaseClauseNode *c);
     Value evaluate(ExecState *exec);
     CaseClauseNode *clause() const { return cl; }
@@ -878,7 +830,6 @@ namespace KJS {
       : list1(l1), def(d), list2(l2) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~CaseBlockNode();
     Value evaluate(ExecState *exec);
     Completion evalBlock(ExecState *exec, const Value& input);
     virtual void processVarDecls(ExecState *exec);
@@ -894,7 +845,6 @@ namespace KJS {
     SwitchNode(Node *e, CaseBlockNode *b) : expr(e), block(b) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~SwitchNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -908,7 +858,6 @@ namespace KJS {
     LabelNode(const UString *l, StatementNode *s) : label(*l), statement(s) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~LabelNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -922,7 +871,6 @@ namespace KJS {
     ThrowNode(Node *e) : expr(e) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~ThrowNode();
     virtual Completion execute(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -934,7 +882,6 @@ namespace KJS {
     CatchNode(const UString *i, StatementNode *b) : ident(*i), block(b) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~CatchNode();
     virtual Completion execute(ExecState *exec);
     Completion execute(ExecState *exec, const Value &arg);
     virtual void processVarDecls(ExecState *exec);
@@ -949,7 +896,6 @@ namespace KJS {
     FinallyNode(StatementNode *b) : block(b) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~FinallyNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -963,7 +909,6 @@ namespace KJS {
       : block(b), _catch((CatchNode*)c), _final((FinallyNode*)f) {}
     virtual void ref();
     virtual bool deref();
-    virtual ~TryNode();
     virtual Completion execute(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
@@ -979,7 +924,6 @@ namespace KJS {
     ParameterNode *append(const UString *i);
     virtual void ref();
     virtual bool deref();
-    virtual ~ParameterNode();
     Value evaluate(ExecState *exec);
     UString ident() { return id; }
     ParameterNode *nextParam() { return next; }
@@ -995,7 +939,6 @@ namespace KJS {
     FunctionBodyNode(SourceElementsNode *s);
     virtual void ref();
     virtual bool deref();
-    virtual ~FunctionBodyNode();
     Completion execute(ExecState *exec);
     virtual void processFuncDecl(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
@@ -1010,7 +953,6 @@ namespace KJS {
       : ident(*i), param(p), body(b) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~FuncDeclNode();
     Completion execute(ExecState */*exec*/)
       { /* empty */ return Completion(); }
     void processFuncDecl(ExecState *exec);
@@ -1027,7 +969,6 @@ namespace KJS {
 	: param(p), body(b) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~FuncExprNode();
     Value evaluate(ExecState *exec);
     virtual void streamTo(SourceStream &s) const;
   private:
@@ -1041,7 +982,6 @@ namespace KJS {
     SourceElementNode(FuncDeclNode *f) : statement(0L), function(f) { }
     virtual void ref();
     virtual bool deref();
-    virtual ~SourceElementNode();
     Completion execute(ExecState *exec);
     virtual void processFuncDecl(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
@@ -1059,7 +999,6 @@ namespace KJS {
       { elements = s1; element = s2; }
     virtual void ref();
     virtual bool deref();
-    virtual ~SourceElementsNode();
     Completion execute(ExecState *exec);
     virtual void processFuncDecl(ExecState *exec);
     virtual void processVarDecls(ExecState *exec);
@@ -1072,10 +1011,6 @@ namespace KJS {
   class ProgramNode : public FunctionBodyNode {
   public:
     ProgramNode(SourceElementsNode *s);
-    ~ProgramNode();
-  private:
-    // Disallow copy
-    ProgramNode(const ProgramNode &other);
   };
 
 }; // namespace
diff --git a/JavaScriptCore/kjs/nodes2string.cpp b/JavaScriptCore/kjs/nodes2string.cpp
index 617813a..cc2ace2 100644
--- a/JavaScriptCore/kjs/nodes2string.cpp
+++ b/JavaScriptCore/kjs/nodes2string.cpp
@@ -34,6 +34,7 @@ namespace KJS {
 
     UString toString() const { return str; }
     SourceStream& operator<<(const KJS::UString &);
+    SourceStream& operator<<(char);
     SourceStream& operator<<(Format f);
     SourceStream& operator<<(const Node *);
   private:
@@ -44,6 +45,12 @@ namespace KJS {
 
 using namespace KJS;
 
+SourceStream& SourceStream::operator<<(char c)
+{
+  str += UString(c);
+  return *this;
+}
+
 SourceStream& SourceStream::operator<<(const KJS::UString &s)
 {
   str += s;
diff --git a/JavaScriptCore/kjs/number_object.cpp b/JavaScriptCore/kjs/number_object.cpp
index de2abe8..8fe9e94 100644
--- a/JavaScriptCore/kjs/number_object.cpp
+++ b/JavaScriptCore/kjs/number_object.cpp
@@ -54,9 +54,9 @@ NumberPrototypeImp::NumberPrototypeImp(ExecState *exec,
 
   // The constructor will be added later, after NumberObjectImp has been constructed
 
-  put(exec,"toString",       Object(new NumberProtoFuncImp(exec,funcProto,NumberProtoFuncImp::ToString,       1)), DontEnum);
+  put(exec,toStringPropertyName,       Object(new NumberProtoFuncImp(exec,funcProto,NumberProtoFuncImp::ToString,       1)), DontEnum);
   put(exec,"toLocaleString", Object(new NumberProtoFuncImp(exec,funcProto,NumberProtoFuncImp::ToLocaleString, 0)), DontEnum);
-  put(exec,"valueOf",        Object(new NumberProtoFuncImp(exec,funcProto,NumberProtoFuncImp::ValueOf,        0)), DontEnum);
+  put(exec,valueOfPropertyName,        Object(new NumberProtoFuncImp(exec,funcProto,NumberProtoFuncImp::ValueOf,        0)), DontEnum);
 }
 
 
@@ -67,7 +67,7 @@ NumberProtoFuncImp::NumberProtoFuncImp(ExecState *exec,
   : InternalFunctionImp(funcProto), id(i)
 {
   Value protect(this);
-  put(exec,"length",Number(len),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
 }
 
 
@@ -124,10 +124,10 @@ NumberObjectImp::NumberObjectImp(ExecState *exec,
 {
   Value protect(this);
   // Number.Prototype
-  put(exec,"prototype", Value(numberProto),DontEnum|DontDelete|ReadOnly);
+  put(exec,prototypePropertyName, Value(numberProto),DontEnum|DontDelete|ReadOnly);
 
   // no. of arguments for constructor
-  put(exec,"length", Number(1), ReadOnly|DontDelete|DontEnum);
+  put(exec,lengthPropertyName, Number(1), ReadOnly|DontDelete|DontEnum);
 }
 
 Value NumberObjectImp::get(ExecState *exec, const UString &propertyName) const
diff --git a/JavaScriptCore/kjs/object.cpp b/JavaScriptCore/kjs/object.cpp
index a43755a..a6ee57e 100644
--- a/JavaScriptCore/kjs/object.cpp
+++ b/JavaScriptCore/kjs/object.cpp
@@ -38,41 +38,14 @@
 #include "nodes.h"
 #include "property_map.h"
 
-using namespace KJS;
+namespace KJS {
 
-// ------------------------------ Object ---------------------------------------
-
-Object::Object() : Value()
-{
-}
-
-Object::Object(ObjectImp *v) : Value(v)
-{
-}
+extern const UString lengthPropertyName("length");
+extern const UString prototypePropertyName("prototype");
+extern const UString toStringPropertyName("toString");
+extern const UString valueOfPropertyName("valueOf");
 
-Object::Object(const Object &v) : Value(v)
-{
-}
-
-Object::~Object()
-{
-}
-
-Object& Object::operator=(const Object &v)
-{
-  Value::operator=(v);
-  return *this;
-}
-
-const ClassInfo *Object::classInfo() const
-{
-  return static_cast<ObjectImp*>(rep)->classInfo();
-}
-
-bool Object::inherits(const ClassInfo *cinfo) const
-{
-  return static_cast<ObjectImp*>(rep)->inherits(cinfo);
-}
+// ------------------------------ Object ---------------------------------------
 
 Object Object::dynamicCast(const Value &v)
 {
@@ -82,101 +55,6 @@ Object Object::dynamicCast(const Value &v)
   return Object(static_cast<ObjectImp*>(v.imp()));
 }
 
-Value Object::prototype() const
-{
-  return Value(static_cast<ObjectImp*>(rep)->prototype());
-}
-
-UString Object::className() const
-{
-  return static_cast<ObjectImp*>(rep)->className();
-}
-
-Value Object::get(ExecState *exec, const UString &propertyName) const
-{
-  return static_cast<ObjectImp*>(rep)->get(exec,propertyName);
-}
-
-void Object::put(ExecState *exec, const UString &propertyName, const Value &value, int attr)
-{
-  static_cast<ObjectImp*>(rep)->put(exec,propertyName,value,attr);
-}
-
-bool Object::canPut(ExecState *exec, const UString &propertyName) const
-{
-  return static_cast<ObjectImp*>(rep)->canPut(exec,propertyName);
-}
-
-bool Object::hasProperty(ExecState *exec, const UString &propertyName) const
-{
-  return static_cast<ObjectImp*>(rep)->hasProperty(exec, propertyName);
-}
-
-bool Object::deleteProperty(ExecState *exec, const UString &propertyName)
-{
-  return static_cast<ObjectImp*>(rep)->deleteProperty(exec,propertyName);
-}
-
-Value Object::defaultValue(ExecState *exec, Type hint) const
-{
-  return static_cast<ObjectImp*>(rep)->defaultValue(exec,hint);
-}
-
-bool Object::implementsConstruct() const
-{
-  return static_cast<ObjectImp*>(rep)->implementsConstruct();
-}
-
-Object Object::construct(ExecState *exec, const List &args)
-{
-  return static_cast<ObjectImp*>(rep)->construct(exec,args);
-}
-
-bool Object::implementsCall() const
-{
-  return static_cast<ObjectImp*>(rep)->implementsCall();
-}
-
-Value Object::call(ExecState *exec, Object &thisObj, const List &args)
-{
-  return static_cast<ObjectImp*>(rep)->call(exec,thisObj,args);
-}
-
-bool Object::implementsHasInstance() const
-{
-  return static_cast<ObjectImp*>(rep)->implementsHasInstance();
-}
-
-Boolean Object::hasInstance(ExecState *exec, const Value &value)
-{
-  return static_cast<ObjectImp*>(rep)->hasInstance(exec,value);
-}
-
-const List Object::scope() const
-{
-  return static_cast<ObjectImp*>(rep)->scope();
-}
-
-void Object::setScope(const List &s)
-{
-  static_cast<ObjectImp*>(rep)->setScope(s);
-}
-
-List Object::propList(ExecState *exec, bool recursive)
-{
-  return static_cast<ObjectImp*>(rep)->propList(exec,recursive);
-}
-
-Value Object::internalValue() const
-{
-  return static_cast<ObjectImp*>(rep)->internalValue();
-}
-
-void Object::setInternalValue(const Value &v)
-{
-  static_cast<ObjectImp*>(rep)->setInternalValue(v);
-}
-
 // ------------------------------ ObjectImp ------------------------------------
 
 ObjectImp::ObjectImp(const Object &proto)
@@ -295,6 +173,11 @@ Value ObjectImp::get(ExecState *exec, const UString &propertyName) const
   return proto.get(exec,propertyName);
 }
 
+Value ObjectImp::get(ExecState *exec, unsigned propertyName) const
+{
+  return get(exec, UString::from(propertyName));
+}
+
 // This get method only looks at the property map.
 // A bit like hasProperty(recursive=false), this doesn't go to the prototype.
 // This is used e.g. by lookupOrCreateFunction (to cache a function, we don't want
@@ -334,6 +217,12 @@ void ObjectImp::put(ExecState *exec, const UString &propertyName,
   _prop->put(propertyName,value.imp(),attr);
 }
 
+void ObjectImp::put(ExecState *exec, unsigned propertyName,
+                     const Value &value, int attr)
+{
+  put(exec, UString::from(propertyName), value, attr);
+}
+
 // ECMA 8.6.2.3
 bool ObjectImp::canPut(ExecState *, const UString &propertyName) const
 {
@@ -368,6 +257,11 @@ bool ObjectImp::hasProperty(ExecState *exec, const UString &propertyName) const
   return !proto.isNull() && proto.hasProperty(exec,propertyName);
 }
 
+bool ObjectImp::hasProperty(ExecState *exec, unsigned propertyName) const
+{
+  return hasProperty(exec, UString::from(propertyName));
+}
+
 // ECMA 8.6.2.5
 bool ObjectImp::deleteProperty(ExecState */*exec*/, const UString &propertyName)
 {
@@ -386,6 +280,11 @@ bool ObjectImp::deleteProperty(ExecState */*exec*/, const UString &propertyName)
   return true;
 }
 
+bool ObjectImp::deleteProperty(ExecState *exec, unsigned propertyName)
+{
+  return deleteProperty(exec, UString::from(propertyName));
+}
+
 void ObjectImp::deleteAllProperties( ExecState * )
 {
   _prop->clear();
@@ -404,9 +303,9 @@ Value ObjectImp::defaultValue(ExecState *exec, Type hint) const
 
   Value v;
   if (hint == StringType)
-    v = get(exec,"toString");
+    v = get(exec,toStringPropertyName);
   else
-    v = get(exec,"valueOf");
+    v = get(exec,valueOfPropertyName);
 
   if (v.type() == ObjectType) {
     Object o = Object(static_cast<ObjectImp*>(v.imp()));
@@ -423,9 +322,9 @@ Value ObjectImp::defaultValue(ExecState *exec, Type hint) const
   }
 
   if (hint == StringType)
-    v = get(exec,"valueOf");
+    v = get(exec,valueOfPropertyName);
   else
-    v = get(exec,"toString");
+    v = get(exec,toStringPropertyName);
 
   if (v.type() == ObjectType) {
     Object o = Object(static_cast<ObjectImp*>(v.imp()));
@@ -545,9 +444,6 @@ void ObjectImp::setInternalValue(const Value &v)
   _internalValue = v.imp();
 }
 
-// The following functions simply call the corresponding functions in ValueImp
-// but are overridden in case of future needs
-
 Value ObjectImp::toPrimitive(ExecState *exec, Type preferredType) const
 {
   return defaultValue(exec,preferredType);
@@ -566,26 +462,6 @@ double ObjectImp::toNumber(ExecState *exec) const
   return prim.toNumber(exec);
 }
 
-int ObjectImp::toInteger(ExecState *exec) const
-{
-  return ValueImp::toInteger(exec);
-}
-
-int ObjectImp::toInt32(ExecState *exec) const
-{
-  return ValueImp::toInt32(exec);
-}
-
-unsigned int ObjectImp::toUInt32(ExecState *exec) const
-{
-  return ValueImp::toUInt32(exec);
-}
-
-unsigned short ObjectImp::toUInt16(ExecState *exec) const
-{
-  return ValueImp::toUInt16(exec);
-}
-
 UString ObjectImp::toString(ExecState *exec) const
 {
   Value prim = toPrimitive(exec,StringType);
@@ -669,3 +545,4 @@ Object Error::create(ExecState *exec, ErrorType errtype, const char *message,
 */
 }
 
+} // namespace KJS
diff --git a/JavaScriptCore/kjs/object.h b/JavaScriptCore/kjs/object.h
index c679249..c16c311 100644
--- a/JavaScriptCore/kjs/object.h
+++ b/JavaScriptCore/kjs/object.h
@@ -79,14 +79,12 @@ namespace KJS {
    */
   class Object : public Value {
   public:
-    Object();
+    Object() { }
     explicit Object(ObjectImp *v);
-    Object(const Object &v);
-    virtual ~Object();
+    
+    ObjectImp *imp() const;
 
-    Object& operator=(const Object &v);
-
-    virtual const ClassInfo *classInfo() const;
+    const ClassInfo *classInfo() const;
     bool inherits(const ClassInfo *cinfo) const;
 
     /**
@@ -132,6 +130,7 @@ namespace KJS {
      * @return The specified property, or Undefined
      */
     Value get(ExecState *exec, const UString &propertyName) const;
+    Value get(ExecState *exec, unsigned propertyName) const;
 
     /**
      * Sets the specified property.
@@ -144,6 +143,8 @@ namespace KJS {
      */
     void put(ExecState *exec, const UString &propertyName,
              const Value &value, int attr = None);
+    void put(ExecState *exec, unsigned propertyName,
+             const Value &value, int attr = None);
 
     /**
      * Used to check whether or not a particular property is allowed to be set
@@ -168,6 +169,7 @@ namespace KJS {
      * @return true if the object has the property, otherwise false
      */
     bool hasProperty(ExecState *exec, const UString &propertyName) const;
+    bool hasProperty(ExecState *exec, unsigned propertyName) const;
 
     /**
      * Removes the specified property from the object.
@@ -181,6 +183,7 @@ namespace KJS {
      * allowed.
      */
     bool deleteProperty(ExecState *exec, const UString &propertyName);
+    bool deleteProperty(ExecState *exec, unsigned propertyName);
 
     /**
      * Converts the object into a primitive value. The value return may differ
@@ -349,6 +352,8 @@ namespace KJS {
     void setInternalValue(const Value &v);
   };
 
+  inline Object Value::toObject(ExecState *exec) const { return rep->toObject(exec); }
+  
   class ObjectImp : public ValueImp {
   public:
     /**
@@ -466,6 +471,7 @@ namespace KJS {
      */
     // [[Get]] - must be implemented by all Objects
     virtual Value get(ExecState *exec, const UString &propertyName) const;
+    virtual Value get(ExecState *exec, unsigned propertyName) const;
 
     /**
      * Implementation of the [[Put]] internal property (implemented by all
@@ -475,6 +481,8 @@ namespace KJS {
      */
     virtual void put(ExecState *exec, const UString &propertyName,
                      const Value &value, int attr = None);
+    virtual void put(ExecState *exec, unsigned propertyName,
+                     const Value &value, int attr = None);
 
     /**
      * Implementation of the [[CanPut]] internal property (implemented by all
@@ -492,6 +500,7 @@ namespace KJS {
      */
     virtual bool hasProperty(ExecState *exec,
 			     const UString &propertyName) const;
+    virtual bool hasProperty(ExecState *exec, unsigned propertyName) const;
 
     /**
      * Implementation of the [[Delete]] internal property (implemented by all
@@ -501,6 +510,7 @@ namespace KJS {
      */
     virtual bool deleteProperty(ExecState *exec,
                                 const UString &propertyName);
+    virtual bool deleteProperty(ExecState *exec, unsigned propertyName);
 
     /**
      * Remove all properties from this object.
@@ -559,10 +569,6 @@ namespace KJS {
                       Type preferredType = UnspecifiedType) const;
     bool toBoolean(ExecState *exec) const;
     double toNumber(ExecState *exec) const;
-    int toInteger(ExecState *exec) const;
-    int toInt32(ExecState *exec) const;
-    unsigned int toUInt32(ExecState *exec) const;
-    unsigned short toUInt16(ExecState *exec) const;
     UString toString(ExecState *exec) const;
     Object toObject(ExecState *exec) const;
 
@@ -612,6 +618,90 @@ namespace KJS {
     static const char * const * const errorNames;
   };
 
+  inline Object::Object(ObjectImp *v) : Value(v) { }
+
+  inline ObjectImp *Object::imp() const { return static_cast<ObjectImp*>(rep); }
+
+  inline const ClassInfo *Object::classInfo() const
+    { return imp()->classInfo(); }
+
+  inline bool Object::inherits(const ClassInfo *cinfo) const
+    { return imp()->inherits(cinfo); }
+
+  inline Value Object::prototype() const
+    { return Value(imp()->prototype()); }
+
+  inline UString Object::className() const
+    { return imp()->className(); }
+
+  inline Value Object::get(ExecState *exec, const UString &propertyName) const
+    { return imp()->get(exec,propertyName); }
+
+  inline Value Object::get(ExecState *exec, unsigned propertyName) const
+    { return imp()->get(exec,propertyName); }
+
+  inline void Object::put(ExecState *exec, const UString &propertyName, const Value &value, int attr)
+    { imp()->put(exec,propertyName,value,attr); }
+
+  inline void Object::put(ExecState *exec, unsigned propertyName, const Value &value, int attr)
+    { imp()->put(exec,propertyName,value,attr); }
+
+  inline bool Object::canPut(ExecState *exec, const UString &propertyName) const
+    { return imp()->canPut(exec,propertyName); }
+
+  inline bool Object::hasProperty(ExecState *exec, const UString &propertyName) const
+    { return imp()->hasProperty(exec, propertyName); }
+
+  inline bool Object::hasProperty(ExecState *exec, unsigned propertyName) const
+    { return imp()->hasProperty(exec, propertyName); }
+
+  inline bool Object::deleteProperty(ExecState *exec, const UString &propertyName)
+    { return imp()->deleteProperty(exec,propertyName); }
+
+  inline bool Object::deleteProperty(ExecState *exec, unsigned propertyName)
+    { return imp()->deleteProperty(exec,propertyName); }
+
+  inline Value Object::defaultValue(ExecState *exec, Type hint) const
+    { return imp()->defaultValue(exec,hint); }
+
+  inline bool Object::implementsConstruct() const
+    { return imp()->implementsConstruct(); }
+
+  inline Object Object::construct(ExecState *exec, const List &args)
+    { return imp()->construct(exec,args); }
+
+  inline bool Object::implementsCall() const
+    { return imp()->implementsCall(); }
+
+  inline Value Object::call(ExecState *exec, Object &thisObj, const List &args)
+    { return imp()->call(exec,thisObj,args); }
+
+  inline bool Object::implementsHasInstance() const
+    { return imp()->implementsHasInstance(); }
+
+  inline Boolean Object::hasInstance(ExecState *exec, const Value &value)
+    { return imp()->hasInstance(exec,value); }
+
+  inline const List Object::scope() const
+    { return imp()->scope(); }
+
+  inline void Object::setScope(const List &s)
+    { imp()->setScope(s); }
+
+  inline List Object::propList(ExecState *exec, bool recursive)
+    { return imp()->propList(exec,recursive); }
+
+  inline Value Object::internalValue() const
+    { return imp()->internalValue(); }
+
+  inline void Object::setInternalValue(const Value &v)
+    { imp()->setInternalValue(v); }
+
+  extern const UString lengthPropertyName;
+  extern const UString prototypePropertyName;
+  extern const UString toStringPropertyName;
+  extern const UString valueOfPropertyName;
+
 }; // namespace
 
 #endif // _KJS_OBJECT_H_
diff --git a/JavaScriptCore/kjs/object_object.cpp b/JavaScriptCore/kjs/object_object.cpp
index 5326ba9..74ba0c6 100644
--- a/JavaScriptCore/kjs/object_object.cpp
+++ b/JavaScriptCore/kjs/object_object.cpp
@@ -38,8 +38,8 @@ ObjectPrototypeImp::ObjectPrototypeImp(ExecState *exec,
   : ObjectImp() // [[Prototype]] is Null()
 {
   Value protect(this);
-  put(exec,"toString", Object(new ObjectProtoFuncImp(exec,funcProto,ObjectProtoFuncImp::ToString, 0)), DontEnum);
-  put(exec,"valueOf",  Object(new ObjectProtoFuncImp(exec,funcProto,ObjectProtoFuncImp::ValueOf,  0)), DontEnum);
+  put(exec,toStringPropertyName, Object(new ObjectProtoFuncImp(exec,funcProto,ObjectProtoFuncImp::ToString, 0)), DontEnum);
+  put(exec,valueOfPropertyName,  Object(new ObjectProtoFuncImp(exec,funcProto,ObjectProtoFuncImp::ValueOf,  0)), DontEnum);
 }
 
 
@@ -51,7 +51,7 @@ ObjectProtoFuncImp::ObjectProtoFuncImp(ExecState *exec,
   : InternalFunctionImp(funcProto), id(i)
 {
   Value protect(this);
-  put(exec,"length",Number(len),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
 }
 
 
@@ -79,10 +79,10 @@ ObjectObjectImp::ObjectObjectImp(ExecState *exec,
 {
   Value protect(this);
   // ECMA 15.2.3.1
-  put(exec,"prototype", Object(objProto), DontEnum|DontDelete|ReadOnly);
+  put(exec,prototypePropertyName, Object(objProto), DontEnum|DontDelete|ReadOnly);
 
   // no. of arguments for constructor
-  put(exec,"length", Number(1), ReadOnly|DontDelete|DontEnum);
+  put(exec,lengthPropertyName, Number(1), ReadOnly|DontDelete|DontEnum);
 }
 
 
diff --git a/JavaScriptCore/kjs/regexp_object.cpp b/JavaScriptCore/kjs/regexp_object.cpp
index ecc8981..1a1af57 100644
--- a/JavaScriptCore/kjs/regexp_object.cpp
+++ b/JavaScriptCore/kjs/regexp_object.cpp
@@ -49,7 +49,7 @@ RegExpPrototypeImp::RegExpPrototypeImp(ExecState *exec,
 
   put(exec, "exec",     Object(new RegExpProtoFuncImp(exec,funcProto,RegExpProtoFuncImp::Exec,     0)), DontEnum);
   put(exec, "test",     Object(new RegExpProtoFuncImp(exec,funcProto,RegExpProtoFuncImp::Test,     0)), DontEnum);
-  put(exec, "toString", Object(new RegExpProtoFuncImp(exec,funcProto,RegExpProtoFuncImp::ToString, 0)), DontEnum);
+  put(exec, toStringPropertyName, Object(new RegExpProtoFuncImp(exec,funcProto,RegExpProtoFuncImp::ToString, 0)), DontEnum);
 }
 
 // ------------------------------ RegExpProtoFuncImp ---------------------------
@@ -59,7 +59,7 @@ RegExpProtoFuncImp::RegExpProtoFuncImp(ExecState *exec,
   : InternalFunctionImp(funcProto), id(i)
 {
   Value protect(this);
-  put(exec,"length",Number(len),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
 }
 
 bool RegExpProtoFuncImp::implementsCall() const
@@ -156,10 +156,10 @@ RegExpObjectImp::RegExpObjectImp(ExecState *exec,
 {
   Value protect(this);
   // ECMA 15.10.5.1 RegExp.prototype
-  put(exec,"prototype", Object(regProto), DontEnum|DontDelete|ReadOnly);
+  put(exec,prototypePropertyName, Object(regProto), DontEnum|DontDelete|ReadOnly);
 
   // no. of arguments for constructor
-  put(exec,"length", Number(2), ReadOnly|DontDelete|DontEnum);
+  put(exec,lengthPropertyName, Number(2), ReadOnly|DontDelete|DontEnum);
 }
 
 RegExpObjectImp::~RegExpObjectImp()
diff --git a/JavaScriptCore/kjs/string_object.cpp b/JavaScriptCore/kjs/string_object.cpp
index 3564876..52e3e5f 100644
--- a/JavaScriptCore/kjs/string_object.cpp
+++ b/JavaScriptCore/kjs/string_object.cpp
@@ -89,7 +89,7 @@ StringPrototypeImp::StringPrototypeImp(ExecState *exec,
 {
   Value protect(this);
   // The constructor will be added later, after StringObjectImp has been built
-  put(exec,"length",Number(0),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(0),DontDelete|ReadOnly|DontEnum);
 
 }
 
@@ -106,7 +106,7 @@ StringProtoFuncImp::StringProtoFuncImp(ExecState *exec, int i, int len)
     ), id(i)
 {
   Value protect(this);
-  put(exec,"length",Number(len),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum);
 }
 
 bool StringProtoFuncImp::implementsCall() const
@@ -342,7 +342,7 @@ Value StringProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &arg
       RegExp reg(obj0.get(exec,"source").toString(exec));
       if (u.isEmpty() && !reg.match(u, 0).isNull()) {
 	// empty string matched by regexp -> empty array
-	res.put(exec,"length", Number(0));
+	res.put(exec,lengthPropertyName, Number(0));
 	break;
       }
       pos = 0;
@@ -356,7 +356,7 @@ Value StringProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &arg
 	  break;
 	pos = mpos + (mstr.isEmpty() ? 1 : mstr.size());
 	if (mpos != p0 || !mstr.isEmpty()) {
-	  res.put(exec,UString::from(i), String(u.substr(p0, mpos-p0)));
+	  res.put(exec,i, String(u.substr(p0, mpos-p0)));
 	  p0 = mpos + mstr.size();
 	  i++;
 	}
@@ -366,15 +366,15 @@ Value StringProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &arg
       if (u2.isEmpty()) {
 	if (u.isEmpty()) {
 	  // empty separator matches empty string -> empty array
-	  put(exec,"length", Number(0));
+	  put(exec,lengthPropertyName, Number(0));
 	  break;
 	} else {
 	  while (i != d && i < u.size()-1)
-	    res.put(exec,UString::from(i++), String(u.substr(p0++, 1)));
+	    res.put(exec, i++, String(u.substr(p0++, 1)));
 	}
       } else {
 	while (i != d && (pos = u.find(u2, p0)) >= 0) {
-	  res.put(exec,UString::from(i), String(u.substr(p0, pos-p0)));
+	  res.put(exec, i, String(u.substr(p0, pos-p0)));
 	  p0 = pos + u2.size();
 	  i++;
 	}
@@ -382,8 +382,8 @@ Value StringProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &arg
     }
     // add remaining string, if any
     if (i != d)
-      res.put(exec,UString::from(i++), String(u.substr(p0)));
-    res.put(exec,"length", Number(i));
+      res.put(exec, i++, String(u.substr(p0)));
+    res.put(exec,lengthPropertyName, Number(i));
     }
     break;
   case Substr: {
@@ -497,12 +497,13 @@ StringObjectImp::StringObjectImp(ExecState *exec,
 {
   Value protect(this);
   // ECMA 15.5.3.1 String.prototype
-  put(exec,"prototype", Object(stringProto), DontEnum|DontDelete|ReadOnly);
+  put(exec,prototypePropertyName, Object(stringProto), DontEnum|DontDelete|ReadOnly);
 
-  put(exec,"fromCharCode", Object(new StringObjectFuncImp(exec,funcProto)), DontEnum);
+  static UString fromCharCode("fromCharCode");
+  put(exec,fromCharCode, Object(new StringObjectFuncImp(exec,funcProto)), DontEnum);
 
   // no. of arguments for constructor
-  put(exec,"length", Number(1), ReadOnly|DontDelete|DontEnum);
+  put(exec,lengthPropertyName, Number(1), ReadOnly|DontDelete|DontEnum);
 }
 
 
@@ -524,7 +525,7 @@ Object StringObjectImp::construct(ExecState *exec, const List &args)
     s = UString("");
 
   obj.setInternalValue(String(s));
-  obj.put(exec, "length", Number(s.size()), ReadOnly|DontEnum|DontDelete);
+  obj.put(exec, lengthPropertyName, Number(s.size()), ReadOnly|DontEnum|DontDelete);
 
   return obj;
 }
@@ -552,7 +553,7 @@ StringObjectFuncImp::StringObjectFuncImp(ExecState *exec, FunctionPrototypeImp *
   : InternalFunctionImp(funcProto)
 {
   Value protect(this);
-  put(exec,"length",Number(1),DontDelete|ReadOnly|DontEnum);
+  put(exec,lengthPropertyName,Number(1),DontDelete|ReadOnly|DontEnum);
 }
 
 bool StringObjectFuncImp::implementsCall() const
diff --git a/JavaScriptCore/kjs/types.cpp b/JavaScriptCore/kjs/types.cpp
index c6645c8..ece3cdd 100644
--- a/JavaScriptCore/kjs/types.cpp
+++ b/JavaScriptCore/kjs/types.cpp
@@ -45,27 +45,19 @@ Reference::Reference(const Object& b, const UString& p)
 {
 }
 
-Reference::Reference(const Null& b, const UString& p)
+Reference::Reference(const Object& b, unsigned p)
   : Value(new ReferenceImp(b,p))
 {
 }
 
-Reference::Reference(ReferenceImp *v) : Value(v)
-{
-}
-
-Reference::Reference(const Reference &v) : Value(v)
-{
-}
-
-Reference::~Reference()
+Reference::Reference(const Null& b, const UString& p)
+  : Value(new ReferenceImp(b,p))
 {
 }
 
-Reference& Reference::operator=(const Reference &v)
+Reference::Reference(const Null& b, unsigned p)
+  : Value(new ReferenceImp(b,p))
 {
-  Value::operator=(v);
-  return *this;
 }
 
 Reference Reference::dynamicCast(const Value &v)
@@ -89,20 +81,6 @@ ListIterator::ListIterator(const List &l)
 {
 }
 
-ListIterator& ListIterator::operator=(const ListIterator &iterator)
-{
-  node=iterator.node;
-  return *this;
-}
-
-ListIterator::ListIterator(const ListIterator &i) : node(i.node)
-{
-}
-
-ListIterator::~ListIterator()
-{
-}
-
 ValueImp* ListIterator::operator->() const
 {
   return node->member;
@@ -159,28 +137,6 @@ List::List()
   //fprintf(stderr,"List::List() this=%p imp=%p refcount=%d\n",this,rep,rep->refcount);
 }
 
-List::List(ListImp *v) : Value(v)
-{
-  //fprintf(stderr,"List::List(imp) this=%p imp=%p refcount=%d\n",this,v,v?v->refcount:0);
-}
-
-List::List(const List &v) : Value(v)
-{
-  //fprintf(stderr,"List::List(List) this=%p imp=%p refcount=%d\n",this,rep,rep?rep->refcount:0);
-}
-
-List::~List()
-{
-  //fprintf(stderr,"List::~List() this=%p imp=%p refcount=%d\n",this,rep,rep->refcount-1);
-}
-
-List& List::operator=(const List &v)
-{
-  //fprintf(stderr,"List::operator=() this=%p\n",this);
-  Value::operator=(v);
-  return *this;
-}
-
 List List::dynamicCast(const Value &v)
 {
   if (v.isNull() || v.type() != ListType)
@@ -285,24 +241,6 @@ Completion::Completion(ComplType c, const Value& v, const UString &t)
 {
 }
 
-Completion::Completion(CompletionImp *v) : Value(v)
-{
-}
-
-Completion::Completion(const Completion &v) : Value(v)
-{
-}
-
-Completion::~Completion()
-{
-}
-
-Completion& Completion::operator=(const Completion &v)
-{
-  Value::operator=(v);
-  return *this;
-}
-
 Completion Completion::dynamicCast(const Value &v)
 {
   if (v.isNull() || v.type() != CompletionType)
diff --git a/JavaScriptCore/kjs/types.h b/JavaScriptCore/kjs/types.h
index 71df730..3d01e70 100644
--- a/JavaScriptCore/kjs/types.h
+++ b/JavaScriptCore/kjs/types.h
@@ -33,12 +33,10 @@ namespace KJS {
   class Reference : public Value {
   public:
     Reference(const Object& b, const UString& p);
+    Reference(const Object& b, unsigned p);
     Reference(const Null& b, const UString& p);
+    Reference(const Null& b, unsigned p);
     Reference(ReferenceImp *v);
-    Reference(const Reference &v);
-    virtual ~Reference();
-
-    Reference& operator=(const Reference &v);
 
     /**
      * Converts a Value into an Reference. If the value's type is not
@@ -71,15 +69,6 @@ namespace KJS {
      */
     ListIterator(const List &l);
     /**
-     * Assignment constructor.
-     */
-    ListIterator& operator=(const ListIterator &iterator);
-    /**
-     * Copy constructor.
-     */
-    ListIterator(const ListIterator &i);
-    ~ListIterator();
-    /**
      * Dereference the iterator.
      * @return A pointer to the element the iterator operates on.
      */
@@ -138,10 +127,6 @@ namespace KJS {
   public:
     List();
     List(ListImp *v);
-    List(const List &v);
-    virtual ~List();
-
-    List& operator=(const List &v);
 
     /**
      * Converts a Value into an List. If the value's type is not
@@ -254,10 +239,6 @@ namespace KJS {
     Completion(ComplType c = Normal, const Value& v = Value(),
                const UString &t = UString::null);
     Completion(CompletionImp *v);
-    Completion(const Completion &v);
-    virtual ~Completion();
-
-    Completion& operator=(const Completion &v);
 
     /**
      * Converts a Value into an Completion. If the value's type is not
diff --git a/JavaScriptCore/kjs/ustring.cpp b/JavaScriptCore/kjs/ustring.cpp
index e725cd4..0991b47 100644
--- a/JavaScriptCore/kjs/ustring.cpp
+++ b/JavaScriptCore/kjs/ustring.cpp
@@ -115,6 +115,7 @@ bool KJS::operator==(const KJS::CString& c1, const KJS::CString& c2)
 
 UChar UChar::null;
 UString::Rep UString::Rep::null = { 0, 0, 0, 1 };
+UString::Rep UString::Rep::empty = { 0, 0, 0, 1 };
 UString UString::null;
 const int normalStatBufferSize = 4096;
 static char *statBuffer = 0;
@@ -190,6 +191,10 @@ UString::UString(const char *c)
     return;
   }
   int length = strlen(c);
+  if (length == 0) {
+    attach(&Rep::empty);
+    return;
+  }
   UChar *d = new UChar[length];
   for (int i = 0; i < length; i++)
     d[i].uc = c[i];
@@ -198,6 +203,10 @@ UString::UString(const char *c)
 
 UString::UString(const UChar *c, int length)
 {
+  if (length == 0) {
+    attach(&Rep::empty);
+    return;
+  }
   UChar *d = new UChar[length];
   memcpy(d, c, length * sizeof(UChar));
   rep = Rep::create(d, length);
@@ -205,6 +214,10 @@ UString::UString(const UChar *c, int length)
 
 UString::UString(UChar *c, int length, bool copy)
 {
+  if (length == 0) {
+    attach(&Rep::empty);
+    return;
+  }
   UChar *d;
   if (copy) {
     d = new UChar[length];
@@ -223,10 +236,15 @@ UString::UString(const UString &a, const UString &b)
 {
   int aSize = a.size();
   int bSize = b.size();
-  UChar *d = new UChar[aSize + bSize];
+  int length = aSize + bSize;
+  if (length == 0) {
+    attach(&Rep::empty);
+    return;
+  }
+  UChar *d = new UChar[length];
   memcpy(d, a.data(), aSize * sizeof(UChar));
   memcpy(d + aSize, b.data(), bSize * sizeof(UChar));
-  rep = Rep::create(d, aSize + bSize);
+  rep = Rep::create(d, length);
 }
 
 UString UString::from(int i)
@@ -466,14 +484,27 @@ unsigned long UString::toULong(bool *ok) const
 
 int UString::find(const UString &f, int pos) const
 {
-  if (isNull())
+  if (size() < f.size())
     return -1;
-  long fsize = f.size() * sizeof(UChar);
   if (pos < 0)
     pos = 0;
   const UChar *end = data() + size() - f.size();
+  long fsize = f.size() * sizeof(UChar);
+  const void *fdata = f.data();
   for (const UChar *c = data() + pos; c <= end; c++)
-    if (!memcmp((void*)c, (void*)f.data(), fsize))
+    if (!memcmp(c, fdata, fsize))
+      return (c-data());
+
+  return -1;
+}
+
+int UString::find(UChar ch, int pos) const
+{
+  if (pos < 0)
+    pos = 0;
+  const UChar *end = data() + size();
+  for (const UChar *c = data() + pos; c < end; c++)
+    if (*c == ch)
       return (c-data());
 
   return -1;
@@ -481,13 +512,28 @@ int UString::find(const UString &f, int pos) const
 
 int UString::rfind(const UString &f, int pos) const
 {
-  if (isNull())
+  if (size() < f.size())
     return -1;
   if (pos + f.size() >= size())
     pos = size() - f.size();
   long fsize = f.size() * sizeof(UChar);
+  const void *fdata = f.data();
   for (const UChar *c = data() + pos; c >= data(); c--) {
-    if (!memcmp((void*)c, (void*)f.data(), fsize))
+    if (!memcmp(c, fdata, fsize))
+      return (c-data());
+  }
+
+  return -1;
+}
+
+int UString::rfind(UChar ch, int pos) const
+{
+  if (isEmpty())
+    return -1;
+  if (pos + 1 >= size())
+    pos = size() - 1;
+  for (const UChar *c = data() + pos; c >= data(); c--) {
+    if (*c == ch)
       return (c-data());
   }
 
@@ -496,8 +542,6 @@ int UString::rfind(const UString &f, int pos) const
 
 UString UString::substr(int pos, int len) const
 {
-  if (isNull())
-    return UString();
   if (pos < 0)
     pos = 0;
   else if (pos >= (int) size())
@@ -551,15 +595,16 @@ bool KJS::operator==(const UString& s1, const UString& s2)
 
 bool KJS::operator==(const UString& s1, const char *s2)
 {
-  if (s2 == 0L && s1.isNull())
-    return true;
+  if (s2 == 0) {
+    return s1.isEmpty();
+  }
 
-  if (s1.size() != (int) strlen(s2))
+  if (s1.size() != (int)strlen(s2))
     return false;
 
   const UChar *u = s1.data();
   while (*s2) {
-    if (u->uc != *s2 )
+    if (u->uc != (unsigned char)*s2)
       return false;
     s2++;
     u++;
@@ -582,7 +627,7 @@ bool KJS::operator<(const UString& s1, const UString& s2)
     l++;
   }
   if (l < lmin)
-    return (c1->unicode() < c2->unicode());
+    return (c1->uc < c2->uc);
 
   return (l1 < l2);
 }
diff --git a/JavaScriptCore/kjs/ustring.h b/JavaScriptCore/kjs/ustring.h
index 67a6c4a..a1d1fa8 100644
--- a/JavaScriptCore/kjs/ustring.h
+++ b/JavaScriptCore/kjs/ustring.h
@@ -215,6 +215,7 @@ namespace KJS {
       int capacity;
       int rc;
       static Rep null;
+      static Rep empty;
     };
 
   public:
@@ -225,7 +226,7 @@ namespace KJS {
     /**
      * Constructs a string from the single character c.
      */
-    UString(char c);
+    explicit UString(char c);
     /**
      * Constructs a string from a classical zero determined char string.
      */
@@ -315,9 +316,6 @@ namespace KJS {
      * Assignment operator.
      */
     UString &operator=(const char *c);
-    /**
-     * Assignment operator.
-     */
     UString &operator=(const UString &);
     /**
      * Appends the specified string.
@@ -375,12 +373,14 @@ namespace KJS {
      * -1 if the search was not successful.
      */
     int find(const UString &f, int pos = 0) const;
+    int find(UChar, int pos = 0) const;
     /**
      * @return Position of first occurence of f searching backwards from
      * position pos.
      * -1 if the search was not successful.
      */
     int rfind(const UString &f, int pos) const;
+    int rfind(UChar, int pos) const;
     /**
      * @return The sub string starting at position pos and length len.
      */
diff --git a/JavaScriptCore/kjs/value.cpp b/JavaScriptCore/kjs/value.cpp
index e15f423..cff7d3c 100644
--- a/JavaScriptCore/kjs/value.cpp
+++ b/JavaScriptCore/kjs/value.cpp
@@ -82,14 +82,26 @@ void ValueImp::operator delete(void*)
   // Do nothing. So far.
 }
 
+bool ValueImp::toUInt32(unsigned&) const
+{
+  return false;
+}
+
 // ECMA 9.4
 int ValueImp::toInteger(ExecState *exec) const
 {
+  unsigned i;
+  if (toUInt32(i))
+    return (int)i;
   return int(roundValue(exec, Value(const_cast<ValueImp*>(this))));
 }
 
 int ValueImp::toInt32(ExecState *exec) const
 {
+  unsigned i;
+  if (toUInt32(i))
+    return (int)i;
+
   double d = roundValue(exec, Value(const_cast<ValueImp*>(this)));
   double d32 = fmod(d, D32);
 
@@ -101,6 +113,10 @@ int ValueImp::toInt32(ExecState *exec) const
 
 unsigned int ValueImp::toUInt32(ExecState *exec) const
 {
+  unsigned i;
+  if (toUInt32(i))
+    return i;
+
   double d = roundValue(exec, Value(const_cast<ValueImp*>(this)));
   double d32 = fmod(d, D32);
 
@@ -109,6 +125,10 @@ unsigned int ValueImp::toUInt32(ExecState *exec) const
 
 unsigned short ValueImp::toUInt16(ExecState *exec) const
 {
+  unsigned i;
+  if (toUInt32(i))
+    return (unsigned short)i;
+
   double d = roundValue(exec, Value(const_cast<ValueImp*>(this)));
   double d16 = fmod(d, D16);
 
@@ -118,93 +138,41 @@ unsigned short ValueImp::toUInt16(ExecState *exec) const
 // ECMA 8.7.1
 Value ValueImp::getBase(ExecState *exec) const
 {
-  if (type() != ReferenceType) {
-    Object err = Error::create(exec, ReferenceError, I18N_NOOP("Invalid reference base"));
-    exec->setException(err);
-    return err;
-  }
-
-  return (static_cast<const ReferenceImp*>(this))->getBase();
+  Object err = Error::create(exec, ReferenceError, I18N_NOOP("Invalid reference base"));
+  exec->setException(err);
+  return err;
 }
 
 // ECMA 8.7.2
 UString ValueImp::getPropertyName(ExecState * /*exec*/) const
 {
-  if (type() != ReferenceType)
-    // the spec wants a runtime error here. But getValue() and putValue()
-    // will catch this case on their own earlier. When returning a Null
-    // string we should be on the safe side.
-    return UString();
-
-  return (static_cast<const ReferenceImp*>(this))->getPropertyName();
+  // the spec wants a runtime error here. But getValue() and putValue()
+  // will catch this case on their own earlier. When returning a Null
+  // string we should be on the safe side.
+  return UString();
 }
 
 // ECMA 8.7.1
 Value ValueImp::getValue(ExecState *exec) const
 {
-  if (type() != ReferenceType)
-    return Value(const_cast<ValueImp*>(this));
-
-  Value o = getBase(exec);
-
-  if (o.isNull() || o.type() == NullType) {
-    UString m = I18N_NOOP("Can't find variable: ") + getPropertyName(exec);
-    Object err = Error::create(exec, ReferenceError, m.ascii());
-    exec->setException(err);
-    return err;
-  }
-
-  if (o.type() != ObjectType) {
-    UString m = I18N_NOOP("Base is not an object");
-    Object err = Error::create(exec, ReferenceError, m.ascii());
-    exec->setException(err);
-    return err;
-  }
-
-  return static_cast<ObjectImp*>(o.imp())->get(exec,getPropertyName(exec));
-}
-
-void ValueImp::putValue(ExecState *exec, const Value w)
-{
-  if (type() != ReferenceType) {
-    Object err = Error::create(exec,ReferenceError);
-    exec->setException(err);
-    return;
-  }
-
-#ifdef KJS_VERBOSE
-  printInfo(exec,(UString("setting property ")+getPropertyName(exec)).cstring().c_str(),w);
-#endif
-  Value o = getBase(exec);
-  if (o.type() == NullType)
-    exec->interpreter()->globalObject().put(exec,getPropertyName(exec), w);
-  else {
-    static_cast<ObjectImp*>(o.imp())->put(exec,getPropertyName(exec), w);
-  }
-
-  return;
+  return Value(const_cast<ValueImp*>(this));
 }
 
-bool KJS::operator==(const Value &v1, const Value &v2)
+void ValueImp::putValue(ExecState *exec, const Value& w)
 {
-  return (v1.imp() == v2.imp());
+  Object err = Error::create(exec,ReferenceError);
+  exec->setException(err);
 }
 
-bool KJS::operator!=(const Value &v1, const Value &v2)
+bool ValueImp::deleteValue(ExecState *exec)
 {
-  return (v1.imp() != v2.imp());
+  Object err = Error::create(exec,ReferenceError);
+  exec->setException(err);
+  return false;
 }
 
-
-
-
 // ------------------------------ Value ----------------------------------------
 
-Value::Value()
-{
-  rep = 0;
-}
-
 Value::Value(ValueImp *v)
 {
   rep = v;
@@ -250,114 +218,12 @@ Value& Value::operator=(const Value &v)
   return *this;
 }
 
-bool Value::isNull() const
-{
-  return (rep == 0);
-}
-
-ValueImp *Value::imp() const
-{
-  return rep;
-}
-
-Type Value::type() const
-{
-  return rep->type();
-}
-
-bool Value::isA(Type t) const
-{
-  return (type() == t);
-}
-
-Value Value::toPrimitive(ExecState *exec, Type preferredType) const
-{
-  return rep->toPrimitive(exec,preferredType);
-}
-
-bool Value::toBoolean(ExecState *exec) const
-{
-  return rep->toBoolean(exec);
-}
-
-double Value::toNumber(ExecState *exec) const
-{
-  return rep->toNumber(exec);
-}
-
-int Value::toInteger(ExecState *exec) const
-{
-  return rep->toInteger(exec);
-}
-
-int Value::toInt32(ExecState *exec) const
-{
-  return rep->toInt32(exec);
-}
-
-unsigned int Value::toUInt32(ExecState *exec) const
-{
-  return rep->toUInt32(exec);
-}
-
-unsigned short Value::toUInt16(ExecState *exec) const
-{
-  return rep->toUInt16(exec);
-}
-
-UString Value::toString(ExecState *exec) const
-{
-  return rep->toString(exec);
-}
-
-Object Value::toObject(ExecState *exec) const
-{
-  return rep->toObject(exec);
-}
-
-Value Value::getBase(ExecState *exec) const
-{
-  return rep->getBase(exec);
-}
-
-UString Value::getPropertyName(ExecState *exec) const
-{
-  return rep->getPropertyName(exec);
-}
-
-Value Value::getValue(ExecState *exec) const
-{
-  return rep->getValue(exec);
-}
-
-void Value::putValue(ExecState *exec, const Value w)
-{
-  rep->putValue(exec,w);
-}
-
 // ------------------------------ Undefined ------------------------------------
 
 Undefined::Undefined() : Value(UndefinedImp::staticUndefined)
 {
 }
 
-Undefined::~Undefined() {
-}
-
-Undefined::Undefined(UndefinedImp *v) : Value(v)
-{
-}
-
-Undefined::Undefined(const Undefined &v) : Value(v)
-{
-}
-
-Undefined& Undefined::operator=(const Undefined &v)
-{
-  Value::operator=(v);
-  return *this;
-}
-
 Undefined Undefined::dynamicCast(const Value &v)
 {
   if (v.isNull() || v.type() != UndefinedType)
@@ -372,24 +238,6 @@ Null::Null() : Value(NullImp::staticNull)
 {
 }
 
-Null::~Null() {
-}
-
-
-Null::Null(NullImp *v) : Value(v)
-{
-}
-
-Null::Null(const Null &v) : Value(v)
-{
-}
-
-Null& Null::operator=(const Null &v)
-{
-  Value::operator=(v);
-  return *this;
-}
-
 Null Null::dynamicCast(const Value &v)
 {
   if (v.isNull() || v.type() != NullType)
@@ -405,25 +253,6 @@ Boolean::Boolean(bool b)
 {
 }
 
-Boolean::~Boolean() { }
-
-
-
-Boolean::Boolean(BooleanImp *v) : Value(v)
-{
-}
-
-Boolean::Boolean(const Boolean &v) : Value(v)
-{
-}
-
-Boolean& Boolean::operator=(const Boolean &v)
-{
-  Value::operator=(v);
-  return *this;
-}
-
-
 bool Boolean::value() const
 {
   assert(rep);
@@ -444,22 +273,6 @@ String::String(const UString &s) : Value(new StringImp(UString(s)))
 {
 }
 
-String::~String() { }
-
-String::String(StringImp *v) : Value(v)
-{
-}
-
-String::String(const String &v) : Value(v)
-{
-}
-
-String& String::operator=(const String &v)
-{
-  Value::operator=(v);
-  return *this;
-}
-
 UString String::value() const
 {
   assert(rep);
@@ -491,22 +304,6 @@ Number::Number(long int l)
 Number::Number(long unsigned int l)
   : Value(new NumberImp(static_cast<double>(l))) { }
 
-Number::~Number() { }
-
-Number::Number(NumberImp *v) : Value(v)
-{
-}
-
-Number::Number(const Number &v) : Value(v)
-{
-}
-
-Number& Number::operator=(const Number &v)
-{
-  Value::operator=(v);
-  return *this;
-}
-
 Number Number::dynamicCast(const Value &v)
 {
   if (v.isNull() || v.type() != NumberType)
@@ -535,4 +332,3 @@ bool Number::isInf() const
 {
   return KJS::isInf(value());
 }
-
diff --git a/JavaScriptCore/kjs/value.h b/JavaScriptCore/kjs/value.h
index e24d79c..f2aacd5 100644
--- a/JavaScriptCore/kjs/value.h
+++ b/JavaScriptCore/kjs/value.h
@@ -114,23 +114,26 @@ namespace KJS {
 
     // The conversion operations
 
-    virtual Value toPrimitive(ExecState *exec,
-                              Type preferredType = UnspecifiedType) const = 0;
+    virtual Value toPrimitive(ExecState *exec, Type preferredType = UnspecifiedType) const = 0;
     virtual bool toBoolean(ExecState *exec) const = 0;
     virtual double toNumber(ExecState *exec) const = 0;
-    virtual int toInteger(ExecState *exec) const;
-    virtual int toInt32(ExecState *exec) const;
-    virtual unsigned int toUInt32(ExecState *exec) const;
-    virtual unsigned short toUInt16(ExecState *exec) const;
     virtual UString toString(ExecState *exec) const = 0;
     virtual Object toObject(ExecState *exec) const = 0;
 
+    virtual bool toUInt32(unsigned&) const;
+    
+    int toInteger(ExecState *exec) const;
+    int toInt32(ExecState *exec) const;
+    unsigned int toUInt32(ExecState *exec) const;
+    unsigned short toUInt16(ExecState *exec) const;
+
     // Reference operations
 
     virtual Value getBase(ExecState *exec) const;
     virtual UString getPropertyName(ExecState *exec) const;
     virtual Value getValue(ExecState *exec) const;
-    virtual void putValue(ExecState *exec, const Value w);
+    virtual void putValue(ExecState *exec, const Value& w);
+    virtual bool deleteValue(ExecState *exec);
 
   private:
     enum {
@@ -142,6 +145,10 @@ namespace KJS {
 
     ValueImpPrivate *_vd;
     unsigned int _flags;
+    
+    // Give a compile time error if we try to copy one of these.
+    ValueImp(const ValueImp&);
+    ValueImp& operator=(const ValueImp&);
   };
 
   /**
@@ -161,14 +168,14 @@ namespace KJS {
    */
   class Value {
   public:
-    Value();
+    Value() : rep(0) { }
     explicit Value(ValueImp *v);
     Value(const Value &v);
-    virtual ~Value();
+    ~Value();
 
     Value& operator=(const Value &v);
-    bool isNull() const;
-    ValueImp *imp() const;
+    bool isNull() const { return rep == 0; }
+    ValueImp *imp() const { return rep; }
 
     /**
      * Returns the type of value. This is one of UndefinedType, NullType,
@@ -177,7 +184,7 @@ namespace KJS {
      *
      * @return The type of value
      */
-    Type type() const;
+    Type type() const { return rep->type(); }
 
     /**
      * Checks whether or not the value is of a particular tpye
@@ -185,49 +192,50 @@ namespace KJS {
      * @param The type to compare with
      * @return true if the value is of the specified type, otherwise false
      */
-    bool isA(Type t) const;
+    bool isA(Type t) const { return rep->type() == t; }
 
     /**
      * Performs the ToPrimitive type conversion operation on this value
      * (ECMA 9.1)
      */
     Value toPrimitive(ExecState *exec,
-                      Type preferredType = UnspecifiedType) const;
+                      Type preferredType = UnspecifiedType) const
+      { return rep->toPrimitive(exec, preferredType); }
 
     /**
      * Performs the ToBoolean type conversion operation on this value (ECMA 9.2)
      */
-    bool toBoolean(ExecState *exec) const;
+    bool toBoolean(ExecState *exec) const { return rep->toBoolean(exec); }
 
     /**
      * Performs the ToNumber type conversion operation on this value (ECMA 9.3)
      */
-    double toNumber(ExecState *exec) const;
+    double toNumber(ExecState *exec) const { return rep->toNumber(exec); }
 
     /**
      * Performs the ToInteger type conversion operation on this value (ECMA 9.4)
      */
-    int toInteger(ExecState *exec) const;
+    int toInteger(ExecState *exec) const { return rep->toInteger(exec); }
 
     /**
      * Performs the ToInt32 type conversion operation on this value (ECMA 9.5)
      */
-    int toInt32(ExecState *exec) const;
+    int toInt32(ExecState *exec) const { return rep->toInt32(exec); }
 
     /**
      * Performs the ToUint32 type conversion operation on this value (ECMA 9.6)
      */
-    unsigned int toUInt32(ExecState *exec) const;
+    unsigned int toUInt32(ExecState *exec) const { return rep->toUInt32(exec); }
 
     /**
      * Performs the ToUint16 type conversion operation on this value (ECMA 9.7)
      */
-    unsigned short toUInt16(ExecState *exec) const;
+    unsigned short toUInt16(ExecState *exec) const { return rep->toUInt16(exec); }
 
     /**
      * Performs the ToString type conversion operation on this value (ECMA 9.8)
      */
-    UString toString(ExecState *exec) const;
+    UString toString(ExecState *exec) const { return rep->toString(exec); }
 
     /**
      * Performs the ToObject type conversion operation on this value (ECMA 9.9)
@@ -240,33 +248,36 @@ namespace KJS {
      * Since references are supposed to have an Object or null as their base,
      * this method is guaranteed to return either Null() or an Object value.
      */
-    Value getBase(ExecState *exec) const;
+    Value getBase(ExecState *exec) const { return rep->getBase(exec); }
 
     /**
      * Performs the GetPropertyName type conversion operation on this value
      * (ECMA 8.7)
      */
-    UString getPropertyName(ExecState *exec) const;
+    UString getPropertyName(ExecState *exec) const { return rep->getPropertyName(exec); }
 
     /**
      * Performs the GetValue type conversion operation on this value
      * (ECMA 8.7.1)
      */
-    Value getValue(ExecState *exec) const;
+    Value getValue(ExecState *exec) const { return rep->getValue(exec); }
 
     /**
      * Performs the PutValue type conversion operation on this value
      * (ECMA 8.7.1)
      */
-    void putValue(ExecState *exec, const Value w);
+    void putValue(ExecState *exec, const Value &w) { rep->putValue(exec, w); }
+    bool deleteValue(ExecState *exec) { return rep->deleteValue(exec); }
+
+    /**
+     * Checks if we can do a lossless conversion to UInt32.
+     */
+    bool toUInt32(unsigned& i) const { return rep->toUInt32(i); }
 
   protected:
     ValueImp *rep;
   };
 
-  bool operator==(const Value &v1, const Value &v2);
-  bool operator!=(const Value &v1, const Value &v2);
-
   // Primitive types
 
   /**
@@ -277,10 +288,6 @@ namespace KJS {
   class Undefined : public Value {
   public:
     Undefined();
-    Undefined(const Undefined &v);
-    virtual ~Undefined();
-
-    Undefined& operator=(const Undefined &v);
 
     /**
      * Converts a Value into an Undefined. If the value's type is not
@@ -306,10 +313,6 @@ namespace KJS {
   class Null : public Value {
   public:
     Null();
-    Null(const Null &v);
-    virtual ~Null();
-
-    Null& operator=(const Null &v);
 
     /**
      * Converts a Value into an Null. If the value's type is not NullType,
@@ -332,10 +335,6 @@ namespace KJS {
   class Boolean : public Value {
   public:
     Boolean(bool b = false);
-    Boolean(const Boolean &v);
-    virtual ~Boolean();
-
-    Boolean& operator=(const Boolean &v);
 
     /**
      * Converts a Value into an Boolean. If the value's type is not BooleanType,
@@ -360,10 +359,6 @@ namespace KJS {
   class String : public Value {
   public:
     String(const UString &s = "");
-    String(const String &v);
-    virtual ~String();
-
-    String& operator=(const String &v);
 
     /**
      * Converts a Value into an String. If the value's type is not StringType,
@@ -395,10 +390,6 @@ namespace KJS {
     Number(double d = 0.0);
     Number(long int l);
     Number(long unsigned int l);
-    Number(const Number &v);
-    virtual ~Number();
-
-    Number& operator=(const Number &v);
 
     double value() const;
     int intValue() const;
diff --git a/WebCore/ChangeLog-2002-12-03 b/WebCore/ChangeLog-2002-12-03
index 94c801d..fee0427 100644
--- a/WebCore/ChangeLog-2002-12-03
+++ b/WebCore/ChangeLog-2002-12-03
@@ -1,5 +1,11 @@
 2002-08-12  Darin Adler  <darin at apple.com>
 
+        * force-clean-timestamp: Need a full build because of KJS changes.
+        * khtml/ecma/kjs_window.h: Need to store an Object, not an ObjectImp, because there's no way
+	to copy an ObjectImp. KJS changes caught this mistake.
+
+2002-08-12  Darin Adler  <darin at apple.com>
+
 	- re-fixed 2948387 -- stop button flashes to "go" two extra times while loading citibank.com
 
 	It turns out Maciej and I rebroke this when we made the "completed" code run.
diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index 94c801d..fee0427 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,5 +1,11 @@
 2002-08-12  Darin Adler  <darin at apple.com>
 
+        * force-clean-timestamp: Need a full build because of KJS changes.
+        * khtml/ecma/kjs_window.h: Need to store an Object, not an ObjectImp, because there's no way
+	to copy an ObjectImp. KJS changes caught this mistake.
+
+2002-08-12  Darin Adler  <darin at apple.com>
+
 	- re-fixed 2948387 -- stop button flashes to "go" two extra times while loading citibank.com
 
 	It turns out Maciej and I rebroke this when we made the "completed" code run.
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index 94c801d..fee0427 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,5 +1,11 @@
 2002-08-12  Darin Adler  <darin at apple.com>
 
+        * force-clean-timestamp: Need a full build because of KJS changes.
+        * khtml/ecma/kjs_window.h: Need to store an Object, not an ObjectImp, because there's no way
+	to copy an ObjectImp. KJS changes caught this mistake.
+
+2002-08-12  Darin Adler  <darin at apple.com>
+
 	- re-fixed 2948387 -- stop button flashes to "go" two extra times while loading citibank.com
 
 	It turns out Maciej and I rebroke this when we made the "completed" code run.
diff --git a/WebCore/force-clean-timestamp b/WebCore/force-clean-timestamp
index 640ae12..025bbe8 100644
--- a/WebCore/force-clean-timestamp
+++ b/WebCore/force-clean-timestamp
@@ -1 +1 @@
-JavaScriptCore changes 8/9
+JavaScriptCore changes 8/12
diff --git a/WebCore/khtml/ecma/kjs_window.h b/WebCore/khtml/ecma/kjs_window.h
index 1eeed88..1061da4 100644
--- a/WebCore/khtml/ecma/kjs_window.h
+++ b/WebCore/khtml/ecma/kjs_window.h
@@ -140,7 +140,7 @@ namespace KJS {
     ~ScheduledAction();
     void execute(Window *window);
 
-    ObjectImp func;
+    Object func;
     List args;
     QString code;
     bool isFunction;

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list