| 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 4461 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   4472   CHECK(r7->IsNull()); |   4472   CHECK(r7->IsNull()); | 
|   4473   Local<v8::Value> r8 = ReturnThisStrict->Call(v8_num(42), 0, NULL); |   4473   Local<v8::Value> r8 = ReturnThisStrict->Call(v8_num(42), 0, NULL); | 
|   4474   CHECK(r8->StrictEquals(v8_num(42))); |   4474   CHECK(r8->StrictEquals(v8_num(42))); | 
|   4475   Local<v8::Value> r9 = ReturnThisStrict->Call(v8_str("hello"), 0, NULL); |   4475   Local<v8::Value> r9 = ReturnThisStrict->Call(v8_str("hello"), 0, NULL); | 
|   4476   CHECK(r9->StrictEquals(v8_str("hello"))); |   4476   CHECK(r9->StrictEquals(v8_str("hello"))); | 
|   4477   Local<v8::Value> r10 = ReturnThisStrict->Call(v8::True(isolate), 0, NULL); |   4477   Local<v8::Value> r10 = ReturnThisStrict->Call(v8::True(isolate), 0, NULL); | 
|   4478   CHECK(r10->StrictEquals(v8::True(isolate))); |   4478   CHECK(r10->StrictEquals(v8::True(isolate))); | 
|   4479 } |   4479 } | 
|   4480  |   4480  | 
|   4481  |   4481  | 
|   4482 static const char* js_code_causing_out_of_memory = |  | 
|   4483     "var a = new Array(); while(true) a.push(a);"; |  | 
|   4484  |  | 
|   4485  |  | 
|   4486 // These tests run for a long time and prevent us from running tests |  | 
|   4487 // that come after them so they cannot run in parallel. |  | 
|   4488 TEST(OutOfMemory) { |  | 
|   4489   // It's not possible to read a snapshot into a heap with different dimensions. |  | 
|   4490   if (i::Snapshot::IsEnabled()) return; |  | 
|   4491   // Set heap limits. |  | 
|   4492   static const int K = 1024; |  | 
|   4493   v8::ResourceConstraints constraints; |  | 
|   4494   constraints.set_max_young_space_size(256 * K); |  | 
|   4495   constraints.set_max_old_space_size(5 * K * K); |  | 
|   4496   v8::SetResourceConstraints(CcTest::isolate(), &constraints); |  | 
|   4497  |  | 
|   4498   // Execute a script that causes out of memory. |  | 
|   4499   LocalContext context; |  | 
|   4500   v8::HandleScope scope(context->GetIsolate()); |  | 
|   4501   v8::V8::IgnoreOutOfMemoryException(); |  | 
|   4502   Local<Value> result = CompileRun(js_code_causing_out_of_memory); |  | 
|   4503  |  | 
|   4504   // Check for out of memory state. |  | 
|   4505   CHECK(result.IsEmpty()); |  | 
|   4506   CHECK(context->HasOutOfMemoryException()); |  | 
|   4507 } |  | 
|   4508  |  | 
|   4509  |  | 
|   4510 void ProvokeOutOfMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { |  | 
|   4511   ApiTestFuzzer::Fuzz(); |  | 
|   4512  |  | 
|   4513   LocalContext context; |  | 
|   4514   v8::HandleScope scope(context->GetIsolate()); |  | 
|   4515   Local<Value> result = CompileRun(js_code_causing_out_of_memory); |  | 
|   4516  |  | 
|   4517   // Check for out of memory state. |  | 
|   4518   CHECK(result.IsEmpty()); |  | 
|   4519   CHECK(context->HasOutOfMemoryException()); |  | 
|   4520  |  | 
|   4521   args.GetReturnValue().Set(result); |  | 
|   4522 } |  | 
|   4523  |  | 
|   4524  |  | 
|   4525 TEST(OutOfMemoryNested) { |  | 
|   4526   // It's not possible to read a snapshot into a heap with different dimensions. |  | 
|   4527   if (i::Snapshot::IsEnabled()) return; |  | 
|   4528   // Set heap limits. |  | 
|   4529   static const int K = 1024; |  | 
|   4530   v8::ResourceConstraints constraints; |  | 
|   4531   constraints.set_max_young_space_size(256 * K); |  | 
|   4532   constraints.set_max_old_space_size(5 * K * K); |  | 
|   4533   v8::Isolate* isolate = CcTest::isolate(); |  | 
|   4534   v8::SetResourceConstraints(isolate, &constraints); |  | 
|   4535  |  | 
|   4536   v8::HandleScope scope(isolate); |  | 
|   4537   Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |  | 
|   4538   templ->Set(v8_str("ProvokeOutOfMemory"), |  | 
|   4539              v8::FunctionTemplate::New(isolate, ProvokeOutOfMemory)); |  | 
|   4540   LocalContext context(0, templ); |  | 
|   4541   v8::V8::IgnoreOutOfMemoryException(); |  | 
|   4542   Local<Value> result = CompileRun( |  | 
|   4543     "var thrown = false;" |  | 
|   4544     "try {" |  | 
|   4545     "  ProvokeOutOfMemory();" |  | 
|   4546     "} catch (e) {" |  | 
|   4547     "  thrown = true;" |  | 
|   4548     "}"); |  | 
|   4549   // Check for out of memory state. |  | 
|   4550   CHECK(result.IsEmpty()); |  | 
|   4551   CHECK(context->HasOutOfMemoryException()); |  | 
|   4552 } |  | 
|   4553  |  | 
|   4554  |  | 
|   4555 void OOMCallback(const char* location, const char* message) { |  | 
|   4556   exit(0); |  | 
|   4557 } |  | 
|   4558  |  | 
|   4559  |  | 
|   4560 TEST(HugeConsStringOutOfMemory) { |  | 
|   4561   // It's not possible to read a snapshot into a heap with different dimensions. |  | 
|   4562   if (i::Snapshot::IsEnabled()) return; |  | 
|   4563   // Set heap limits. |  | 
|   4564   static const int K = 1024; |  | 
|   4565   v8::ResourceConstraints constraints; |  | 
|   4566   constraints.set_max_young_space_size(256 * K); |  | 
|   4567   constraints.set_max_old_space_size(4 * K * K); |  | 
|   4568   v8::SetResourceConstraints(CcTest::isolate(), &constraints); |  | 
|   4569  |  | 
|   4570   // Execute a script that causes out of memory. |  | 
|   4571   v8::V8::SetFatalErrorHandler(OOMCallback); |  | 
|   4572  |  | 
|   4573   LocalContext context; |  | 
|   4574   v8::HandleScope scope(context->GetIsolate()); |  | 
|   4575  |  | 
|   4576   // Build huge string. This should fail with out of memory exception. |  | 
|   4577   CompileRun( |  | 
|   4578     "var str = Array.prototype.join.call({length: 513}, \"A\").toUpperCase();" |  | 
|   4579     "for (var i = 0; i < 22; i++) { str = str + str; }"); |  | 
|   4580  |  | 
|   4581   CHECK(false);  // Should not return. |  | 
|   4582 } |  | 
|   4583  |  | 
|   4584  |  | 
|   4585 THREADED_TEST(ConstructCall) { |   4482 THREADED_TEST(ConstructCall) { | 
|   4586   LocalContext context; |   4483   LocalContext context; | 
|   4587   v8::Isolate* isolate = context->GetIsolate(); |   4484   v8::Isolate* isolate = context->GetIsolate(); | 
|   4588   v8::HandleScope scope(isolate); |   4485   v8::HandleScope scope(isolate); | 
|   4589   CompileRun( |   4486   CompileRun( | 
|   4590     "function Foo() {" |   4487     "function Foo() {" | 
|   4591     "  var result = [];" |   4488     "  var result = [];" | 
|   4592     "  for (var i = 0; i < arguments.length; i++) {" |   4489     "  for (var i = 0; i < arguments.length; i++) {" | 
|   4593     "    result.push(arguments[i]);" |   4490     "    result.push(arguments[i]);" | 
|   4594     "  }" |   4491     "  }" | 
| (...skipping 17799 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  22394 TEST(ThrowOnJavascriptExecution) { |  22291 TEST(ThrowOnJavascriptExecution) { | 
|  22395   LocalContext context; |  22292   LocalContext context; | 
|  22396   v8::Isolate* isolate = context->GetIsolate(); |  22293   v8::Isolate* isolate = context->GetIsolate(); | 
|  22397   v8::HandleScope scope(isolate); |  22294   v8::HandleScope scope(isolate); | 
|  22398   v8::TryCatch try_catch; |  22295   v8::TryCatch try_catch; | 
|  22399   v8::Isolate::DisallowJavascriptExecutionScope throw_js( |  22296   v8::Isolate::DisallowJavascriptExecutionScope throw_js( | 
|  22400       isolate, v8::Isolate::DisallowJavascriptExecutionScope::THROW_ON_FAILURE); |  22297       isolate, v8::Isolate::DisallowJavascriptExecutionScope::THROW_ON_FAILURE); | 
|  22401   CompileRun("1+1"); |  22298   CompileRun("1+1"); | 
|  22402   CHECK(try_catch.HasCaught()); |  22299   CHECK(try_catch.HasCaught()); | 
|  22403 } |  22300 } | 
| OLD | NEW |