OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 (isolate)->is_out_of_memory()) { \ | 90 (isolate)->is_out_of_memory()) { \ |
91 if (!handle_scope_implementer->ignore_out_of_memory()) \ | 91 if (!handle_scope_implementer->ignore_out_of_memory()) \ |
92 i::V8::FatalProcessOutOfMemory(NULL); \ | 92 i::V8::FatalProcessOutOfMemory(NULL); \ |
93 } \ | 93 } \ |
94 bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \ | 94 bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \ |
95 (isolate)->OptionalRescheduleException(call_depth_is_zero); \ | 95 (isolate)->OptionalRescheduleException(call_depth_is_zero); \ |
96 return value; \ | 96 return value; \ |
97 } \ | 97 } \ |
98 } while (false) | 98 } while (false) |
99 | 99 |
100 // TODO(isolates): Add a parameter to this macro for an isolate. | |
101 | 100 |
102 #define API_ENTRY_CHECK(msg) \ | 101 #define API_ENTRY_CHECK(isolate, msg) \ |
103 do { \ | 102 do { \ |
104 if (v8::Locker::IsActive()) { \ | 103 if (v8::Locker::IsActive()) { \ |
105 ApiCheck(i::Isolate::Current()->thread_manager()-> \ | 104 ApiCheck(isolate->thread_manager()-> IsLockedByCurrentThread(), \ |
106 IsLockedByCurrentThread(), \ | |
107 msg, \ | 105 msg, \ |
108 "Entering the V8 API without proper locking in place"); \ | 106 "Entering the V8 API without proper locking in place"); \ |
109 } \ | 107 } \ |
110 } while (false) | 108 } while (false) |
111 | 109 |
112 | 110 |
113 // --- E x c e p t i o n B e h a v i o r --- | 111 // --- E x c e p t i o n B e h a v i o r --- |
114 | 112 |
115 | 113 |
116 static void DefaultFatalErrorHandler(const char* location, | 114 static void DefaultFatalErrorHandler(const char* location, |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
566 i::Isolate* isolate = i::Isolate::Current(); | 564 i::Isolate* isolate = i::Isolate::Current(); |
567 LOG_API(isolate, "DisposeGlobal"); | 565 LOG_API(isolate, "DisposeGlobal"); |
568 if (!isolate->IsInitialized()) return; | 566 if (!isolate->IsInitialized()) return; |
569 isolate->global_handles()->Destroy(obj); | 567 isolate->global_handles()->Destroy(obj); |
570 } | 568 } |
571 | 569 |
572 // --- H a n d l e s --- | 570 // --- H a n d l e s --- |
573 | 571 |
574 | 572 |
575 HandleScope::HandleScope() { | 573 HandleScope::HandleScope() { |
576 API_ENTRY_CHECK("HandleScope::HandleScope"); | |
577 i::Isolate* isolate = i::Isolate::Current(); | 574 i::Isolate* isolate = i::Isolate::Current(); |
| 575 API_ENTRY_CHECK(isolate, "HandleScope::HandleScope"); |
578 v8::ImplementationUtilities::HandleScopeData* current = | 576 v8::ImplementationUtilities::HandleScopeData* current = |
579 isolate->handle_scope_data(); | 577 isolate->handle_scope_data(); |
580 isolate_ = isolate; | 578 isolate_ = isolate; |
581 prev_next_ = current->next; | 579 prev_next_ = current->next; |
582 prev_limit_ = current->limit; | 580 prev_limit_ = current->limit; |
583 is_closed_ = false; | 581 is_closed_ = false; |
584 current->level++; | 582 current->level++; |
585 } | 583 } |
586 | 584 |
587 | 585 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
623 | 621 |
624 | 622 |
625 i::Object** HandleScope::CreateHandle(i::HeapObject* value) { | 623 i::Object** HandleScope::CreateHandle(i::HeapObject* value) { |
626 ASSERT(value->IsHeapObject()); | 624 ASSERT(value->IsHeapObject()); |
627 return reinterpret_cast<i::Object**>( | 625 return reinterpret_cast<i::Object**>( |
628 i::HandleScope::CreateHandle(value, value->GetIsolate())); | 626 i::HandleScope::CreateHandle(value, value->GetIsolate())); |
629 } | 627 } |
630 | 628 |
631 | 629 |
632 void Context::Enter() { | 630 void Context::Enter() { |
633 // TODO(isolates): Context should have a pointer to isolate. | 631 i::Handle<i::Context> env = Utils::OpenHandle(this); |
634 i::Isolate* isolate = i::Isolate::Current(); | 632 i::Isolate* isolate = env->GetIsolate(); |
635 if (IsDeadCheck(isolate, "v8::Context::Enter()")) return; | 633 if (IsDeadCheck(isolate, "v8::Context::Enter()")) return; |
636 ENTER_V8(isolate); | 634 ENTER_V8(isolate); |
637 | 635 |
638 i::Handle<i::Context> env = Utils::OpenHandle(this); | |
639 isolate->handle_scope_implementer()->EnterContext(env); | 636 isolate->handle_scope_implementer()->EnterContext(env); |
640 | 637 |
641 isolate->handle_scope_implementer()->SaveContext(isolate->context()); | 638 isolate->handle_scope_implementer()->SaveContext(isolate->context()); |
642 isolate->set_context(*env); | 639 isolate->set_context(*env); |
643 } | 640 } |
644 | 641 |
645 | 642 |
646 void Context::Exit() { | 643 void Context::Exit() { |
647 // TODO(isolates): Context should have a pointer to isolate. | 644 i::Handle<i::Context> env = Utils::OpenHandle(this); |
648 i::Isolate* isolate = i::Isolate::Current(); | 645 i::Isolate* isolate = env->GetIsolate(); |
649 if (!isolate->IsInitialized()) return; | 646 if (!isolate->IsInitialized()) return; |
650 | 647 |
651 if (!ApiCheck(isolate->handle_scope_implementer()->LeaveLastContext(), | 648 if (!ApiCheck(isolate->handle_scope_implementer()->LeaveLastContext(), |
652 "v8::Context::Exit()", | 649 "v8::Context::Exit()", |
653 "Cannot exit non-entered context")) { | 650 "Cannot exit non-entered context")) { |
654 return; | 651 return; |
655 } | 652 } |
656 | 653 |
657 // Content of 'last_context' could be NULL. | 654 // Content of 'last_context' could be NULL. |
658 i::Context* last_context = | 655 i::Context* last_context = |
659 isolate->handle_scope_implementer()->RestoreContext(); | 656 isolate->handle_scope_implementer()->RestoreContext(); |
660 isolate->set_context(last_context); | 657 isolate->set_context(last_context); |
661 } | 658 } |
662 | 659 |
663 | 660 |
664 void Context::SetData(v8::Handle<String> data) { | 661 void Context::SetData(v8::Handle<String> data) { |
665 // TODO(isolates): Context should have a pointer to isolate. | 662 i::Handle<i::Context> env = Utils::OpenHandle(this); |
666 i::Isolate* isolate = i::Isolate::Current(); | 663 i::Isolate* isolate = env->GetIsolate(); |
667 if (IsDeadCheck(isolate, "v8::Context::SetData()")) return; | 664 if (IsDeadCheck(isolate, "v8::Context::SetData()")) return; |
668 ENTER_V8(isolate); | 665 i::Handle<i::Object> raw_data = Utils::OpenHandle(*data); |
669 { | 666 ASSERT(env->IsGlobalContext()); |
670 i::HandleScope scope(isolate); | 667 if (env->IsGlobalContext()) { |
671 i::Handle<i::Context> env = Utils::OpenHandle(this); | 668 env->set_data(*raw_data); |
672 i::Handle<i::Object> raw_data = Utils::OpenHandle(*data); | |
673 ASSERT(env->IsGlobalContext()); | |
674 if (env->IsGlobalContext()) { | |
675 env->set_data(*raw_data); | |
676 } | |
677 } | 669 } |
678 } | 670 } |
679 | 671 |
680 | 672 |
681 v8::Local<v8::Value> Context::GetData() { | 673 v8::Local<v8::Value> Context::GetData() { |
682 // TODO(isolates): Context should have a pointer to isolate. | 674 i::Handle<i::Context> env = Utils::OpenHandle(this); |
683 i::Isolate* isolate = i::Isolate::Current(); | 675 i::Isolate* isolate = env->GetIsolate(); |
684 if (IsDeadCheck(isolate, "v8::Context::GetData()")) { | 676 if (IsDeadCheck(isolate, "v8::Context::GetData()")) { |
685 return v8::Local<Value>(); | 677 return v8::Local<Value>(); |
686 } | 678 } |
687 ENTER_V8(isolate); | |
688 i::Object* raw_result = NULL; | 679 i::Object* raw_result = NULL; |
689 { | 680 ASSERT(env->IsGlobalContext()); |
690 i::HandleScope scope(isolate); | 681 if (env->IsGlobalContext()) { |
691 i::Handle<i::Context> env = Utils::OpenHandle(this); | 682 raw_result = env->data(); |
692 ASSERT(env->IsGlobalContext()); | 683 } else { |
693 if (env->IsGlobalContext()) { | 684 return Local<Value>(); |
694 raw_result = env->data(); | |
695 } else { | |
696 return Local<Value>(); | |
697 } | |
698 } | 685 } |
699 i::Handle<i::Object> result(raw_result); | 686 i::Handle<i::Object> result(raw_result, isolate); |
700 return Utils::ToLocal(result); | 687 return Utils::ToLocal(result); |
701 } | 688 } |
702 | 689 |
703 | 690 |
704 i::Object** v8::HandleScope::RawClose(i::Object** value) { | 691 i::Object** v8::HandleScope::RawClose(i::Object** value) { |
705 if (!ApiCheck(!is_closed_, | 692 if (!ApiCheck(!is_closed_, |
706 "v8::HandleScope::Close()", | 693 "v8::HandleScope::Close()", |
707 "Local scope has already been closed")) { | 694 "Local scope has already been closed")) { |
708 return 0; | 695 return 0; |
709 } | 696 } |
(...skipping 4097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4807 int V8::GetCurrentThreadId() { | 4794 int V8::GetCurrentThreadId() { |
4808 i::Isolate* isolate = i::Isolate::Current(); | 4795 i::Isolate* isolate = i::Isolate::Current(); |
4809 EnsureInitializedForIsolate(isolate, "V8::GetCurrentThreadId()"); | 4796 EnsureInitializedForIsolate(isolate, "V8::GetCurrentThreadId()"); |
4810 return isolate->thread_id().ToInteger(); | 4797 return isolate->thread_id().ToInteger(); |
4811 } | 4798 } |
4812 | 4799 |
4813 | 4800 |
4814 void V8::TerminateExecution(int thread_id) { | 4801 void V8::TerminateExecution(int thread_id) { |
4815 i::Isolate* isolate = i::Isolate::Current(); | 4802 i::Isolate* isolate = i::Isolate::Current(); |
4816 if (!isolate->IsInitialized()) return; | 4803 if (!isolate->IsInitialized()) return; |
4817 API_ENTRY_CHECK("V8::TerminateExecution()"); | 4804 API_ENTRY_CHECK(isolate, "V8::TerminateExecution()"); |
4818 // If the thread_id identifies the current thread just terminate | 4805 // If the thread_id identifies the current thread just terminate |
4819 // execution right away. Otherwise, ask the thread manager to | 4806 // execution right away. Otherwise, ask the thread manager to |
4820 // terminate the thread with the given id if any. | 4807 // terminate the thread with the given id if any. |
4821 i::ThreadId internal_tid = i::ThreadId::FromInteger(thread_id); | 4808 i::ThreadId internal_tid = i::ThreadId::FromInteger(thread_id); |
4822 if (isolate->thread_id().Equals(internal_tid)) { | 4809 if (isolate->thread_id().Equals(internal_tid)) { |
4823 isolate->stack_guard()->TerminateExecution(); | 4810 isolate->stack_guard()->TerminateExecution(); |
4824 } else { | 4811 } else { |
4825 isolate->thread_manager()->TerminateExecution(internal_tid); | 4812 isolate->thread_manager()->TerminateExecution(internal_tid); |
4826 } | 4813 } |
4827 } | 4814 } |
(...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6028 | 6015 |
6029 | 6016 |
6030 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { | 6017 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { |
6031 HandleScopeImplementer* scope_implementer = | 6018 HandleScopeImplementer* scope_implementer = |
6032 reinterpret_cast<HandleScopeImplementer*>(storage); | 6019 reinterpret_cast<HandleScopeImplementer*>(storage); |
6033 scope_implementer->IterateThis(v); | 6020 scope_implementer->IterateThis(v); |
6034 return storage + ArchiveSpacePerThread(); | 6021 return storage + ArchiveSpacePerThread(); |
6035 } | 6022 } |
6036 | 6023 |
6037 } } // namespace v8::internal | 6024 } } // namespace v8::internal |
OLD | NEW |