// convert a readable to a JSString, copying string data // static bool XPCStringConvert::ReadableToJSVal(JSContext *cx, const nsAString &readable, nsStringBuffer** sharedBuffer, MutableHandleValue vp) { *sharedBuffer = nullptr; uint32_t length = readable.Length(); if (readable.IsLiteral()) { JSString *str = JS_NewExternalString(cx, static_cast<const jschar*>(readable.BeginReading()), length, &sLiteralFinalizer); if (!str) return false; vp.setString(str); return true; } nsStringBuffer *buf = nsStringBuffer::FromString(readable); if (buf) { bool shared; if (!StringBufferToJSVal(cx, buf, length, vp, &shared)) return false; if (shared) *sharedBuffer = buf; return true; } // blech, have to copy. JSString *str = JS_NewUCStringCopyN(cx, readable.BeginReading(), length); if (!str) return false; vp.setString(str); return true; }