| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/objects.h" | 5 #include "src/objects.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <iomanip> | 8 #include <iomanip> |
| 9 #include <sstream> | 9 #include <sstream> |
| 10 | 10 |
| (...skipping 5983 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5994 | 5994 |
| 5995 Maybe<bool> JSObject::PreventExtensionsInternal(Handle<JSObject> object) { | 5995 Maybe<bool> JSObject::PreventExtensionsInternal(Handle<JSObject> object) { |
| 5996 Isolate* isolate = object->GetIsolate(); | 5996 Isolate* isolate = object->GetIsolate(); |
| 5997 | 5997 |
| 5998 if (!object->map()->is_extensible()) return Just(true); | 5998 if (!object->map()->is_extensible()) return Just(true); |
| 5999 | 5999 |
| 6000 if (!object->HasSloppyArgumentsElements() && !object->map()->is_observed()) { | 6000 if (!object->HasSloppyArgumentsElements() && !object->map()->is_observed()) { |
| 6001 return PreventExtensionsWithTransition<NONE>(object); | 6001 return PreventExtensionsWithTransition<NONE>(object); |
| 6002 } | 6002 } |
| 6003 | 6003 |
| 6004 if (object->IsAccessCheckNeeded() && !isolate->MayAccess(object)) { | 6004 if (object->IsAccessCheckNeeded() && |
| 6005 !isolate->MayAccess(handle(isolate->context()), object)) { |
| 6005 isolate->ReportFailedAccessCheck(object); | 6006 isolate->ReportFailedAccessCheck(object); |
| 6006 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); | 6007 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); |
| 6007 UNREACHABLE(); | 6008 UNREACHABLE(); |
| 6008 return Just(false); | 6009 return Just(false); |
| 6009 } | 6010 } |
| 6010 | 6011 |
| 6011 if (object->IsJSGlobalProxy()) { | 6012 if (object->IsJSGlobalProxy()) { |
| 6012 PrototypeIterator iter(isolate, object); | 6013 PrototypeIterator iter(isolate, object); |
| 6013 if (iter.IsAtEnd()) return Just(true); | 6014 if (iter.IsAtEnd()) return Just(true); |
| 6014 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); | 6015 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6060 | 6061 |
| 6061 | 6062 |
| 6062 MaybeHandle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { | 6063 MaybeHandle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { |
| 6063 return ReturnObjectOrThrowTypeError(object, PreventExtensionsInternal(object), | 6064 return ReturnObjectOrThrowTypeError(object, PreventExtensionsInternal(object), |
| 6064 MessageTemplate::kCannotPreventExt); | 6065 MessageTemplate::kCannotPreventExt); |
| 6065 } | 6066 } |
| 6066 | 6067 |
| 6067 | 6068 |
| 6068 bool JSObject::IsExtensible(Handle<JSObject> object) { | 6069 bool JSObject::IsExtensible(Handle<JSObject> object) { |
| 6069 Isolate* isolate = object->GetIsolate(); | 6070 Isolate* isolate = object->GetIsolate(); |
| 6070 if (object->IsAccessCheckNeeded() && !isolate->MayAccess(object)) { | 6071 if (object->IsAccessCheckNeeded() && |
| 6072 !isolate->MayAccess(handle(isolate->context()), object)) { |
| 6071 return true; | 6073 return true; |
| 6072 } | 6074 } |
| 6073 if (object->IsJSGlobalProxy()) { | 6075 if (object->IsJSGlobalProxy()) { |
| 6074 PrototypeIterator iter(isolate, *object); | 6076 PrototypeIterator iter(isolate, *object); |
| 6075 if (iter.IsAtEnd()) return false; | 6077 if (iter.IsAtEnd()) return false; |
| 6076 DCHECK(iter.GetCurrent()->IsJSGlobalObject()); | 6078 DCHECK(iter.GetCurrent()->IsJSGlobalObject()); |
| 6077 return iter.GetCurrent<JSObject>()->map()->is_extensible(); | 6079 return iter.GetCurrent<JSObject>()->map()->is_extensible(); |
| 6078 } | 6080 } |
| 6079 return object->map()->is_extensible(); | 6081 return object->map()->is_extensible(); |
| 6080 } | 6082 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 6106 | 6108 |
| 6107 template <PropertyAttributes attrs> | 6109 template <PropertyAttributes attrs> |
| 6108 Maybe<bool> JSObject::PreventExtensionsWithTransition(Handle<JSObject> object) { | 6110 Maybe<bool> JSObject::PreventExtensionsWithTransition(Handle<JSObject> object) { |
| 6109 STATIC_ASSERT(attrs == NONE || attrs == SEALED || attrs == FROZEN); | 6111 STATIC_ASSERT(attrs == NONE || attrs == SEALED || attrs == FROZEN); |
| 6110 | 6112 |
| 6111 // Sealing/freezing sloppy arguments should be handled elsewhere. | 6113 // Sealing/freezing sloppy arguments should be handled elsewhere. |
| 6112 DCHECK(!object->HasSloppyArgumentsElements()); | 6114 DCHECK(!object->HasSloppyArgumentsElements()); |
| 6113 DCHECK(!object->map()->is_observed()); | 6115 DCHECK(!object->map()->is_observed()); |
| 6114 | 6116 |
| 6115 Isolate* isolate = object->GetIsolate(); | 6117 Isolate* isolate = object->GetIsolate(); |
| 6116 if (object->IsAccessCheckNeeded() && !isolate->MayAccess(object)) { | 6118 if (object->IsAccessCheckNeeded() && |
| 6119 !isolate->MayAccess(handle(isolate->context()), object)) { |
| 6117 isolate->ReportFailedAccessCheck(object); | 6120 isolate->ReportFailedAccessCheck(object); |
| 6118 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); | 6121 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); |
| 6119 UNREACHABLE(); | 6122 UNREACHABLE(); |
| 6120 } | 6123 } |
| 6121 | 6124 |
| 6122 if (object->IsJSGlobalProxy()) { | 6125 if (object->IsJSGlobalProxy()) { |
| 6123 PrototypeIterator iter(isolate, object); | 6126 PrototypeIterator iter(isolate, object); |
| 6124 if (iter.IsAtEnd()) return Just(true); | 6127 if (iter.IsAtEnd()) return Just(true); |
| 6125 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); | 6128 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); |
| 6126 return PreventExtensionsWithTransition<attrs>( | 6129 return PreventExtensionsWithTransition<attrs>( |
| (...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6914 arraysize(args), | 6917 arraysize(args), |
| 6915 args), | 6918 args), |
| 6916 FixedArray); | 6919 FixedArray); |
| 6917 accumulator.AddKeys(Handle<JSObject>::cast(names), filter); | 6920 accumulator.AddKeys(Handle<JSObject>::cast(names), filter); |
| 6918 break; | 6921 break; |
| 6919 } | 6922 } |
| 6920 | 6923 |
| 6921 Handle<JSObject> current = PrototypeIterator::GetCurrent<JSObject>(iter); | 6924 Handle<JSObject> current = PrototypeIterator::GetCurrent<JSObject>(iter); |
| 6922 | 6925 |
| 6923 // Check access rights if required. | 6926 // Check access rights if required. |
| 6924 if (current->IsAccessCheckNeeded() && !isolate->MayAccess(current)) { | 6927 if (current->IsAccessCheckNeeded() && |
| 6928 !isolate->MayAccess(handle(isolate->context()), current)) { |
| 6925 if (iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) { | 6929 if (iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) { |
| 6926 isolate->ReportFailedAccessCheck(current); | 6930 isolate->ReportFailedAccessCheck(current); |
| 6927 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); | 6931 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); |
| 6928 } | 6932 } |
| 6929 break; | 6933 break; |
| 6930 } | 6934 } |
| 6931 | 6935 |
| 6932 // Compute the element keys. | 6936 // Compute the element keys. |
| 6933 Handle<FixedArray> element_keys = | 6937 Handle<FixedArray> element_keys = |
| 6934 isolate->factory()->NewFixedArray(current->NumberOfEnumElements()); | 6938 isolate->factory()->NewFixedArray(current->NumberOfEnumElements()); |
| (...skipping 9986 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16921 if (cell->value() != *new_value) { | 16925 if (cell->value() != *new_value) { |
| 16922 cell->set_value(*new_value); | 16926 cell->set_value(*new_value); |
| 16923 Isolate* isolate = cell->GetIsolate(); | 16927 Isolate* isolate = cell->GetIsolate(); |
| 16924 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 16928 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 16925 isolate, DependentCode::kPropertyCellChangedGroup); | 16929 isolate, DependentCode::kPropertyCellChangedGroup); |
| 16926 } | 16930 } |
| 16927 } | 16931 } |
| 16928 | 16932 |
| 16929 } // namespace internal | 16933 } // namespace internal |
| 16930 } // namespace v8 | 16934 } // namespace v8 |
| OLD | NEW |