diff --git a/JavaScriptCore/kjs/string_object.cpp b/JavaScriptCore/kjs/string_object.cpp
index d2c4853..b679c252 100644
--- a/JavaScriptCore/kjs/string_object.cpp
+++ b/JavaScriptCore/kjs/string_object.cpp
@@ -21,7 +21,6 @@
 
 #include "config.h"
 #include "string_object.h"
-#include "string_object.lut.h"
 
 #include "JSWrapperObject.h"
 #include "PropertyNameArray.h"
@@ -36,6 +35,46 @@
 
 namespace KJS {
 
+static JSValue* stringProtoFuncToString(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncValueOf(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncCharAt(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncCharCodeAt(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncConcat(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncIndexOf(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncLastIndexOf(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncMatch(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncReplace(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSearch(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSlice(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSplit(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSubstr(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSubstring(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncToLowerCase(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncToUpperCase(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncToLocaleLowerCase(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncToLocaleUpperCase(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncLocaleCompare(ExecState*, JSObject*, JSValue*, const ArgList&);
+
+static JSValue* stringProtoFuncBig(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSmall(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncBlink(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncBold(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncFixed(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncItalics(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncStrike(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSub(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncSup(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncFontcolor(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncFontsize(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncAnchor(ExecState*, JSObject*, JSValue*, const ArgList&);
+static JSValue* stringProtoFuncLink(ExecState*, JSObject*, JSValue*, const ArgList&);
+
+}
+
+#include "string_object.lut.h"
+
+namespace KJS {
+
 // ------------------------------ StringObject ----------------------------
 
 const ClassInfo StringObject::info = { "String", 0, 0, 0 };
@@ -98,39 +137,39 @@
 const ClassInfo StringPrototype::info = { "String", &StringObject::info, 0, ExecState::stringTable };
 /* Source for string_object.lut.h
 @begin stringTable 26
-  toString              &stringProtoFuncToString          DontEnum|Function       0
-  valueOf               &stringProtoFuncValueOf           DontEnum|Function       0
-  charAt                &stringProtoFuncCharAt            DontEnum|Function       1
-  charCodeAt            &stringProtoFuncCharCodeAt        DontEnum|Function       1
-  concat                &stringProtoFuncConcat            DontEnum|Function       1
-  indexOf               &stringProtoFuncIndexOf           DontEnum|Function       1
-  lastIndexOf           &stringProtoFuncLastIndexOf       DontEnum|Function       1
-  match                 &stringProtoFuncMatch             DontEnum|Function       1
-  replace               &stringProtoFuncReplace           DontEnum|Function       2
-  search                &stringProtoFuncSearch            DontEnum|Function       1
-  slice                 &stringProtoFuncSlice             DontEnum|Function       2
-  split                 &stringProtoFuncSplit             DontEnum|Function       2
-  substr                &stringProtoFuncSubstr            DontEnum|Function       2
-  substring             &stringProtoFuncSubstring         DontEnum|Function       2
-  toLowerCase           &stringProtoFuncToLowerCase       DontEnum|Function       0
-  toUpperCase           &stringProtoFuncToUpperCase       DontEnum|Function       0
-  toLocaleLowerCase     &stringProtoFuncToLocaleLowerCase DontEnum|Function       0
-  toLocaleUpperCase     &stringProtoFuncToLocaleUpperCase DontEnum|Function       0
-  localeCompare         &stringProtoFuncLocaleCompare     DontEnum|Function       1
+  toString              stringProtoFuncToString          DontEnum|Function       0
+  valueOf               stringProtoFuncValueOf           DontEnum|Function       0
+  charAt                stringProtoFuncCharAt            DontEnum|Function       1
+  charCodeAt            stringProtoFuncCharCodeAt        DontEnum|Function       1
+  concat                stringProtoFuncConcat            DontEnum|Function       1
+  indexOf               stringProtoFuncIndexOf           DontEnum|Function       1
+  lastIndexOf           stringProtoFuncLastIndexOf       DontEnum|Function       1
+  match                 stringProtoFuncMatch             DontEnum|Function       1
+  replace               stringProtoFuncReplace           DontEnum|Function       2
+  search                stringProtoFuncSearch            DontEnum|Function       1
+  slice                 stringProtoFuncSlice             DontEnum|Function       2
+  split                 stringProtoFuncSplit             DontEnum|Function       2
+  substr                stringProtoFuncSubstr            DontEnum|Function       2
+  substring             stringProtoFuncSubstring         DontEnum|Function       2
+  toLowerCase           stringProtoFuncToLowerCase       DontEnum|Function       0
+  toUpperCase           stringProtoFuncToUpperCase       DontEnum|Function       0
+  toLocaleLowerCase     stringProtoFuncToLocaleLowerCase DontEnum|Function       0
+  toLocaleUpperCase     stringProtoFuncToLocaleUpperCase DontEnum|Function       0
+  localeCompare         stringProtoFuncLocaleCompare     DontEnum|Function       1
 
-  big                   &stringProtoFuncBig               DontEnum|Function       0
-  small                 &stringProtoFuncSmall             DontEnum|Function       0
-  blink                 &stringProtoFuncBlink             DontEnum|Function       0
-  bold                  &stringProtoFuncBold              DontEnum|Function       0
-  fixed                 &stringProtoFuncFixed             DontEnum|Function       0
-  italics               &stringProtoFuncItalics           DontEnum|Function       0
-  strike                &stringProtoFuncStrike            DontEnum|Function       0
-  sub                   &stringProtoFuncSub               DontEnum|Function       0
-  sup                   &stringProtoFuncSup               DontEnum|Function       0
-  fontcolor             &stringProtoFuncFontcolor         DontEnum|Function       1
-  fontsize              &stringProtoFuncFontsize          DontEnum|Function       1
-  anchor                &stringProtoFuncAnchor            DontEnum|Function       1
-  link                  &stringProtoFuncLink              DontEnum|Function       1
+  big                   stringProtoFuncBig               DontEnum|Function       0
+  small                 stringProtoFuncSmall             DontEnum|Function       0
+  blink                 stringProtoFuncBlink             DontEnum|Function       0
+  bold                  stringProtoFuncBold              DontEnum|Function       0
+  fixed                 stringProtoFuncFixed             DontEnum|Function       0
+  italics               stringProtoFuncItalics           DontEnum|Function       0
+  strike                stringProtoFuncStrike            DontEnum|Function       0
+  sub                   stringProtoFuncSub               DontEnum|Function       0
+  sup                   stringProtoFuncSup               DontEnum|Function       0
+  fontcolor             stringProtoFuncFontcolor         DontEnum|Function       1
+  fontsize              stringProtoFuncFontsize          DontEnum|Function       1
+  anchor                stringProtoFuncAnchor            DontEnum|Function       1
+  link                  stringProtoFuncLink              DontEnum|Function       1
 @end
 */
 // ECMA 15.5.4
@@ -267,12 +306,11 @@
 static JSValue *replace(ExecState *exec, JSString* sourceVal, JSValue *pattern, JSValue *replacement)
 {
   UString source = sourceVal->value();
-  JSObject *replacementFunction = 0;
+  CallData callData;
   UString replacementString;
 
-  if (replacement->isObject() && replacement->toObject(exec)->implementsCall())
-    replacementFunction = replacement->toObject(exec);
-  else
+  CallType callType = replacement->getCallData(callData);
+  if (callType == CallTypeNone)
     replacementString = replacement->toString(exec);
 
   if (pattern->isObject() && static_cast<JSObject *>(pattern)->inherits(&RegExpObject::info)) {
@@ -303,7 +341,7 @@
       pushSourceRange(sourceRanges, sourceRangeCount, sourceRangeCapacity, UString::Range(lastIndex, matchIndex - lastIndex));
 
       UString substitutedReplacement;
-      if (replacementFunction) {
+      if (callType != CallTypeNone) {
           int completeMatchStart = ovector[0];
           ArgList args;
 
@@ -320,7 +358,7 @@
           args.append(jsNumber(exec, completeMatchStart));
           args.append(sourceVal);
 
-          substitutedReplacement = replacementFunction->callAsFunction(exec, exec->globalThisValue(), args)->toString(exec);
+          substitutedReplacement = call(exec, replacement, callType, callData, exec->globalThisValue(), args)->toString(exec);
       } else
           substitutedReplacement = substituteBackreferences(replacementString, source, ovector, reg);
 
@@ -362,39 +400,39 @@
   if (matchPos == -1)
     return sourceVal;
   
-  if (replacementFunction) {
+  if (callType != CallTypeNone) {
       ArgList args;
       
       args.append(jsString(exec, source.substr(matchPos, matchLen)));
       args.append(jsNumber(exec, matchPos));
       args.append(sourceVal);
       
-      replacementString = replacementFunction->callAsFunction(exec, exec->globalThisValue(), args)->toString(exec);
+      replacementString = call(exec, replacement, callType, callData, exec->globalThisValue(), args)->toString(exec);
   }
 
   return jsString(exec, source.substr(0, matchPos) + replacementString + source.substr(matchPos + matchLen));
 }
 
-JSValue* stringProtoFuncToString(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncToString(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
-    if (!thisObj->inherits(&StringObject::info))
+    if (!thisValue->isObject(&StringObject::info))
         return throwError(exec, TypeError);
 
-    return static_cast<StringObject*>(thisObj)->internalValue();
+    return static_cast<StringObject*>(thisValue)->internalValue();
 }
 
-JSValue* stringProtoFuncValueOf(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncValueOf(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
-    if (!thisObj->inherits(&StringObject::info))
+    if (!thisValue->isObject(&StringObject::info))
         return throwError(exec, TypeError);
 
-    return static_cast<StringObject*>(thisObj)->internalValue();
+    return static_cast<StringObject*>(thisValue)->internalValue();
 }
 
-JSValue* stringProtoFuncCharAt(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncCharAt(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     int len = s.size();
 
     UString u;
@@ -407,10 +445,10 @@
     return jsString(exec, u);
 }
 
-JSValue* stringProtoFuncCharCodeAt(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncCharCodeAt(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     int len = s.size();
 
     JSValue* result = 0;
@@ -424,10 +462,10 @@
     return result;
 }
 
-JSValue* stringProtoFuncConcat(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncConcat(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
 
     ArgList::const_iterator end = args.end();
     for (ArgList::const_iterator it = args.begin(); it != end; ++it) {
@@ -436,10 +474,10 @@
     return jsString(exec, s);
 }
 
-JSValue* stringProtoFuncIndexOf(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncIndexOf(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     int len = s.size();
 
     JSValue* a0 = args[0];
@@ -453,10 +491,10 @@
     return jsNumber(exec, s.find(u2, static_cast<int>(dpos)));
 }
 
-JSValue* stringProtoFuncLastIndexOf(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncLastIndexOf(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     int len = s.size();
 
     JSValue* a0 = args[0];
@@ -471,10 +509,10 @@
     return jsNumber(exec, s.rfind(u2, static_cast<int>(dpos)));
 }
 
-JSValue* stringProtoFuncMatch(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncMatch(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
 
     JSValue* a0 = args[0];
 
@@ -520,16 +558,16 @@
         // other browsers and because Null is a false value.
         result = jsNull();
       } else {
-        result = exec->lexicalGlobalObject()->arrayConstructor()->construct(exec, list);
+        result = constructArray(exec, list);
       }
     }
     return result;
 }
 
-JSValue* stringProtoFuncSearch(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncSearch(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
 
     JSValue* a0 = args[0];
 
@@ -552,13 +590,13 @@
     return jsNumber(exec, pos);
 }
 
-JSValue* stringProtoFuncReplace(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncReplace(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
 
-    JSString* sVal = thisObj->inherits(&StringObject::info) ?
-      static_cast<StringObject*>(thisObj)->internalValue() :
+    JSString* sVal = thisValue->isObject(&StringObject::info) ?
+      static_cast<StringObject*>(thisValue)->internalValue() :
       static_cast<JSString*>(jsString(exec, s));
 
     JSValue* a0 = args[0];
@@ -567,10 +605,10 @@
     return replace(exec, sVal, a0, a1);
 }
 
-JSValue* stringProtoFuncSlice(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncSlice(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     int len = s.size();
 
     JSValue* a0 = args[0];
@@ -592,16 +630,15 @@
     return jsString(exec, "");
 }
 
-JSValue* stringProtoFuncSplit(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncSplit(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
 
     JSValue* a0 = args[0];
     JSValue* a1 = args[1];
 
-    JSObject *constructor = exec->lexicalGlobalObject()->arrayConstructor();
-    JSObject* res = static_cast<JSObject*>(constructor->construct(exec, exec->emptyList()));
+    JSObject* res = constructEmptyArray(exec);
     JSValue* result = res;
     UString u = s;
     int pos;
@@ -662,10 +699,10 @@
     return result;
 }
 
-JSValue* stringProtoFuncSubstr(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncSubstr(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     int len = s.size();
 
     JSValue* a0 = args[0];
@@ -687,10 +724,10 @@
     return jsString(exec, s.substr(static_cast<int>(start), static_cast<int>(length)));
 }
 
-JSValue* stringProtoFuncSubstring(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncSubstring(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     int len = s.size();
 
     JSValue* a0 = args[0];
@@ -720,13 +757,13 @@
     return jsString(exec, s.substr((int)start, (int)end-(int)start));
 }
 
-JSValue* stringProtoFuncToLowerCase(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncToLowerCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     
-    JSString* sVal = thisObj->inherits(&StringObject::info)
-        ? static_cast<StringObject*>(thisObj)->internalValue()
+    JSString* sVal = thisValue->isObject(&StringObject::info)
+        ? static_cast<StringObject*>(thisValue)->internalValue()
         : static_cast<JSString*>(jsString(exec, s));
     int ssize = s.size();
     if (!ssize)
@@ -745,13 +782,13 @@
     return jsString(exec, UString(buffer.releaseBuffer(), length, false));
 }
 
-JSValue* stringProtoFuncToUpperCase(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncToUpperCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
 
-    JSString* sVal = thisObj->inherits(&StringObject::info)
-        ? static_cast<StringObject*>(thisObj)->internalValue()
+    JSString* sVal = thisValue->isObject(&StringObject::info)
+        ? static_cast<StringObject*>(thisValue)->internalValue()
         : static_cast<JSString*>(jsString(exec, s));
     int ssize = s.size();
     if (!ssize)
@@ -770,14 +807,14 @@
     return jsString(exec, UString(buffer.releaseBuffer(), length, false));
 }
 
-JSValue* stringProtoFuncToLocaleLowerCase(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncToLocaleLowerCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     
     // FIXME: See http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt for locale-sensitive mappings that aren't implemented.
-    JSString* sVal = thisObj->inherits(&StringObject::info)
-        ? static_cast<StringObject*>(thisObj)->internalValue()
+    JSString* sVal = thisValue->isObject(&StringObject::info)
+        ? static_cast<StringObject*>(thisValue)->internalValue()
         : static_cast<JSString*>(jsString(exec, s));
     int ssize = s.size();
     if (!ssize)
@@ -796,13 +833,13 @@
     return jsString(exec, UString(buffer.releaseBuffer(), length, false));
 }
 
-JSValue* stringProtoFuncToLocaleUpperCase(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncToLocaleUpperCase(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
 
-    JSString* sVal = thisObj->inherits(&StringObject::info)
-        ? static_cast<StringObject*>(thisObj)->internalValue()
+    JSString* sVal = thisValue->isObject(&StringObject::info)
+        ? static_cast<StringObject*>(thisValue)->internalValue()
         : static_cast<JSString*>(jsString(exec, s));
     int ssize = s.size();
     if (!ssize)
@@ -821,177 +858,170 @@
     return jsString(exec, UString(buffer.releaseBuffer(), length, false));
 }
 
-JSValue* stringProtoFuncLocaleCompare(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncLocaleCompare(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     if (args.size() < 1)
       return jsNumber(exec, 0);
 
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     JSValue* a0 = args[0];
     return jsNumber(exec, localeCompare(s, a0->toString(exec)));
 }
 
-JSValue* stringProtoFuncBig(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncBig(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     return jsString(exec, "<big>" + s + "</big>");
 }
 
-JSValue* stringProtoFuncSmall(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncSmall(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     return jsString(exec, "<small>" + s + "</small>");
 }
 
-JSValue* stringProtoFuncBlink(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncBlink(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     return jsString(exec, "<blink>" + s + "</blink>");
 }
 
-JSValue* stringProtoFuncBold(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncBold(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     return jsString(exec, "<b>" + s + "</b>");
 }
 
-JSValue* stringProtoFuncFixed(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncFixed(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     return jsString(exec, "<tt>" + s + "</tt>");
 }
 
-JSValue* stringProtoFuncItalics(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncItalics(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     return jsString(exec, "<i>" + s + "</i>");
 }
 
-JSValue* stringProtoFuncStrike(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncStrike(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     return jsString(exec, "<strike>" + s + "</strike>");
 }
 
-JSValue* stringProtoFuncSub(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncSub(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     return jsString(exec, "<sub>" + s + "</sub>");
 }
 
-JSValue* stringProtoFuncSup(ExecState* exec, JSObject* thisObj, const ArgList&)
+JSValue* stringProtoFuncSup(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     return jsString(exec, "<sup>" + s + "</sup>");
 }
 
-JSValue* stringProtoFuncFontcolor(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncFontcolor(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     JSValue* a0 = args[0];
     return jsString(exec, "<font color=\"" + a0->toString(exec) + "\">" + s + "</font>");
 }
 
-JSValue* stringProtoFuncFontsize(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncFontsize(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     JSValue* a0 = args[0];
     return jsString(exec, "<font size=\"" + a0->toString(exec) + "\">" + s + "</font>");
 }
 
-JSValue* stringProtoFuncAnchor(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncAnchor(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     JSValue* a0 = args[0];
     return jsString(exec, "<a name=\"" + a0->toString(exec) + "\">" + s + "</a>");
 }
 
-JSValue* stringProtoFuncLink(ExecState* exec, JSObject* thisObj, const ArgList& args)
+JSValue* stringProtoFuncLink(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
 {
     // This optimizes the common case that thisObj is a StringObject
-    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
+    UString s = thisValue->isObject(&StringObject::info) ? static_cast<StringObject*>(thisValue)->internalValue()->value() : thisValue->toThisObject(exec)->toString(exec);
     JSValue* a0 = args[0];
     return jsString(exec, "<a href=\"" + a0->toString(exec) + "\">" + s + "</a>");
 }
 
 // ------------------------------ StringConstructor ------------------------------
 
+static JSValue* stringFromCharCode(ExecState* exec, JSObject*, JSValue*, const ArgList& args)
+{
+    UString s;
+    if (args.size()) {
+        UChar* buf = static_cast<UChar*>(fastMalloc(args.size() * sizeof(UChar)));
+        UChar* p = buf;
+        ArgList::const_iterator end = args.end();
+        for (ArgList::const_iterator it = args.begin(); it != end; ++it)
+          *p++ = static_cast<UChar>((*it)->toUInt32(exec));
+        s = UString(buf, args.size(), false);
+    } else
+        s = "";
+
+    return jsString(exec, s);
+}
+
 StringConstructor::StringConstructor(ExecState* exec, FunctionPrototype* funcProto, StringPrototype* stringProto)
   : InternalFunction(funcProto, Identifier(exec, stringProto->classInfo()->className))
 {
   // ECMA 15.5.3.1 String.prototype
-  putDirect(exec->propertyNames().prototype, stringProto, DontEnum|DontDelete|ReadOnly);
+  putDirect(exec->propertyNames().prototype, stringProto, ReadOnly | DontEnum | DontDelete);
 
-  putDirectFunction(new (exec) StringConstructorFunction(exec, funcProto, exec->propertyNames().fromCharCode), DontEnum);
+  // ECMA 15.5.3.2 fromCharCode()
+  putDirectFunction(new (exec) PrototypeFunction(exec, funcProto, 1, exec->propertyNames().fromCharCode, stringFromCharCode), DontEnum);
 
   // no. of arguments for constructor
-  putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum);
-}
-
-
-ConstructType StringConstructor::getConstructData(ConstructData&)
-{
-    return ConstructTypeNative;
+  putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly | DontEnum | DontDelete);
 }
 
 // ECMA 15.5.2
-JSObject* StringConstructor::construct(ExecState* exec, const ArgList& args)
+static JSObject* constructWithStringConstructor(ExecState* exec, JSObject*, const ArgList& args)
 {
-  JSObject* proto = exec->lexicalGlobalObject()->stringPrototype();
-  if (!args.size())
-    return new (exec) StringObject(exec, proto);
-  return new (exec) StringObject(exec, proto, args[0]->toString(exec));
+    JSObject* prototype = exec->lexicalGlobalObject()->stringPrototype();
+    if (args.isEmpty())
+        return new (exec) StringObject(exec, prototype);
+    return new (exec) StringObject(exec, prototype, args[0]->toString(exec));
+}
+
+ConstructType StringConstructor::getConstructData(ConstructData& constructData)
+{
+    constructData.native.function = constructWithStringConstructor;
+    return ConstructTypeNative;
 }
 
 // ECMA 15.5.1
-JSValue *StringConstructor::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, const ArgList &args)
+static JSValue* callStringConstructor(ExecState* exec, JSObject*, JSValue*, const ArgList& args)
 {
-  if (args.isEmpty())
-    return jsString(exec, "");
-  else {
-    JSValue *v = args[0];
-    return jsString(exec, v->toString(exec));
-  }
+    if (args.isEmpty())
+        return jsString(exec, "");
+    return jsString(exec, args[0]->toString(exec));
 }
 
-// ------------------------------ StringConstructorFunction --------------------------
-
-// ECMA 15.5.3.2 fromCharCode()
-StringConstructorFunction::StringConstructorFunction(ExecState* exec, FunctionPrototype* funcProto, const Identifier& name)
-  : InternalFunction(funcProto, name)
+CallType StringConstructor::getCallData(CallData& callData)
 {
-  putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum);
-}
-
-JSValue *StringConstructorFunction::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, const ArgList &args)
-{
-  UString s;
-  if (args.size()) {
-    UChar *buf = static_cast<UChar *>(fastMalloc(args.size() * sizeof(UChar)));
-    UChar *p = buf;
-    ArgList::const_iterator end = args.end();
-    for (ArgList::const_iterator it = args.begin(); it != end; ++it) {
-      unsigned short u = static_cast<unsigned short>((*it)->toUInt32(exec));
-      *p++ = UChar(u);
-    }
-    s = UString(buf, args.size(), false);
-  } else
-    s = "";
-
-  return jsString(exec, s);
+    callData.native.function = callStringConstructor;
+    return CallTypeNative;
 }
 
 } // namespace KJS
