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

Side by Side Diff: src/objects-inl.h

Issue 2870018: Add "has fast elements" bit to maps and use it in inlined keyed loads. (Closed)
Patch Set: More ARM fixes. Created 10 years, 6 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
« no previous file with comments | « src/objects-debug.cc ('k') | src/runtime.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 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 1148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1159 HeapObject* JSObject::elements() { 1159 HeapObject* JSObject::elements() {
1160 Object* array = READ_FIELD(this, kElementsOffset); 1160 Object* array = READ_FIELD(this, kElementsOffset);
1161 // In the assert below Dictionary is covered under FixedArray. 1161 // In the assert below Dictionary is covered under FixedArray.
1162 ASSERT(array->IsFixedArray() || array->IsPixelArray() || 1162 ASSERT(array->IsFixedArray() || array->IsPixelArray() ||
1163 array->IsExternalArray()); 1163 array->IsExternalArray());
1164 return reinterpret_cast<HeapObject*>(array); 1164 return reinterpret_cast<HeapObject*>(array);
1165 } 1165 }
1166 1166
1167 1167
1168 void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { 1168 void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) {
1169 ASSERT(map()->has_fast_elements() ==
1170 (value->map() == Heap::fixed_array_map()));
1169 // In the assert below Dictionary is covered under FixedArray. 1171 // In the assert below Dictionary is covered under FixedArray.
1170 ASSERT(value->IsFixedArray() || value->IsPixelArray() || 1172 ASSERT(value->IsFixedArray() || value->IsPixelArray() ||
1171 value->IsExternalArray()); 1173 value->IsExternalArray());
1172 WRITE_FIELD(this, kElementsOffset, value); 1174 WRITE_FIELD(this, kElementsOffset, value);
1173 CONDITIONAL_WRITE_BARRIER(this, kElementsOffset, mode); 1175 CONDITIONAL_WRITE_BARRIER(this, kElementsOffset, mode);
1174 } 1176 }
1175 1177
1176 1178
1177 void JSObject::initialize_properties() { 1179 void JSObject::initialize_properties() {
1178 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); 1180 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array()));
1179 WRITE_FIELD(this, kPropertiesOffset, Heap::empty_fixed_array()); 1181 WRITE_FIELD(this, kPropertiesOffset, Heap::empty_fixed_array());
1180 } 1182 }
1181 1183
1182 1184
1183 void JSObject::initialize_elements() { 1185 void JSObject::initialize_elements() {
1186 ASSERT(map()->has_fast_elements());
1184 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); 1187 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array()));
1185 WRITE_FIELD(this, kElementsOffset, Heap::empty_fixed_array()); 1188 WRITE_FIELD(this, kElementsOffset, Heap::empty_fixed_array());
1186 } 1189 }
1187 1190
1188 1191
1192 Object* JSObject::ResetElements() {
1193 Object* obj = map()->GetFastElementsMap();
1194 if (obj->IsFailure()) return obj;
1195 set_map(Map::cast(obj));
1196 initialize_elements();
1197 return this;
1198 }
1199
1200
1189 ACCESSORS(Oddball, to_string, String, kToStringOffset) 1201 ACCESSORS(Oddball, to_string, String, kToStringOffset)
1190 ACCESSORS(Oddball, to_number, Object, kToNumberOffset) 1202 ACCESSORS(Oddball, to_number, Object, kToNumberOffset)
1191 1203
1192 1204
1193 Object* JSGlobalPropertyCell::value() { 1205 Object* JSGlobalPropertyCell::value() {
1194 return READ_FIELD(this, kValueOffset); 1206 return READ_FIELD(this, kValueOffset);
1195 } 1207 }
1196 1208
1197 1209
1198 void JSGlobalPropertyCell::set_value(Object* val, WriteBarrierMode ignored) { 1210 void JSGlobalPropertyCell::set_value(Object* val, WriteBarrierMode ignored) {
(...skipping 1129 matching lines...) Expand 10 before | Expand all | Expand 10 after
2328 } 2340 }
2329 2341
2330 2342
2331 void Map::set_prototype(Object* value, WriteBarrierMode mode) { 2343 void Map::set_prototype(Object* value, WriteBarrierMode mode) {
2332 ASSERT(value->IsNull() || value->IsJSObject()); 2344 ASSERT(value->IsNull() || value->IsJSObject());
2333 WRITE_FIELD(this, kPrototypeOffset, value); 2345 WRITE_FIELD(this, kPrototypeOffset, value);
2334 CONDITIONAL_WRITE_BARRIER(this, kPrototypeOffset, mode); 2346 CONDITIONAL_WRITE_BARRIER(this, kPrototypeOffset, mode);
2335 } 2347 }
2336 2348
2337 2349
2350 Object* Map::GetFastElementsMap() {
2351 if (has_fast_elements()) return this;
2352 Object* obj = CopyDropTransitions();
2353 if (obj->IsFailure()) return obj;
2354 Map* new_map = Map::cast(obj);
2355 new_map->set_has_fast_elements(true);
2356 return new_map;
2357 }
2358
2359
2360 Object* Map::GetSlowElementsMap() {
2361 if (!has_fast_elements()) return this;
2362 Object* obj = CopyDropTransitions();
2363 if (obj->IsFailure()) return obj;
2364 Map* new_map = Map::cast(obj);
2365 new_map->set_has_fast_elements(false);
2366 return new_map;
2367 }
2368
2369
2338 ACCESSORS(Map, instance_descriptors, DescriptorArray, 2370 ACCESSORS(Map, instance_descriptors, DescriptorArray,
2339 kInstanceDescriptorsOffset) 2371 kInstanceDescriptorsOffset)
2340 ACCESSORS(Map, code_cache, Object, kCodeCacheOffset) 2372 ACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
2341 ACCESSORS(Map, constructor, Object, kConstructorOffset) 2373 ACCESSORS(Map, constructor, Object, kConstructorOffset)
2342 2374
2343 ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset) 2375 ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset)
2344 ACCESSORS(JSFunction, literals, FixedArray, kLiteralsOffset) 2376 ACCESSORS(JSFunction, literals, FixedArray, kLiteralsOffset)
2345 2377
2346 ACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset) 2378 ACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset)
2347 ACCESSORS(GlobalObject, global_context, Context, kGlobalContextOffset) 2379 ACCESSORS(GlobalObject, global_context, Context, kGlobalContextOffset)
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after
2831 ASSERT(index >= kDataIndex); // Only implementation data can be set this way. 2863 ASSERT(index >= kDataIndex); // Only implementation data can be set this way.
2832 FixedArray::cast(data())->set(index, value); 2864 FixedArray::cast(data())->set(index, value);
2833 } 2865 }
2834 2866
2835 2867
2836 JSObject::ElementsKind JSObject::GetElementsKind() { 2868 JSObject::ElementsKind JSObject::GetElementsKind() {
2837 HeapObject* array = elements(); 2869 HeapObject* array = elements();
2838 if (array->IsFixedArray()) { 2870 if (array->IsFixedArray()) {
2839 // FAST_ELEMENTS or DICTIONARY_ELEMENTS are both stored in a FixedArray. 2871 // FAST_ELEMENTS or DICTIONARY_ELEMENTS are both stored in a FixedArray.
2840 if (array->map() == Heap::fixed_array_map()) { 2872 if (array->map() == Heap::fixed_array_map()) {
2873 ASSERT(map()->has_fast_elements());
2841 return FAST_ELEMENTS; 2874 return FAST_ELEMENTS;
2842 } 2875 }
2843 ASSERT(array->IsDictionary()); 2876 ASSERT(array->IsDictionary());
2877 ASSERT(!map()->has_fast_elements());
2844 return DICTIONARY_ELEMENTS; 2878 return DICTIONARY_ELEMENTS;
2845 } 2879 }
2880 ASSERT(!map()->has_fast_elements());
2846 if (array->IsExternalArray()) { 2881 if (array->IsExternalArray()) {
2847 switch (array->map()->instance_type()) { 2882 switch (array->map()->instance_type()) {
2848 case EXTERNAL_BYTE_ARRAY_TYPE: 2883 case EXTERNAL_BYTE_ARRAY_TYPE:
2849 return EXTERNAL_BYTE_ELEMENTS; 2884 return EXTERNAL_BYTE_ELEMENTS;
2850 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: 2885 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
2851 return EXTERNAL_UNSIGNED_BYTE_ELEMENTS; 2886 return EXTERNAL_UNSIGNED_BYTE_ELEMENTS;
2852 case EXTERNAL_SHORT_ARRAY_TYPE: 2887 case EXTERNAL_SHORT_ARRAY_TYPE:
2853 return EXTERNAL_SHORT_ELEMENTS; 2888 return EXTERNAL_SHORT_ELEMENTS;
2854 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: 2889 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
2855 return EXTERNAL_UNSIGNED_SHORT_ELEMENTS; 2890 return EXTERNAL_UNSIGNED_SHORT_ELEMENTS;
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
3219 #undef WRITE_INT_FIELD 3254 #undef WRITE_INT_FIELD
3220 #undef READ_SHORT_FIELD 3255 #undef READ_SHORT_FIELD
3221 #undef WRITE_SHORT_FIELD 3256 #undef WRITE_SHORT_FIELD
3222 #undef READ_BYTE_FIELD 3257 #undef READ_BYTE_FIELD
3223 #undef WRITE_BYTE_FIELD 3258 #undef WRITE_BYTE_FIELD
3224 3259
3225 3260
3226 } } // namespace v8::internal 3261 } } // namespace v8::internal
3227 3262
3228 #endif // V8_OBJECTS_INL_H_ 3263 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects-debug.cc ('k') | src/runtime.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698