diff options
author | Justin Seyster <justin.seyster@mongodb.com> | 2022-02-28 22:30:51 -0500 |
---|---|---|
committer | Justin Seyster <justin.seyster@mongodb.com> | 2022-03-07 12:08:01 -0500 |
commit | 26bab136615f5f7a5d6c35e767e2321dcc31b956 (patch) | |
tree | 63ecab22fa06e3b308f91697864f272c44152595 /src/mongo/scripting/mozjs/jscustomallocator.cpp | |
parent | 82190f17c29d5090c16af894ec21a9b51312cc4f (diff) | |
download | mongo-26bab136615f5f7a5d6c35e767e2321dcc31b956.tar.gz |
SERVER-61008 Upgrade vendorized mozjs to esr91.3
Co-authored-by: Mohammad Dashti <mdashti@gmail.com>
Diffstat (limited to 'src/mongo/scripting/mozjs/jscustomallocator.cpp')
-rw-r--r-- | src/mongo/scripting/mozjs/jscustomallocator.cpp | 112 |
1 files changed, 82 insertions, 30 deletions
diff --git a/src/mongo/scripting/mozjs/jscustomallocator.cpp b/src/mongo/scripting/mozjs/jscustomallocator.cpp index d170e9a0873..f8031f54ad2 100644 --- a/src/mongo/scripting/mozjs/jscustomallocator.cpp +++ b/src/mongo/scripting/mozjs/jscustomallocator.cpp @@ -30,6 +30,7 @@ #include "mongo/platform/basic.h" #include <cstddef> +#include <js/Utility.h> #include <jscustomallocator.h> #include <type_traits> @@ -196,19 +197,92 @@ size_t get_current(void* ptr) { } // namespace sm } // namespace mongo +JS_PUBLIC_DATA arena_id_t js::MallocArena; +JS_PUBLIC_DATA arena_id_t js::ArrayBufferContentsArena; +JS_PUBLIC_DATA arena_id_t js::StringBufferArena; + +void* mongo_arena_malloc(arena_id_t arena, size_t bytes) { + return std::malloc(bytes); +} + +void* mongo_arena_calloc(arena_id_t arena, size_t nmemb, size_t size) { + return std::calloc(nmemb, size); +} + +void* mongo_arena_realloc(arena_id_t arena, void* p, size_t bytes) { + if (!p) { + return mongo_arena_malloc(arena, bytes); + } + + if (!bytes) { + js_free(p); + return nullptr; + } + + size_t current = mongo::sm::get_current(p); + + if (current >= bytes) { + return p; + } + + size_t tb = mongo::sm::total_bytes; + + if (tb >= current) { + mongo::sm::total_bytes = tb - current; + } + + return std::realloc(p, bytes); +} + +void* js_arena_malloc(size_t arena, size_t bytes) { + JS_OOM_POSSIBLY_FAIL(); + JS_CHECK_LARGE_ALLOC(bytes); + return mongo::sm::wrap_alloc( + [&](void* ptr, size_t b) { return mongo_arena_malloc(arena, bytes); }, nullptr, bytes); +} + void* js_malloc(size_t bytes) { + return js_arena_malloc(js::MallocArena, bytes); +} + +void* js_arena_calloc(arena_id_t arena, size_t bytes) { + JS_OOM_POSSIBLY_FAIL(); + JS_CHECK_LARGE_ALLOC(bytes); return mongo::sm::wrap_alloc( - [](void* ptr, size_t b) { return std::malloc(b); }, nullptr, bytes); + [&](void* ptr, size_t b) { return mongo_arena_calloc(arena, 1, b); }, nullptr, bytes); } -void* js_calloc(size_t bytes) { +void* js_arena_calloc(arena_id_t arena, size_t nmemb, size_t size) { + JS_OOM_POSSIBLY_FAIL(); + JS_CHECK_LARGE_ALLOC(size); return mongo::sm::wrap_alloc( - [](void* ptr, size_t b) { return std::calloc(b, 1); }, nullptr, bytes); + [&](void* ptr, size_t b) { return mongo_arena_calloc(arena, nmemb, size); }, + nullptr, + size * nmemb); +} + +void* js_calloc(size_t bytes) { + return js_arena_calloc(js::MallocArena, bytes); } void* js_calloc(size_t nmemb, size_t size) { + return js_arena_calloc(js::MallocArena, nmemb, size); +} + +void* js_arena_realloc(arena_id_t arena, void* p, size_t bytes) { + // realloc() with zero size is not portable, as some implementations may + // return nullptr on success and free |p| for this. We assume nullptr + // indicates failure and that |p| is still valid. + MOZ_ASSERT(bytes != 0); + + JS_OOM_POSSIBLY_FAIL(); + JS_CHECK_LARGE_ALLOC(bytes); return mongo::sm::wrap_alloc( - [](void* ptr, size_t b) { return std::calloc(b, 1); }, nullptr, nmemb * size); + [&](void* ptr, size_t b) { return mongo_arena_realloc(arena, ptr, b); }, p, bytes); +} + +void* js_realloc(void* p, size_t bytes) { + return js_arena_realloc(js::MallocArena, p, bytes); } void js_free(void* p) { @@ -231,32 +305,10 @@ void js_free(void* p) { 0); } -void* js_realloc(void* p, size_t bytes) { - if (!p) { - return js_malloc(bytes); - } - - if (!bytes) { - js_free(p); - return nullptr; - } - - size_t current = mongo::sm::get_current(p); - - if (current >= bytes) { - return p; - } - - size_t tb = mongo::sm::total_bytes; - - if (tb >= current) { - mongo::sm::total_bytes = tb - current; - } - - return mongo::sm::wrap_alloc( - [](void* ptr, size_t b) { return std::realloc(ptr, b); }, p, bytes); +void js::InitMallocAllocator() { + MallocArena = 0; + ArrayBufferContentsArena = 1; + StringBufferArena = 2; } -void js::InitMallocAllocator() {} - void js::ShutDownMallocAllocator() {} |