From 92f83f4288f14bd307cadf184c5766cddffb727e Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 4 Aug 2012 09:29:26 +0200 Subject: [PATCH] Bug 352437 - Part a: Use a StringBuffer in tagify; r=jorendorff --- js/src/jsstr.cpp | 55 +++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/js/src/jsstr.cpp b/js/src/jsstr.cpp index 10eee2c209f5..5584e4beeca6 100644 --- a/js/src/jsstr.cpp +++ b/js/src/jsstr.cpp @@ -2805,51 +2805,44 @@ tagify(JSContext *cx, const char *begin, JSLinearString *param, const char *end, size_t beglen = strlen(begin); size_t taglen = 1 + beglen + 1; /* '' */ - size_t parlen = 0; /* Avoid warning. */ if (param) { - parlen = param->length(); + size_t parlen = param->length(); taglen += 2 + parlen + 1; /* '="param"' */ } size_t endlen = strlen(end); taglen += str->length() + 2 + endlen + 1; /* 'str' */ - if (taglen >= ~(size_t)0 / sizeof(jschar)) { - js_ReportAllocationOverflow(cx); - return false; - } - jschar *tagbuf = (jschar *) cx->malloc_((taglen + 1) * sizeof(jschar)); - if (!tagbuf) + StringBuffer sb(cx); + if (!sb.reserve(taglen)) return false; - size_t j = 0; - tagbuf[j++] = '<'; - for (size_t i = 0; i < beglen; i++) - tagbuf[j++] = (jschar)begin[i]; + sb.infallibleAppend('<'); + + MOZ_ALWAYS_TRUE(sb.appendInflated(begin, beglen)); + if (param) { - tagbuf[j++] = '='; - tagbuf[j++] = '"'; - js_strncpy(&tagbuf[j], param->chars(), parlen); - j += parlen; - tagbuf[j++] = '"'; + sb.infallibleAppend('='); + sb.infallibleAppend('"'); + MOZ_ALWAYS_TRUE(sb.append(param)); + sb.infallibleAppend('"'); } - tagbuf[j++] = '>'; + + sb.infallibleAppend('>'); - js_strncpy(&tagbuf[j], str->chars(), str->length()); - j += str->length(); - tagbuf[j++] = '<'; - tagbuf[j++] = '/'; - for (size_t i = 0; i < endlen; i++) - tagbuf[j++] = (jschar)end[i]; - tagbuf[j++] = '>'; - JS_ASSERT(j == taglen); - tagbuf[j] = 0; + MOZ_ALWAYS_TRUE(sb.append(str)); - JSString *retstr = js_NewString(cx, tagbuf, taglen); - if (!retstr) { - Foreground::free_((char *)tagbuf); + sb.infallibleAppend('<'); + sb.infallibleAppend('/'); + + MOZ_ALWAYS_TRUE(sb.appendInflated(end, endlen)); + + sb.infallibleAppend('>'); + + JSFixedString *retstr = sb.finishString(); + if (!retstr) return false; - } + call.rval().setString(retstr); return true; }