| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 4382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4393 " ProvokeOutOfMemory();" | 4393 " ProvokeOutOfMemory();" |
| 4394 "} catch (e) {" | 4394 "} catch (e) {" |
| 4395 " thrown = true;" | 4395 " thrown = true;" |
| 4396 "}"); | 4396 "}"); |
| 4397 // Check for out of memory state. | 4397 // Check for out of memory state. |
| 4398 CHECK(result.IsEmpty()); | 4398 CHECK(result.IsEmpty()); |
| 4399 CHECK(context->HasOutOfMemoryException()); | 4399 CHECK(context->HasOutOfMemoryException()); |
| 4400 } | 4400 } |
| 4401 | 4401 |
| 4402 | 4402 |
| 4403 void OOMCallback(const char* location, const char* message) { |
| 4404 exit(0); |
| 4405 } |
| 4406 |
| 4407 |
| 4403 TEST(HugeConsStringOutOfMemory) { | 4408 TEST(HugeConsStringOutOfMemory) { |
| 4404 // It's not possible to read a snapshot into a heap with different dimensions. | 4409 // It's not possible to read a snapshot into a heap with different dimensions. |
| 4405 if (i::Snapshot::IsEnabled()) return; | 4410 if (i::Snapshot::IsEnabled()) return; |
| 4406 // Set heap limits. | 4411 // Set heap limits. |
| 4407 static const int K = 1024; | 4412 static const int K = 1024; |
| 4408 v8::ResourceConstraints constraints; | 4413 v8::ResourceConstraints constraints; |
| 4409 constraints.set_max_young_space_size(256 * K); | 4414 constraints.set_max_young_space_size(256 * K); |
| 4410 constraints.set_max_old_space_size(4 * K * K); | 4415 constraints.set_max_old_space_size(4 * K * K); |
| 4411 v8::SetResourceConstraints(CcTest::isolate(), &constraints); | 4416 v8::SetResourceConstraints(CcTest::isolate(), &constraints); |
| 4412 | 4417 |
| 4413 // Execute a script that causes out of memory. | 4418 // Execute a script that causes out of memory. |
| 4414 v8::V8::IgnoreOutOfMemoryException(); | 4419 v8::V8::SetFatalErrorHandler(OOMCallback); |
| 4415 | 4420 |
| 4416 LocalContext context; | 4421 LocalContext context; |
| 4417 v8::HandleScope scope(context->GetIsolate()); | 4422 v8::HandleScope scope(context->GetIsolate()); |
| 4418 | 4423 |
| 4419 // Build huge string. This should fail with out of memory exception. | 4424 // Build huge string. This should fail with out of memory exception. |
| 4420 Local<Value> result = CompileRun( | 4425 CompileRun( |
| 4421 "var str = Array.prototype.join.call({length: 513}, \"A\").toUpperCase();" | 4426 "var str = Array.prototype.join.call({length: 513}, \"A\").toUpperCase();" |
| 4422 "for (var i = 0; i < 22; i++) { str = str + str; }"); | 4427 "for (var i = 0; i < 22; i++) { str = str + str; }"); |
| 4423 | 4428 |
| 4424 // Check for out of memory state. | 4429 CHECK(false); // Should not return. |
| 4425 CHECK(result.IsEmpty()); | |
| 4426 CHECK(context->HasOutOfMemoryException()); | |
| 4427 } | 4430 } |
| 4428 | 4431 |
| 4429 | 4432 |
| 4430 THREADED_TEST(ConstructCall) { | 4433 THREADED_TEST(ConstructCall) { |
| 4431 LocalContext context; | 4434 LocalContext context; |
| 4432 v8::HandleScope scope(context->GetIsolate()); | 4435 v8::HandleScope scope(context->GetIsolate()); |
| 4433 CompileRun( | 4436 CompileRun( |
| 4434 "function Foo() {" | 4437 "function Foo() {" |
| 4435 " var result = [];" | 4438 " var result = [];" |
| 4436 " for (var i = 0; i < arguments.length; i++) {" | 4439 " for (var i = 0; i < arguments.length; i++) {" |
| (...skipping 2481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6918 | 6921 |
| 6919 | 6922 |
| 6920 static const char* js_code_causing_huge_string_flattening = | 6923 static const char* js_code_causing_huge_string_flattening = |
| 6921 "var str = 'X';" | 6924 "var str = 'X';" |
| 6922 "for (var i = 0; i < 30; i++) {" | 6925 "for (var i = 0; i < 30; i++) {" |
| 6923 " str = str + str;" | 6926 " str = str + str;" |
| 6924 "}" | 6927 "}" |
| 6925 "str.match(/X/);"; | 6928 "str.match(/X/);"; |
| 6926 | 6929 |
| 6927 | 6930 |
| 6928 void OOMCallback(const char* location, const char* message) { | |
| 6929 exit(0); | |
| 6930 } | |
| 6931 | |
| 6932 | |
| 6933 TEST(RegexpOutOfMemory) { | 6931 TEST(RegexpOutOfMemory) { |
| 6934 // Execute a script that causes out of memory when flattening a string. | 6932 // Execute a script that causes out of memory when flattening a string. |
| 6935 v8::HandleScope scope(CcTest::isolate()); | 6933 v8::HandleScope scope(CcTest::isolate()); |
| 6936 v8::V8::SetFatalErrorHandler(OOMCallback); | 6934 v8::V8::SetFatalErrorHandler(OOMCallback); |
| 6937 LocalContext context; | 6935 LocalContext context; |
| 6938 Local<Script> script = Script::Compile(String::NewFromUtf8( | 6936 Local<Script> script = Script::Compile(String::NewFromUtf8( |
| 6939 CcTest::isolate(), js_code_causing_huge_string_flattening)); | 6937 CcTest::isolate(), js_code_causing_huge_string_flattening)); |
| 6940 last_location = NULL; | 6938 last_location = NULL; |
| 6941 script->Run(); | 6939 script->Run(); |
| 6942 | 6940 |
| (...skipping 14007 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 20950 } | 20948 } |
| 20951 for (int i = 0; i < runs; i++) { | 20949 for (int i = 0; i < runs; i++) { |
| 20952 Local<String> expected; | 20950 Local<String> expected; |
| 20953 if (i != 0) { | 20951 if (i != 0) { |
| 20954 CHECK_EQ(v8_str("escape value"), values[i]); | 20952 CHECK_EQ(v8_str("escape value"), values[i]); |
| 20955 } else { | 20953 } else { |
| 20956 CHECK(values[i].IsEmpty()); | 20954 CHECK(values[i].IsEmpty()); |
| 20957 } | 20955 } |
| 20958 } | 20956 } |
| 20959 } | 20957 } |
| OLD | NEW |