From 4228132e7480a4133377aa52ddcc18a9d38d4a9a Mon Sep 17 00:00:00 2001 From: "dslomov@chromium.org" Date: Mon, 18 Nov 2013 14:50:45 +0000 Subject: [PATCH] Use mock ArrayBuffer allocator to avoid really allocating 1Gb. R=jkummerow@chromium.org BUG=v8:3014 LOG=N Review URL: https://codereview.chromium.org/61623009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17837 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/d8.cc | 23 +++++++++++++++++++++- src/d8.h | 2 ++ test/mjsunit/mjsunit.status | 4 ---- test/mjsunit/regress/regress-319722-ArrayBuffer.js | 15 ++++++++++++-- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/d8.cc b/src/d8.cc index d227ac3..eaec7d3 100644 --- a/src/d8.cc +++ b/src/d8.cc @@ -1364,6 +1364,9 @@ bool Shell::SetOptions(int argc, char* argv[]) { } else if (strcmp(argv[i], "--stress-deopt") == 0) { options.stress_deopt = true; argv[i] = NULL; + } else if (strcmp(argv[i], "--mock-arraybuffer-allocator") == 0) { + options.mock_arraybuffer_allocator = true; + argv[i] = NULL; } else if (strcmp(argv[i], "--noalways-opt") == 0) { // No support for stressing if we can't use --always-opt. options.stress_opt = false; @@ -1673,6 +1676,19 @@ class ShellArrayBufferAllocator : public v8::ArrayBuffer::Allocator { }; +class MockArrayBufferAllocator : public v8::ArrayBuffer::Allocator { + public: + virtual void* Allocate(size_t) V8_OVERRIDE { + return malloc(0); + } + virtual void* AllocateUninitialized(size_t length) V8_OVERRIDE { + return malloc(0); + } + virtual void Free(void*, size_t) V8_OVERRIDE { + } +}; + + int Shell::Main(int argc, char* argv[]) { if (!SetOptions(argc, argv)) return 1; v8::V8::InitializeICU(); @@ -1683,7 +1699,12 @@ int Shell::Main(int argc, char* argv[]) { SetStandaloneFlagsViaCommandLine(); #endif ShellArrayBufferAllocator array_buffer_allocator; - v8::V8::SetArrayBufferAllocator(&array_buffer_allocator); + MockArrayBufferAllocator mock_arraybuffer_allocator; + if (options.mock_arraybuffer_allocator) { + v8::V8::SetArrayBufferAllocator(&mock_arraybuffer_allocator); + } else { + v8::V8::SetArrayBufferAllocator(&array_buffer_allocator); + } int result = 0; Isolate* isolate = Isolate::GetCurrent(); #ifndef V8_SHARED diff --git a/src/d8.h b/src/d8.h index 411dfdd..8c1687e 100644 --- a/src/d8.h +++ b/src/d8.h @@ -233,6 +233,7 @@ class ShellOptions { test_shell(false), dump_heap_constants(false), expected_to_throw(false), + mock_arraybuffer_allocator(false), num_isolates(1), isolate_sources(NULL) { } @@ -258,6 +259,7 @@ class ShellOptions { bool test_shell; bool dump_heap_constants; bool expected_to_throw; + bool mock_arraybuffer_allocator; int num_isolates; SourceGroup* isolate_sources; }; diff --git a/test/mjsunit/mjsunit.status b/test/mjsunit/mjsunit.status index 5134313..d975f2b 100644 --- a/test/mjsunit/mjsunit.status +++ b/test/mjsunit/mjsunit.status @@ -99,10 +99,6 @@ ############################################################################## # Long running test that reproduces memory leak and should be run manually. 'regress/regress-2073': [SKIP], - - ############################################################################## - # Needs to allocate 1Gb of memory. - 'regress/regress-319722-ArrayBuffer': [PASS, ['system == windows or system == macos or arch == arm or arch == android_arm or arch == android_ia32', SKIP]], }], # ALWAYS ############################################################################## diff --git a/test/mjsunit/regress/regress-319722-ArrayBuffer.js b/test/mjsunit/regress/regress-319722-ArrayBuffer.js index c8aed9e..1849bd2 100644 --- a/test/mjsunit/regress/regress-319722-ArrayBuffer.js +++ b/test/mjsunit/regress/regress-319722-ArrayBuffer.js @@ -25,9 +25,20 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --nostress-opt --allow-natives-syntax +// Flags: --nostress-opt --allow-natives-syntax --mock-arraybuffer-allocator var maxSize = %MaxSmi() + 1; -var ab = new ArrayBuffer(maxSize); +var ab; + +// Allocate the largest ArrayBuffer we can on this architecture. +for (k = 8; k >= 1 && ab == null; k = k/2) { + try { + ab = new ArrayBuffer(maxSize * k); + } catch (e) { + ab = null; + } +} + +assertTrue(ab != null); function TestArray(constr) { assertThrows(function() { -- 2.7.4