Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(268)

Side by Side Diff: src/isolate.cc

Issue 1398093002: Pass the context from which a given receiver is accessed explicitly (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/isolate.h ('k') | src/lookup.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/isolate.h" 5 #include "src/isolate.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include <fstream> // NOLINT(readability/streams) 9 #include <fstream> // NOLINT(readability/streams)
10 #include <sstream> 10 #include <sstream>
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 775
776 776
777 bool Isolate::IsInternallyUsedPropertyName(Object* name) { 777 bool Isolate::IsInternallyUsedPropertyName(Object* name) {
778 if (name->IsSymbol()) { 778 if (name->IsSymbol()) {
779 return Symbol::cast(name)->is_private(); 779 return Symbol::cast(name)->is_private();
780 } 780 }
781 return name == heap()->hidden_string(); 781 return name == heap()->hidden_string();
782 } 782 }
783 783
784 784
785 bool Isolate::MayAccess(Handle<JSObject> receiver) { 785 bool Isolate::MayAccess(Handle<Context> accessing_context,
786 Handle<JSObject> receiver) {
786 DCHECK(receiver->IsJSGlobalProxy() || receiver->IsAccessCheckNeeded()); 787 DCHECK(receiver->IsJSGlobalProxy() || receiver->IsAccessCheckNeeded());
787 788
788 // Check for compatibility between the security tokens in the 789 // Check for compatibility between the security tokens in the
789 // current lexical context and the accessed object. 790 // current lexical context and the accessed object.
790 DCHECK(context());
791 791
792 { 792 {
793 DisallowHeapAllocation no_gc; 793 DisallowHeapAllocation no_gc;
794 // During bootstrapping, callback functions are not enabled yet. 794 // During bootstrapping, callback functions are not enabled yet.
795 if (bootstrapper()->IsActive()) return true; 795 if (bootstrapper()->IsActive()) return true;
796 796
797 if (receiver->IsJSGlobalProxy()) { 797 if (receiver->IsJSGlobalProxy()) {
798 Object* receiver_context = 798 Object* receiver_context =
799 JSGlobalProxy::cast(*receiver)->native_context(); 799 JSGlobalProxy::cast(*receiver)->native_context();
800 if (!receiver_context->IsContext()) return false; 800 if (!receiver_context->IsContext()) return false;
801 801
802 // Get the native context of current top context. 802 // Get the native context of current top context.
803 // avoid using Isolate::native_context() because it uses Handle. 803 // avoid using Isolate::native_context() because it uses Handle.
804 Context* native_context = context()->global_object()->native_context(); 804 Context* native_context =
805 accessing_context->global_object()->native_context();
805 if (receiver_context == native_context) return true; 806 if (receiver_context == native_context) return true;
806 807
807 if (Context::cast(receiver_context)->security_token() == 808 if (Context::cast(receiver_context)->security_token() ==
808 native_context->security_token()) 809 native_context->security_token())
809 return true; 810 return true;
810 } 811 }
811 } 812 }
812 813
813 HandleScope scope(this); 814 HandleScope scope(this);
814 Handle<Object> data; 815 Handle<Object> data;
815 v8::NamedSecurityCallback callback; 816 v8::NamedSecurityCallback callback;
816 { DisallowHeapAllocation no_gc; 817 { DisallowHeapAllocation no_gc;
817 AccessCheckInfo* access_check_info = GetAccessCheckInfo(this, receiver); 818 AccessCheckInfo* access_check_info = GetAccessCheckInfo(this, receiver);
818 if (!access_check_info) return false; 819 if (!access_check_info) return false;
819 Object* fun_obj = access_check_info->named_callback(); 820 Object* fun_obj = access_check_info->named_callback();
820 callback = v8::ToCData<v8::NamedSecurityCallback>(fun_obj); 821 callback = v8::ToCData<v8::NamedSecurityCallback>(fun_obj);
821 if (!callback) return false; 822 if (!callback) return false;
822 data = handle(access_check_info->data(), this); 823 data = handle(access_check_info->data(), this);
823 } 824 }
824 825
825 LOG(this, ApiSecurityCheck()); 826 LOG(this, ApiSecurityCheck());
826 827
827 // Leaving JavaScript. 828 {
828 VMState<EXTERNAL> state(this); 829 SaveContext save(this);
829 Handle<Object> key = factory()->undefined_value(); 830 set_context(accessing_context->native_context());
830 return callback(v8::Utils::ToLocal(receiver), v8::Utils::ToLocal(key), 831
831 v8::ACCESS_HAS, v8::Utils::ToLocal(data)); 832 // Leaving JavaScript.
833 VMState<EXTERNAL> state(this);
834 Handle<Object> key = factory()->undefined_value();
835 return callback(v8::Utils::ToLocal(receiver), v8::Utils::ToLocal(key),
836 v8::ACCESS_HAS, v8::Utils::ToLocal(data));
837 }
832 } 838 }
833 839
834 840
835 const char* const Isolate::kStackOverflowMessage = 841 const char* const Isolate::kStackOverflowMessage =
836 "Uncaught RangeError: Maximum call stack size exceeded"; 842 "Uncaught RangeError: Maximum call stack size exceeded";
837 843
838 844
839 Object* Isolate::StackOverflow() { 845 Object* Isolate::StackOverflow() {
840 HandleScope scope(this); 846 HandleScope scope(this);
841 // At this point we cannot create an Error object using its javascript 847 // At this point we cannot create an Error object using its javascript
(...skipping 1995 matching lines...) Expand 10 before | Expand all | Expand 10 after
2837 // Then check whether this scope intercepts. 2843 // Then check whether this scope intercepts.
2838 if ((flag & intercept_mask_)) { 2844 if ((flag & intercept_mask_)) {
2839 intercepted_flags_ |= flag; 2845 intercepted_flags_ |= flag;
2840 return true; 2846 return true;
2841 } 2847 }
2842 return false; 2848 return false;
2843 } 2849 }
2844 2850
2845 } // namespace internal 2851 } // namespace internal
2846 } // namespace v8 2852 } // namespace v8
OLDNEW
« no previous file with comments | « src/isolate.h ('k') | src/lookup.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698