js/src/jsapi-tests/testIntern.cpp
author Jon Coppeard <jcoppeard@mozilla.com>
Mon, 14 Jan 2019 11:02:35 +0000
changeset 453704 1cebf4f5c850ad22500a360c2742de3c9dd78c81
parent 448947 6f3709b3878117466168c40affa7bca0b60cf75b
permissions -rw-r--r--
Bug 1519397 - Factor GC locking RAII classes out of vm/Runtime.h r=pbone

/* 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 "gc/FreeOp.h"
#include "gc/Marking.h"
#include "jsapi-tests/tests.h"
#include "vm/JSAtom.h"
#include "vm/StringType.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,
                             void* data) {
  if (status == JSFINALIZE_GROUP_START) {
    sw.strOk = js::gc::IsMarkedUnbarriered(fop->runtime(), &sw.str);
  }
}
END_TEST(testPinAcrossGC)