diff --git a/js/src/builtin/Object.cpp b/js/src/builtin/Object.cpp index 145f1dff286..8e2689d3e16 100644 --- a/js/src/builtin/Object.cpp +++ b/js/src/builtin/Object.cpp @@ -272,8 +272,24 @@ js::ObjectToSource(JSContext *cx, HandleObject obj) JSString * JS_BasicObjectToString(JSContext *cx, HandleObject obj) { + // Some classes are really common, don't allocate new strings for them. + // The ordering below is based on the measurements in bug 966264. + if (obj->is()) + return cx->names().objectObject; + if (obj->is()) + return cx->names().objectString; + if (obj->is()) + return cx->names().objectArray; + if (obj->is()) + return cx->names().objectFunction; + if (obj->is()) + return cx->names().objectNumber; + const char *className = JSObject::className(cx, obj); + if (strcmp(className, "Window") == 0) + return cx->names().objectWindow; + StringBuffer sb(cx); if (!sb.append("[object ") || !sb.appendInflated(className, strlen(className)) || !sb.append("]")) diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h index 0ba2d4ee561..01f5e6850a3 100644 --- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -129,8 +129,14 @@ macro(NumberFormat, NumberFormat, "NumberFormat") \ macro(NumberFormatFormatGet, NumberFormatFormatGet, "Intl_NumberFormat_format_get") \ macro(numeric, numeric, "numeric") \ + macro(objectArray, objectArray, "[object Array]") \ + macro(objectFunction, objectFunction, "[object Function]") \ macro(objectNull, objectNull, "[object Null]") \ + macro(objectNumber, objectNumber, "[object Number]") \ + macro(objectObject, objectObject, "[object Object]") \ + macro(objectString, objectString, "[object String]") \ macro(objectUndefined, objectUndefined, "[object Undefined]") \ + macro(objectWindow, objectWindow, "[object Window]") \ macro(of, of, "of") \ macro(offset, offset, "offset") \ macro(outOfMemory, outOfMemory, "out of memory") \