| 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 2044 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2055 | 2055 |
| 2056 // The array may not be moved during GC, | 2056 // The array may not be moved during GC, |
| 2057 // and size has to be adjusted nevertheless. | 2057 // and size has to be adjusted nevertheless. |
| 2058 HeapProfiler* profiler = heap->isolate()->heap_profiler(); | 2058 HeapProfiler* profiler = heap->isolate()->heap_profiler(); |
| 2059 if (profiler->is_tracking_allocations()) { | 2059 if (profiler->is_tracking_allocations()) { |
| 2060 profiler->UpdateObjectSizeEvent(elms->address(), elms->Size()); | 2060 profiler->UpdateObjectSizeEvent(elms->address(), elms->Size()); |
| 2061 } | 2061 } |
| 2062 } | 2062 } |
| 2063 | 2063 |
| 2064 | 2064 |
| 2065 bool Map::InstancesNeedRewriting(Map* target, | 2065 bool Map::InstancesNeedRewriting(Map* target, int target_number_of_fields, |
| 2066 int target_number_of_fields, | 2066 int target_inobject, int target_unused, |
| 2067 int target_inobject, | 2067 int* old_number_of_fields) { |
| 2068 int target_unused) { | |
| 2069 // If fields were added (or removed), rewrite the instance. | 2068 // If fields were added (or removed), rewrite the instance. |
| 2070 int number_of_fields = NumberOfFields(); | 2069 *old_number_of_fields = NumberOfFields(); |
| 2071 ASSERT(target_number_of_fields >= number_of_fields); | 2070 ASSERT(target_number_of_fields >= *old_number_of_fields); |
| 2072 if (target_number_of_fields != number_of_fields) return true; | 2071 if (target_number_of_fields != *old_number_of_fields) return true; |
| 2073 | 2072 |
| 2074 // If smi descriptors were replaced by double descriptors, rewrite. | 2073 // If smi descriptors were replaced by double descriptors, rewrite. |
| 2075 DescriptorArray* old_desc = instance_descriptors(); | 2074 DescriptorArray* old_desc = instance_descriptors(); |
| 2076 DescriptorArray* new_desc = target->instance_descriptors(); | 2075 DescriptorArray* new_desc = target->instance_descriptors(); |
| 2077 int limit = NumberOfOwnDescriptors(); | 2076 int limit = NumberOfOwnDescriptors(); |
| 2078 for (int i = 0; i < limit; i++) { | 2077 for (int i = 0; i < limit; i++) { |
| 2079 if (new_desc->GetDetails(i).representation().IsDouble() != | 2078 if (new_desc->GetDetails(i).representation().IsDouble() != |
| 2080 old_desc->GetDetails(i).representation().IsDouble()) { | 2079 old_desc->GetDetails(i).representation().IsDouble()) { |
| 2081 return true; | 2080 return true; |
| 2082 } | 2081 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2140 // * Copy inobject properties from the backing store back into the object. | 2139 // * Copy inobject properties from the backing store back into the object. |
| 2141 // * Trim the difference in instance size of the object. This also cleanly | 2140 // * Trim the difference in instance size of the object. This also cleanly |
| 2142 // frees inobject properties that moved to the backing store. | 2141 // frees inobject properties that moved to the backing store. |
| 2143 // * If there are properties left in the backing store, trim of the space used | 2142 // * If there are properties left in the backing store, trim of the space used |
| 2144 // to temporarily store the inobject properties. | 2143 // to temporarily store the inobject properties. |
| 2145 // * If there are properties left in the backing store, install the backing | 2144 // * If there are properties left in the backing store, install the backing |
| 2146 // store. | 2145 // store. |
| 2147 void JSObject::MigrateFastToFast(Handle<JSObject> object, Handle<Map> new_map) { | 2146 void JSObject::MigrateFastToFast(Handle<JSObject> object, Handle<Map> new_map) { |
| 2148 Isolate* isolate = object->GetIsolate(); | 2147 Isolate* isolate = object->GetIsolate(); |
| 2149 Handle<Map> old_map(object->map()); | 2148 Handle<Map> old_map(object->map()); |
| 2149 int old_number_of_fields; |
| 2150 int number_of_fields = new_map->NumberOfFields(); | 2150 int number_of_fields = new_map->NumberOfFields(); |
| 2151 int inobject = new_map->inobject_properties(); | 2151 int inobject = new_map->inobject_properties(); |
| 2152 int unused = new_map->unused_property_fields(); | 2152 int unused = new_map->unused_property_fields(); |
| 2153 | 2153 |
| 2154 // Nothing to do if no functions were converted to fields and no smis were | 2154 // Nothing to do if no functions were converted to fields and no smis were |
| 2155 // converted to doubles. | 2155 // converted to doubles. |
| 2156 if (!old_map->InstancesNeedRewriting( | 2156 if (!old_map->InstancesNeedRewriting(*new_map, number_of_fields, inobject, |
| 2157 *new_map, number_of_fields, inobject, unused)) { | 2157 unused, &old_number_of_fields)) { |
| 2158 object->synchronized_set_map(*new_map); | 2158 object->synchronized_set_map(*new_map); |
| 2159 return; | 2159 return; |
| 2160 } | 2160 } |
| 2161 | 2161 |
| 2162 int total_size = number_of_fields + unused; | 2162 int total_size = number_of_fields + unused; |
| 2163 int external = total_size - inobject; | 2163 int external = total_size - inobject; |
| 2164 | 2164 |
| 2165 if ((old_map->unused_property_fields() == 0) && | 2165 if ((old_map->unused_property_fields() == 0) && |
| 2166 (number_of_fields != old_number_of_fields) && |
| 2166 (new_map->GetBackPointer() == *old_map)) { | 2167 (new_map->GetBackPointer() == *old_map)) { |
| 2168 ASSERT(number_of_fields == old_number_of_fields + 1); |
| 2167 // This migration is a transition from a map that has run out out property | 2169 // This migration is a transition from a map that has run out out property |
| 2168 // space. Therefore it could be done by extending the backing store. | 2170 // space. Therefore it could be done by extending the backing store. |
| 2169 Handle<FixedArray> old_storage = handle(object->properties(), isolate); | 2171 Handle<FixedArray> old_storage = handle(object->properties(), isolate); |
| 2170 Handle<FixedArray> new_storage = | 2172 Handle<FixedArray> new_storage = |
| 2171 FixedArray::CopySize(old_storage, external); | 2173 FixedArray::CopySize(old_storage, external); |
| 2172 | 2174 |
| 2173 // Properly initialize newly added property. | 2175 // Properly initialize newly added property. |
| 2174 PropertyDetails details = new_map->GetLastDescriptorDetails(); | 2176 PropertyDetails details = new_map->GetLastDescriptorDetails(); |
| 2175 Handle<Object> value; | 2177 Handle<Object> value; |
| 2176 if (details.representation().IsDouble()) { | 2178 if (details.representation().IsDouble()) { |
| (...skipping 14799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16976 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16978 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16977 static const char* error_messages_[] = { | 16979 static const char* error_messages_[] = { |
| 16978 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16980 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16979 }; | 16981 }; |
| 16980 #undef ERROR_MESSAGES_TEXTS | 16982 #undef ERROR_MESSAGES_TEXTS |
| 16981 return error_messages_[reason]; | 16983 return error_messages_[reason]; |
| 16982 } | 16984 } |
| 16983 | 16985 |
| 16984 | 16986 |
| 16985 } } // namespace v8::internal | 16987 } } // namespace v8::internal |
| OLD | NEW |