summaryrefslogtreecommitdiffstats
path: root/js/src/jsapi-tests/testExternalStrings.cpp
blob: 59c1029fb2e8c0864131db5b301fbdcb95ac6751 (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
49
50
51
52
/* 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 "util/Text.h"

static const char16_t arr[] = u"hi, don't delete me";
static const size_t arrlen = js_strlen(arr);

static int finalized1 = 0;
static int finalized2 = 0;

struct ExternalStringCallbacks : public JSExternalStringCallbacks {
  int* finalizedCount = nullptr;

  explicit ExternalStringCallbacks(int* finalizedCount)
      : finalizedCount(finalizedCount) {}

  void finalize(char16_t* chars) const override {
    MOZ_ASSERT(chars == arr);
    (*finalizedCount)++;
  }

  size_t sizeOfBuffer(const char16_t* chars,
                      mozilla::MallocSizeOf mallocSizeOf) const override {
    MOZ_CRASH("Unexpected call");
  }
};

static const ExternalStringCallbacks callbacks1(&finalized1);
static const ExternalStringCallbacks callbacks2(&finalized2);

BEGIN_TEST(testExternalStrings) {
  const unsigned N = 1000;

  for (unsigned i = 0; i < N; ++i) {
    CHECK(JS_NewExternalString(cx, arr, arrlen, &callbacks1));
    CHECK(JS_NewExternalString(cx, arr, arrlen, &callbacks2));
  }

  JS_GC(cx);

  // 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)