| 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/contexts.h" | 5 #include "src/contexts.h" |
| 6 | 6 |
| 7 #include "src/ast/scopeinfo.h" | 7 #include "src/ast/scopeinfo.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/debug/debug.h" | 9 #include "src/debug/debug.h" |
| 10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 !current->IsNativeContext()) { | 85 !current->IsNativeContext()) { |
| 86 current = current->previous(); | 86 current = current->previous(); |
| 87 DCHECK(current->closure() == closure()); | 87 DCHECK(current->closure() == closure()); |
| 88 } | 88 } |
| 89 return current; | 89 return current; |
| 90 } | 90 } |
| 91 | 91 |
| 92 JSObject* Context::extension_object() { | 92 JSObject* Context::extension_object() { |
| 93 DCHECK(IsNativeContext() || IsFunctionContext() || IsBlockContext()); | 93 DCHECK(IsNativeContext() || IsFunctionContext() || IsBlockContext()); |
| 94 HeapObject* object = extension(); | 94 HeapObject* object = extension(); |
| 95 if (object->IsTheHole()) return nullptr; | 95 if (object->IsTheHole(GetIsolate())) return nullptr; |
| 96 if (IsBlockContext()) { | 96 if (IsBlockContext()) { |
| 97 if (!object->IsSloppyBlockWithEvalContextExtension()) return nullptr; | 97 if (!object->IsSloppyBlockWithEvalContextExtension()) return nullptr; |
| 98 object = SloppyBlockWithEvalContextExtension::cast(object)->extension(); | 98 object = SloppyBlockWithEvalContextExtension::cast(object)->extension(); |
| 99 } | 99 } |
| 100 DCHECK(object->IsJSContextExtensionObject() || | 100 DCHECK(object->IsJSContextExtensionObject() || |
| 101 (IsNativeContext() && object->IsJSGlobalObject())); | 101 (IsNativeContext() && object->IsJSGlobalObject())); |
| 102 return JSObject::cast(object); | 102 return JSObject::cast(object); |
| 103 } | 103 } |
| 104 | 104 |
| 105 | 105 |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 int index = Context::MIN_CONTEXT_SLOTS + context_locals; | 436 int index = Context::MIN_CONTEXT_SLOTS + context_locals; |
| 437 for (int i = 0; i < context_globals; i++) { | 437 for (int i = 0; i < context_globals; i++) { |
| 438 set(index++, empty_cell); | 438 set(index++, empty_cell); |
| 439 } | 439 } |
| 440 } | 440 } |
| 441 } | 441 } |
| 442 | 442 |
| 443 | 443 |
| 444 void Context::AddOptimizedFunction(JSFunction* function) { | 444 void Context::AddOptimizedFunction(JSFunction* function) { |
| 445 DCHECK(IsNativeContext()); | 445 DCHECK(IsNativeContext()); |
| 446 Isolate* isolate = GetIsolate(); |
| 446 #ifdef ENABLE_SLOW_DCHECKS | 447 #ifdef ENABLE_SLOW_DCHECKS |
| 447 if (FLAG_enable_slow_asserts) { | 448 if (FLAG_enable_slow_asserts) { |
| 448 Object* element = get(OPTIMIZED_FUNCTIONS_LIST); | 449 Object* element = get(OPTIMIZED_FUNCTIONS_LIST); |
| 449 while (!element->IsUndefined()) { | 450 while (!element->IsUndefined(isolate)) { |
| 450 CHECK(element != function); | 451 CHECK(element != function); |
| 451 element = JSFunction::cast(element)->next_function_link(); | 452 element = JSFunction::cast(element)->next_function_link(); |
| 452 } | 453 } |
| 453 } | 454 } |
| 454 | 455 |
| 455 // Check that the context belongs to the weak native contexts list. | 456 // Check that the context belongs to the weak native contexts list. |
| 456 bool found = false; | 457 bool found = false; |
| 457 Object* context = GetHeap()->native_contexts_list(); | 458 Object* context = isolate->heap()->native_contexts_list(); |
| 458 while (!context->IsUndefined()) { | 459 while (!context->IsUndefined(isolate)) { |
| 459 if (context == this) { | 460 if (context == this) { |
| 460 found = true; | 461 found = true; |
| 461 break; | 462 break; |
| 462 } | 463 } |
| 463 context = Context::cast(context)->next_context_link(); | 464 context = Context::cast(context)->next_context_link(); |
| 464 } | 465 } |
| 465 CHECK(found); | 466 CHECK(found); |
| 466 #endif | 467 #endif |
| 467 | 468 |
| 468 // If the function link field is already used then the function was | 469 // If the function link field is already used then the function was |
| 469 // enqueued as a code flushing candidate and we remove it now. | 470 // enqueued as a code flushing candidate and we remove it now. |
| 470 if (!function->next_function_link()->IsUndefined()) { | 471 if (!function->next_function_link()->IsUndefined(isolate)) { |
| 471 CodeFlusher* flusher = GetHeap()->mark_compact_collector()->code_flusher(); | 472 CodeFlusher* flusher = GetHeap()->mark_compact_collector()->code_flusher(); |
| 472 flusher->EvictCandidate(function); | 473 flusher->EvictCandidate(function); |
| 473 } | 474 } |
| 474 | 475 |
| 475 DCHECK(function->next_function_link()->IsUndefined()); | 476 DCHECK(function->next_function_link()->IsUndefined(isolate)); |
| 476 | 477 |
| 477 function->set_next_function_link(get(OPTIMIZED_FUNCTIONS_LIST), | 478 function->set_next_function_link(get(OPTIMIZED_FUNCTIONS_LIST), |
| 478 UPDATE_WEAK_WRITE_BARRIER); | 479 UPDATE_WEAK_WRITE_BARRIER); |
| 479 set(OPTIMIZED_FUNCTIONS_LIST, function, UPDATE_WEAK_WRITE_BARRIER); | 480 set(OPTIMIZED_FUNCTIONS_LIST, function, UPDATE_WEAK_WRITE_BARRIER); |
| 480 } | 481 } |
| 481 | 482 |
| 482 | 483 |
| 483 void Context::RemoveOptimizedFunction(JSFunction* function) { | 484 void Context::RemoveOptimizedFunction(JSFunction* function) { |
| 484 DCHECK(IsNativeContext()); | 485 DCHECK(IsNativeContext()); |
| 485 Object* element = get(OPTIMIZED_FUNCTIONS_LIST); | 486 Object* element = get(OPTIMIZED_FUNCTIONS_LIST); |
| 486 JSFunction* prev = NULL; | 487 JSFunction* prev = NULL; |
| 487 while (!element->IsUndefined()) { | 488 Isolate* isolate = function->GetIsolate(); |
| 489 while (!element->IsUndefined(isolate)) { |
| 488 JSFunction* element_function = JSFunction::cast(element); | 490 JSFunction* element_function = JSFunction::cast(element); |
| 489 DCHECK(element_function->next_function_link()->IsUndefined() || | 491 DCHECK(element_function->next_function_link()->IsUndefined(isolate) || |
| 490 element_function->next_function_link()->IsJSFunction()); | 492 element_function->next_function_link()->IsJSFunction()); |
| 491 if (element_function == function) { | 493 if (element_function == function) { |
| 492 if (prev == NULL) { | 494 if (prev == NULL) { |
| 493 set(OPTIMIZED_FUNCTIONS_LIST, element_function->next_function_link(), | 495 set(OPTIMIZED_FUNCTIONS_LIST, element_function->next_function_link(), |
| 494 UPDATE_WEAK_WRITE_BARRIER); | 496 UPDATE_WEAK_WRITE_BARRIER); |
| 495 } else { | 497 } else { |
| 496 prev->set_next_function_link(element_function->next_function_link(), | 498 prev->set_next_function_link(element_function->next_function_link(), |
| 497 UPDATE_WEAK_WRITE_BARRIER); | 499 UPDATE_WEAK_WRITE_BARRIER); |
| 498 } | 500 } |
| 499 element_function->set_next_function_link(GetHeap()->undefined_value(), | 501 element_function->set_next_function_link(GetHeap()->undefined_value(), |
| (...skipping 15 matching lines...) Expand all Loading... |
| 515 | 517 |
| 516 Object* Context::OptimizedFunctionsListHead() { | 518 Object* Context::OptimizedFunctionsListHead() { |
| 517 DCHECK(IsNativeContext()); | 519 DCHECK(IsNativeContext()); |
| 518 return get(OPTIMIZED_FUNCTIONS_LIST); | 520 return get(OPTIMIZED_FUNCTIONS_LIST); |
| 519 } | 521 } |
| 520 | 522 |
| 521 | 523 |
| 522 void Context::AddOptimizedCode(Code* code) { | 524 void Context::AddOptimizedCode(Code* code) { |
| 523 DCHECK(IsNativeContext()); | 525 DCHECK(IsNativeContext()); |
| 524 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); | 526 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); |
| 525 DCHECK(code->next_code_link()->IsUndefined()); | 527 DCHECK(code->next_code_link()->IsUndefined(GetIsolate())); |
| 526 code->set_next_code_link(get(OPTIMIZED_CODE_LIST)); | 528 code->set_next_code_link(get(OPTIMIZED_CODE_LIST)); |
| 527 set(OPTIMIZED_CODE_LIST, code, UPDATE_WEAK_WRITE_BARRIER); | 529 set(OPTIMIZED_CODE_LIST, code, UPDATE_WEAK_WRITE_BARRIER); |
| 528 } | 530 } |
| 529 | 531 |
| 530 | 532 |
| 531 void Context::SetOptimizedCodeListHead(Object* head) { | 533 void Context::SetOptimizedCodeListHead(Object* head) { |
| 532 DCHECK(IsNativeContext()); | 534 DCHECK(IsNativeContext()); |
| 533 set(OPTIMIZED_CODE_LIST, head, UPDATE_WEAK_WRITE_BARRIER); | 535 set(OPTIMIZED_CODE_LIST, head, UPDATE_WEAK_WRITE_BARRIER); |
| 534 } | 536 } |
| 535 | 537 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 548 | 550 |
| 549 Object* Context::DeoptimizedCodeListHead() { | 551 Object* Context::DeoptimizedCodeListHead() { |
| 550 DCHECK(IsNativeContext()); | 552 DCHECK(IsNativeContext()); |
| 551 return get(DEOPTIMIZED_CODE_LIST); | 553 return get(DEOPTIMIZED_CODE_LIST); |
| 552 } | 554 } |
| 553 | 555 |
| 554 | 556 |
| 555 Handle<Object> Context::ErrorMessageForCodeGenerationFromStrings() { | 557 Handle<Object> Context::ErrorMessageForCodeGenerationFromStrings() { |
| 556 Isolate* isolate = GetIsolate(); | 558 Isolate* isolate = GetIsolate(); |
| 557 Handle<Object> result(error_message_for_code_gen_from_strings(), isolate); | 559 Handle<Object> result(error_message_for_code_gen_from_strings(), isolate); |
| 558 if (!result->IsUndefined()) return result; | 560 if (!result->IsUndefined(isolate)) return result; |
| 559 return isolate->factory()->NewStringFromStaticChars( | 561 return isolate->factory()->NewStringFromStaticChars( |
| 560 "Code generation from strings disallowed for this context"); | 562 "Code generation from strings disallowed for this context"); |
| 561 } | 563 } |
| 562 | 564 |
| 563 | 565 |
| 564 #define COMPARE_NAME(index, type, name) \ | 566 #define COMPARE_NAME(index, type, name) \ |
| 565 if (string->IsOneByteEqualTo(STATIC_CHAR_VECTOR(#name))) return index; | 567 if (string->IsOneByteEqualTo(STATIC_CHAR_VECTOR(#name))) return index; |
| 566 | 568 |
| 567 int Context::ImportedFieldIndexForName(Handle<String> string) { | 569 int Context::ImportedFieldIndexForName(Handle<String> string) { |
| 568 NATIVE_CONTEXT_IMPORTED_FIELDS(COMPARE_NAME) | 570 NATIVE_CONTEXT_IMPORTED_FIELDS(COMPARE_NAME) |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 607 | 609 |
| 608 int previous_value = errors_thrown()->value(); | 610 int previous_value = errors_thrown()->value(); |
| 609 set_errors_thrown(Smi::FromInt(previous_value + 1)); | 611 set_errors_thrown(Smi::FromInt(previous_value + 1)); |
| 610 } | 612 } |
| 611 | 613 |
| 612 | 614 |
| 613 int Context::GetErrorsThrown() { return errors_thrown()->value(); } | 615 int Context::GetErrorsThrown() { return errors_thrown()->value(); } |
| 614 | 616 |
| 615 } // namespace internal | 617 } // namespace internal |
| 616 } // namespace v8 | 618 } // namespace v8 |
| OLD | NEW |