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

Side by Side Diff: src/objects.h

Issue 6546036: Combine typed and pixel arrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: final version Created 9 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « src/log.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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 // - JSArray 50 // - JSArray
51 // - JSRegExp 51 // - JSRegExp
52 // - JSFunction 52 // - JSFunction
53 // - GlobalObject 53 // - GlobalObject
54 // - JSGlobalObject 54 // - JSGlobalObject
55 // - JSBuiltinsObject 55 // - JSBuiltinsObject
56 // - JSGlobalProxy 56 // - JSGlobalProxy
57 // - JSValue 57 // - JSValue
58 // - JSMessageObject 58 // - JSMessageObject
59 // - ByteArray 59 // - ByteArray
60 // - PixelArray
61 // - ExternalArray 60 // - ExternalArray
61 // - ExternalPixelArray
62 // - ExternalByteArray 62 // - ExternalByteArray
63 // - ExternalUnsignedByteArray 63 // - ExternalUnsignedByteArray
64 // - ExternalShortArray 64 // - ExternalShortArray
65 // - ExternalUnsignedShortArray 65 // - ExternalUnsignedShortArray
66 // - ExternalIntArray 66 // - ExternalIntArray
67 // - ExternalUnsignedIntArray 67 // - ExternalUnsignedIntArray
68 // - ExternalFloatArray 68 // - ExternalFloatArray
69 // - FixedArray 69 // - FixedArray
70 // - DescriptorArray 70 // - DescriptorArray
71 // - HashTable 71 // - HashTable
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 V(PRIVATE_EXTERNAL_ASCII_STRING_TYPE) \ 255 V(PRIVATE_EXTERNAL_ASCII_STRING_TYPE) \
256 \ 256 \
257 V(MAP_TYPE) \ 257 V(MAP_TYPE) \
258 V(CODE_TYPE) \ 258 V(CODE_TYPE) \
259 V(ODDBALL_TYPE) \ 259 V(ODDBALL_TYPE) \
260 V(JS_GLOBAL_PROPERTY_CELL_TYPE) \ 260 V(JS_GLOBAL_PROPERTY_CELL_TYPE) \
261 \ 261 \
262 V(HEAP_NUMBER_TYPE) \ 262 V(HEAP_NUMBER_TYPE) \
263 V(PROXY_TYPE) \ 263 V(PROXY_TYPE) \
264 V(BYTE_ARRAY_TYPE) \ 264 V(BYTE_ARRAY_TYPE) \
265 V(PIXEL_ARRAY_TYPE) \
266 /* Note: the order of these external array */ \ 265 /* Note: the order of these external array */ \
267 /* types is relied upon in */ \ 266 /* types is relied upon in */ \
268 /* Object::IsExternalArray(). */ \ 267 /* Object::IsExternalArray(). */ \
269 V(EXTERNAL_BYTE_ARRAY_TYPE) \ 268 V(EXTERNAL_BYTE_ARRAY_TYPE) \
270 V(EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE) \ 269 V(EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE) \
271 V(EXTERNAL_SHORT_ARRAY_TYPE) \ 270 V(EXTERNAL_SHORT_ARRAY_TYPE) \
272 V(EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE) \ 271 V(EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE) \
273 V(EXTERNAL_INT_ARRAY_TYPE) \ 272 V(EXTERNAL_INT_ARRAY_TYPE) \
274 V(EXTERNAL_UNSIGNED_INT_ARRAY_TYPE) \ 273 V(EXTERNAL_UNSIGNED_INT_ARRAY_TYPE) \
275 V(EXTERNAL_FLOAT_ARRAY_TYPE) \ 274 V(EXTERNAL_FLOAT_ARRAY_TYPE) \
275 V(EXTERNAL_PIXEL_ARRAY_TYPE) \
276 V(FILLER_TYPE) \ 276 V(FILLER_TYPE) \
277 \ 277 \
278 V(ACCESSOR_INFO_TYPE) \ 278 V(ACCESSOR_INFO_TYPE) \
279 V(ACCESS_CHECK_INFO_TYPE) \ 279 V(ACCESS_CHECK_INFO_TYPE) \
280 V(INTERCEPTOR_INFO_TYPE) \ 280 V(INTERCEPTOR_INFO_TYPE) \
281 V(CALL_HANDLER_INFO_TYPE) \ 281 V(CALL_HANDLER_INFO_TYPE) \
282 V(FUNCTION_TEMPLATE_INFO_TYPE) \ 282 V(FUNCTION_TEMPLATE_INFO_TYPE) \
283 V(OBJECT_TEMPLATE_INFO_TYPE) \ 283 V(OBJECT_TEMPLATE_INFO_TYPE) \
284 V(SIGNATURE_INFO_TYPE) \ 284 V(SIGNATURE_INFO_TYPE) \
285 V(TYPE_SWITCH_INFO_TYPE) \ 285 V(TYPE_SWITCH_INFO_TYPE) \
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 MAP_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE 483 MAP_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE
484 CODE_TYPE, 484 CODE_TYPE,
485 ODDBALL_TYPE, 485 ODDBALL_TYPE,
486 JS_GLOBAL_PROPERTY_CELL_TYPE, 486 JS_GLOBAL_PROPERTY_CELL_TYPE,
487 487
488 // "Data", objects that cannot contain non-map-word pointers to heap 488 // "Data", objects that cannot contain non-map-word pointers to heap
489 // objects. 489 // objects.
490 HEAP_NUMBER_TYPE, 490 HEAP_NUMBER_TYPE,
491 PROXY_TYPE, 491 PROXY_TYPE,
492 BYTE_ARRAY_TYPE, 492 BYTE_ARRAY_TYPE,
493 PIXEL_ARRAY_TYPE,
494 EXTERNAL_BYTE_ARRAY_TYPE, // FIRST_EXTERNAL_ARRAY_TYPE 493 EXTERNAL_BYTE_ARRAY_TYPE, // FIRST_EXTERNAL_ARRAY_TYPE
495 EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE, 494 EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE,
496 EXTERNAL_SHORT_ARRAY_TYPE, 495 EXTERNAL_SHORT_ARRAY_TYPE,
497 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE, 496 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE,
498 EXTERNAL_INT_ARRAY_TYPE, 497 EXTERNAL_INT_ARRAY_TYPE,
499 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE, 498 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE,
500 EXTERNAL_FLOAT_ARRAY_TYPE, // LAST_EXTERNAL_ARRAY_TYPE 499 EXTERNAL_FLOAT_ARRAY_TYPE,
500 EXTERNAL_PIXEL_ARRAY_TYPE, // LAST_EXTERNAL_ARRAY_TYPE
501 FILLER_TYPE, // LAST_DATA_TYPE 501 FILLER_TYPE, // LAST_DATA_TYPE
502 502
503 // Structs. 503 // Structs.
504 ACCESSOR_INFO_TYPE, 504 ACCESSOR_INFO_TYPE,
505 ACCESS_CHECK_INFO_TYPE, 505 ACCESS_CHECK_INFO_TYPE,
506 INTERCEPTOR_INFO_TYPE, 506 INTERCEPTOR_INFO_TYPE,
507 CALL_HANDLER_INFO_TYPE, 507 CALL_HANDLER_INFO_TYPE,
508 FUNCTION_TEMPLATE_INFO_TYPE, 508 FUNCTION_TEMPLATE_INFO_TYPE,
509 OBJECT_TEMPLATE_INFO_TYPE, 509 OBJECT_TEMPLATE_INFO_TYPE,
510 SIGNATURE_INFO_TYPE, 510 SIGNATURE_INFO_TYPE,
(...skipping 26 matching lines...) Expand all
537 537
538 // Pseudo-types 538 // Pseudo-types
539 FIRST_TYPE = 0x0, 539 FIRST_TYPE = 0x0,
540 LAST_TYPE = JS_FUNCTION_TYPE, 540 LAST_TYPE = JS_FUNCTION_TYPE,
541 INVALID_TYPE = FIRST_TYPE - 1, 541 INVALID_TYPE = FIRST_TYPE - 1,
542 FIRST_NONSTRING_TYPE = MAP_TYPE, 542 FIRST_NONSTRING_TYPE = MAP_TYPE,
543 FIRST_STRING_TYPE = FIRST_TYPE, 543 FIRST_STRING_TYPE = FIRST_TYPE,
544 LAST_STRING_TYPE = FIRST_NONSTRING_TYPE - 1, 544 LAST_STRING_TYPE = FIRST_NONSTRING_TYPE - 1,
545 // Boundaries for testing for an external array. 545 // Boundaries for testing for an external array.
546 FIRST_EXTERNAL_ARRAY_TYPE = EXTERNAL_BYTE_ARRAY_TYPE, 546 FIRST_EXTERNAL_ARRAY_TYPE = EXTERNAL_BYTE_ARRAY_TYPE,
547 LAST_EXTERNAL_ARRAY_TYPE = EXTERNAL_FLOAT_ARRAY_TYPE, 547 LAST_EXTERNAL_ARRAY_TYPE = EXTERNAL_PIXEL_ARRAY_TYPE,
548 // Boundary for promotion to old data space/old pointer space. 548 // Boundary for promotion to old data space/old pointer space.
549 LAST_DATA_TYPE = FILLER_TYPE, 549 LAST_DATA_TYPE = FILLER_TYPE,
550 // Boundaries for testing the type is a JavaScript "object". Note that 550 // Boundaries for testing the type is a JavaScript "object". Note that
551 // function objects are not counted as objects, even though they are 551 // function objects are not counted as objects, even though they are
552 // implemented as such; only values whose typeof is "object" are included. 552 // implemented as such; only values whose typeof is "object" are included.
553 FIRST_JS_OBJECT_TYPE = JS_VALUE_TYPE, 553 FIRST_JS_OBJECT_TYPE = JS_VALUE_TYPE,
554 LAST_JS_OBJECT_TYPE = JS_REGEXP_TYPE, 554 LAST_JS_OBJECT_TYPE = JS_REGEXP_TYPE,
555 // RegExp objects have [[Class]] "function" because they are callable. 555 // RegExp objects have [[Class]] "function" because they are callable.
556 // All types from this type and above are objects with [[Class]] "function". 556 // All types from this type and above are objects with [[Class]] "function".
557 FIRST_FUNCTION_CLASS_TYPE = JS_REGEXP_TYPE 557 FIRST_FUNCTION_CLASS_TYPE = JS_REGEXP_TYPE
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 V(String) \ 648 V(String) \
649 V(Symbol) \ 649 V(Symbol) \
650 V(SeqString) \ 650 V(SeqString) \
651 V(ExternalString) \ 651 V(ExternalString) \
652 V(ConsString) \ 652 V(ConsString) \
653 V(ExternalTwoByteString) \ 653 V(ExternalTwoByteString) \
654 V(ExternalAsciiString) \ 654 V(ExternalAsciiString) \
655 V(SeqTwoByteString) \ 655 V(SeqTwoByteString) \
656 V(SeqAsciiString) \ 656 V(SeqAsciiString) \
657 \ 657 \
658 V(PixelArray) \
659 V(ExternalArray) \ 658 V(ExternalArray) \
660 V(ExternalByteArray) \ 659 V(ExternalByteArray) \
661 V(ExternalUnsignedByteArray) \ 660 V(ExternalUnsignedByteArray) \
662 V(ExternalShortArray) \ 661 V(ExternalShortArray) \
663 V(ExternalUnsignedShortArray) \ 662 V(ExternalUnsignedShortArray) \
664 V(ExternalIntArray) \ 663 V(ExternalIntArray) \
665 V(ExternalUnsignedIntArray) \ 664 V(ExternalUnsignedIntArray) \
666 V(ExternalFloatArray) \ 665 V(ExternalFloatArray) \
666 V(ExternalPixelArray) \
667 V(ByteArray) \ 667 V(ByteArray) \
668 V(JSObject) \ 668 V(JSObject) \
669 V(JSContextExtensionObject) \ 669 V(JSContextExtensionObject) \
670 V(Map) \ 670 V(Map) \
671 V(DescriptorArray) \ 671 V(DescriptorArray) \
672 V(DeoptimizationInputData) \ 672 V(DeoptimizationInputData) \
673 V(DeoptimizationOutputData) \ 673 V(DeoptimizationOutputData) \
674 V(FixedArray) \ 674 V(FixedArray) \
675 V(Context) \ 675 V(Context) \
676 V(CatchContext) \ 676 V(CatchContext) \
(...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after
1290 NORMAL_DELETION, 1290 NORMAL_DELETION,
1291 STRICT_DELETION, 1291 STRICT_DELETION,
1292 FORCE_DELETION 1292 FORCE_DELETION
1293 }; 1293 };
1294 1294
1295 enum ElementsKind { 1295 enum ElementsKind {
1296 // The only "fast" kind. 1296 // The only "fast" kind.
1297 FAST_ELEMENTS, 1297 FAST_ELEMENTS,
1298 // All the kinds below are "slow". 1298 // All the kinds below are "slow".
1299 DICTIONARY_ELEMENTS, 1299 DICTIONARY_ELEMENTS,
1300 PIXEL_ELEMENTS,
1301 EXTERNAL_BYTE_ELEMENTS, 1300 EXTERNAL_BYTE_ELEMENTS,
1302 EXTERNAL_UNSIGNED_BYTE_ELEMENTS, 1301 EXTERNAL_UNSIGNED_BYTE_ELEMENTS,
1303 EXTERNAL_SHORT_ELEMENTS, 1302 EXTERNAL_SHORT_ELEMENTS,
1304 EXTERNAL_UNSIGNED_SHORT_ELEMENTS, 1303 EXTERNAL_UNSIGNED_SHORT_ELEMENTS,
1305 EXTERNAL_INT_ELEMENTS, 1304 EXTERNAL_INT_ELEMENTS,
1306 EXTERNAL_UNSIGNED_INT_ELEMENTS, 1305 EXTERNAL_UNSIGNED_INT_ELEMENTS,
1307 EXTERNAL_FLOAT_ELEMENTS 1306 EXTERNAL_FLOAT_ELEMENTS,
1307 EXTERNAL_PIXEL_ELEMENTS
1308 }; 1308 };
1309 1309
1310 // [properties]: Backing storage for properties. 1310 // [properties]: Backing storage for properties.
1311 // properties is a FixedArray in the fast case and a Dictionary in the 1311 // properties is a FixedArray in the fast case and a Dictionary in the
1312 // slow case. 1312 // slow case.
1313 DECL_ACCESSORS(properties, FixedArray) // Get and set fast properties. 1313 DECL_ACCESSORS(properties, FixedArray) // Get and set fast properties.
1314 inline void initialize_properties(); 1314 inline void initialize_properties();
1315 inline bool HasFastProperties(); 1315 inline bool HasFastProperties();
1316 inline StringDictionary* property_dictionary(); // Gets slow properties. 1316 inline StringDictionary* property_dictionary(); // Gets slow properties.
1317 1317
1318 // [elements]: The elements (properties with names that are integers). 1318 // [elements]: The elements (properties with names that are integers).
1319 // 1319 //
1320 // Elements can be in two general modes: fast and slow. Each mode 1320 // Elements can be in two general modes: fast and slow. Each mode
1321 // corrensponds to a set of object representations of elements that 1321 // corrensponds to a set of object representations of elements that
1322 // have something in common. 1322 // have something in common.
1323 // 1323 //
1324 // In the fast mode elements is a FixedArray and so each element can 1324 // In the fast mode elements is a FixedArray and so each element can
1325 // be quickly accessed. This fact is used in the generated code. The 1325 // be quickly accessed. This fact is used in the generated code. The
1326 // elements array can have one of the two maps in this mode: 1326 // elements array can have one of the two maps in this mode:
1327 // fixed_array_map or fixed_cow_array_map (for copy-on-write 1327 // fixed_array_map or fixed_cow_array_map (for copy-on-write
1328 // arrays). In the latter case the elements array may be shared by a 1328 // arrays). In the latter case the elements array may be shared by a
1329 // few objects and so before writing to any element the array must 1329 // few objects and so before writing to any element the array must
1330 // be copied. Use EnsureWritableFastElements in this case. 1330 // be copied. Use EnsureWritableFastElements in this case.
1331 // 1331 //
1332 // In the slow mode elements is either a NumberDictionary or a 1332 // In the slow mode elements is either a NumberDictionary or an ExternalArray.
1333 // PixelArray or an ExternalArray.
1334 DECL_ACCESSORS(elements, HeapObject) 1333 DECL_ACCESSORS(elements, HeapObject)
1335 inline void initialize_elements(); 1334 inline void initialize_elements();
1336 MUST_USE_RESULT inline MaybeObject* ResetElements(); 1335 MUST_USE_RESULT inline MaybeObject* ResetElements();
1337 inline ElementsKind GetElementsKind(); 1336 inline ElementsKind GetElementsKind();
1338 inline bool HasFastElements(); 1337 inline bool HasFastElements();
1339 inline bool HasDictionaryElements(); 1338 inline bool HasDictionaryElements();
1340 inline bool HasPixelElements(); 1339 inline bool HasExternalPixelElements();
1341 inline bool HasExternalArrayElements(); 1340 inline bool HasExternalArrayElements();
1342 inline bool HasExternalByteElements(); 1341 inline bool HasExternalByteElements();
1343 inline bool HasExternalUnsignedByteElements(); 1342 inline bool HasExternalUnsignedByteElements();
1344 inline bool HasExternalShortElements(); 1343 inline bool HasExternalShortElements();
1345 inline bool HasExternalUnsignedShortElements(); 1344 inline bool HasExternalUnsignedShortElements();
1346 inline bool HasExternalIntElements(); 1345 inline bool HasExternalIntElements();
1347 inline bool HasExternalUnsignedIntElements(); 1346 inline bool HasExternalUnsignedIntElements();
1348 inline bool HasExternalFloatElements(); 1347 inline bool HasExternalFloatElements();
1349 inline bool AllowsSetElementsLength(); 1348 inline bool AllowsSetElementsLength();
1350 inline NumberDictionary* element_dictionary(); // Gets slow elements. 1349 inline NumberDictionary* element_dictionary(); // Gets slow elements.
(...skipping 1417 matching lines...) Expand 10 before | Expand all | Expand 10 after
2768 // Maximal memory consumption for a single ByteArray. 2767 // Maximal memory consumption for a single ByteArray.
2769 static const int kMaxSize = 512 * MB; 2768 static const int kMaxSize = 512 * MB;
2770 // Maximal length of a single ByteArray. 2769 // Maximal length of a single ByteArray.
2771 static const int kMaxLength = kMaxSize - kHeaderSize; 2770 static const int kMaxLength = kMaxSize - kHeaderSize;
2772 2771
2773 private: 2772 private:
2774 DISALLOW_IMPLICIT_CONSTRUCTORS(ByteArray); 2773 DISALLOW_IMPLICIT_CONSTRUCTORS(ByteArray);
2775 }; 2774 };
2776 2775
2777 2776
2778 // A PixelArray represents a fixed-size byte array with special semantics
2779 // used for implementing the CanvasPixelArray object. Please see the
2780 // specification at:
2781 // http://www.whatwg.org/specs/web-apps/current-work/
2782 // multipage/the-canvas-element.html#canvaspixelarray
2783 // In particular, write access clamps the value written to 0 or 255 if the
2784 // value written is outside this range.
2785 class PixelArray: public HeapObject {
2786 public:
2787 // [length]: length of the array.
2788 inline int length();
2789 inline void set_length(int value);
2790
2791 // [external_pointer]: The pointer to the external memory area backing this
2792 // pixel array.
2793 DECL_ACCESSORS(external_pointer, uint8_t) // Pointer to the data store.
2794
2795 // Setter and getter.
2796 inline uint8_t get(int index);
2797 inline void set(int index, uint8_t value);
2798
2799 // This accessor applies the correct conversion from Smi, HeapNumber and
2800 // undefined and clamps the converted value between 0 and 255.
2801 Object* SetValue(uint32_t index, Object* value);
2802
2803 // Casting.
2804 static inline PixelArray* cast(Object* obj);
2805
2806 #ifdef OBJECT_PRINT
2807 inline void PixelArrayPrint() {
2808 PixelArrayPrint(stdout);
2809 }
2810 void PixelArrayPrint(FILE* out);
2811 #endif
2812 #ifdef DEBUG
2813 void PixelArrayVerify();
2814 #endif // DEBUG
2815
2816 // Maximal acceptable length for a pixel array.
2817 static const int kMaxLength = 0x3fffffff;
2818
2819 // PixelArray headers are not quadword aligned.
2820 static const int kLengthOffset = HeapObject::kHeaderSize;
2821 static const int kExternalPointerOffset =
2822 POINTER_SIZE_ALIGN(kLengthOffset + kIntSize);
2823 static const int kHeaderSize = kExternalPointerOffset + kPointerSize;
2824 static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize);
2825
2826 private:
2827 DISALLOW_IMPLICIT_CONSTRUCTORS(PixelArray);
2828 };
2829
2830
2831 // An ExternalArray represents a fixed-size array of primitive values 2777 // An ExternalArray represents a fixed-size array of primitive values
2832 // which live outside the JavaScript heap. Its subclasses are used to 2778 // which live outside the JavaScript heap. Its subclasses are used to
2833 // implement the CanvasArray types being defined in the WebGL 2779 // implement the CanvasArray types being defined in the WebGL
2834 // specification. As of this writing the first public draft is not yet 2780 // specification. As of this writing the first public draft is not yet
2835 // available, but Khronos members can access the draft at: 2781 // available, but Khronos members can access the draft at:
2836 // https://cvs.khronos.org/svn/repos/3dweb/trunk/doc/spec/WebGL-spec.html 2782 // https://cvs.khronos.org/svn/repos/3dweb/trunk/doc/spec/WebGL-spec.html
2837 // 2783 //
2838 // The semantics of these arrays differ from CanvasPixelArray. 2784 // The semantics of these arrays differ from CanvasPixelArray.
2839 // Out-of-range values passed to the setter are converted via a C 2785 // Out-of-range values passed to the setter are converted via a C
2840 // cast, not clamping. Out-of-range indices cause exceptions to be 2786 // cast, not clamping. Out-of-range indices cause exceptions to be
(...skipping 19 matching lines...) Expand all
2860 static const int kExternalPointerOffset = 2806 static const int kExternalPointerOffset =
2861 POINTER_SIZE_ALIGN(kLengthOffset + kIntSize); 2807 POINTER_SIZE_ALIGN(kLengthOffset + kIntSize);
2862 static const int kHeaderSize = kExternalPointerOffset + kPointerSize; 2808 static const int kHeaderSize = kExternalPointerOffset + kPointerSize;
2863 static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize); 2809 static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize);
2864 2810
2865 private: 2811 private:
2866 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalArray); 2812 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalArray);
2867 }; 2813 };
2868 2814
2869 2815
2816 // A ExternalPixelArray represents a fixed-size byte array with special
2817 // semantics used for implementing the CanvasPixelArray object. Please see the
2818 // specification at:
2819
2820 // http://www.whatwg.org/specs/web-apps/current-work/
2821 // multipage/the-canvas-element.html#canvaspixelarray
2822 // In particular, write access clamps the value written to 0 or 255 if the
2823 // value written is outside this range.
2824 class ExternalPixelArray: public ExternalArray {
2825 public:
2826 inline uint8_t* external_pixel_pointer();
2827
2828 // Setter and getter.
2829 inline uint8_t get(int index);
2830 inline void set(int index, uint8_t value);
2831
2832 // This accessor applies the correct conversion from Smi, HeapNumber and
2833 // undefined and clamps the converted value between 0 and 255.
2834 Object* SetValue(uint32_t index, Object* value);
2835
2836 // Casting.
2837 static inline ExternalPixelArray* cast(Object* obj);
2838
2839 #ifdef OBJECT_PRINT
2840 inline void ExternalPixelArrayPrint() {
2841 ExternalPixelArrayPrint(stdout);
2842 }
2843 void ExternalPixelArrayPrint(FILE* out);
2844 #endif
2845 #ifdef DEBUG
2846 void ExternalPixelArrayVerify();
2847 #endif // DEBUG
2848
2849 private:
2850 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalPixelArray);
2851 };
2852
2853
2870 class ExternalByteArray: public ExternalArray { 2854 class ExternalByteArray: public ExternalArray {
2871 public: 2855 public:
2872 // Setter and getter. 2856 // Setter and getter.
2873 inline int8_t get(int index); 2857 inline int8_t get(int index);
2874 inline void set(int index, int8_t value); 2858 inline void set(int index, int8_t value);
2875 2859
2876 // This accessor applies the correct conversion from Smi, HeapNumber 2860 // This accessor applies the correct conversion from Smi, HeapNumber
2877 // and undefined. 2861 // and undefined.
2878 MaybeObject* SetValue(uint32_t index, Object* value); 2862 MaybeObject* SetValue(uint32_t index, Object* value);
2879 2863
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
3194 FLAGS_MAX_VALUE = kMaxInt 3178 FLAGS_MAX_VALUE = kMaxInt
3195 }; 3179 };
3196 3180
3197 enum Kind { 3181 enum Kind {
3198 FUNCTION, 3182 FUNCTION,
3199 OPTIMIZED_FUNCTION, 3183 OPTIMIZED_FUNCTION,
3200 STUB, 3184 STUB,
3201 BUILTIN, 3185 BUILTIN,
3202 LOAD_IC, 3186 LOAD_IC,
3203 KEYED_LOAD_IC, 3187 KEYED_LOAD_IC,
3188 KEYED_EXTERNAL_ARRAY_LOAD_IC,
3204 CALL_IC, 3189 CALL_IC,
3205 KEYED_CALL_IC, 3190 KEYED_CALL_IC,
3206 STORE_IC, 3191 STORE_IC,
3207 KEYED_STORE_IC, 3192 KEYED_STORE_IC,
3193 KEYED_EXTERNAL_ARRAY_STORE_IC,
3208 BINARY_OP_IC, 3194 BINARY_OP_IC,
3209 TYPE_RECORDING_BINARY_OP_IC, 3195 TYPE_RECORDING_BINARY_OP_IC,
3210 COMPARE_IC, 3196 COMPARE_IC,
3211 // No more than 16 kinds. The value currently encoded in four bits in 3197 // No more than 16 kinds. The value currently encoded in four bits in
3212 // Flags. 3198 // Flags.
3213 3199
3214 // Pseudo-kinds. 3200 // Pseudo-kinds.
3215 REGEXP = BUILTIN, 3201 REGEXP = BUILTIN,
3216 FIRST_IC_KIND = LOAD_IC, 3202 FIRST_IC_KIND = LOAD_IC,
3217 LAST_IC_KIND = COMPARE_IC 3203 LAST_IC_KIND = COMPARE_IC
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
3272 inline bool is_keyed_load_stub() { return kind() == KEYED_LOAD_IC; } 3258 inline bool is_keyed_load_stub() { return kind() == KEYED_LOAD_IC; }
3273 inline bool is_store_stub() { return kind() == STORE_IC; } 3259 inline bool is_store_stub() { return kind() == STORE_IC; }
3274 inline bool is_keyed_store_stub() { return kind() == KEYED_STORE_IC; } 3260 inline bool is_keyed_store_stub() { return kind() == KEYED_STORE_IC; }
3275 inline bool is_call_stub() { return kind() == CALL_IC; } 3261 inline bool is_call_stub() { return kind() == CALL_IC; }
3276 inline bool is_keyed_call_stub() { return kind() == KEYED_CALL_IC; } 3262 inline bool is_keyed_call_stub() { return kind() == KEYED_CALL_IC; }
3277 inline bool is_binary_op_stub() { return kind() == BINARY_OP_IC; } 3263 inline bool is_binary_op_stub() { return kind() == BINARY_OP_IC; }
3278 inline bool is_type_recording_binary_op_stub() { 3264 inline bool is_type_recording_binary_op_stub() {
3279 return kind() == TYPE_RECORDING_BINARY_OP_IC; 3265 return kind() == TYPE_RECORDING_BINARY_OP_IC;
3280 } 3266 }
3281 inline bool is_compare_ic_stub() { return kind() == COMPARE_IC; } 3267 inline bool is_compare_ic_stub() { return kind() == COMPARE_IC; }
3268 inline bool is_external_array_load_stub() {
3269 return kind() == KEYED_EXTERNAL_ARRAY_LOAD_IC;
3270 }
3271 inline bool is_external_array_store_stub() {
3272 return kind() == KEYED_EXTERNAL_ARRAY_STORE_IC;
3273 }
3282 3274
3283 // [major_key]: For kind STUB or BINARY_OP_IC, the major key. 3275 // [major_key]: For kind STUB or BINARY_OP_IC, the major key.
3284 inline int major_key(); 3276 inline int major_key();
3285 inline void set_major_key(int value); 3277 inline void set_major_key(int value);
3286 3278
3287 // [optimizable]: For FUNCTION kind, tells if it is optimizable. 3279 // [optimizable]: For FUNCTION kind, tells if it is optimizable.
3288 inline bool optimizable(); 3280 inline bool optimizable();
3289 inline void set_optimizable(bool value); 3281 inline void set_optimizable(bool value);
3290 3282
3291 // [has_deoptimization_support]: For FUNCTION kind, tells if it has 3283 // [has_deoptimization_support]: For FUNCTION kind, tells if it has
(...skipping 21 matching lines...) Expand all
3313 // [stack_check_table_start]: For kind FUNCTION, the offset in the 3305 // [stack_check_table_start]: For kind FUNCTION, the offset in the
3314 // instruction stream where the stack check table starts. 3306 // instruction stream where the stack check table starts.
3315 inline unsigned stack_check_table_offset(); 3307 inline unsigned stack_check_table_offset();
3316 inline void set_stack_check_table_offset(unsigned offset); 3308 inline void set_stack_check_table_offset(unsigned offset);
3317 3309
3318 // [check type]: For kind CALL_IC, tells how to check if the 3310 // [check type]: For kind CALL_IC, tells how to check if the
3319 // receiver is valid for the given call. 3311 // receiver is valid for the given call.
3320 inline CheckType check_type(); 3312 inline CheckType check_type();
3321 inline void set_check_type(CheckType value); 3313 inline void set_check_type(CheckType value);
3322 3314
3315 // [external array type]: For kind KEYED_EXTERNAL_ARRAY_LOAD_IC and
3316 // KEYED_EXTERNAL_ARRAY_STORE_IC, identifies the type of external
3317 // array that the code stub is specialized for.
3318 inline ExternalArrayType external_array_type();
3319 inline void set_external_array_type(ExternalArrayType value);
3320
3323 // [binary op type]: For all BINARY_OP_IC. 3321 // [binary op type]: For all BINARY_OP_IC.
3324 inline byte binary_op_type(); 3322 inline byte binary_op_type();
3325 inline void set_binary_op_type(byte value); 3323 inline void set_binary_op_type(byte value);
3326 3324
3327 // [type-recording binary op type]: For all TYPE_RECORDING_BINARY_OP_IC. 3325 // [type-recording binary op type]: For all TYPE_RECORDING_BINARY_OP_IC.
3328 inline byte type_recording_binary_op_type(); 3326 inline byte type_recording_binary_op_type();
3329 inline void set_type_recording_binary_op_type(byte value); 3327 inline void set_type_recording_binary_op_type(byte value);
3330 inline byte type_recording_binary_op_result_type(); 3328 inline byte type_recording_binary_op_result_type();
3331 inline void set_type_recording_binary_op_result_type(byte value); 3329 inline void set_type_recording_binary_op_result_type(byte value);
3332 3330
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
3461 // Add padding to align the instruction start following right after 3459 // Add padding to align the instruction start following right after
3462 // the Code object header. 3460 // the Code object header.
3463 static const int kHeaderSize = 3461 static const int kHeaderSize =
3464 (kHeaderPaddingStart + kCodeAlignmentMask) & ~kCodeAlignmentMask; 3462 (kHeaderPaddingStart + kCodeAlignmentMask) & ~kCodeAlignmentMask;
3465 3463
3466 // Byte offsets within kKindSpecificFlagsOffset. 3464 // Byte offsets within kKindSpecificFlagsOffset.
3467 static const int kStubMajorKeyOffset = kKindSpecificFlagsOffset; 3465 static const int kStubMajorKeyOffset = kKindSpecificFlagsOffset;
3468 static const int kOptimizableOffset = kKindSpecificFlagsOffset; 3466 static const int kOptimizableOffset = kKindSpecificFlagsOffset;
3469 static const int kStackSlotsOffset = kKindSpecificFlagsOffset; 3467 static const int kStackSlotsOffset = kKindSpecificFlagsOffset;
3470 static const int kCheckTypeOffset = kKindSpecificFlagsOffset; 3468 static const int kCheckTypeOffset = kKindSpecificFlagsOffset;
3469 static const int kExternalArrayTypeOffset = kKindSpecificFlagsOffset;
3471 3470
3472 static const int kCompareStateOffset = kStubMajorKeyOffset + 1; 3471 static const int kCompareStateOffset = kStubMajorKeyOffset + 1;
3473 static const int kBinaryOpTypeOffset = kStubMajorKeyOffset + 1; 3472 static const int kBinaryOpTypeOffset = kStubMajorKeyOffset + 1;
3474 static const int kHasDeoptimizationSupportOffset = kOptimizableOffset + 1; 3473 static const int kHasDeoptimizationSupportOffset = kOptimizableOffset + 1;
3475 3474
3476 static const int kBinaryOpReturnTypeOffset = kBinaryOpTypeOffset + 1; 3475 static const int kBinaryOpReturnTypeOffset = kBinaryOpTypeOffset + 1;
3477 static const int kAllowOSRAtLoopNestingLevelOffset = 3476 static const int kAllowOSRAtLoopNestingLevelOffset =
3478 kHasDeoptimizationSupportOffset + 1; 3477 kHasDeoptimizationSupportOffset + 1;
3479 3478
3480 static const int kSafepointTableOffsetOffset = kStackSlotsOffset + kIntSize; 3479 static const int kSafepointTableOffsetOffset = kStackSlotsOffset + kIntSize;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
3618 } else { 3617 } else {
3619 set_bit_field2(bit_field2() & ~(1 << kHasFastElements)); 3618 set_bit_field2(bit_field2() & ~(1 << kHasFastElements));
3620 } 3619 }
3621 } 3620 }
3622 3621
3623 inline bool has_fast_elements() { 3622 inline bool has_fast_elements() {
3624 return ((1 << kHasFastElements) & bit_field2()) != 0; 3623 return ((1 << kHasFastElements) & bit_field2()) != 0;
3625 } 3624 }
3626 3625
3627 // Tells whether an instance has pixel array elements. 3626 // Tells whether an instance has pixel array elements.
3628 inline void set_has_pixel_array_elements(bool value) { 3627 inline void set_has_external_array_elements(bool value) {
3629 if (value) { 3628 if (value) {
3630 set_bit_field2(bit_field2() | (1 << kHasPixelArrayElements)); 3629 set_bit_field2(bit_field2() | (1 << kHasExternalArrayElements));
3631 } else { 3630 } else {
3632 set_bit_field2(bit_field2() & ~(1 << kHasPixelArrayElements)); 3631 set_bit_field2(bit_field2() & ~(1 << kHasExternalArrayElements));
3633 } 3632 }
3634 } 3633 }
3635 3634
3636 inline bool has_pixel_array_elements() { 3635 inline bool has_external_array_elements() {
3637 return ((1 << kHasPixelArrayElements) & bit_field2()) != 0; 3636 return ((1 << kHasExternalArrayElements) & bit_field2()) != 0;
3638 } 3637 }
3639 3638
3640 // Tells whether the map is attached to SharedFunctionInfo 3639 // Tells whether the map is attached to SharedFunctionInfo
3641 // (for inobject slack tracking). 3640 // (for inobject slack tracking).
3642 inline void set_attached_to_shared_function_info(bool value); 3641 inline void set_attached_to_shared_function_info(bool value);
3643 3642
3644 inline bool attached_to_shared_function_info(); 3643 inline bool attached_to_shared_function_info();
3645 3644
3646 // Tells whether the map is shared between objects that may have different 3645 // Tells whether the map is shared between objects that may have different
3647 // behavior. If true, the map should never be modified, instead a clone 3646 // behavior. If true, the map should never be modified, instead a clone
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3688 // Returns this map if it has the fast elements bit set, otherwise 3687 // Returns this map if it has the fast elements bit set, otherwise
3689 // returns a copy of the map, with all transitions dropped from the 3688 // returns a copy of the map, with all transitions dropped from the
3690 // descriptors and the fast elements bit set. 3689 // descriptors and the fast elements bit set.
3691 MUST_USE_RESULT inline MaybeObject* GetFastElementsMap(); 3690 MUST_USE_RESULT inline MaybeObject* GetFastElementsMap();
3692 3691
3693 // Returns this map if it has the fast elements bit cleared, 3692 // Returns this map if it has the fast elements bit cleared,
3694 // otherwise returns a copy of the map, with all transitions dropped 3693 // otherwise returns a copy of the map, with all transitions dropped
3695 // from the descriptors and the fast elements bit cleared. 3694 // from the descriptors and the fast elements bit cleared.
3696 MUST_USE_RESULT inline MaybeObject* GetSlowElementsMap(); 3695 MUST_USE_RESULT inline MaybeObject* GetSlowElementsMap();
3697 3696
3698 // Returns this map if it has the pixel array elements bit is set, otherwise 3697 // Returns a new map with all transitions dropped from the descriptors and the
3699 // returns a copy of the map, with all transitions dropped from the 3698 // external array elements bit set.
3700 // descriptors and the pixel array elements bit set. 3699 MUST_USE_RESULT inline MaybeObject* NewExternalArrayElementsMap();
3701 MUST_USE_RESULT inline MaybeObject* GetPixelArrayElementsMap();
3702 3700
3703 // Returns the property index for name (only valid for FAST MODE). 3701 // Returns the property index for name (only valid for FAST MODE).
3704 int PropertyIndexFor(String* name); 3702 int PropertyIndexFor(String* name);
3705 3703
3706 // Returns the next free property index (only valid for FAST MODE). 3704 // Returns the next free property index (only valid for FAST MODE).
3707 int NextFreePropertyIndex(); 3705 int NextFreePropertyIndex();
3708 3706
3709 // Returns the number of properties described in instance_descriptors. 3707 // Returns the number of properties described in instance_descriptors.
3710 int NumberOfDescribedProperties(); 3708 int NumberOfDescribedProperties();
3711 3709
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
3811 static const int kHasInstanceCallHandler = 6; 3809 static const int kHasInstanceCallHandler = 6;
3812 static const int kIsAccessCheckNeeded = 7; 3810 static const int kIsAccessCheckNeeded = 7;
3813 3811
3814 // Bit positions for bit field 2 3812 // Bit positions for bit field 2
3815 static const int kIsExtensible = 0; 3813 static const int kIsExtensible = 0;
3816 static const int kFunctionWithPrototype = 1; 3814 static const int kFunctionWithPrototype = 1;
3817 static const int kHasFastElements = 2; 3815 static const int kHasFastElements = 2;
3818 static const int kStringWrapperSafeForDefaultValueOf = 3; 3816 static const int kStringWrapperSafeForDefaultValueOf = 3;
3819 static const int kAttachedToSharedFunctionInfo = 4; 3817 static const int kAttachedToSharedFunctionInfo = 4;
3820 static const int kIsShared = 5; 3818 static const int kIsShared = 5;
3821 static const int kHasPixelArrayElements = 6; 3819 static const int kHasExternalArrayElements = 6;
3822 3820
3823 // Layout of the default cache. It holds alternating name and code objects. 3821 // Layout of the default cache. It holds alternating name and code objects.
3824 static const int kCodeCacheEntrySize = 2; 3822 static const int kCodeCacheEntrySize = 2;
3825 static const int kCodeCacheEntryNameOffset = 0; 3823 static const int kCodeCacheEntryNameOffset = 0;
3826 static const int kCodeCacheEntryCodeOffset = 1; 3824 static const int kCodeCacheEntryCodeOffset = 1;
3827 3825
3828 typedef FixedBodyDescriptor<kPointerFieldsBeginOffset, 3826 typedef FixedBodyDescriptor<kPointerFieldsBeginOffset,
3829 kPointerFieldsEndOffset, 3827 kPointerFieldsEndOffset,
3830 kSize> BodyDescriptor; 3828 kSize> BodyDescriptor;
3831 3829
(...skipping 2746 matching lines...) Expand 10 before | Expand all | Expand 10 after
6578 } else { 6576 } else {
6579 value &= ~(1 << bit_position); 6577 value &= ~(1 << bit_position);
6580 } 6578 }
6581 return value; 6579 return value;
6582 } 6580 }
6583 }; 6581 };
6584 6582
6585 } } // namespace v8::internal 6583 } } // namespace v8::internal
6586 6584
6587 #endif // V8_OBJECTS_H_ 6585 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/log.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698