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 3072 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3083 DescriptorArray::WhitenessWitness witness(*new_descriptors); | 3083 DescriptorArray::WhitenessWitness witness(*new_descriptors); |
3084 | 3084 |
3085 for (int i = 0; i < number_of_descriptors; ++i) { | 3085 for (int i = 0; i < number_of_descriptors; ++i) { |
3086 new_descriptors->CopyFrom(i, *descriptors, i, witness); | 3086 new_descriptors->CopyFrom(i, *descriptors, i, witness); |
3087 } | 3087 } |
3088 | 3088 |
3089 map->set_instance_descriptors(*new_descriptors); | 3089 map->set_instance_descriptors(*new_descriptors); |
3090 } | 3090 } |
3091 | 3091 |
3092 | 3092 |
3093 void Map::AppendCallbackDescriptors(Handle<Map> map, | 3093 template<class T> |
3094 Handle<Object> descriptors) { | 3094 static int AppendUniqueCallbacks(NeanderArray* callbacks, |
3095 Isolate* isolate = map->GetIsolate(); | 3095 Handle<typename T::Array> array, |
3096 Handle<DescriptorArray> array(map->instance_descriptors()); | 3096 int valid_descriptors) { |
3097 NeanderArray callbacks(descriptors); | 3097 int nof_callbacks = callbacks->length(); |
3098 int nof_callbacks = callbacks.length(); | |
3099 | 3098 |
3100 ASSERT(array->NumberOfSlackDescriptors() >= nof_callbacks); | 3099 Isolate* isolate = array->GetIsolate(); |
3101 | |
3102 // Ensure the keys are unique names before writing them into the | 3100 // Ensure the keys are unique names before writing them into the |
3103 // instance descriptor. Since it may cause a GC, it has to be done before we | 3101 // instance descriptor. Since it may cause a GC, it has to be done before we |
3104 // temporarily put the heap in an invalid state while appending descriptors. | 3102 // temporarily put the heap in an invalid state while appending descriptors. |
3105 for (int i = 0; i < nof_callbacks; ++i) { | 3103 for (int i = 0; i < nof_callbacks; ++i) { |
3106 Handle<AccessorInfo> entry(AccessorInfo::cast(callbacks.get(i))); | 3104 Handle<AccessorInfo> entry(AccessorInfo::cast(callbacks->get(i))); |
3107 if (!entry->name()->IsUniqueName()) { | 3105 if (entry->name()->IsUniqueName()) continue; |
3108 Handle<String> key = | 3106 Handle<String> key = |
3109 isolate->factory()->InternalizedStringFromString( | 3107 isolate->factory()->InternalizedStringFromString( |
3110 Handle<String>(String::cast(entry->name()))); | 3108 Handle<String>(String::cast(entry->name()))); |
3111 entry->set_name(*key); | 3109 entry->set_name(*key); |
3112 } | |
3113 } | 3110 } |
3114 | 3111 |
3115 int nof = map->NumberOfOwnDescriptors(); | |
3116 | |
3117 // Fill in new callback descriptors. Process the callbacks from | 3112 // Fill in new callback descriptors. Process the callbacks from |
3118 // back to front so that the last callback with a given name takes | 3113 // back to front so that the last callback with a given name takes |
3119 // precedence over previously added callbacks with that name. | 3114 // precedence over previously added callbacks with that name. |
3120 for (int i = nof_callbacks - 1; i >= 0; i--) { | 3115 for (int i = nof_callbacks - 1; i >= 0; i--) { |
3121 AccessorInfo* entry = AccessorInfo::cast(callbacks.get(i)); | 3116 AccessorInfo* entry = AccessorInfo::cast(callbacks->get(i)); |
3122 Name* key = Name::cast(entry->name()); | 3117 Name* key = Name::cast(entry->name()); |
3123 // Check if a descriptor with this name already exists before writing. | 3118 // Check if a descriptor with this name already exists before writing. |
3124 if (array->Search(key, nof) == DescriptorArray::kNotFound) { | 3119 if (!T::Contains(key, entry, valid_descriptors, array)) { |
3125 CallbacksDescriptor desc(key, entry, entry->property_attributes()); | 3120 T::Insert(key, entry, valid_descriptors, array); |
3126 array->Append(&desc); | 3121 valid_descriptors++; |
3127 nof += 1; | |
3128 } | 3122 } |
3129 } | 3123 } |
3130 | 3124 |
| 3125 return valid_descriptors; |
| 3126 } |
| 3127 |
| 3128 struct DescriptorArrayAppender { |
| 3129 typedef DescriptorArray Array; |
| 3130 static bool Contains(Name* key, |
| 3131 AccessorInfo* entry, |
| 3132 int valid_descriptors, |
| 3133 Handle<DescriptorArray> array) { |
| 3134 return array->Search(key, valid_descriptors) != DescriptorArray::kNotFound; |
| 3135 } |
| 3136 static void Insert(Name* key, |
| 3137 AccessorInfo* entry, |
| 3138 int valid_descriptors, |
| 3139 Handle<DescriptorArray> array) { |
| 3140 CallbacksDescriptor desc(key, entry, entry->property_attributes()); |
| 3141 array->Append(&desc); |
| 3142 } |
| 3143 }; |
| 3144 |
| 3145 |
| 3146 struct FixedArrayAppender { |
| 3147 typedef FixedArray Array; |
| 3148 static bool Contains(Name* key, |
| 3149 AccessorInfo* entry, |
| 3150 int valid_descriptors, |
| 3151 Handle<FixedArray> array) { |
| 3152 for (int i = 0; i < valid_descriptors; i++) { |
| 3153 if (key == AccessorInfo::cast(array->get(i))->name()) return true; |
| 3154 } |
| 3155 return false; |
| 3156 } |
| 3157 static void Insert(Name* key, |
| 3158 AccessorInfo* entry, |
| 3159 int valid_descriptors, |
| 3160 Handle<FixedArray> array) { |
| 3161 array->set(valid_descriptors, entry); |
| 3162 } |
| 3163 }; |
| 3164 |
| 3165 |
| 3166 void Map::AppendCallbackDescriptors(Handle<Map> map, |
| 3167 Handle<Object> descriptors) { |
| 3168 int nof = map->NumberOfOwnDescriptors(); |
| 3169 Handle<DescriptorArray> array(map->instance_descriptors()); |
| 3170 NeanderArray callbacks(descriptors); |
| 3171 ASSERT(array->NumberOfSlackDescriptors() >= callbacks.length()); |
| 3172 nof = AppendUniqueCallbacks<DescriptorArrayAppender>(&callbacks, array, nof); |
3131 map->SetNumberOfOwnDescriptors(nof); | 3173 map->SetNumberOfOwnDescriptors(nof); |
3132 } | 3174 } |
3133 | 3175 |
3134 | 3176 |
| 3177 int AccessorInfo::AppendUnique(Handle<Object> descriptors, |
| 3178 Handle<FixedArray> array, |
| 3179 int valid_descriptors) { |
| 3180 NeanderArray callbacks(descriptors); |
| 3181 ASSERT(array->length() >= callbacks.length() + valid_descriptors); |
| 3182 return AppendUniqueCallbacks<FixedArrayAppender>(&callbacks, |
| 3183 array, |
| 3184 valid_descriptors); |
| 3185 } |
| 3186 |
| 3187 |
3135 static bool ContainsMap(MapHandleList* maps, Handle<Map> map) { | 3188 static bool ContainsMap(MapHandleList* maps, Handle<Map> map) { |
3136 ASSERT(!map.is_null()); | 3189 ASSERT(!map.is_null()); |
3137 for (int i = 0; i < maps->length(); ++i) { | 3190 for (int i = 0; i < maps->length(); ++i) { |
3138 if (!maps->at(i).is_null() && maps->at(i).is_identical_to(map)) return true; | 3191 if (!maps->at(i).is_null() && maps->at(i).is_identical_to(map)) return true; |
3139 } | 3192 } |
3140 return false; | 3193 return false; |
3141 } | 3194 } |
3142 | 3195 |
3143 | 3196 |
3144 template <class T> | 3197 template <class T> |
(...skipping 12804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15949 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16002 #define ERROR_MESSAGES_TEXTS(C, T) T, |
15950 static const char* error_messages_[] = { | 16003 static const char* error_messages_[] = { |
15951 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16004 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
15952 }; | 16005 }; |
15953 #undef ERROR_MESSAGES_TEXTS | 16006 #undef ERROR_MESSAGES_TEXTS |
15954 return error_messages_[reason]; | 16007 return error_messages_[reason]; |
15955 } | 16008 } |
15956 | 16009 |
15957 | 16010 |
15958 } } // namespace v8::internal | 16011 } } // namespace v8::internal |
OLD | NEW |