Skip to content

Commit

Permalink
Bug 1034689 part 2 - Add AssignJSFlatString and use it. r=bz,terrence
Browse files Browse the repository at this point in the history
  • Loading branch information
jandem committed Jul 12, 2014
1 parent e3e56e7 commit 2a7ce8f
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 20 deletions.
4 changes: 2 additions & 2 deletions dom/base/nsJSTimeoutHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -349,8 +349,8 @@ nsJSScriptTimeoutHandler::Init(nsGlobalWindow *aWindow, bool *aIsInterval,
return error.ErrorCode();
}

mExpr.Append(JS_GetFlatStringChars(expr),
JS_GetStringLength(JS_FORGET_STRING_FLATNESS(expr)));
MOZ_ASSERT(mExpr.IsEmpty());
AssignJSFlatString(mExpr, expr);

// Get the calling location.
const char *filename;
Expand Down
12 changes: 12 additions & 0 deletions dom/base/nsJSUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,18 @@ AssignJSString(JSContext *cx, T &dest, JSString *s)
return true;
}

inline void
AssignJSFlatString(nsAString &dest, JSFlatString *s)
{
size_t len = js::GetFlatStringLength(s);
static_assert(js::MaxStringLength < (1 << 28),
"Shouldn't overflow here or in SetCapacity");
dest.SetCapacity(len + 1);
js::CopyFlatStringChars(dest.BeginWriting(), s, len);
dest.BeginWriting()[len] = '\0';
dest.SetLength(len);
}

class nsAutoJSString : public nsAutoString
{
public:
Expand Down
7 changes: 5 additions & 2 deletions dom/bindings/BindingUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,13 @@ ThrowInvalidThis(JSContext* aCx, const JS::CallArgs& aArgs,
MOZ_ASSERT(func);
JS::Rooted<JSString*> funcName(aCx, JS_GetFunctionDisplayId(func));
MOZ_ASSERT(funcName);
nsAutoJSString funcNameStr;
if (!funcNameStr.init(aCx, funcName)) {
return false;
}
JS_ReportErrorNumberUC(aCx, GetErrorMessage, nullptr,
static_cast<const unsigned>(aErrorNumber),
JS_GetStringCharsZ(aCx, funcName),
ifaceName.get());
funcNameStr.get(), ifaceName.get());
return false;
}

Expand Down
4 changes: 1 addition & 3 deletions dom/bindings/Exceptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -394,9 +394,7 @@ NS_IMETHODIMP JSStackFrame::GetName(nsAString& aFunction)
if (!mFunnameInitialized) {
JS::FrameDescription& desc = mStackDescription->FrameAt(mIndex);
if (JSFlatString *name = desc.funDisplayName()) {
mFunname.Assign(JS_GetFlatStringChars(name),
// XXXbz Can't JS_GetStringLength on JSFlatString!
JS_GetStringLength(JS_FORGET_STRING_FLATNESS(name)));
AssignJSFlatString(mFunname, name);
}
mFunnameInitialized = true;
}
Expand Down
6 changes: 3 additions & 3 deletions dom/plugins/base/nsNPAPIPlugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1303,10 +1303,10 @@ _utf8fromidentifier(NPIdentifier id)
}

JSString *str = NPIdentifierToString(id);
nsAutoString autoStr;
AssignJSFlatString(autoStr, JS_ASSERT_STRING_IS_FLAT(str));

return
ToNewUTF8String(nsDependentString(::JS_GetInternedStringChars(str),
::JS_GetStringLength(str)));
return ToNewUTF8String(autoStr);
}

int32_t
Expand Down
41 changes: 32 additions & 9 deletions js/src/jsfriendapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,12 @@ GetStringLength(JSString *s)
return reinterpret_cast<shadow::String*>(s)->length;
}

MOZ_ALWAYS_INLINE size_t
GetFlatStringLength(JSFlatString *s)
{
return reinterpret_cast<shadow::String*>(s)->length;
}

MOZ_ALWAYS_INLINE bool
LinearStringHasLatin1Chars(JSLinearString *s)
{
Expand Down Expand Up @@ -861,6 +867,12 @@ AtomToLinearString(JSAtom *atom)
return reinterpret_cast<JSLinearString *>(atom);
}

MOZ_ALWAYS_INLINE JSLinearString *
FlatStringToLinearString(JSFlatString *s)
{
return reinterpret_cast<JSLinearString *>(s);
}

MOZ_ALWAYS_INLINE const JS::Latin1Char *
GetLatin1AtomChars(const JS::AutoCheckCannotGC &nogc, JSAtom *atom)
{
Expand All @@ -886,26 +898,37 @@ StringToLinearString(JSContext *cx, JSString *str)
return reinterpret_cast<JSLinearString *>(str);
}

inline bool
CopyStringChars(JSContext *cx, jschar *dest, JSString *s, size_t len)
MOZ_ALWAYS_INLINE void
CopyLinearStringChars(jschar *dest, JSLinearString *s, size_t len)
{
JSLinearString *linear = StringToLinearString(cx, s);
if (!linear)
return false;

JS::AutoCheckCannotGC nogc;
if (LinearStringHasLatin1Chars(linear)) {
const JS::Latin1Char *src = GetLatin1LinearStringChars(nogc, linear);
if (LinearStringHasLatin1Chars(s)) {
const JS::Latin1Char *src = GetLatin1LinearStringChars(nogc, s);
for (size_t i = 0; i < len; i++)
dest[i] = src[i];
} else {
const jschar *src = GetTwoByteLinearStringChars(nogc, linear);
const jschar *src = GetTwoByteLinearStringChars(nogc, s);
mozilla::PodCopy(dest, src, len);
}
}

inline bool
CopyStringChars(JSContext *cx, jschar *dest, JSString *s, size_t len)
{
JSLinearString *linear = StringToLinearString(cx, s);
if (!linear)
return false;

CopyLinearStringChars(dest, linear, len);
return true;
}

inline void
CopyFlatStringChars(jschar *dest, JSFlatString *s, size_t len)
{
CopyLinearStringChars(dest, FlatStringToLinearString(s), len);
}

JS_FRIEND_API(bool)
GetPropertyNames(JSContext *cx, JSObject *obj, unsigned flags, JS::AutoIdVector *props);

Expand Down
6 changes: 5 additions & 1 deletion xpcom/base/CycleCollectedJSRuntime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
#include "nsCycleCollectionParticipant.h"
#include "nsCycleCollector.h"
#include "nsDOMJSUtils.h"
#include "nsJSUtils.h"

#ifdef MOZ_CRASHREPORTER
#include "nsExceptionHandler.h"
Expand Down Expand Up @@ -565,7 +566,10 @@ CycleCollectedJSRuntime::DescribeGCThing(bool aIsMarked, void* aThing,
JSFunction* fun = JS_GetObjectFunction(obj);
JSString* str = JS_GetFunctionDisplayId(fun);
if (str) {
NS_ConvertUTF16toUTF8 fname(JS_GetInternedStringChars(str));
JSFlatString* flat = JS_ASSERT_STRING_IS_FLAT(str);
nsAutoString chars;
AssignJSFlatString(chars, flat);
NS_ConvertUTF16toUTF8 fname(chars);
JS_snprintf(name, sizeof(name),
"JS Object (Function - %s)", fname.get());
} else {
Expand Down

0 comments on commit 2a7ce8f

Please sign in to comment.