Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
| 8 #include "src/debug.h" | 8 #include "src/debug.h" |
| 9 #include "src/scopeinfo.h" | 9 #include "src/scopeinfo.h" |
| 10 | 10 |
| (...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 387 | 387 |
| 388 // If the function link field is already used then the function was | 388 // If the function link field is already used then the function was |
| 389 // enqueued as a code flushing candidate and we remove it now. | 389 // enqueued as a code flushing candidate and we remove it now. |
| 390 if (!function->next_function_link()->IsUndefined()) { | 390 if (!function->next_function_link()->IsUndefined()) { |
| 391 CodeFlusher* flusher = GetHeap()->mark_compact_collector()->code_flusher(); | 391 CodeFlusher* flusher = GetHeap()->mark_compact_collector()->code_flusher(); |
| 392 flusher->EvictCandidate(function); | 392 flusher->EvictCandidate(function); |
| 393 } | 393 } |
| 394 | 394 |
| 395 DCHECK(function->next_function_link()->IsUndefined()); | 395 DCHECK(function->next_function_link()->IsUndefined()); |
| 396 | 396 |
| 397 function->set_next_function_link(get(OPTIMIZED_FUNCTIONS_LIST)); | 397 function->set_next_function_link(get(OPTIMIZED_FUNCTIONS_LIST)); |
|
ulan
2015/05/27 13:35:51
set_next_function_link should be weak too. Is this
Hannes Payer (out of office)
2015/05/27 13:48:59
Next CL together with the other weak next function
| |
| 398 set(OPTIMIZED_FUNCTIONS_LIST, function); | 398 set(OPTIMIZED_FUNCTIONS_LIST, function, UPDATE_WEAK_WRITE_BARRIER); |
| 399 } | 399 } |
| 400 | 400 |
| 401 | 401 |
| 402 void Context::RemoveOptimizedFunction(JSFunction* function) { | 402 void Context::RemoveOptimizedFunction(JSFunction* function) { |
| 403 DCHECK(IsNativeContext()); | 403 DCHECK(IsNativeContext()); |
| 404 Object* element = get(OPTIMIZED_FUNCTIONS_LIST); | 404 Object* element = get(OPTIMIZED_FUNCTIONS_LIST); |
| 405 JSFunction* prev = NULL; | 405 JSFunction* prev = NULL; |
| 406 while (!element->IsUndefined()) { | 406 while (!element->IsUndefined()) { |
| 407 JSFunction* element_function = JSFunction::cast(element); | 407 JSFunction* element_function = JSFunction::cast(element); |
| 408 DCHECK(element_function->next_function_link()->IsUndefined() || | 408 DCHECK(element_function->next_function_link()->IsUndefined() || |
| 409 element_function->next_function_link()->IsJSFunction()); | 409 element_function->next_function_link()->IsJSFunction()); |
| 410 if (element_function == function) { | 410 if (element_function == function) { |
| 411 if (prev == NULL) { | 411 if (prev == NULL) { |
| 412 set(OPTIMIZED_FUNCTIONS_LIST, element_function->next_function_link()); | 412 set(OPTIMIZED_FUNCTIONS_LIST, element_function->next_function_link(), |
| 413 UPDATE_WEAK_WRITE_BARRIER); | |
| 413 } else { | 414 } else { |
| 414 prev->set_next_function_link(element_function->next_function_link()); | 415 prev->set_next_function_link(element_function->next_function_link()); |
| 415 } | 416 } |
| 416 element_function->set_next_function_link(GetHeap()->undefined_value()); | 417 element_function->set_next_function_link(GetHeap()->undefined_value()); |
| 417 return; | 418 return; |
| 418 } | 419 } |
| 419 prev = element_function; | 420 prev = element_function; |
| 420 element = element_function->next_function_link(); | 421 element = element_function->next_function_link(); |
| 421 } | 422 } |
| 422 UNREACHABLE(); | 423 UNREACHABLE(); |
| 423 } | 424 } |
| 424 | 425 |
| 425 | 426 |
| 426 void Context::SetOptimizedFunctionsListHead(Object* head) { | 427 void Context::SetOptimizedFunctionsListHead(Object* head) { |
| 427 DCHECK(IsNativeContext()); | 428 DCHECK(IsNativeContext()); |
| 428 set(OPTIMIZED_FUNCTIONS_LIST, head); | 429 set(OPTIMIZED_FUNCTIONS_LIST, head, UPDATE_WEAK_WRITE_BARRIER); |
| 429 } | 430 } |
| 430 | 431 |
| 431 | 432 |
| 432 Object* Context::OptimizedFunctionsListHead() { | 433 Object* Context::OptimizedFunctionsListHead() { |
| 433 DCHECK(IsNativeContext()); | 434 DCHECK(IsNativeContext()); |
| 434 return get(OPTIMIZED_FUNCTIONS_LIST); | 435 return get(OPTIMIZED_FUNCTIONS_LIST); |
| 435 } | 436 } |
| 436 | 437 |
| 437 | 438 |
| 438 void Context::AddOptimizedCode(Code* code) { | 439 void Context::AddOptimizedCode(Code* code) { |
| 439 DCHECK(IsNativeContext()); | 440 DCHECK(IsNativeContext()); |
| 440 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); | 441 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); |
| 441 DCHECK(code->next_code_link()->IsUndefined()); | 442 DCHECK(code->next_code_link()->IsUndefined()); |
| 442 code->set_next_code_link(get(OPTIMIZED_CODE_LIST)); | 443 code->set_next_code_link(get(OPTIMIZED_CODE_LIST)); |
| 443 set(OPTIMIZED_CODE_LIST, code); | 444 set(OPTIMIZED_CODE_LIST, code, UPDATE_WEAK_WRITE_BARRIER); |
| 444 } | 445 } |
| 445 | 446 |
| 446 | 447 |
| 447 void Context::SetOptimizedCodeListHead(Object* head) { | 448 void Context::SetOptimizedCodeListHead(Object* head) { |
| 448 DCHECK(IsNativeContext()); | 449 DCHECK(IsNativeContext()); |
| 449 set(OPTIMIZED_CODE_LIST, head); | 450 set(OPTIMIZED_CODE_LIST, head, UPDATE_WEAK_WRITE_BARRIER); |
| 450 } | 451 } |
| 451 | 452 |
| 452 | 453 |
| 453 Object* Context::OptimizedCodeListHead() { | 454 Object* Context::OptimizedCodeListHead() { |
| 454 DCHECK(IsNativeContext()); | 455 DCHECK(IsNativeContext()); |
| 455 return get(OPTIMIZED_CODE_LIST); | 456 return get(OPTIMIZED_CODE_LIST); |
| 456 } | 457 } |
| 457 | 458 |
| 458 | 459 |
| 459 void Context::SetDeoptimizedCodeListHead(Object* head) { | 460 void Context::SetDeoptimizedCodeListHead(Object* head) { |
| 460 DCHECK(IsNativeContext()); | 461 DCHECK(IsNativeContext()); |
| 461 set(DEOPTIMIZED_CODE_LIST, head); | 462 set(DEOPTIMIZED_CODE_LIST, head, UPDATE_WEAK_WRITE_BARRIER); |
| 462 } | 463 } |
| 463 | 464 |
| 464 | 465 |
| 465 Object* Context::DeoptimizedCodeListHead() { | 466 Object* Context::DeoptimizedCodeListHead() { |
| 466 DCHECK(IsNativeContext()); | 467 DCHECK(IsNativeContext()); |
| 467 return get(DEOPTIMIZED_CODE_LIST); | 468 return get(DEOPTIMIZED_CODE_LIST); |
| 468 } | 469 } |
| 469 | 470 |
| 470 | 471 |
| 471 Handle<Object> Context::ErrorMessageForCodeGenerationFromStrings() { | 472 Handle<Object> Context::ErrorMessageForCodeGenerationFromStrings() { |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 493 bool Context::IsBootstrappingOrGlobalObject(Isolate* isolate, Object* object) { | 494 bool Context::IsBootstrappingOrGlobalObject(Isolate* isolate, Object* object) { |
| 494 // During bootstrapping we allow all objects to pass as global | 495 // During bootstrapping we allow all objects to pass as global |
| 495 // objects. This is necessary to fix circular dependencies. | 496 // objects. This is necessary to fix circular dependencies. |
| 496 return isolate->heap()->gc_state() != Heap::NOT_IN_GC || | 497 return isolate->heap()->gc_state() != Heap::NOT_IN_GC || |
| 497 isolate->bootstrapper()->IsActive() || | 498 isolate->bootstrapper()->IsActive() || |
| 498 object->IsGlobalObject(); | 499 object->IsGlobalObject(); |
| 499 } | 500 } |
| 500 #endif | 501 #endif |
| 501 | 502 |
| 502 } } // namespace v8::internal | 503 } } // namespace v8::internal |
| OLD | NEW |