blob: 38845435ba14b36d77b7728aa98bb2e4917334d2 [file] [log] [blame]
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/PodOperations.h"
#include "mozilla/Util.h"
#include "tests.h"
#include "jsutil.h"
using mozilla::ArrayLength;
using mozilla::PodEqual;
static const jschar arr[] = {
'h', 'i', ',', 'd', 'o', 'n', '\'', 't', ' ', 'd', 'e', 'l', 'e', 't', 'e', ' ', 'm', 'e', '\0'
};
static const size_t arrlen = ArrayLength(arr) - 1;
static int finalized1 = 0;
static int finalized2 = 0;
static void
finalize_str(const JSStringFinalizer *fin, jschar *chars);
static const JSStringFinalizer finalizer1 = { finalize_str };
static const JSStringFinalizer finalizer2 = { finalize_str };
static void
finalize_str(const JSStringFinalizer *fin, jschar *chars)
{
if (chars && PodEqual(const_cast<const jschar *>(chars), arr, arrlen)) {
if (fin == &finalizer1) {
++finalized1;
} else if (fin == &finalizer2) {
++finalized2;
}
}
}
BEGIN_TEST(testExternalStrings)
{
const unsigned N = 1000;
for (unsigned i = 0; i < N; ++i) {
CHECK(JS_NewExternalString(cx, arr, arrlen, &finalizer1));
CHECK(JS_NewExternalString(cx, arr, arrlen, &finalizer2));
}
// clear that newborn root
JS_NewUCStringCopyN(cx, arr, arrlen);
JS_GC(rt);
// a generous fudge factor to account for strings rooted by conservative gc
const unsigned epsilon = 10;
CHECK((N - finalized1) < epsilon);
CHECK((N - finalized2) < epsilon);
return true;
}
END_TEST(testExternalStrings)