| /* 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 JSRuntime * createRuntime() override |
| { |
| JSRuntime* rt = JS_NewRuntime(0); |
| if (!rt) |
| return nullptr; |
| JS_SetGCParameter(rt, JSGC_MAX_BYTES, (uint32_t)-1); |
| setNativeStackQuota(rt); |
| return rt; |
| } |
| END_TEST(testOOM) |
| |
| #ifdef DEBUG // OOM_maxAllocations is 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) { \ |
| setOOMAfter(oomAfter) |
| |
| #define OOM_TEST_FINISHED \ |
| { \ |
| printf("Test %s: finished with %d allocations\n", \ |
| testName, oomAfter - 1); \ |
| break; \ |
| } |
| |
| #define END_OOM_TEST \ |
| } \ |
| cancelOOMAfter(); \ |
| CHECK(oomAfter != maxAllocsPerTest) |
| |
| BEGIN_TEST(testNewRuntime) |
| { |
| uninit(); // Get rid of test harness' original JSRuntime. |
| |
| JSRuntime* rt; |
| START_OOM_TEST("new runtime"); |
| rt = JS_NewRuntime(8L * 1024 * 1024); |
| if (rt) |
| OOM_TEST_FINISHED; |
| END_OOM_TEST; |
| JS_DestroyRuntime(rt); |
| return true; |
| } |
| |
| const char* testName; |
| uint32_t oomAfter; |
| |
| void |
| setOOMAfter(uint32_t numAllocs) |
| { |
| if (uint64_t(OOM_counter) + numAllocs >= UINT32_MAX) |
| MOZ_CRASH("Can't set maxAllocations - out of range"); |
| OOM_maxAllocations = OOM_counter + numAllocs; |
| } |
| |
| void |
| cancelOOMAfter() |
| { |
| OOM_maxAllocations = UINT32_MAX; |
| } |
| END_TEST(testNewRuntime) |
| |
| #endif |