+JSString* errorDescriptionForValue(ExecState* exec, JSValue v)
+{
+ VM& vm = exec->vm();
+ if (v.isNull())
+ return vm.smallStrings.nullString();
+ if (v.isUndefined())
+ return vm.smallStrings.undefinedString();
+ if (v.isInt32())
+ return jsString(&vm, vm.numericStrings.add(v.asInt32()));
+ if (v.isDouble())
+ return jsString(&vm, vm.numericStrings.add(v.asDouble()));
+ if (v.isTrue())
+ return vm.smallStrings.trueString();
+ if (v.isFalse())
+ return vm.smallStrings.falseString();
+ if (v.isString())
+ return jsCast<JSString*>(v.asCell());
+ if (v.isObject()) {
+ CallData callData;
+ JSObject* object = asObject(v);
+ if (object->methodTable()->getCallData(object, callData) != CallTypeNone)
+ return vm.smallStrings.functionString();
+ return jsString(exec, object->methodTable()->className(object));
+ }
+
+ // The JSValue should never be empty, so this point in the code should never be reached.
+ ASSERT_NOT_REACHED();
+ return vm.smallStrings.emptyString();
+}
+
+JSObject* createError(ExecState* exec, ErrorFactory errorFactory, JSValue value, const String& message)