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

Side by Side Diff: src/objects.h

Issue 3144002: Copy-on-write arrays. (Closed)
Patch Set: Review fixes. Created 10 years, 4 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/ia32/stub-cache-ia32.cc ('k') | src/objects.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-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 1204
1205 1205
1206 // The JSObject describes real heap allocated JavaScript objects with 1206 // The JSObject describes real heap allocated JavaScript objects with
1207 // properties. 1207 // properties.
1208 // Note that the map of JSObject changes during execution to enable inline 1208 // Note that the map of JSObject changes during execution to enable inline
1209 // caching. 1209 // caching.
1210 class JSObject: public HeapObject { 1210 class JSObject: public HeapObject {
1211 public: 1211 public:
1212 enum DeleteMode { NORMAL_DELETION, FORCE_DELETION }; 1212 enum DeleteMode { NORMAL_DELETION, FORCE_DELETION };
1213 enum ElementsKind { 1213 enum ElementsKind {
1214 // The only "fast" kind.
1214 FAST_ELEMENTS, 1215 FAST_ELEMENTS,
1216 // All the kinds below are "slow".
1215 DICTIONARY_ELEMENTS, 1217 DICTIONARY_ELEMENTS,
1216 PIXEL_ELEMENTS, 1218 PIXEL_ELEMENTS,
1217 EXTERNAL_BYTE_ELEMENTS, 1219 EXTERNAL_BYTE_ELEMENTS,
1218 EXTERNAL_UNSIGNED_BYTE_ELEMENTS, 1220 EXTERNAL_UNSIGNED_BYTE_ELEMENTS,
1219 EXTERNAL_SHORT_ELEMENTS, 1221 EXTERNAL_SHORT_ELEMENTS,
1220 EXTERNAL_UNSIGNED_SHORT_ELEMENTS, 1222 EXTERNAL_UNSIGNED_SHORT_ELEMENTS,
1221 EXTERNAL_INT_ELEMENTS, 1223 EXTERNAL_INT_ELEMENTS,
1222 EXTERNAL_UNSIGNED_INT_ELEMENTS, 1224 EXTERNAL_UNSIGNED_INT_ELEMENTS,
1223 EXTERNAL_FLOAT_ELEMENTS 1225 EXTERNAL_FLOAT_ELEMENTS
1224 }; 1226 };
1225 1227
1226 // [properties]: Backing storage for properties. 1228 // [properties]: Backing storage for properties.
1227 // properties is a FixedArray in the fast case and a Dictionary in the 1229 // properties is a FixedArray in the fast case and a Dictionary in the
1228 // slow case. 1230 // slow case.
1229 DECL_ACCESSORS(properties, FixedArray) // Get and set fast properties. 1231 DECL_ACCESSORS(properties, FixedArray) // Get and set fast properties.
1230 inline void initialize_properties(); 1232 inline void initialize_properties();
1231 inline bool HasFastProperties(); 1233 inline bool HasFastProperties();
1232 inline StringDictionary* property_dictionary(); // Gets slow properties. 1234 inline StringDictionary* property_dictionary(); // Gets slow properties.
1233 1235
1234 // [elements]: The elements (properties with names that are integers). 1236 // [elements]: The elements (properties with names that are integers).
1235 // elements is a FixedArray in the fast case, a Dictionary in the slow 1237 //
1236 // case, and a PixelArray or ExternalArray in special cases. 1238 // Elements can be in two general modes: fast and slow. Each mode
1239 // corrensponds to a set of object representations of elements that
1240 // have something in common.
1241 //
1242 // In the fast mode elements is a FixedArray and so each element can
1243 // be quickly accessed. This fact is used in the generated code. The
1244 // elements array can have one of the two maps in this mode:
1245 // fixed_array_map or fixed_cow_array_map (for copy-on-write
1246 // arrays). In the latter case the elements array may be shared by a
1247 // few objects and so before writing to any element the array must
1248 // be copied. Use EnsureWritableFastElements in this case.
1249 //
1250 // In the slow mode elements is either a NumberDictionary or a
1251 // PixelArray or an ExternalArray.
1237 DECL_ACCESSORS(elements, HeapObject) 1252 DECL_ACCESSORS(elements, HeapObject)
1238 inline void initialize_elements(); 1253 inline void initialize_elements();
1239 inline Object* ResetElements(); 1254 inline Object* ResetElements();
1240 inline ElementsKind GetElementsKind(); 1255 inline ElementsKind GetElementsKind();
1241 inline bool HasFastElements(); 1256 inline bool HasFastElements();
1242 inline bool HasDictionaryElements(); 1257 inline bool HasDictionaryElements();
1243 inline bool HasPixelElements(); 1258 inline bool HasPixelElements();
1244 inline bool HasExternalArrayElements(); 1259 inline bool HasExternalArrayElements();
1245 inline bool HasExternalByteElements(); 1260 inline bool HasExternalByteElements();
1246 inline bool HasExternalUnsignedByteElements(); 1261 inline bool HasExternalUnsignedByteElements();
1247 inline bool HasExternalShortElements(); 1262 inline bool HasExternalShortElements();
1248 inline bool HasExternalUnsignedShortElements(); 1263 inline bool HasExternalUnsignedShortElements();
1249 inline bool HasExternalIntElements(); 1264 inline bool HasExternalIntElements();
1250 inline bool HasExternalUnsignedIntElements(); 1265 inline bool HasExternalUnsignedIntElements();
1251 inline bool HasExternalFloatElements(); 1266 inline bool HasExternalFloatElements();
1252 inline bool AllowsSetElementsLength(); 1267 inline bool AllowsSetElementsLength();
1253 inline NumberDictionary* element_dictionary(); // Gets slow elements. 1268 inline NumberDictionary* element_dictionary(); // Gets slow elements.
1269 // Requires: this->HasFastElements().
1270 inline Object* EnsureWritableFastElements();
1254 1271
1255 // Collects elements starting at index 0. 1272 // Collects elements starting at index 0.
1256 // Undefined values are placed after non-undefined values. 1273 // Undefined values are placed after non-undefined values.
1257 // Returns the number of non-undefined values. 1274 // Returns the number of non-undefined values.
1258 Object* PrepareElementsForSort(uint32_t limit); 1275 Object* PrepareElementsForSort(uint32_t limit);
1259 // As PrepareElementsForSort, but only on objects where elements is 1276 // As PrepareElementsForSort, but only on objects where elements is
1260 // a dictionary, and it will stay a dictionary. 1277 // a dictionary, and it will stay a dictionary.
1261 Object* PrepareSlowElementsForSort(uint32_t limit); 1278 Object* PrepareSlowElementsForSort(uint32_t limit);
1262 1279
1263 Object* SetProperty(String* key, 1280 Object* SetProperty(String* key,
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
1696 // Setter that doesn't need write barrier). 1713 // Setter that doesn't need write barrier).
1697 inline void set(int index, Smi* value); 1714 inline void set(int index, Smi* value);
1698 // Setter with explicit barrier mode. 1715 // Setter with explicit barrier mode.
1699 inline void set(int index, Object* value, WriteBarrierMode mode); 1716 inline void set(int index, Object* value, WriteBarrierMode mode);
1700 1717
1701 // Setters for frequently used oddballs located in old space. 1718 // Setters for frequently used oddballs located in old space.
1702 inline void set_undefined(int index); 1719 inline void set_undefined(int index);
1703 inline void set_null(int index); 1720 inline void set_null(int index);
1704 inline void set_the_hole(int index); 1721 inline void set_the_hole(int index);
1705 1722
1723 // Setters with less debug checks for the GC to use.
1724 inline void set_unchecked(int index, Smi* value);
1725 inline void set_null_unchecked(int index);
1726
1706 // Gives access to raw memory which stores the array's data. 1727 // Gives access to raw memory which stores the array's data.
1707 inline Object** data_start(); 1728 inline Object** data_start();
1708 1729
1709 // Copy operations. 1730 // Copy operations.
1710 inline Object* Copy(); 1731 inline Object* Copy();
1711 Object* CopySize(int new_length); 1732 Object* CopySize(int new_length);
1712 1733
1713 // Add the elements of a JSArray to this FixedArray. 1734 // Add the elements of a JSArray to this FixedArray.
1714 Object* AddKeysFromJSArray(JSArray* array); 1735 Object* AddKeysFromJSArray(JSArray* array);
1715 1736
(...skipping 1338 matching lines...) Expand 10 before | Expand all | Expand 10 after
3054 } 3075 }
3055 3076
3056 inline bool has_instance_call_handler() { 3077 inline bool has_instance_call_handler() {
3057 return ((1 << kHasInstanceCallHandler) & bit_field()) != 0; 3078 return ((1 << kHasInstanceCallHandler) & bit_field()) != 0;
3058 } 3079 }
3059 3080
3060 inline void set_is_extensible(bool value); 3081 inline void set_is_extensible(bool value);
3061 inline bool is_extensible(); 3082 inline bool is_extensible();
3062 3083
3063 // Tells whether the instance has fast elements. 3084 // Tells whether the instance has fast elements.
3064 void set_has_fast_elements(bool value) { 3085 // Equivalent to instance->GetElementsKind() == FAST_ELEMENTS.
3086 inline void set_has_fast_elements(bool value) {
3065 if (value) { 3087 if (value) {
3066 set_bit_field2(bit_field2() | (1 << kHasFastElements)); 3088 set_bit_field2(bit_field2() | (1 << kHasFastElements));
3067 } else { 3089 } else {
3068 set_bit_field2(bit_field2() & ~(1 << kHasFastElements)); 3090 set_bit_field2(bit_field2() & ~(1 << kHasFastElements));
3069 } 3091 }
3070 } 3092 }
3071 3093
3072 bool has_fast_elements() { 3094 inline bool has_fast_elements() {
3073 return ((1 << kHasFastElements) & bit_field2()) != 0; 3095 return ((1 << kHasFastElements) & bit_field2()) != 0;
3074 } 3096 }
3075 3097
3076 // Tells whether the instance needs security checks when accessing its 3098 // Tells whether the instance needs security checks when accessing its
3077 // properties. 3099 // properties.
3078 inline void set_is_access_check_needed(bool access_check_needed); 3100 inline void set_is_access_check_needed(bool access_check_needed);
3079 inline bool is_access_check_needed(); 3101 inline bool is_access_check_needed();
3080 3102
3081 // [prototype]: implicit prototype object. 3103 // [prototype]: implicit prototype object.
3082 DECL_ACCESSORS(prototype, Object) 3104 DECL_ACCESSORS(prototype, Object)
(...skipping 2372 matching lines...) Expand 10 before | Expand all | Expand 10 after
5455 } else { 5477 } else {
5456 value &= ~(1 << bit_position); 5478 value &= ~(1 << bit_position);
5457 } 5479 }
5458 return value; 5480 return value;
5459 } 5481 }
5460 }; 5482 };
5461 5483
5462 } } // namespace v8::internal 5484 } } // namespace v8::internal
5463 5485
5464 #endif // V8_OBJECTS_H_ 5486 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/ia32/stub-cache-ia32.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698