diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /js/src/jsapi-tests/testIsInsideNursery.cpp | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | js/src/jsapi-tests/testIsInsideNursery.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/js/src/jsapi-tests/testIsInsideNursery.cpp b/js/src/jsapi-tests/testIsInsideNursery.cpp new file mode 100644 index 0000000000..793a1ed3cc --- /dev/null +++ b/js/src/jsapi-tests/testIsInsideNursery.cpp @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: set ts=8 sts=2 et sw=2 tw=80: + */ +/* 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 "jsapi-tests/tests.h" + +#include "vm/JSContext-inl.h" + +BEGIN_TEST(testIsInsideNursery) { + /* Non-GC things are never inside the nursery. */ + CHECK(!cx->nursery().isInside(cx)); + CHECK(!cx->nursery().isInside((void*)nullptr)); + + // Skip test if some part of the nursery is disabled (via env var, for + // example.) + if (!cx->zone()->allocNurseryObjects() || + !cx->zone()->allocNurseryStrings()) { + return true; + } + + JS_GC(cx); + + JS::Rooted<JSObject*> object(cx, JS_NewPlainObject(cx)); + const char oolstr[] = + "my hands are floppy dark red pieces of liver, large " + "enough to exceed the space of an inline string"; + JS::Rooted<JSString*> string(cx, JS_NewStringCopyZ(cx, oolstr)); + + /* Objects are initially allocated in the nursery. */ + CHECK(js::gc::IsInsideNursery(object)); + /* As are strings. */ + CHECK(js::gc::IsInsideNursery(string)); + /* And their contents. */ + { + JS::AutoCheckCannotGC nogc; + const JS::Latin1Char* strdata = + string->asLinear().nonInlineLatin1Chars(nogc); + CHECK(cx->nursery().isInside(strdata)); + } + + JS_GC(cx); + + /* And are tenured if still live after a GC. */ + CHECK(!js::gc::IsInsideNursery(object)); + CHECK(!js::gc::IsInsideNursery(string)); + { + JS::AutoCheckCannotGC nogc; + const JS::Latin1Char* strdata = + string->asLinear().nonInlineLatin1Chars(nogc); + CHECK(!cx->nursery().isInside(strdata)); + } + + return true; +} +END_TEST(testIsInsideNursery) |