DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (b6d82b1a6b02)

VCS Links

Line Code
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
/* 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 "mozilla/DebugOnly.h"

#include "jsapi-tests/tests.h"

BEGIN_TEST(testOOM) {
  JS::RootedValue v(cx, JS::Int32Value(9));
  JS::RootedString jsstr(cx, JS::ToString(cx, v));
  char16_t ch;
  if (!JS_GetStringCharAt(cx, jsstr, 0, &ch)) {
    return false;
  }
  MOZ_RELEASE_ASSERT(ch == '9');
  return true;
}

virtual JSContext* createContext() override {
  JSContext* cx = JS_NewContext(0);
  if (!cx) {
    return nullptr;
  }
  JS_SetGCParameter(cx, JSGC_MAX_BYTES, (uint32_t)-1);
  setNativeStackQuota(cx);
  return cx;
}
END_TEST(testOOM)

#ifdef DEBUG  // js::oom functions are only available in debug builds.

const uint32_t maxAllocsPerTest = 100;

#  define START_OOM_TEST(name)                                    \
    testName = name;                                              \
    printf("Test %s: started\n", testName);                       \
    for (oomAfter = 1; oomAfter < maxAllocsPerTest; ++oomAfter) { \
      js::oom::simulator.simulateFailureAfter(                    \
          js::oom::FailureSimulator::Kind::OOM, oomAfter,         \
          js::THREAD_TYPE_MAIN, true)

#  define OOM_TEST_FINISHED                                                \
    {                                                                      \
      printf("Test %s: finished with %" PRIu64 " allocations\n", testName, \
             oomAfter - 1);                                                \
      break;                                                               \
    }

#  define END_OOM_TEST          \
    }                           \
    js::oom::simulator.reset(); \
    CHECK(oomAfter != maxAllocsPerTest)

BEGIN_TEST(testNewContext) {
  uninit();  // Get rid of test harness' original JSContext.

  JSContext* cx;
  START_OOM_TEST("new context");
  cx = JS_NewContext(8L * 1024 * 1024);
  if (cx) {
    OOM_TEST_FINISHED;
  }
  CHECK(!JSRuntime::hasLiveRuntimes());
  END_OOM_TEST;
  JS_DestroyContext(cx);
  return true;
}

const char* testName;
uint64_t oomAfter;
END_TEST(testNewContext)

#endif