Backed out changeset bcba40acc0ac (bug 1034627)

This commit is contained in:
Ed Morley 2014-07-11 15:46:29 +01:00
parent e7c5d218c2
commit 9af578991f

View File

@ -7,7 +7,6 @@
/* Data conversion between native and JavaScript types. */
#include "mozilla/ArrayUtils.h"
#include "mozilla/Range.h"
#include "xpcprivate.h"
#include "nsIAtom.h"
@ -19,7 +18,6 @@
#include "jsapi.h"
#include "jsfriendapi.h"
#include "js/CharacterEncoding.h"
#include "jsprf.h"
#include "JavaScriptParent.h"
@ -366,16 +364,6 @@ CheckJSCharInCharRange(jschar c)
return true;
}
template<typename CharT>
static void
CheckCharsInCharRange(const CharT *chars, size_t len)
{
for (size_t i = 0; i < len; i++) {
if (!CheckJSCharInCharRange(chars[i]))
break;
}
}
#endif
template<typename T>
@ -426,14 +414,12 @@ XPCConvert::JSData2Native(void* d, HandleValue s,
if (!str) {
return false;
}
jschar ch;
if (JS_GetStringLength(str) == 0) {
ch = 0;
} else {
if (!JS_GetStringCharAt(cx, str, 0, &ch))
return false;
size_t length;
const jschar* chars = JS_GetStringCharsAndLength(cx, str, &length);
if (!chars) {
return false;
}
jschar ch = length ? chars[0] : 0;
#ifdef DEBUG
CheckJSCharInCharRange(ch);
#endif
@ -446,17 +432,16 @@ XPCConvert::JSData2Native(void* d, HandleValue s,
if (!(str = ToString(cx, s))) {
return false;
}
size_t length = JS_GetStringLength(str);
size_t length;
const jschar* chars = JS_GetStringCharsAndLength(cx, str, &length);
if (!chars) {
return false;
}
if (length == 0) {
*((uint16_t*)d) = 0;
break;
}
jschar ch;
if (!JS_GetStringCharAt(cx, str, 0, &ch))
return false;
*((uint16_t*)d) = uint16_t(ch);
*((uint16_t*)d) = uint16_t(chars[0]);
break;
}
case nsXPTType::T_JSVAL :
@ -507,13 +492,18 @@ XPCConvert::JSData2Native(void* d, HandleValue s,
return true;
}
size_t length = 0;
const char16_t* chars = nullptr;
JSString* str = nullptr;
if (!s.isUndefined()) {
str = ToString(cx, s);
if (!str)
return false;
length = JS_GetStringLength(str);
chars = useAllocator ? JS_GetStringCharsZAndLength(cx, str, &length)
: JS_GetStringCharsAndLength(cx, str, &length);
if (!chars)
return false;
if (!length) {
if (useAllocator)
*((const nsAString**)d) = &EmptyString();
@ -536,16 +526,17 @@ XPCConvert::JSData2Native(void* d, HandleValue s,
} else if (XPCStringConvert::IsDOMString(str)) {
// The characters represent an existing nsStringBuffer that
// was shared by XPCStringConvert::ReadableToJSVal.
const jschar *chars = JS_GetTwoByteExternalStringChars(str);
nsStringBuffer::FromData((void *)chars)->ToString(length, *ws);
} else if (XPCStringConvert::IsLiteral(str)) {
// The characters represent a literal char16_t string constant
// compiled into libxul, such as the string "undefined" above.
const jschar *chars = JS_GetTwoByteExternalStringChars(str);
ws->AssignLiteral(chars, length);
} else if (useAllocator && STRING_TO_JSVAL(str) == s) {
// The JS string will exist over the function call.
// We don't need to copy the characters in this case.
ws->Rebind(chars, length);
} else {
if (!AssignJSString(cx, *ws, str))
return false;
ws->Assign(chars, length);
}
return true;
}
@ -562,18 +553,16 @@ XPCConvert::JSData2Native(void* d, HandleValue s,
return false;
}
#ifdef DEBUG
if (JS_StringHasLatin1Chars(str)) {
size_t len;
AutoCheckCannotGC nogc;
const Latin1Char *chars = JS_GetLatin1StringCharsAndLength(cx, nogc, str, &len);
if (chars)
CheckCharsInCharRange(chars, len);
} else {
size_t len;
AutoCheckCannotGC nogc;
const jschar *chars = JS_GetTwoByteStringCharsAndLength(cx, nogc, str, &len);
if (chars)
CheckCharsInCharRange(chars, len);
const jschar* chars=nullptr;
if (nullptr != (chars = JS_GetStringCharsZ(cx, str))) {
bool legalRange = true;
int len = JS_GetStringLength(str);
const jschar* t;
int32_t i=0;
for (t=chars; (i< len) && legalRange ; i++,t++) {
if (!CheckJSCharInCharRange(*t))
break;
}
}
#endif // DEBUG
size_t length = JS_GetStringEncodingLength(cx, str);
@ -592,6 +581,7 @@ XPCConvert::JSData2Native(void* d, HandleValue s,
case nsXPTType::T_WCHAR_STR:
{
const jschar* chars=nullptr;
JSString* str;
if (s.isUndefined() || s.isNull()) {
@ -602,22 +592,28 @@ XPCConvert::JSData2Native(void* d, HandleValue s,
if (!(str = ToString(cx, s))) {
return false;
}
if (!(chars = JS_GetStringCharsZ(cx, str))) {
return false;
}
int len = JS_GetStringLength(str);
int byte_len = (len+1)*sizeof(jschar);
if (!(*((void**)d) = nsMemory::Alloc(byte_len))) {
// XXX should report error
return false;
}
mozilla::Range<jschar> destChars(*((jschar**)d), len + 1);
if (!JS_CopyStringChars(cx, destChars, str))
return false;
destChars[len] = 0;
jschar* destchars = *((jschar**)d);
memcpy(destchars, chars, byte_len);
destchars[len] = 0;
return true;
}
case nsXPTType::T_UTF8STRING:
{
const jschar* chars;
size_t length;
JSString* str;
if (s.isNull() || s.isUndefined()) {
if (useAllocator) {
*((const nsACString**)d) = &NullCString();
@ -629,11 +625,12 @@ XPCConvert::JSData2Native(void* d, HandleValue s,
}
// The JS val is neither null nor void...
JSString *str = ToString(cx, s);
if (!str)
return false;
size_t length = JS_GetStringLength(str);
if (!(str = ToString(cx, s))||
!(chars = JS_GetStringCharsAndLength(cx, str, &length))) {
return false;
}
if (!length) {
if (useAllocator) {
*((const nsACString**)d) = &EmptyCString();
@ -655,16 +652,7 @@ XPCConvert::JSData2Native(void* d, HandleValue s,
} else {
rs = *((nsCString**)d);
}
JSFlatString *flat = JS_FlattenString(cx, str);
if (!flat)
return false;
size_t utf8Length = JS::GetDeflatedUTF8StringLength(flat);
rs->SetLength(utf8Length);
JS::DeflateStringToUTF8Buffer(flat, mozilla::RangedPtr<char>(rs->BeginWriting(), utf8Length));
MOZ_ASSERT(rs->get()[utf8Length] == '\0');
CopyUTF16toUTF8(Substring(chars, length), *rs);
return true;
}
@ -741,13 +729,15 @@ XPCConvert::JSData2Native(void* d, HandleValue s,
} else if (iid->Equals(NS_GET_IID(nsIAtom)) && s.isString()) {
// We're trying to pass a string as an nsIAtom. Let's atomize!
JSString* str = s.toString();
nsAutoJSString autoStr;
if (!autoStr.init(cx, str)) {
const char16_t* chars = JS_GetStringCharsZ(cx, str);
if (!chars) {
if (pErr)
*pErr = NS_ERROR_XPC_BAD_CONVERT_JS_NULL_REF;
return false;
}
nsCOMPtr<nsIAtom> atom = NS_NewAtom(autoStr);
uint32_t length = JS_GetStringLength(str);
nsCOMPtr<nsIAtom> atom =
NS_NewAtom(nsDependentSubstring(chars, chars + length));
atom.forget((nsISupports**)d);
return true;
}
@ -1803,6 +1793,7 @@ XPCConvert::JSStringWithSize2Native(void* d, HandleValue s,
case nsXPTType::T_PWSTRING_SIZE_IS:
{
const jschar* chars=nullptr;
JSString* str;
if (s.isUndefined() || s.isNull()) {
@ -1834,18 +1825,19 @@ XPCConvert::JSStringWithSize2Native(void* d, HandleValue s,
*pErr = NS_ERROR_XPC_NOT_ENOUGH_CHARS_IN_STRING;
return false;
}
if (len < count)
len = count;
len = count;
if (!(chars = JS_GetStringCharsZ(cx, str))) {
return false;
}
uint32_t alloc_len = (len + 1) * sizeof(jschar);
if (!(*((void**)d) = nsMemory::Alloc(alloc_len))) {
// XXX should report error
return false;
}
mozilla::Range<jschar> destChars(*((jschar**)d), len + 1);
if (!JS_CopyStringChars(cx, destChars, str))
return false;
destChars[count] = 0;
memcpy(*((jschar**)d), chars, alloc_len);
(*((jschar**)d))[count] = 0;
return true;
}