| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 5304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5315 return JSObject::cast(context->extension())->ReferencesObject(obj); | 5315 return JSObject::cast(context->extension())->ReferencesObject(obj); |
| 5316 } | 5316 } |
| 5317 } | 5317 } |
| 5318 | 5318 |
| 5319 // No references to object. | 5319 // No references to object. |
| 5320 return false; | 5320 return false; |
| 5321 } | 5321 } |
| 5322 | 5322 |
| 5323 | 5323 |
| 5324 Handle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { | 5324 Handle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { |
| 5325 CALL_HEAP_FUNCTION(object->GetIsolate(), object->PreventExtensions(), Object); | 5325 Isolate* isolate = object->GetIsolate(); |
| 5326 } | 5326 if (object->IsAccessCheckNeeded() && |
| 5327 | 5327 !isolate->MayNamedAccess(*object, |
| 5328 | |
| 5329 MaybeObject* JSObject::PreventExtensions() { | |
| 5330 Isolate* isolate = GetIsolate(); | |
| 5331 if (IsAccessCheckNeeded() && | |
| 5332 !isolate->MayNamedAccess(this, | |
| 5333 isolate->heap()->undefined_value(), | 5328 isolate->heap()->undefined_value(), |
| 5334 v8::ACCESS_KEYS)) { | 5329 v8::ACCESS_KEYS)) { |
| 5335 isolate->ReportFailedAccessCheck(this, v8::ACCESS_KEYS); | 5330 isolate->ReportFailedAccessCheck(*object, v8::ACCESS_KEYS); |
| 5336 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 5331 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 5337 return isolate->heap()->false_value(); | 5332 return isolate->factory()->false_value(); |
| 5338 } | 5333 } |
| 5339 | 5334 |
| 5340 if (IsJSGlobalProxy()) { | 5335 if (object->IsJSGlobalProxy()) { |
| 5341 Object* proto = GetPrototype(); | 5336 Handle<Object> proto(object->GetPrototype(), isolate); |
| 5342 if (proto->IsNull()) return this; | 5337 if (proto->IsNull()) return object; |
| 5343 ASSERT(proto->IsJSGlobalObject()); | 5338 ASSERT(proto->IsJSGlobalObject()); |
| 5344 return JSObject::cast(proto)->PreventExtensions(); | 5339 return PreventExtensions(Handle<JSObject>::cast(proto)); |
| 5345 } | 5340 } |
| 5346 | 5341 |
| 5347 // It's not possible to seal objects with external array elements | 5342 // It's not possible to seal objects with external array elements |
| 5348 if (HasExternalArrayElements()) { | 5343 if (object->HasExternalArrayElements()) { |
| 5349 HandleScope scope(isolate); | |
| 5350 Handle<Object> object(this, isolate); | |
| 5351 Handle<Object> error = | 5344 Handle<Object> error = |
| 5352 isolate->factory()->NewTypeError( | 5345 isolate->factory()->NewTypeError( |
| 5353 "cant_prevent_ext_external_array_elements", | 5346 "cant_prevent_ext_external_array_elements", |
| 5354 HandleVector(&object, 1)); | 5347 HandleVector(&object, 1)); |
| 5355 return isolate->Throw(*error); | 5348 isolate->Throw(*error); |
| 5349 return Handle<Object>(); |
| 5356 } | 5350 } |
| 5357 | 5351 |
| 5358 // If there are fast elements we normalize. | 5352 // If there are fast elements we normalize. |
| 5359 SeededNumberDictionary* dictionary = NULL; | 5353 Handle<SeededNumberDictionary> dictionary = NormalizeElements(object); |
| 5360 { MaybeObject* maybe = NormalizeElements(); | 5354 ASSERT(object->HasDictionaryElements() || |
| 5361 if (!maybe->To<SeededNumberDictionary>(&dictionary)) return maybe; | 5355 object->HasDictionaryArgumentsElements()); |
| 5362 } | 5356 |
| 5363 ASSERT(HasDictionaryElements() || HasDictionaryArgumentsElements()); | |
| 5364 // Make sure that we never go back to fast case. | 5357 // Make sure that we never go back to fast case. |
| 5365 dictionary->set_requires_slow_elements(); | 5358 dictionary->set_requires_slow_elements(); |
| 5366 | 5359 |
| 5367 // Do a map transition, other objects with this map may still | 5360 // Do a map transition, other objects with this map may still |
| 5368 // be extensible. | 5361 // be extensible. |
| 5369 // TODO(adamk): Extend the NormalizedMapCache to handle non-extensible maps. | 5362 // TODO(adamk): Extend the NormalizedMapCache to handle non-extensible maps. |
| 5370 Map* new_map; | 5363 Handle<Map> new_map = Map::Copy(handle(object->map())); |
| 5371 MaybeObject* maybe = map()->Copy(); | |
| 5372 if (!maybe->To(&new_map)) return maybe; | |
| 5373 | 5364 |
| 5374 new_map->set_is_extensible(false); | 5365 new_map->set_is_extensible(false); |
| 5375 set_map(new_map); | 5366 object->set_map(*new_map); |
| 5376 ASSERT(!map()->is_extensible()); | 5367 ASSERT(!object->map()->is_extensible()); |
| 5377 return new_map; | 5368 return object; |
| 5378 } | 5369 } |
| 5379 | 5370 |
| 5380 | 5371 |
| 5381 template<typename Dictionary> | 5372 template<typename Dictionary> |
| 5382 static void FreezeDictionary(Dictionary* dictionary) { | 5373 static void FreezeDictionary(Dictionary* dictionary) { |
| 5383 int capacity = dictionary->Capacity(); | 5374 int capacity = dictionary->Capacity(); |
| 5384 for (int i = 0; i < capacity; i++) { | 5375 for (int i = 0; i < capacity; i++) { |
| 5385 Object* k = dictionary->KeyAt(i); | 5376 Object* k = dictionary->KeyAt(i); |
| 5386 if (dictionary->IsKey(k)) { | 5377 if (dictionary->IsKey(k)) { |
| 5387 PropertyDetails details = dictionary->DetailsAt(i); | 5378 PropertyDetails details = dictionary->DetailsAt(i); |
| (...skipping 10699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16087 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16078 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16088 static const char* error_messages_[] = { | 16079 static const char* error_messages_[] = { |
| 16089 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16080 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16090 }; | 16081 }; |
| 16091 #undef ERROR_MESSAGES_TEXTS | 16082 #undef ERROR_MESSAGES_TEXTS |
| 16092 return error_messages_[reason]; | 16083 return error_messages_[reason]; |
| 16093 } | 16084 } |
| 16094 | 16085 |
| 16095 | 16086 |
| 16096 } } // namespace v8::internal | 16087 } } // namespace v8::internal |
| OLD | NEW |