| OLD | NEW |
| 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 4107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4118 // global objects. They will be unused once we normalize the object. | 4118 // global objects. They will be unused once we normalize the object. |
| 4119 ASSERT(map->unused_property_fields() == 0); | 4119 ASSERT(map->unused_property_fields() == 0); |
| 4120 ASSERT(map->inobject_properties() == 0); | 4120 ASSERT(map->inobject_properties() == 0); |
| 4121 | 4121 |
| 4122 // Initial size of the backing store to avoid resize of the storage during | 4122 // Initial size of the backing store to avoid resize of the storage during |
| 4123 // bootstrapping. The size differs between the JS global object ad the | 4123 // bootstrapping. The size differs between the JS global object ad the |
| 4124 // builtins object. | 4124 // builtins object. |
| 4125 int initial_size = map->instance_type() == JS_GLOBAL_OBJECT_TYPE ? 64 : 512; | 4125 int initial_size = map->instance_type() == JS_GLOBAL_OBJECT_TYPE ? 64 : 512; |
| 4126 | 4126 |
| 4127 // Allocate a dictionary object for backing storage. | 4127 // Allocate a dictionary object for backing storage. |
| 4128 Object* obj; | 4128 StringDictionary* dictionary; |
| 4129 { MaybeObject* maybe_obj = | 4129 MaybeObject* maybe_dictionary = |
| 4130 StringDictionary::Allocate( | 4130 StringDictionary::Allocate( |
| 4131 map->NumberOfDescribedProperties() * 2 + initial_size); | 4131 map->NumberOfDescribedProperties() * 2 + initial_size); |
| 4132 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 4132 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
| 4133 } | |
| 4134 StringDictionary* dictionary = StringDictionary::cast(obj); | |
| 4135 | 4133 |
| 4136 // The global object might be created from an object template with accessors. | 4134 // The global object might be created from an object template with accessors. |
| 4137 // Fill these accessors into the dictionary. | 4135 // Fill these accessors into the dictionary. |
| 4138 DescriptorArray* descs = map->instance_descriptors(); | 4136 DescriptorArray* descs = map->instance_descriptors(); |
| 4139 for (int i = 0; i < descs->number_of_descriptors(); i++) { | 4137 for (int i = 0; i < descs->number_of_descriptors(); i++) { |
| 4140 PropertyDetails details = descs->GetDetails(i); | 4138 PropertyDetails details = descs->GetDetails(i); |
| 4141 ASSERT(details.type() == CALLBACKS); // Only accessors are expected. | 4139 ASSERT(details.type() == CALLBACKS); // Only accessors are expected. |
| 4142 PropertyDetails d = | 4140 PropertyDetails d = |
| 4143 PropertyDetails(details.attributes(), CALLBACKS, details.index()); | 4141 PropertyDetails(details.attributes(), CALLBACKS, details.index()); |
| 4144 Object* value = descs->GetCallbacksObject(i); | 4142 Object* value = descs->GetCallbacksObject(i); |
| 4145 { MaybeObject* maybe_value = AllocateJSGlobalPropertyCell(value); | 4143 MaybeObject* maybe_value = AllocateJSGlobalPropertyCell(value); |
| 4146 if (!maybe_value->ToObject(&value)) return maybe_value; | 4144 if (!maybe_value->ToObject(&value)) return maybe_value; |
| 4147 } | |
| 4148 | 4145 |
| 4149 Object* result; | 4146 MaybeObject* maybe_added = dictionary->Add(descs->GetKey(i), value, d); |
| 4150 { MaybeObject* maybe_result = dictionary->Add(descs->GetKey(i), value, d); | 4147 if (!maybe_added->To(&dictionary)) return maybe_added; |
| 4151 if (!maybe_result->ToObject(&result)) return maybe_result; | |
| 4152 } | |
| 4153 dictionary = StringDictionary::cast(result); | |
| 4154 } | 4148 } |
| 4155 | 4149 |
| 4156 // Allocate the global object and initialize it with the backing store. | 4150 // Allocate the global object and initialize it with the backing store. |
| 4157 { MaybeObject* maybe_obj = Allocate(map, OLD_POINTER_SPACE); | 4151 JSObject* global; |
| 4158 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 4152 MaybeObject* maybe_global = Allocate(map, OLD_POINTER_SPACE); |
| 4159 } | 4153 if (!maybe_global->To(&global)) return maybe_global; |
| 4160 JSObject* global = JSObject::cast(obj); | 4154 |
| 4161 InitializeJSObjectFromMap(global, dictionary, map); | 4155 InitializeJSObjectFromMap(global, dictionary, map); |
| 4162 | 4156 |
| 4163 // Create a new map for the global object. | 4157 // Create a new map for the global object. |
| 4164 Map* new_map; | 4158 Map* new_map; |
| 4165 { MaybeObject* maybe_map = map->CopyDropDescriptors(); | 4159 MaybeObject* maybe_map = map->CopyDropDescriptors(); |
| 4166 if (!maybe_map->To(&new_map)) return maybe_map; | 4160 if (!maybe_map->To(&new_map)) return maybe_map; |
| 4167 } | 4161 |
| 4162 ASSERT(new_map->LastAdded() == Map::kNoneAdded); |
| 4168 | 4163 |
| 4169 // Set up the global object as a normalized object. | 4164 // Set up the global object as a normalized object. |
| 4170 global->set_map(new_map); | 4165 global->set_map(new_map); |
| 4171 global->set_properties(dictionary); | 4166 global->set_properties(dictionary); |
| 4172 | 4167 |
| 4173 // Make sure result is a global object with properties in dictionary. | 4168 // Make sure result is a global object with properties in dictionary. |
| 4174 ASSERT(global->IsGlobalObject()); | 4169 ASSERT(global->IsGlobalObject()); |
| 4175 ASSERT(!global->HasFastProperties()); | 4170 ASSERT(!global->HasFastProperties()); |
| 4176 return global; | 4171 return global; |
| 4177 } | 4172 } |
| (...skipping 3058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7236 static_cast<int>(object_sizes_last_time_[index])); | 7231 static_cast<int>(object_sizes_last_time_[index])); |
| 7237 FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(ADJUST_LAST_TIME_OBJECT_COUNT) | 7232 FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(ADJUST_LAST_TIME_OBJECT_COUNT) |
| 7238 #undef ADJUST_LAST_TIME_OBJECT_COUNT | 7233 #undef ADJUST_LAST_TIME_OBJECT_COUNT |
| 7239 | 7234 |
| 7240 memcpy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); | 7235 memcpy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); |
| 7241 memcpy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); | 7236 memcpy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); |
| 7242 ClearObjectStats(); | 7237 ClearObjectStats(); |
| 7243 } | 7238 } |
| 7244 | 7239 |
| 7245 } } // namespace v8::internal | 7240 } } // namespace v8::internal |
| OLD | NEW |