| Index: test/cctest/test-api.cc
 | 
| ===================================================================
 | 
| --- test/cctest/test-api.cc	(revision 3407)
 | 
| +++ test/cctest/test-api.cc	(working copy)
 | 
| @@ -8416,13 +8416,8 @@
 | 
|    v8::internal::HeapIterator it;
 | 
|    while (it.has_next()) {
 | 
|      v8::internal::HeapObject* object = it.next();
 | 
| -    if (object->IsJSGlobalObject()) {
 | 
| -      count++;
 | 
| -    }
 | 
| +    if (object->IsJSGlobalObject()) count++;
 | 
|    }
 | 
| -#ifdef DEBUG
 | 
| -  if (count > 0) v8::internal::Heap::TracePathToGlobal();
 | 
| -#endif
 | 
|    return count;
 | 
|  }
 | 
|  
 | 
| @@ -8432,10 +8427,16 @@
 | 
|  
 | 
|    v8::HandleScope scope;
 | 
|    v8::Persistent<Context> context;
 | 
| +  v8::Persistent<Context> other_context;
 | 
|    int gc_count;
 | 
|  
 | 
| +  // Create a context used to keep the code from aging in the compilation
 | 
| +  // cache.
 | 
| +  other_context = Context::New();
 | 
| +
 | 
|    // Context-dependent context data creates reference from the compilation
 | 
|    // cache to the global object.
 | 
| +  const char* source_simple = "1";
 | 
|    context = Context::New();
 | 
|    {
 | 
|      v8::HandleScope scope;
 | 
| @@ -8443,44 +8444,52 @@
 | 
|      context->Enter();
 | 
|      Local<v8::String> obj = v8::String::New("");
 | 
|      context->SetData(obj);
 | 
| -    CompileRun("1");
 | 
| +    CompileRun(source_simple);
 | 
|      context->Exit();
 | 
|    }
 | 
|    context.Dispose();
 | 
|    for (gc_count = 1; gc_count < 10; gc_count++) {
 | 
| +    other_context->Enter();
 | 
| +    CompileRun(source_simple);
 | 
| +    other_context->Exit();
 | 
|      v8::internal::Heap::CollectAllGarbage(false);
 | 
| -    if (GetGlobalObjectsCount() == 0) break;
 | 
| +    if (GetGlobalObjectsCount() == 1) break;
 | 
|    }
 | 
| -  CHECK_EQ(0, GetGlobalObjectsCount());
 | 
| -  CHECK_EQ(2, gc_count);
 | 
| +  CHECK_GE(2, gc_count);
 | 
| +  CHECK_EQ(1, GetGlobalObjectsCount());
 | 
|  
 | 
|    // Eval in a function creates reference from the compilation cache to the
 | 
|    // global object.
 | 
| +  const char* source_eval = "function f(){eval('1')}; f()";
 | 
|    context = Context::New();
 | 
|    {
 | 
|      v8::HandleScope scope;
 | 
|  
 | 
|      context->Enter();
 | 
| -    CompileRun("function f(){eval('1')}; f()");
 | 
| +    CompileRun(source_eval);
 | 
|      context->Exit();
 | 
|    }
 | 
|    context.Dispose();
 | 
|    for (gc_count = 1; gc_count < 10; gc_count++) {
 | 
| +    other_context->Enter();
 | 
| +    CompileRun(source_eval);
 | 
| +    other_context->Exit();
 | 
|      v8::internal::Heap::CollectAllGarbage(false);
 | 
| -    if (GetGlobalObjectsCount() == 0) break;
 | 
| +    if (GetGlobalObjectsCount() == 1) break;
 | 
|    }
 | 
| -  CHECK_GE(2, gc_count);
 | 
| +  CHECK(gc_count <= 2);
 | 
|    CHECK_EQ(1, GetGlobalObjectsCount());
 | 
|  
 | 
|    // Looking up the line number for an exception creates reference from the
 | 
|    // compilation cache to the global object.
 | 
| +  const char* source_exception = "function f(){throw 1;} f()";
 | 
|    context = Context::New();
 | 
|    {
 | 
|      v8::HandleScope scope;
 | 
|  
 | 
|      context->Enter();
 | 
|      v8::TryCatch try_catch;
 | 
| -    CompileRun("function f(){throw 1;}; f()");
 | 
| +    CompileRun(source_exception);
 | 
|      CHECK(try_catch.HasCaught());
 | 
|      v8::Handle<v8::Message> message = try_catch.Message();
 | 
|      CHECK(!message.IsEmpty());
 | 
| @@ -8489,9 +8498,14 @@
 | 
|    }
 | 
|    context.Dispose();
 | 
|    for (gc_count = 1; gc_count < 10; gc_count++) {
 | 
| +    other_context->Enter();
 | 
| +    CompileRun(source_exception);
 | 
| +    other_context->Exit();
 | 
|      v8::internal::Heap::CollectAllGarbage(false);
 | 
| -    if (GetGlobalObjectsCount() == 0) break;
 | 
| +    if (GetGlobalObjectsCount() == 1) break;
 | 
|    }
 | 
| -  CHECK_EQ(0, GetGlobalObjectsCount());
 | 
| -  CHECK_EQ(2, gc_count);
 | 
| +  CHECK_GE(2, gc_count);
 | 
| +  CHECK_EQ(1, GetGlobalObjectsCount());
 | 
| +
 | 
| +  other_context.Dispose();
 | 
|  }
 | 
| 
 |