1 : #include "tests.h"
2 : #include "jsutil.h"
3 :
4 : static const jschar arr[] = {
5 : 'h', 'i', ',', 'd', 'o', 'n', '\'', 't', ' ', 'd', 'e', 'l', 'e', 't', 'e', ' ', 'm', 'e', '\0'
6 : };
7 : static const size_t arrlen = sizeof(arr) / sizeof(arr[0]) - 1;
8 :
9 : static int finalized1 = 0;
10 : static int finalized2 = 0;
11 :
12 : static void
13 : finalize_str(const JSStringFinalizer *fin, jschar *chars);
14 :
15 : static const JSStringFinalizer finalizer1 = { finalize_str };
16 : static const JSStringFinalizer finalizer2 = { finalize_str };
17 :
18 : static void
19 2000 : finalize_str(const JSStringFinalizer *fin, jschar *chars)
20 : {
21 2000 : if (chars && js::PodEqual(const_cast<const jschar *>(chars), arr, arrlen)) {
22 2000 : if (fin == &finalizer1) {
23 1000 : ++finalized1;
24 1000 : } else if (fin == &finalizer2) {
25 1000 : ++finalized2;
26 : }
27 : }
28 2000 : }
29 :
30 4 : BEGIN_TEST(testExternalStrings)
31 : {
32 1 : const unsigned N = 1000;
33 :
34 1001 : for (unsigned i = 0; i < N; ++i) {
35 1000 : CHECK(JS_NewExternalString(cx, arr, arrlen, &finalizer1));
36 1000 : CHECK(JS_NewExternalString(cx, arr, arrlen, &finalizer2));
37 : }
38 :
39 : // clear that newborn root
40 1 : JS_NewUCStringCopyN(cx, arr, arrlen);
41 :
42 1 : JS_GC(cx);
43 :
44 : // a generous fudge factor to account for strings rooted by conservative gc
45 1 : const unsigned epsilon = 10;
46 :
47 1 : CHECK((N - finalized1) < epsilon);
48 1 : CHECK((N - finalized2) < epsilon);
49 :
50 1 : return true;
51 : }
52 2 : END_TEST(testExternalStrings)
|