Revision: 3372 Author: [email protected] Date: Thu Nov 26 23:57:45 2009 Log: Add test to expose bug 528
BUG=http://code.google.com/p/v8/issues/detail?id=528 TEST=cctest/test-api/Bug528 Review URL: http://codereview.chromium.org/443021 http://code.google.com/p/v8/source/detail?r=3372 Modified: /branches/bleeding_edge/src/objects-debug.cc /branches/bleeding_edge/test/cctest/test-api.cc ======================================= --- /branches/bleeding_edge/src/objects-debug.cc Tue Nov 24 06:10:06 2009 +++ /branches/bleeding_edge/src/objects-debug.cc Thu Nov 26 23:57:45 2009 @@ -1136,6 +1136,22 @@ type()->ShortPrint(); PrintF("\n - id: "); id()->ShortPrint(); + PrintF("\n - data: "); + data()->ShortPrint(); + PrintF("\n - context data: "); + context_data()->ShortPrint(); + PrintF("\n - wrapper: "); + wrapper()->ShortPrint(); + PrintF("\n - compilation type: "); + compilation_type()->ShortPrint(); + PrintF("\n - line ends fixed array: "); + line_ends_fixed_array()->ShortPrint(); + PrintF("\n - line ends js array: "); + line_ends_js_array()->ShortPrint(); + PrintF("\n - eval from function: "); + eval_from_function()->ShortPrint(); + PrintF("\n - eval from instructions offset: "); + eval_from_instructions_offset()->ShortPrint(); PrintF("\n"); } ======================================= --- /branches/bleeding_edge/test/cctest/test-api.cc Wed Nov 25 13:50:30 2009 +++ /branches/bleeding_edge/test/cctest/test-api.cc Thu Nov 26 23:57:45 2009 @@ -8495,3 +8495,107 @@ v8::String::Utf8Value value(try_catch.Exception()); CHECK_EQ(0, strcmp(*value, "Hey!")); } + + +static int GetGlobalObjectsCount() { + int count = 0; + v8::internal::HeapIterator it; + while (it.has_next()) { + v8::internal::HeapObject* object = it.next(); + if (object->IsJSGlobalObject()) { + count++; + } + } +#ifdef DEBUG + if (count > 0) v8::internal::Heap::TracePathToGlobal(); +#endif + return count; +} + + +TEST(Bug528) { + v8::V8::Initialize(); + + v8::HandleScope scope; + v8::Persistent<Context> context; + int gc_count; + + // Context-dependent context data creates reference from the compilation + // cache to the global object. + context = Context::New(); + { + v8::HandleScope scope; + + context->Enter(); + Local<v8::Object> obj = v8::Object::New(); + context->SetData(obj); + CompileRun("1"); + context->Exit(); + } + context.Dispose(); + for (gc_count = 1; gc_count < 10; gc_count++) { + v8::internal::Heap::CollectAllGarbage(false); + if (GetGlobalObjectsCount() == 0) break; + } + CHECK_EQ(0, GetGlobalObjectsCount()); + + // Compilation cache size is different for Android. +#if defined(ANDROID) + CHECK_EQ(1, gc_count); +#else + CHECK_EQ(5, gc_count); +#endif + + // Eval in a function creates reference from the compilation cache to the + // global object. + context = Context::New(); + { + v8::HandleScope scope; + + context->Enter(); + CompileRun("function f(){eval('1')}; f()"); + context->Exit(); + } + context.Dispose(); + for (gc_count = 1; gc_count < 10; gc_count++) { + v8::internal::Heap::CollectAllGarbage(false); + if (GetGlobalObjectsCount() == 0) break; + } + CHECK_EQ(0, GetGlobalObjectsCount()); + + // Compilation cache size is different for Android. +#if defined(ANDROID) + CHECK_EQ(1, gc_count); +#else + CHECK_EQ(2, gc_count); +#endif + + // Looking up the line number for an exception creates reference from the + // compilation cache to the global object. + context = Context::New(); + { + v8::HandleScope scope; + + context->Enter(); + v8::TryCatch try_catch; + CompileRun("function f(){throw 1;}; f()"); + CHECK(try_catch.HasCaught()); + v8::Handle<v8::Message> message = try_catch.Message(); + CHECK(!message.IsEmpty()); + CHECK_EQ(1, message->GetLineNumber()); + context->Exit(); + } + context.Dispose(); + for (gc_count = 1; gc_count < 10; gc_count++) { + v8::internal::Heap::CollectAllGarbage(false); + if (GetGlobalObjectsCount() == 0) break; + } + CHECK_EQ(0, GetGlobalObjectsCount()); + + // Compilation cache size is different for Android. +#if defined(ANDROID) + CHECK_EQ(2, gc_count); +#else + CHECK_EQ(5, gc_count); +#endif +} -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
