Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: test/cctest/test-api.cc

Issue 2944015: Fix memory leaks in test-api.cc to make valgrind happy.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2007-2009 the V8 project authors. All rights reserved. 1 // Copyright 2007-2009 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 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 458
459 459
460 TEST(MakingExternalStringConditions) { 460 TEST(MakingExternalStringConditions) {
461 v8::HandleScope scope; 461 v8::HandleScope scope;
462 LocalContext env; 462 LocalContext env;
463 463
464 // Free some space in the new space so that we can check freshness. 464 // Free some space in the new space so that we can check freshness.
465 i::Heap::CollectGarbage(0, i::NEW_SPACE); 465 i::Heap::CollectGarbage(0, i::NEW_SPACE);
466 i::Heap::CollectGarbage(0, i::NEW_SPACE); 466 i::Heap::CollectGarbage(0, i::NEW_SPACE);
467 467
468 Local<String> small_string = String::New(AsciiToTwoByteString("small")); 468 uint16_t* two_byte_string = AsciiToTwoByteString("small");
469 Local<String> small_string = String::New(two_byte_string);
470 i::DeleteArray(two_byte_string);
471
469 // We should refuse to externalize newly created small string. 472 // We should refuse to externalize newly created small string.
470 CHECK(!small_string->CanMakeExternal()); 473 CHECK(!small_string->CanMakeExternal());
471 // Trigger GCs so that the newly allocated string moves to old gen. 474 // Trigger GCs so that the newly allocated string moves to old gen.
472 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in survivor space now 475 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in survivor space now
473 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in old gen now 476 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in old gen now
474 // Old space strings should be accepted. 477 // Old space strings should be accepted.
475 CHECK(small_string->CanMakeExternal()); 478 CHECK(small_string->CanMakeExternal());
476 479
477 small_string = String::New(AsciiToTwoByteString("small 2")); 480 two_byte_string = AsciiToTwoByteString("small 2");
481 small_string = String::New(two_byte_string);
482 i::DeleteArray(two_byte_string);
483
478 // We should refuse externalizing newly created small string. 484 // We should refuse externalizing newly created small string.
479 CHECK(!small_string->CanMakeExternal()); 485 CHECK(!small_string->CanMakeExternal());
480 for (int i = 0; i < 100; i++) { 486 for (int i = 0; i < 100; i++) {
481 String::Value value(small_string); 487 String::Value value(small_string);
482 } 488 }
483 // Frequently used strings should be accepted. 489 // Frequently used strings should be accepted.
484 CHECK(small_string->CanMakeExternal()); 490 CHECK(small_string->CanMakeExternal());
485 491
486 const int buf_size = 10 * 1024; 492 const int buf_size = 10 * 1024;
487 char* buf = i::NewArray<char>(buf_size); 493 char* buf = i::NewArray<char>(buf_size);
488 memset(buf, 'a', buf_size); 494 memset(buf, 'a', buf_size);
489 buf[buf_size - 1] = '\0'; 495 buf[buf_size - 1] = '\0';
490 Local<String> large_string = String::New(AsciiToTwoByteString(buf)); 496
497 two_byte_string = AsciiToTwoByteString(buf);
498 Local<String> large_string = String::New(two_byte_string);
491 i::DeleteArray(buf); 499 i::DeleteArray(buf);
500 i::DeleteArray(two_byte_string);
492 // Large strings should be immediately accepted. 501 // Large strings should be immediately accepted.
493 CHECK(large_string->CanMakeExternal()); 502 CHECK(large_string->CanMakeExternal());
494 } 503 }
495 504
496 505
497 TEST(MakingExternalAsciiStringConditions) { 506 TEST(MakingExternalAsciiStringConditions) {
498 v8::HandleScope scope; 507 v8::HandleScope scope;
499 LocalContext env; 508 LocalContext env;
500 509
501 // Free some space in the new space so that we can check freshness. 510 // Free some space in the new space so that we can check freshness.
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 v8::HandleScope scope; 619 v8::HandleScope scope;
611 LocalContext env; 620 LocalContext env;
612 const char* one_byte_string_1 = "function a_times_t"; 621 const char* one_byte_string_1 = "function a_times_t";
613 const char* two_byte_string_1 = "wo_plus_b(a, b) {return "; 622 const char* two_byte_string_1 = "wo_plus_b(a, b) {return ";
614 const char* one_byte_extern_1 = "a * 2 + b;} a_times_two_plus_b(4, 8) + "; 623 const char* one_byte_extern_1 = "a * 2 + b;} a_times_two_plus_b(4, 8) + ";
615 const char* two_byte_extern_1 = "a_times_two_plus_b(4, 8) + "; 624 const char* two_byte_extern_1 = "a_times_two_plus_b(4, 8) + ";
616 const char* one_byte_string_2 = "a_times_two_plus_b(4, 8) + "; 625 const char* one_byte_string_2 = "a_times_two_plus_b(4, 8) + ";
617 const char* two_byte_string_2 = "a_times_two_plus_b(4, 8) + "; 626 const char* two_byte_string_2 = "a_times_two_plus_b(4, 8) + ";
618 const char* two_byte_extern_2 = "a_times_two_plus_b(1, 2);"; 627 const char* two_byte_extern_2 = "a_times_two_plus_b(1, 2);";
619 Local<String> left = v8_str(one_byte_string_1); 628 Local<String> left = v8_str(one_byte_string_1);
620 Local<String> right = String::New(AsciiToTwoByteString(two_byte_string_1)); 629
630 uint16_t* two_byte_source = AsciiToTwoByteString(two_byte_string_1);
631 Local<String> right = String::New(two_byte_source);
632 i::DeleteArray(two_byte_source);
633
621 Local<String> source = String::Concat(left, right); 634 Local<String> source = String::Concat(left, right);
622 right = String::NewExternal( 635 right = String::NewExternal(
623 new TestAsciiResource(i::StrDup(one_byte_extern_1))); 636 new TestAsciiResource(i::StrDup(one_byte_extern_1)));
624 source = String::Concat(source, right); 637 source = String::Concat(source, right);
625 right = String::NewExternal( 638 right = String::NewExternal(
626 new TestResource(AsciiToTwoByteString(two_byte_extern_1))); 639 new TestResource(AsciiToTwoByteString(two_byte_extern_1)));
627 source = String::Concat(source, right); 640 source = String::Concat(source, right);
628 right = v8_str(one_byte_string_2); 641 right = v8_str(one_byte_string_2);
629 source = String::Concat(source, right); 642 source = String::Concat(source, right);
630 right = String::New(AsciiToTwoByteString(two_byte_string_2)); 643
644 two_byte_source = AsciiToTwoByteString(two_byte_string_2);
645 right = String::New(two_byte_source);
646 i::DeleteArray(two_byte_source);
647
631 source = String::Concat(source, right); 648 source = String::Concat(source, right);
632 right = String::NewExternal( 649 right = String::NewExternal(
633 new TestResource(AsciiToTwoByteString(two_byte_extern_2))); 650 new TestResource(AsciiToTwoByteString(two_byte_extern_2)));
634 source = String::Concat(source, right); 651 source = String::Concat(source, right);
635 Local<Script> script = Script::Compile(source); 652 Local<Script> script = Script::Compile(source);
636 Local<Value> value = script->Run(); 653 Local<Value> value = script->Run();
637 CHECK(value->IsNumber()); 654 CHECK(value->IsNumber());
638 CHECK_EQ(68, value->Int32Value()); 655 CHECK_EQ(68, value->Int32Value());
639 } 656 }
640 v8::internal::CompilationCache::Clear(); 657 v8::internal::CompilationCache::Clear();
(...skipping 2907 matching lines...) Expand 10 before | Expand all | Expand 10 after
3548 whammy->objects_[whammy->cursor_].Clear(); 3565 whammy->objects_[whammy->cursor_].Clear();
3549 } 3566 }
3550 whammy->objects_[whammy->cursor_] = global; 3567 whammy->objects_[whammy->cursor_] = global;
3551 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount; 3568 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount;
3552 return whammy->getScript()->Run(); 3569 return whammy->getScript()->Run();
3553 } 3570 }
3554 3571
3555 THREADED_TEST(WeakReference) { 3572 THREADED_TEST(WeakReference) {
3556 v8::HandleScope handle_scope; 3573 v8::HandleScope handle_scope;
3557 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New(); 3574 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New();
3575 Whammy* whammy = new Whammy();
3558 templ->SetNamedPropertyHandler(WhammyPropertyGetter, 3576 templ->SetNamedPropertyHandler(WhammyPropertyGetter,
3559 0, 0, 0, 0, 3577 0, 0, 0, 0,
3560 v8::External::New(new Whammy())); 3578 v8::External::New(whammy));
3561 const char* extension_list[] = { "v8/gc" }; 3579 const char* extension_list[] = { "v8/gc" };
3562 v8::ExtensionConfiguration extensions(1, extension_list); 3580 v8::ExtensionConfiguration extensions(1, extension_list);
3563 v8::Persistent<Context> context = Context::New(&extensions); 3581 v8::Persistent<Context> context = Context::New(&extensions);
3564 Context::Scope context_scope(context); 3582 Context::Scope context_scope(context);
3565 3583
3566 v8::Handle<v8::Object> interceptor = templ->NewInstance(); 3584 v8::Handle<v8::Object> interceptor = templ->NewInstance();
3567 context->Global()->Set(v8_str("whammy"), interceptor); 3585 context->Global()->Set(v8_str("whammy"), interceptor);
3568 const char* code = 3586 const char* code =
3569 "var last;" 3587 "var last;"
3570 "for (var i = 0; i < 10000; i++) {" 3588 "for (var i = 0; i < 10000; i++) {"
3571 " var obj = whammy.length;" 3589 " var obj = whammy.length;"
3572 " if (last) last.next = obj;" 3590 " if (last) last.next = obj;"
3573 " last = obj;" 3591 " last = obj;"
3574 "}" 3592 "}"
3575 "gc();" 3593 "gc();"
3576 "4"; 3594 "4";
3577 v8::Handle<Value> result = CompileRun(code); 3595 v8::Handle<Value> result = CompileRun(code);
3578 CHECK_EQ(4.0, result->NumberValue()); 3596 CHECK_EQ(4.0, result->NumberValue());
3579 3597 delete whammy;
3580 context.Dispose(); 3598 context.Dispose();
3581 } 3599 }
3582 3600
3583 3601
3584 static bool in_scavenge = false; 3602 static bool in_scavenge = false;
3585 static int last = -1; 3603 static int last = -1;
3586 3604
3587 static void ForceScavenge(v8::Persistent<v8::Value> obj, void* data) { 3605 static void ForceScavenge(v8::Persistent<v8::Value> obj, void* data) {
3588 CHECK_EQ(-1, last); 3606 CHECK_EQ(-1, last);
3589 last = 0; 3607 last = 0;
(...skipping 4856 matching lines...) Expand 10 before | Expand all | Expand 10 after
8446 const char* expected_slice_on_cons = 8464 const char* expected_slice_on_cons =
8447 "ow is the time for all good men to come to the aid of the party" 8465 "ow is the time for all good men to come to the aid of the party"
8448 "Now is the time for all good men to come to the aid of the part"; 8466 "Now is the time for all good men to come to the aid of the part";
8449 CHECK_EQ(String::New(expected_cons), 8467 CHECK_EQ(String::New(expected_cons),
8450 env->Global()->Get(v8_str("cons"))); 8468 env->Global()->Get(v8_str("cons")));
8451 CHECK_EQ(String::New(expected_slice), 8469 CHECK_EQ(String::New(expected_slice),
8452 env->Global()->Get(v8_str("slice"))); 8470 env->Global()->Get(v8_str("slice")));
8453 CHECK_EQ(String::New(expected_slice_on_cons), 8471 CHECK_EQ(String::New(expected_slice_on_cons),
8454 env->Global()->Get(v8_str("slice_on_cons"))); 8472 env->Global()->Get(v8_str("slice_on_cons")));
8455 } 8473 }
8474 i::DeleteArray(two_byte_string);
8456 } 8475 }
8457 8476
8458 8477
8459 TEST(CompileExternalTwoByteSource) { 8478 TEST(CompileExternalTwoByteSource) {
8460 v8::HandleScope scope; 8479 v8::HandleScope scope;
8461 LocalContext context; 8480 LocalContext context;
8462 8481
8463 // This is a very short list of sources, which currently is to check for a 8482 // This is a very short list of sources, which currently is to check for a
8464 // regression caused by r2703. 8483 // regression caused by r2703.
8465 const char* ascii_sources[] = { 8484 const char* ascii_sources[] = {
8466 "0.5", 8485 "0.5",
8467 "-0.5", // This mainly testes PushBack in the Scanner. 8486 "-0.5", // This mainly testes PushBack in the Scanner.
8468 "--0.5", // This mainly testes PushBack in the Scanner. 8487 "--0.5", // This mainly testes PushBack in the Scanner.
8469 NULL 8488 NULL
8470 }; 8489 };
8471 8490
8472 // Compile the sources as external two byte strings. 8491 // Compile the sources as external two byte strings.
8473 for (int i = 0; ascii_sources[i] != NULL; i++) { 8492 for (int i = 0; ascii_sources[i] != NULL; i++) {
8474 uint16_t* two_byte_string = AsciiToTwoByteString(ascii_sources[i]); 8493 uint16_t* two_byte_string = AsciiToTwoByteString(ascii_sources[i]);
8475 UC16VectorResource uc16_resource( 8494 UC16VectorResource uc16_resource(
8476 i::Vector<const uint16_t>(two_byte_string, 8495 i::Vector<const uint16_t>(two_byte_string,
8477 i::StrLength(ascii_sources[i]))); 8496 i::StrLength(ascii_sources[i])));
8478 v8::Local<v8::String> source = v8::String::NewExternal(&uc16_resource); 8497 v8::Local<v8::String> source = v8::String::NewExternal(&uc16_resource);
8479 v8::Script::Compile(source); 8498 v8::Script::Compile(source);
8499 i::DeleteArray(two_byte_string);
8480 } 8500 }
8481 } 8501 }
8482 8502
8483 8503
8484 class RegExpStringModificationTest { 8504 class RegExpStringModificationTest {
8485 public: 8505 public:
8486 RegExpStringModificationTest() 8506 RegExpStringModificationTest()
8487 : block_(i::OS::CreateSemaphore(0)), 8507 : block_(i::OS::CreateSemaphore(0)),
8488 morphs_(0), 8508 morphs_(0),
8489 morphs_during_regexp_(0), 8509 morphs_during_regexp_(0),
(...skipping 1767 matching lines...) Expand 10 before | Expand all | Expand 10 after
10257 CHECK_EQ(2, prologue_call_count_second); 10277 CHECK_EQ(2, prologue_call_count_second);
10258 CHECK_EQ(2, epilogue_call_count_second); 10278 CHECK_EQ(2, epilogue_call_count_second);
10259 v8::V8::RemoveGCPrologueCallback(PrologueCallbackSecond); 10279 v8::V8::RemoveGCPrologueCallback(PrologueCallbackSecond);
10260 v8::V8::RemoveGCEpilogueCallback(EpilogueCallbackSecond); 10280 v8::V8::RemoveGCEpilogueCallback(EpilogueCallbackSecond);
10261 i::Heap::CollectAllGarbage(false); 10281 i::Heap::CollectAllGarbage(false);
10262 CHECK_EQ(2, prologue_call_count); 10282 CHECK_EQ(2, prologue_call_count);
10263 CHECK_EQ(2, epilogue_call_count); 10283 CHECK_EQ(2, epilogue_call_count);
10264 CHECK_EQ(2, prologue_call_count_second); 10284 CHECK_EQ(2, prologue_call_count_second);
10265 CHECK_EQ(2, epilogue_call_count_second); 10285 CHECK_EQ(2, epilogue_call_count_second);
10266 } 10286 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698