| 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 4301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4312 v8::Handle<v8::Object> array_obj = v8::Utils::ToLocal(array); | 4312 v8::Handle<v8::Object> array_obj = v8::Utils::ToLocal(array); |
| 4313 CcTest::global()->Set(array_name, array_obj); | 4313 CcTest::global()->Set(array_name, array_obj); |
| 4314 | 4314 |
| 4315 // This should crash with a protection violation if we are running a build | 4315 // This should crash with a protection violation if we are running a build |
| 4316 // with the bug. | 4316 // with the bug. |
| 4317 AlwaysAllocateScope aa_scope(isolate); | 4317 AlwaysAllocateScope aa_scope(isolate); |
| 4318 v8::Script::Compile(mote_code_string)->Run(); | 4318 v8::Script::Compile(mote_code_string)->Run(); |
| 4319 } | 4319 } |
| 4320 | 4320 |
| 4321 | 4321 |
| 4322 TEST(Regress168801) { | |
| 4323 if (i::FLAG_never_compact) return; | |
| 4324 i::FLAG_always_compact = true; | |
| 4325 i::FLAG_cache_optimized_code = false; | |
| 4326 i::FLAG_allow_natives_syntax = true; | |
| 4327 CcTest::InitializeVM(); | |
| 4328 Isolate* isolate = CcTest::i_isolate(); | |
| 4329 Heap* heap = isolate->heap(); | |
| 4330 HandleScope scope(isolate); | |
| 4331 | |
| 4332 // Perform one initial GC to enable code flushing. | |
| 4333 heap->CollectAllGarbage(); | |
| 4334 | |
| 4335 // Ensure the code ends up on an evacuation candidate. | |
| 4336 SimulateFullSpace(heap->code_space()); | |
| 4337 | |
| 4338 // Prepare an unoptimized function that is eligible for code flushing. | |
| 4339 Handle<JSFunction> function; | |
| 4340 { | |
| 4341 HandleScope inner_scope(isolate); | |
| 4342 CompileRun("function mkClosure() {" | |
| 4343 " return function(x) { return x + 1; };" | |
| 4344 "}" | |
| 4345 "var f = mkClosure();" | |
| 4346 "f(1); f(2);"); | |
| 4347 | |
| 4348 Handle<JSFunction> f = | |
| 4349 v8::Utils::OpenHandle( | |
| 4350 *v8::Handle<v8::Function>::Cast( | |
| 4351 CcTest::global()->Get(v8_str("f")))); | |
| 4352 CHECK(f->is_compiled()); | |
| 4353 const int kAgingThreshold = 6; | |
| 4354 for (int i = 0; i < kAgingThreshold; i++) { | |
| 4355 f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); | |
| 4356 } | |
| 4357 | |
| 4358 function = inner_scope.CloseAndEscape(handle(*f, isolate)); | |
| 4359 } | |
| 4360 | |
| 4361 // Simulate incremental marking so that unoptimized function is enqueued as a | |
| 4362 // candidate for code flushing. The shared function info however will not be | |
| 4363 // explicitly enqueued. | |
| 4364 SimulateIncrementalMarking(heap); | |
| 4365 | |
| 4366 // Now optimize the function so that it is taken off the candidate list. | |
| 4367 { | |
| 4368 HandleScope inner_scope(isolate); | |
| 4369 CompileRun("%OptimizeFunctionOnNextCall(f); f(3);"); | |
| 4370 } | |
| 4371 | |
| 4372 // This cycle will bust the heap and subsequent cycles will go ballistic. | |
| 4373 heap->CollectAllGarbage(); | |
| 4374 heap->CollectAllGarbage(); | |
| 4375 } | |
| 4376 | |
| 4377 | |
| 4378 TEST(Regress173458) { | |
| 4379 if (i::FLAG_never_compact) return; | |
| 4380 i::FLAG_always_compact = true; | |
| 4381 i::FLAG_cache_optimized_code = false; | |
| 4382 i::FLAG_allow_natives_syntax = true; | |
| 4383 CcTest::InitializeVM(); | |
| 4384 Isolate* isolate = CcTest::i_isolate(); | |
| 4385 Heap* heap = isolate->heap(); | |
| 4386 HandleScope scope(isolate); | |
| 4387 | |
| 4388 // Perform one initial GC to enable code flushing. | |
| 4389 heap->CollectAllGarbage(); | |
| 4390 | |
| 4391 // Ensure the code ends up on an evacuation candidate. | |
| 4392 SimulateFullSpace(heap->code_space()); | |
| 4393 | |
| 4394 // Prepare an unoptimized function that is eligible for code flushing. | |
| 4395 Handle<JSFunction> function; | |
| 4396 { | |
| 4397 HandleScope inner_scope(isolate); | |
| 4398 CompileRun("function mkClosure() {" | |
| 4399 " return function(x) { return x + 1; };" | |
| 4400 "}" | |
| 4401 "var f = mkClosure();" | |
| 4402 "f(1); f(2);"); | |
| 4403 | |
| 4404 Handle<JSFunction> f = | |
| 4405 v8::Utils::OpenHandle( | |
| 4406 *v8::Handle<v8::Function>::Cast( | |
| 4407 CcTest::global()->Get(v8_str("f")))); | |
| 4408 CHECK(f->is_compiled()); | |
| 4409 const int kAgingThreshold = 6; | |
| 4410 for (int i = 0; i < kAgingThreshold; i++) { | |
| 4411 f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); | |
| 4412 } | |
| 4413 | |
| 4414 function = inner_scope.CloseAndEscape(handle(*f, isolate)); | |
| 4415 } | |
| 4416 | |
| 4417 // Simulate incremental marking so that unoptimized function is enqueued as a | |
| 4418 // candidate for code flushing. The shared function info however will not be | |
| 4419 // explicitly enqueued. | |
| 4420 SimulateIncrementalMarking(heap); | |
| 4421 | |
| 4422 // Now enable the debugger which in turn will disable code flushing. | |
| 4423 CHECK(isolate->debug()->Load()); | |
| 4424 | |
| 4425 // This cycle will bust the heap and subsequent cycles will go ballistic. | |
| 4426 heap->CollectAllGarbage(); | |
| 4427 heap->CollectAllGarbage(); | |
| 4428 } | |
| 4429 | |
| 4430 | |
| 4431 #ifdef DEBUG | 4322 #ifdef DEBUG |
| 4432 TEST(Regress513507) { | 4323 TEST(Regress513507) { |
| 4433 i::FLAG_flush_optimized_code_cache = false; | 4324 i::FLAG_flush_optimized_code_cache = false; |
| 4434 i::FLAG_allow_natives_syntax = true; | 4325 i::FLAG_allow_natives_syntax = true; |
| 4435 i::FLAG_gc_global = true; | 4326 i::FLAG_gc_global = true; |
| 4436 CcTest::InitializeVM(); | 4327 CcTest::InitializeVM(); |
| 4437 Isolate* isolate = CcTest::i_isolate(); | 4328 Isolate* isolate = CcTest::i_isolate(); |
| 4438 Heap* heap = isolate->heap(); | 4329 Heap* heap = isolate->heap(); |
| 4439 HandleScope scope(isolate); | 4330 HandleScope scope(isolate); |
| 4440 | 4331 |
| (...skipping 1983 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6424 // The CollectGarbage call above starts sweeper threads. | 6315 // The CollectGarbage call above starts sweeper threads. |
| 6425 // The crash will happen if the following two functions | 6316 // The crash will happen if the following two functions |
| 6426 // are called before sweeping finishes. | 6317 // are called before sweeping finishes. |
| 6427 heap->StartIncrementalMarking(); | 6318 heap->StartIncrementalMarking(); |
| 6428 heap->FinalizeIncrementalMarkingIfComplete("test"); | 6319 heap->FinalizeIncrementalMarkingIfComplete("test"); |
| 6429 } | 6320 } |
| 6430 | 6321 |
| 6431 | 6322 |
| 6432 } // namespace internal | 6323 } // namespace internal |
| 6433 } // namespace v8 | 6324 } // namespace v8 |
| OLD | NEW |