summaryrefslogtreecommitdiff
path: root/js/src/jsapi-tests/testIntern.cpp
blob: 0bcc5fe0dbba9b98192f1a2f54bc162d11fb674e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* 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 "jsatom.h"

#include "gc/Marking.h"
#include "jsapi-tests/tests.h"
#include "vm/String.h"

using mozilla::ArrayLength;

BEGIN_TEST(testAtomizedIsNotPinned)
{
    /* Try to pick a string that won't be interned by other tests in this runtime. */
    static const char someChars[] = "blah blah blah? blah blah blah";
    JS::Rooted<JSAtom*> atom(cx, js::Atomize(cx, someChars, ArrayLength(someChars)));
    CHECK(!JS_StringHasBeenPinned(cx, atom));
    CHECK(JS_AtomizeAndPinJSString(cx, atom));
    CHECK(JS_StringHasBeenPinned(cx, atom));
    return true;
}
END_TEST(testAtomizedIsNotPinned)

struct StringWrapperStruct
{
    JSString* str;
    bool     strOk;
} sw;

BEGIN_TEST(testPinAcrossGC)
{
    sw.str = JS_AtomizeAndPinString(cx, "wrapped chars that another test shouldn't be using");
    sw.strOk = false;
    CHECK(sw.str);
    JS_AddFinalizeCallback(cx, FinalizeCallback, nullptr);
    JS_GC(cx);
    CHECK(sw.strOk);
    return true;
}

static void
FinalizeCallback(JSFreeOp* fop, JSFinalizeStatus status, bool isZoneGC, void* data)
{
    if (status == JSFINALIZE_GROUP_START)
        sw.strOk = js::gc::IsMarkedUnbarriered(fop->runtime(), &sw.str);
}
END_TEST(testPinAcrossGC)