| Index: test/cctest/test-strings.cc
|
| ===================================================================
|
| --- test/cctest/test-strings.cc (revision 11222)
|
| +++ test/cctest/test-strings.cc (working copy)
|
| @@ -587,3 +587,38 @@
|
| CHECK(SlicedString::cast(*string)->parent()->IsSeqString());
|
| CHECK_EQ("cdefghijklmnopqrstuvwx", *(string->ToCString()));
|
| }
|
| +
|
| +
|
| +// string s is made of 2^17 = 131072 'c' characters.
|
| +// a is an array starting with 'bad', followed by 2^14 times the string s.
|
| +// That means the total length of the concatenated strings is 2^31 + 3.
|
| +// So on 32bits systems summing the lengths of the strings (as smis) overflows
|
| +// and wraps.
|
| +static const char* join_causing_out_of_memory =
|
| + "var two_14 = Math.pow(2, 14);"
|
| + "var two_17 = Math.pow(2, 17);"
|
| + "var s = Array(two_17 + 1).join('c');"
|
| + "var a = ['bad'];"
|
| + "for (var i = 1; i <= two_14; i++) a.push(s);"
|
| + "a.join("");";
|
| +
|
| +
|
| +TEST(AsciiArrayJoin) {
|
| + // Set heap limits.
|
| + static const int K = 1024;
|
| + v8::ResourceConstraints constraints;
|
| + constraints.set_max_young_space_size(256 * K);
|
| + constraints.set_max_old_space_size(4 * K * K);
|
| + v8::SetResourceConstraints(&constraints);
|
| +
|
| + v8::HandleScope scope;
|
| + LocalContext context;
|
| + v8::V8::IgnoreOutOfMemoryException();
|
| + v8::Local<v8::Script> script =
|
| + v8::Script::Compile(v8::String::New(join_causing_out_of_memory));
|
| + v8::Local<v8::Value> result = script->Run();
|
| +
|
| + // Check for out of memory state.
|
| + CHECK(result.IsEmpty());
|
| + CHECK(context->HasOutOfMemoryException());
|
| +}
|
|
|