| Index: test/cctest/test-heap.cc
 | 
| diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc
 | 
| index 2ccc9d41e69c4b795742eba362033998b1ad2f8b..696dc864430d2c72250a8ac60be5411080c7c94f 100644
 | 
| --- a/test/cctest/test-heap.cc
 | 
| +++ b/test/cctest/test-heap.cc
 | 
| @@ -1069,6 +1069,70 @@ TEST(TestCodeFlushingIncremental) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +TEST(TestCodeFlushingIncrementalScavenge) {
 | 
| +  // If we do not flush code this test is invalid.
 | 
| +  if (!FLAG_flush_code) return;
 | 
| +  i::FLAG_allow_natives_syntax = true;
 | 
| +  InitializeVM();
 | 
| +  v8::HandleScope scope;
 | 
| +  const char* source = "var foo = function() {"
 | 
| +                       "  var x = 42;"
 | 
| +                       "  var y = 42;"
 | 
| +                       "  var z = x + y;"
 | 
| +                       "};"
 | 
| +                       "foo();"
 | 
| +                       "var bar = function() {"
 | 
| +                       "  var x = 23;"
 | 
| +                       "};"
 | 
| +                       "bar();";
 | 
| +  Handle<String> foo_name = FACTORY->LookupAsciiSymbol("foo");
 | 
| +  Handle<String> bar_name = FACTORY->LookupAsciiSymbol("bar");
 | 
| +
 | 
| +  // Perfrom one initial GC to enable code flushing.
 | 
| +  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
 | 
| +
 | 
| +  // This compile will add the code to the compilation cache.
 | 
| +  { v8::HandleScope scope;
 | 
| +    CompileRun(source);
 | 
| +  }
 | 
| +
 | 
| +  // Check functions are compiled.
 | 
| +  Object* func_value = Isolate::Current()->context()->global_object()->
 | 
| +      GetProperty(*foo_name)->ToObjectChecked();
 | 
| +  CHECK(func_value->IsJSFunction());
 | 
| +  Handle<JSFunction> function(JSFunction::cast(func_value));
 | 
| +  CHECK(function->shared()->is_compiled());
 | 
| +  Object* func_value2 = Isolate::Current()->context()->global_object()->
 | 
| +      GetProperty(*bar_name)->ToObjectChecked();
 | 
| +  CHECK(func_value2->IsJSFunction());
 | 
| +  Handle<JSFunction> function2(JSFunction::cast(func_value2));
 | 
| +  CHECK(function2->shared()->is_compiled());
 | 
| +
 | 
| +  // Clear references to functions so that one of them can die.
 | 
| +  { v8::HandleScope scope;
 | 
| +    CompileRun("foo = 0; bar = 0;");
 | 
| +  }
 | 
| +
 | 
| +  // Bump the code age so that flushing is triggered while the function
 | 
| +  // object is still located in new-space.
 | 
| +  const int kAgingThreshold = 6;
 | 
| +  function->shared()->set_code_age(kAgingThreshold);
 | 
| +  function2->shared()->set_code_age(kAgingThreshold);
 | 
| +
 | 
| +  // Simulate incremental marking so that the functions are enqueued as
 | 
| +  // code flushing candidates. Then kill one of the functions. Finally
 | 
| +  // perform a scavenge while incremental marking is still running.
 | 
| +  SimulateIncrementalMarking();
 | 
| +  *function2.location() = NULL;
 | 
| +  HEAP->CollectGarbage(NEW_SPACE, "test scavenge while marking");
 | 
| +
 | 
| +  // Simulate one final GC to make sure the candidate queue is sane.
 | 
| +  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
 | 
| +  CHECK(!function->shared()->is_compiled() || function->IsOptimized());
 | 
| +  CHECK(!function->is_compiled() || function->IsOptimized());
 | 
| +}
 | 
| +
 | 
| +
 | 
|  // Count the number of native contexts in the weak list of native contexts.
 | 
|  int CountNativeContexts() {
 | 
|    int count = 0;
 | 
| 
 |