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

Side by Side Diff: src/heap.cc

Issue 8138003: Make 'Become' safe for retries. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 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 | Annotate | Revision Log
« no previous file with comments | « src/heap.h ('k') | src/objects.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 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 3303 matching lines...) Expand 10 before | Expand all | Expand 10 after
3314 Object* result; 3314 Object* result;
3315 { MaybeObject* maybe_result = 3315 { MaybeObject* maybe_result =
3316 AllocateRaw(map->instance_size(), space, retry_space); 3316 AllocateRaw(map->instance_size(), space, retry_space);
3317 if (!maybe_result->ToObject(&result)) return maybe_result; 3317 if (!maybe_result->ToObject(&result)) return maybe_result;
3318 } 3318 }
3319 HeapObject::cast(result)->set_map(map); 3319 HeapObject::cast(result)->set_map(map);
3320 return result; 3320 return result;
3321 } 3321 }
3322 3322
3323 3323
3324 MaybeObject* Heap::InitializeFunction(JSFunction* function, 3324 void Heap::InitializeFunction(JSFunction* function,
3325 SharedFunctionInfo* shared, 3325 SharedFunctionInfo* shared,
3326 Object* prototype) { 3326 Object* prototype) {
3327 ASSERT(!prototype->IsMap()); 3327 ASSERT(!prototype->IsMap());
3328 function->initialize_properties(); 3328 function->initialize_properties();
3329 function->initialize_elements(); 3329 function->initialize_elements();
3330 function->set_shared(shared); 3330 function->set_shared(shared);
3331 function->set_code(shared->code()); 3331 function->set_code(shared->code());
3332 function->set_prototype_or_initial_map(prototype); 3332 function->set_prototype_or_initial_map(prototype);
3333 function->set_context(undefined_value()); 3333 function->set_context(undefined_value());
3334 function->set_literals(empty_fixed_array()); 3334 function->set_literals(empty_fixed_array());
3335 function->set_next_function_link(undefined_value()); 3335 function->set_next_function_link(undefined_value());
3336 return function;
3337 } 3336 }
3338 3337
3339 3338
3340 MaybeObject* Heap::AllocateFunctionPrototype(JSFunction* function) { 3339 MaybeObject* Heap::AllocateFunctionPrototype(JSFunction* function) {
3341 // Allocate the prototype. Make sure to use the object function 3340 // Allocate the prototype. Make sure to use the object function
3342 // from the function's context, since the function can be from a 3341 // from the function's context, since the function can be from a
3343 // different context. 3342 // different context.
3344 JSFunction* object_function = 3343 JSFunction* object_function =
3345 function->context()->global_context()->object_function(); 3344 function->context()->global_context()->object_function();
3346 3345
(...skipping 25 matching lines...) Expand all
3372 MaybeObject* Heap::AllocateFunction(Map* function_map, 3371 MaybeObject* Heap::AllocateFunction(Map* function_map,
3373 SharedFunctionInfo* shared, 3372 SharedFunctionInfo* shared,
3374 Object* prototype, 3373 Object* prototype,
3375 PretenureFlag pretenure) { 3374 PretenureFlag pretenure) {
3376 AllocationSpace space = 3375 AllocationSpace space =
3377 (pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; 3376 (pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE;
3378 Object* result; 3377 Object* result;
3379 { MaybeObject* maybe_result = Allocate(function_map, space); 3378 { MaybeObject* maybe_result = Allocate(function_map, space);
3380 if (!maybe_result->ToObject(&result)) return maybe_result; 3379 if (!maybe_result->ToObject(&result)) return maybe_result;
3381 } 3380 }
3382 return InitializeFunction(JSFunction::cast(result), shared, prototype); 3381 InitializeFunction(JSFunction::cast(result), shared, prototype);
3382 return result;
3383 } 3383 }
3384 3384
3385 3385
3386 MaybeObject* Heap::AllocateArgumentsObject(Object* callee, int length) { 3386 MaybeObject* Heap::AllocateArgumentsObject(Object* callee, int length) {
3387 // To get fast allocation and map sharing for arguments objects we 3387 // To get fast allocation and map sharing for arguments objects we
3388 // allocate them based on an arguments boilerplate. 3388 // allocate them based on an arguments boilerplate.
3389 3389
3390 JSObject* boilerplate; 3390 JSObject* boilerplate;
3391 int arguments_object_size; 3391 int arguments_object_size;
3392 bool strict_mode_callee = callee->IsJSFunction() && 3392 bool strict_mode_callee = callee->IsJSFunction() &&
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
3812 } 3812 }
3813 // Return the new clone. 3813 // Return the new clone.
3814 return clone; 3814 return clone;
3815 } 3815 }
3816 3816
3817 3817
3818 MaybeObject* Heap::ReinitializeJSReceiver( 3818 MaybeObject* Heap::ReinitializeJSReceiver(
3819 JSReceiver* object, InstanceType type, int size) { 3819 JSReceiver* object, InstanceType type, int size) {
3820 ASSERT(type >= FIRST_JS_OBJECT_TYPE); 3820 ASSERT(type >= FIRST_JS_OBJECT_TYPE);
3821 3821
3822 // Save identity hash.
3823 MaybeObject* maybe_hash = object->GetIdentityHash(OMIT_CREATION);
3824
3825 // Allocate fresh map. 3822 // Allocate fresh map.
3826 // TODO(rossberg): Once we optimize proxies, cache these maps. 3823 // TODO(rossberg): Once we optimize proxies, cache these maps.
3827 Map* map; 3824 Map* map;
3828 MaybeObject* maybe = AllocateMap(type, size); 3825 MaybeObject* maybe = AllocateMap(type, size);
3829 if (!maybe->To<Map>(&map)) return maybe; 3826 if (!maybe->To<Map>(&map)) return maybe;
3830 3827
3831 // Check that the receiver has at least the size of the fresh object. 3828 // Check that the receiver has at least the size of the fresh object.
3832 int size_difference = object->map()->instance_size() - map->instance_size(); 3829 int size_difference = object->map()->instance_size() - map->instance_size();
3833 ASSERT(size_difference >= 0); 3830 ASSERT(size_difference >= 0);
3834 3831
3835 map->set_prototype(object->map()->prototype()); 3832 map->set_prototype(object->map()->prototype());
3836 3833
3837 // Allocate the backing storage for the properties. 3834 // Allocate the backing storage for the properties.
3838 int prop_size = map->unused_property_fields() - map->inobject_properties(); 3835 int prop_size = map->unused_property_fields() - map->inobject_properties();
3839 Object* properties; 3836 Object* properties;
3840 { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, TENURED); 3837 maybe = AllocateFixedArray(prop_size, TENURED);
3841 if (!maybe_properties->ToObject(&properties)) return maybe_properties; 3838 if (!maybe->ToObject(&properties)) return maybe;
3839
3840 // Functions require some allocation, which might fail here.
3841 SharedFunctionInfo* shared = NULL;
3842 if (type == JS_FUNCTION_TYPE) {
3843 String* name;
3844 maybe = LookupAsciiSymbol("<freezing call trap>");
3845 if (!maybe->To<String>(&name)) return maybe;
3846 maybe = AllocateSharedFunctionInfo(name);
3847 if (!maybe->To<SharedFunctionInfo>(&shared)) return maybe;
3842 } 3848 }
3843 3849
3850 // We must NOT fail after this point!
3851
3844 // Reset the map for the object. 3852 // Reset the map for the object.
3845 object->set_map(map); 3853 object->set_map(map);
3846 JSObject* jsobj = JSObject::cast(object); 3854 JSObject* jsobj = JSObject::cast(object);
3847 3855
3848 // Reinitialize the object from the constructor map. 3856 // Reinitialize the object from the constructor map.
3849 InitializeJSObjectFromMap(jsobj, FixedArray::cast(properties), map); 3857 InitializeJSObjectFromMap(jsobj, FixedArray::cast(properties), map);
3850 3858
3851 // Functions require some minimal initialization. 3859 // Functions require some minimal initialization.
3852 if (type == JS_FUNCTION_TYPE) { 3860 if (type == JS_FUNCTION_TYPE) {
3853 map->set_function_with_prototype(true); 3861 map->set_function_with_prototype(true);
3854 String* name; 3862 InitializeFunction(JSFunction::cast(object), shared, the_hole_value());
3855 maybe = LookupAsciiSymbol("<freezing call trap>"); 3863 JSFunction::cast(object)->set_context(
3856 if (!maybe->To<String>(&name)) return maybe; 3864 isolate()->context()->global_context());
3857 SharedFunctionInfo* shared;
3858 maybe = AllocateSharedFunctionInfo(name);
3859 if (!maybe->To<SharedFunctionInfo>(&shared)) return maybe;
3860 JSFunction* func;
3861 maybe = InitializeFunction(
3862 JSFunction::cast(object), shared, the_hole_value());
3863 if (!maybe->To<JSFunction>(&func)) return maybe;
3864 func->set_context(isolate()->context()->global_context());
3865 } 3865 }
3866 3866
3867 // Put in filler if the new object is smaller than the old. 3867 // Put in filler if the new object is smaller than the old.
3868 if (size_difference > 0) { 3868 if (size_difference > 0) {
3869 CreateFillerObjectAt( 3869 CreateFillerObjectAt(
3870 object->address() + map->instance_size(), size_difference); 3870 object->address() + map->instance_size(), size_difference);
3871 } 3871 }
3872 3872
3873 // Inherit identity, if it was present.
3874 Object* hash;
3875 if (maybe_hash->To<Object>(&hash) && hash->IsSmi()) {
3876 maybe = jsobj->SetIdentityHash(hash, ALLOW_CREATION);
3877 if (maybe->IsFailure()) return maybe;
3878 }
3879
3880 return object; 3873 return object;
3881 } 3874 }
3882 3875
3883 3876
3884 MaybeObject* Heap::ReinitializeJSGlobalProxy(JSFunction* constructor, 3877 MaybeObject* Heap::ReinitializeJSGlobalProxy(JSFunction* constructor,
3885 JSGlobalProxy* object) { 3878 JSGlobalProxy* object) {
3886 ASSERT(constructor->has_initial_map()); 3879 ASSERT(constructor->has_initial_map());
3887 Map* map = constructor->initial_map(); 3880 Map* map = constructor->initial_map();
3888 3881
3889 // Check that the already allocated object has the same size and type as 3882 // Check that the already allocated object has the same size and type as
(...skipping 2580 matching lines...) Expand 10 before | Expand all | Expand 10 after
6470 isolate_->heap()->store_buffer()->Compact(); 6463 isolate_->heap()->store_buffer()->Compact();
6471 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); 6464 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED);
6472 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { 6465 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) {
6473 next = chunk->next_chunk(); 6466 next = chunk->next_chunk();
6474 isolate_->memory_allocator()->Free(chunk); 6467 isolate_->memory_allocator()->Free(chunk);
6475 } 6468 }
6476 chunks_queued_for_free_ = NULL; 6469 chunks_queued_for_free_ = NULL;
6477 } 6470 }
6478 6471
6479 } } // namespace v8::internal 6472 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap.h ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698