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

Side by Side Diff: src/heap.cc

Issue 28783002: Handlify PropertyCell::SetValueInferType and friends. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed comments by Andreas Rossberg. Created 7 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.h » ('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 // 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 2945 matching lines...) Expand 10 before | Expand all | Expand 10 after
2956 Object* result; 2956 Object* result;
2957 { MaybeObject* maybe_result = AllocateRawCell(); 2957 { MaybeObject* maybe_result = AllocateRawCell();
2958 if (!maybe_result->ToObject(&result)) return maybe_result; 2958 if (!maybe_result->ToObject(&result)) return maybe_result;
2959 } 2959 }
2960 HeapObject::cast(result)->set_map_no_write_barrier(cell_map()); 2960 HeapObject::cast(result)->set_map_no_write_barrier(cell_map());
2961 Cell::cast(result)->set_value(value); 2961 Cell::cast(result)->set_value(value);
2962 return result; 2962 return result;
2963 } 2963 }
2964 2964
2965 2965
2966 MaybeObject* Heap::AllocatePropertyCell(Object* value) { 2966 MaybeObject* Heap::AllocatePropertyCell() {
2967 Object* result; 2967 Object* result;
2968 MaybeObject* maybe_result = AllocateRawPropertyCell(); 2968 MaybeObject* maybe_result = AllocateRawPropertyCell();
2969 if (!maybe_result->ToObject(&result)) return maybe_result; 2969 if (!maybe_result->ToObject(&result)) return maybe_result;
2970 2970
2971 HeapObject::cast(result)->set_map_no_write_barrier( 2971 HeapObject::cast(result)->set_map_no_write_barrier(
2972 global_property_cell_map()); 2972 global_property_cell_map());
2973 PropertyCell* cell = PropertyCell::cast(result); 2973 PropertyCell* cell = PropertyCell::cast(result);
2974 cell->set_dependent_code(DependentCode::cast(empty_fixed_array()), 2974 cell->set_dependent_code(DependentCode::cast(empty_fixed_array()),
2975 SKIP_WRITE_BARRIER); 2975 SKIP_WRITE_BARRIER);
2976 cell->set_value(value); 2976 cell->set_value(the_hole_value());
2977 cell->set_type(Type::None()); 2977 cell->set_type(Type::None());
2978 maybe_result = cell->SetValueInferType(value);
2979 if (maybe_result->IsFailure()) return maybe_result;
2980 return result; 2978 return result;
2981 } 2979 }
2982 2980
2983 2981
2984 MaybeObject* Heap::AllocateBox(Object* value, PretenureFlag pretenure) { 2982 MaybeObject* Heap::AllocateBox(Object* value, PretenureFlag pretenure) {
2985 Box* result; 2983 Box* result;
2986 MaybeObject* maybe_result = AllocateStruct(BOX_TYPE); 2984 MaybeObject* maybe_result = AllocateStruct(BOX_TYPE);
2987 if (!maybe_result->To(&result)) return maybe_result; 2985 if (!maybe_result->To(&result)) return maybe_result;
2988 result->set_value(value); 2986 result->set_value(value);
2989 return result; 2987 return result;
(...skipping 1854 matching lines...) Expand 10 before | Expand all | Expand 10 after
4844 if (!maybe_result->To<JSFunctionProxy>(&result)) return maybe_result; 4842 if (!maybe_result->To<JSFunctionProxy>(&result)) return maybe_result;
4845 result->InitializeBody(map->instance_size(), Smi::FromInt(0)); 4843 result->InitializeBody(map->instance_size(), Smi::FromInt(0));
4846 result->set_handler(handler); 4844 result->set_handler(handler);
4847 result->set_hash(undefined_value(), SKIP_WRITE_BARRIER); 4845 result->set_hash(undefined_value(), SKIP_WRITE_BARRIER);
4848 result->set_call_trap(call_trap); 4846 result->set_call_trap(call_trap);
4849 result->set_construct_trap(construct_trap); 4847 result->set_construct_trap(construct_trap);
4850 return result; 4848 return result;
4851 } 4849 }
4852 4850
4853 4851
4854 MaybeObject* Heap::AllocateGlobalObject(JSFunction* constructor) {
4855 ASSERT(constructor->has_initial_map());
4856 Map* map = constructor->initial_map();
4857 ASSERT(map->is_dictionary_map());
4858
4859 // Make sure no field properties are described in the initial map.
4860 // This guarantees us that normalizing the properties does not
4861 // require us to change property values to PropertyCells.
4862 ASSERT(map->NextFreePropertyIndex() == 0);
4863
4864 // Make sure we don't have a ton of pre-allocated slots in the
4865 // global objects. They will be unused once we normalize the object.
4866 ASSERT(map->unused_property_fields() == 0);
4867 ASSERT(map->inobject_properties() == 0);
4868
4869 // Initial size of the backing store to avoid resize of the storage during
4870 // bootstrapping. The size differs between the JS global object ad the
4871 // builtins object.
4872 int initial_size = map->instance_type() == JS_GLOBAL_OBJECT_TYPE ? 64 : 512;
4873
4874 // Allocate a dictionary object for backing storage.
4875 NameDictionary* dictionary;
4876 MaybeObject* maybe_dictionary =
4877 NameDictionary::Allocate(
4878 this,
4879 map->NumberOfOwnDescriptors() * 2 + initial_size);
4880 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary;
4881
4882 // The global object might be created from an object template with accessors.
4883 // Fill these accessors into the dictionary.
4884 DescriptorArray* descs = map->instance_descriptors();
4885 for (int i = 0; i < map->NumberOfOwnDescriptors(); i++) {
4886 PropertyDetails details = descs->GetDetails(i);
4887 ASSERT(details.type() == CALLBACKS); // Only accessors are expected.
4888 PropertyDetails d = PropertyDetails(details.attributes(), CALLBACKS, i + 1);
4889 Object* value = descs->GetCallbacksObject(i);
4890 MaybeObject* maybe_value = AllocatePropertyCell(value);
4891 if (!maybe_value->ToObject(&value)) return maybe_value;
4892
4893 MaybeObject* maybe_added = dictionary->Add(descs->GetKey(i), value, d);
4894 if (!maybe_added->To(&dictionary)) return maybe_added;
4895 }
4896
4897 // Allocate the global object and initialize it with the backing store.
4898 JSObject* global;
4899 MaybeObject* maybe_global = Allocate(map, OLD_POINTER_SPACE);
4900 if (!maybe_global->To(&global)) return maybe_global;
4901
4902 InitializeJSObjectFromMap(global, dictionary, map);
4903
4904 // Create a new map for the global object.
4905 Map* new_map;
4906 MaybeObject* maybe_map = map->CopyDropDescriptors();
4907 if (!maybe_map->To(&new_map)) return maybe_map;
4908 new_map->set_dictionary_map(true);
4909
4910 // Set up the global object as a normalized object.
4911 global->set_map(new_map);
4912 global->set_properties(dictionary);
4913
4914 // Make sure result is a global object with properties in dictionary.
4915 ASSERT(global->IsGlobalObject());
4916 ASSERT(!global->HasFastProperties());
4917 return global;
4918 }
4919
4920
4921 MaybeObject* Heap::CopyJSObject(JSObject* source, AllocationSite* site) { 4852 MaybeObject* Heap::CopyJSObject(JSObject* source, AllocationSite* site) {
4922 // Never used to copy functions. If functions need to be copied we 4853 // Never used to copy functions. If functions need to be copied we
4923 // have to be careful to clear the literals array. 4854 // have to be careful to clear the literals array.
4924 SLOW_ASSERT(!source->IsJSFunction()); 4855 SLOW_ASSERT(!source->IsJSFunction());
4925 4856
4926 // Make the clone. 4857 // Make the clone.
4927 Map* map = source->map(); 4858 Map* map = source->map();
4928 int object_size = map->instance_size(); 4859 int object_size = map->instance_size();
4929 Object* clone; 4860 Object* clone;
4930 4861
(...skipping 3076 matching lines...) Expand 10 before | Expand all | Expand 10 after
8007 if (FLAG_concurrent_recompilation) { 7938 if (FLAG_concurrent_recompilation) {
8008 heap_->relocation_mutex_->Lock(); 7939 heap_->relocation_mutex_->Lock();
8009 #ifdef DEBUG 7940 #ifdef DEBUG
8010 heap_->relocation_mutex_locked_by_optimizer_thread_ = 7941 heap_->relocation_mutex_locked_by_optimizer_thread_ =
8011 heap_->isolate()->optimizing_compiler_thread()->IsOptimizerThread(); 7942 heap_->isolate()->optimizing_compiler_thread()->IsOptimizerThread();
8012 #endif // DEBUG 7943 #endif // DEBUG
8013 } 7944 }
8014 } 7945 }
8015 7946
8016 } } // namespace v8::internal 7947 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap.h ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698