OLD | NEW |
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 23 matching lines...) Expand all Loading... |
34 #if V8_TARGET_ARCH_ARM | 34 #if V8_TARGET_ARCH_ARM |
35 #include "arm/constants-arm.h" | 35 #include "arm/constants-arm.h" |
36 #elif V8_TARGET_ARCH_MIPS | 36 #elif V8_TARGET_ARCH_MIPS |
37 #include "mips/constants-mips.h" | 37 #include "mips/constants-mips.h" |
38 #endif | 38 #endif |
39 | 39 |
40 // | 40 // |
41 // Most object types in the V8 JavaScript are described in this file. | 41 // Most object types in the V8 JavaScript are described in this file. |
42 // | 42 // |
43 // Inheritance hierarchy: | 43 // Inheritance hierarchy: |
| 44 // - MaybeObject (an object or a failure) |
| 45 // - Failure (immediate for marking failed operation) |
44 // - Object | 46 // - Object |
45 // - Smi (immediate small integer) | 47 // - Smi (immediate small integer) |
46 // - Failure (immediate for marking failed operation) | |
47 // - HeapObject (superclass for everything allocated in the heap) | 48 // - HeapObject (superclass for everything allocated in the heap) |
48 // - JSObject | 49 // - JSObject |
49 // - JSArray | 50 // - JSArray |
50 // - JSRegExp | 51 // - JSRegExp |
51 // - JSFunction | 52 // - JSFunction |
52 // - GlobalObject | 53 // - GlobalObject |
53 // - JSGlobalObject | 54 // - JSGlobalObject |
54 // - JSBuiltinsObject | 55 // - JSBuiltinsObject |
55 // - JSGlobalProxy | 56 // - JSGlobalProxy |
56 // - JSValue | 57 // - JSValue |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
577 InstanceType type; | 578 InstanceType type; |
578 Object* ptr; | 579 Object* ptr; |
579 const char* str; | 580 const char* str; |
580 double number; | 581 double number; |
581 }; | 582 }; |
582 | 583 |
583 | 584 |
584 // A template-ized version of the IsXXX functions. | 585 // A template-ized version of the IsXXX functions. |
585 template <class C> static inline bool Is(Object* obj); | 586 template <class C> static inline bool Is(Object* obj); |
586 | 587 |
| 588 class MaybeObject BASE_EMBEDDED { |
| 589 public: |
| 590 inline bool IsFailure(); |
| 591 inline bool IsRetryAfterGC(); |
| 592 inline bool IsOutOfMemory(); |
| 593 inline bool IsException(); |
| 594 INLINE(bool IsTheHole()); |
| 595 inline bool ToObject(Object** obj) { |
| 596 if (IsFailure()) return false; |
| 597 *obj = reinterpret_cast<Object*>(this); |
| 598 return true; |
| 599 } |
| 600 inline Object* ToObjectUnchecked() { |
| 601 ASSERT(!IsFailure()); |
| 602 return reinterpret_cast<Object*>(this); |
| 603 } |
| 604 inline Object* ToObjectChecked() { |
| 605 CHECK(!IsFailure()); |
| 606 return reinterpret_cast<Object*>(this); |
| 607 } |
| 608 |
| 609 #ifdef DEBUG |
| 610 // Prints this object with details. |
| 611 void Print(); |
| 612 void PrintLn(); |
| 613 // Verifies the object. |
| 614 void Verify(); |
| 615 #endif |
| 616 }; |
587 | 617 |
588 // Object is the abstract superclass for all classes in the | 618 // Object is the abstract superclass for all classes in the |
589 // object hierarchy. | 619 // object hierarchy. |
590 // Object does not use any virtual functions to avoid the | 620 // Object does not use any virtual functions to avoid the |
591 // allocation of the C++ vtable. | 621 // allocation of the C++ vtable. |
592 // Since Smi and Failure are subclasses of Object no | 622 // Since Smi and Failure are subclasses of Object no |
593 // data members can be present in Object. | 623 // data members can be present in Object. |
594 class Object BASE_EMBEDDED { | 624 class Object : public MaybeObject { |
595 public: | 625 public: |
596 // Type testing. | 626 // Type testing. |
597 inline bool IsSmi(); | 627 inline bool IsSmi(); |
598 inline bool IsHeapObject(); | 628 inline bool IsHeapObject(); |
599 inline bool IsHeapNumber(); | 629 inline bool IsHeapNumber(); |
600 inline bool IsString(); | 630 inline bool IsString(); |
601 inline bool IsSymbol(); | 631 inline bool IsSymbol(); |
602 // See objects-inl.h for more details | 632 // See objects-inl.h for more details |
603 inline bool IsSeqString(); | 633 inline bool IsSeqString(); |
604 inline bool IsExternalString(); | 634 inline bool IsExternalString(); |
605 inline bool IsExternalTwoByteString(); | 635 inline bool IsExternalTwoByteString(); |
606 inline bool IsExternalAsciiString(); | 636 inline bool IsExternalAsciiString(); |
607 inline bool IsSeqTwoByteString(); | 637 inline bool IsSeqTwoByteString(); |
608 inline bool IsSeqAsciiString(); | 638 inline bool IsSeqAsciiString(); |
609 inline bool IsConsString(); | 639 inline bool IsConsString(); |
610 | 640 |
611 inline bool IsNumber(); | 641 inline bool IsNumber(); |
612 inline bool IsByteArray(); | 642 inline bool IsByteArray(); |
613 inline bool IsPixelArray(); | 643 inline bool IsPixelArray(); |
614 inline bool IsExternalArray(); | 644 inline bool IsExternalArray(); |
615 inline bool IsExternalByteArray(); | 645 inline bool IsExternalByteArray(); |
616 inline bool IsExternalUnsignedByteArray(); | 646 inline bool IsExternalUnsignedByteArray(); |
617 inline bool IsExternalShortArray(); | 647 inline bool IsExternalShortArray(); |
618 inline bool IsExternalUnsignedShortArray(); | 648 inline bool IsExternalUnsignedShortArray(); |
619 inline bool IsExternalIntArray(); | 649 inline bool IsExternalIntArray(); |
620 inline bool IsExternalUnsignedIntArray(); | 650 inline bool IsExternalUnsignedIntArray(); |
621 inline bool IsExternalFloatArray(); | 651 inline bool IsExternalFloatArray(); |
622 inline bool IsFailure(); | |
623 inline bool IsRetryAfterGC(); | |
624 inline bool IsOutOfMemoryFailure(); | |
625 inline bool IsException(); | |
626 inline bool IsJSObject(); | 652 inline bool IsJSObject(); |
627 inline bool IsJSContextExtensionObject(); | 653 inline bool IsJSContextExtensionObject(); |
628 inline bool IsMap(); | 654 inline bool IsMap(); |
629 inline bool IsFixedArray(); | 655 inline bool IsFixedArray(); |
630 inline bool IsDescriptorArray(); | 656 inline bool IsDescriptorArray(); |
631 inline bool IsContext(); | 657 inline bool IsContext(); |
632 inline bool IsCatchContext(); | 658 inline bool IsCatchContext(); |
633 inline bool IsGlobalContext(); | 659 inline bool IsGlobalContext(); |
634 inline bool IsJSFunction(); | 660 inline bool IsJSFunction(); |
635 inline bool IsCode(); | 661 inline bool IsCode(); |
(...skipping 26 matching lines...) Expand all Loading... |
662 // function template. | 688 // function template. |
663 inline bool IsInstanceOf(FunctionTemplateInfo* type); | 689 inline bool IsInstanceOf(FunctionTemplateInfo* type); |
664 | 690 |
665 inline bool IsStruct(); | 691 inline bool IsStruct(); |
666 #define DECLARE_STRUCT_PREDICATE(NAME, Name, name) inline bool Is##Name(); | 692 #define DECLARE_STRUCT_PREDICATE(NAME, Name, name) inline bool Is##Name(); |
667 STRUCT_LIST(DECLARE_STRUCT_PREDICATE) | 693 STRUCT_LIST(DECLARE_STRUCT_PREDICATE) |
668 #undef DECLARE_STRUCT_PREDICATE | 694 #undef DECLARE_STRUCT_PREDICATE |
669 | 695 |
670 // Oddball testing. | 696 // Oddball testing. |
671 INLINE(bool IsUndefined()); | 697 INLINE(bool IsUndefined()); |
672 INLINE(bool IsTheHole()); | |
673 INLINE(bool IsNull()); | 698 INLINE(bool IsNull()); |
674 INLINE(bool IsTrue()); | 699 INLINE(bool IsTrue()); |
675 INLINE(bool IsFalse()); | 700 INLINE(bool IsFalse()); |
676 | 701 |
677 // Extract the number. | 702 // Extract the number. |
678 inline double Number(); | 703 inline double Number(); |
679 | 704 |
680 inline bool HasSpecificClassOf(String* name); | 705 inline bool HasSpecificClassOf(String* name); |
681 | 706 |
682 Object* ToObject(); // ECMA-262 9.9. | 707 MUST_USE_RESULT MaybeObject* ToObject(); // ECMA-262 9.9. |
683 Object* ToBoolean(); // ECMA-262 9.2. | 708 Object* ToBoolean(); // ECMA-262 9.2. |
684 | 709 |
685 // Convert to a JSObject if needed. | 710 // Convert to a JSObject if needed. |
686 // global_context is used when creating wrapper object. | 711 // global_context is used when creating wrapper object. |
687 Object* ToObject(Context* global_context); | 712 MUST_USE_RESULT MaybeObject* ToObject(Context* global_context); |
688 | 713 |
689 // Converts this to a Smi if possible. | 714 // Converts this to a Smi if possible. |
690 // Failure is returned otherwise. | 715 // Failure is returned otherwise. |
691 inline Object* ToSmi(); | 716 MUST_USE_RESULT inline MaybeObject* ToSmi(); |
692 | 717 |
693 void Lookup(String* name, LookupResult* result); | 718 void Lookup(String* name, LookupResult* result); |
694 | 719 |
695 // Property access. | 720 // Property access. |
696 inline Object* GetProperty(String* key); | 721 MUST_USE_RESULT inline MaybeObject* GetProperty(String* key); |
697 inline Object* GetProperty(String* key, PropertyAttributes* attributes); | 722 MUST_USE_RESULT inline MaybeObject* GetProperty( |
698 Object* GetPropertyWithReceiver(Object* receiver, | 723 String* key, |
699 String* key, | 724 PropertyAttributes* attributes); |
700 PropertyAttributes* attributes); | 725 MUST_USE_RESULT MaybeObject* GetPropertyWithReceiver( |
701 Object* GetProperty(Object* receiver, | 726 Object* receiver, |
702 LookupResult* result, | 727 String* key, |
703 String* key, | 728 PropertyAttributes* attributes); |
704 PropertyAttributes* attributes); | 729 MUST_USE_RESULT MaybeObject* GetProperty(Object* receiver, |
705 Object* GetPropertyWithCallback(Object* receiver, | 730 LookupResult* result, |
706 Object* structure, | 731 String* key, |
707 String* name, | 732 PropertyAttributes* attributes); |
708 Object* holder); | 733 MUST_USE_RESULT MaybeObject* GetPropertyWithCallback(Object* receiver, |
709 Object* GetPropertyWithDefinedGetter(Object* receiver, | 734 Object* structure, |
710 JSFunction* getter); | 735 String* name, |
| 736 Object* holder); |
| 737 MUST_USE_RESULT MaybeObject* GetPropertyWithDefinedGetter(Object* receiver, |
| 738 JSFunction* getter); |
711 | 739 |
712 inline Object* GetElement(uint32_t index); | 740 inline MaybeObject* GetElement(uint32_t index); |
713 Object* GetElementWithReceiver(Object* receiver, uint32_t index); | 741 // For use when we know that no exception can be thrown. |
| 742 inline Object* GetElementNoExceptionThrown(uint32_t index); |
| 743 MaybeObject* GetElementWithReceiver(Object* receiver, uint32_t index); |
714 | 744 |
715 // Return the object's prototype (might be Heap::null_value()). | 745 // Return the object's prototype (might be Heap::null_value()). |
716 Object* GetPrototype(); | 746 Object* GetPrototype(); |
717 | 747 |
718 // Tries to convert an object to an array index. Returns true and sets | 748 // Tries to convert an object to an array index. Returns true and sets |
719 // the output parameter if it succeeds. | 749 // the output parameter if it succeeds. |
720 inline bool ToArrayIndex(uint32_t* index); | 750 inline bool ToArrayIndex(uint32_t* index); |
721 | 751 |
722 // Returns true if this is a JSValue containing a string and the index is | 752 // Returns true if this is a JSValue containing a string and the index is |
723 // < the length of the string. Used to implement [] on strings. | 753 // < the length of the string. Used to implement [] on strings. |
724 inline bool IsStringObjectWithCharacterAt(uint32_t index); | 754 inline bool IsStringObjectWithCharacterAt(uint32_t index); |
725 | 755 |
726 #ifdef DEBUG | 756 #ifdef DEBUG |
727 // Prints this object with details. | |
728 void Print(); | |
729 void PrintLn(); | |
730 // Verifies the object. | |
731 void Verify(); | |
732 | |
733 // Verify a pointer is a valid object pointer. | 757 // Verify a pointer is a valid object pointer. |
734 static void VerifyPointer(Object* p); | 758 static void VerifyPointer(Object* p); |
735 #endif | 759 #endif |
736 | 760 |
737 // Prints this object without details. | 761 // Prints this object without details. |
738 void ShortPrint(); | 762 void ShortPrint(); |
739 | 763 |
740 // Prints this object without details to a message accumulator. | 764 // Prints this object without details to a message accumulator. |
741 void ShortPrint(StringStream* accumulator); | 765 void ShortPrint(StringStream* accumulator); |
742 | 766 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 // | 832 // |
809 // The next three bits, 4-6, are an allocation space tag 'sss'. The | 833 // The next three bits, 4-6, are an allocation space tag 'sss'. The |
810 // allocation space tag is 000 for all failure types except | 834 // allocation space tag is 000 for all failure types except |
811 // RETRY_AFTER_GC. For RETRY_AFTER_GC, the possible values are the | 835 // RETRY_AFTER_GC. For RETRY_AFTER_GC, the possible values are the |
812 // allocation spaces (the encoding is found in globals.h). | 836 // allocation spaces (the encoding is found in globals.h). |
813 | 837 |
814 // Failure type tag info. | 838 // Failure type tag info. |
815 const int kFailureTypeTagSize = 2; | 839 const int kFailureTypeTagSize = 2; |
816 const int kFailureTypeTagMask = (1 << kFailureTypeTagSize) - 1; | 840 const int kFailureTypeTagMask = (1 << kFailureTypeTagSize) - 1; |
817 | 841 |
818 class Failure: public Object { | 842 class Failure: public MaybeObject { |
819 public: | 843 public: |
820 // RuntimeStubs assumes EXCEPTION = 1 in the compiler-generated code. | 844 // RuntimeStubs assumes EXCEPTION = 1 in the compiler-generated code. |
821 enum Type { | 845 enum Type { |
822 RETRY_AFTER_GC = 0, | 846 RETRY_AFTER_GC = 0, |
823 EXCEPTION = 1, // Returning this marker tells the real exception | 847 EXCEPTION = 1, // Returning this marker tells the real exception |
824 // is in Top::pending_exception. | 848 // is in Top::pending_exception. |
825 INTERNAL_ERROR = 2, | 849 INTERNAL_ERROR = 2, |
826 OUT_OF_MEMORY_EXCEPTION = 3 | 850 OUT_OF_MEMORY_EXCEPTION = 3 |
827 }; | 851 }; |
828 | 852 |
829 inline Type type() const; | 853 inline Type type() const; |
830 | 854 |
831 // Returns the space that needs to be collected for RetryAfterGC failures. | 855 // Returns the space that needs to be collected for RetryAfterGC failures. |
832 inline AllocationSpace allocation_space() const; | 856 inline AllocationSpace allocation_space() const; |
833 | 857 |
834 inline bool IsInternalError() const; | 858 inline bool IsInternalError() const; |
835 inline bool IsOutOfMemoryException() const; | 859 inline bool IsOutOfMemoryException() const; |
836 | 860 |
837 static inline Failure* RetryAfterGC(AllocationSpace space); | 861 static inline Failure* RetryAfterGC(AllocationSpace space); |
838 static inline Failure* RetryAfterGC(); // NEW_SPACE | 862 static inline Failure* RetryAfterGC(); // NEW_SPACE |
839 static inline Failure* Exception(); | 863 static inline Failure* Exception(); |
840 static inline Failure* InternalError(); | 864 static inline Failure* InternalError(); |
841 static inline Failure* OutOfMemoryException(); | 865 static inline Failure* OutOfMemoryException(); |
842 // Casting. | 866 // Casting. |
843 static inline Failure* cast(Object* object); | 867 static inline Failure* cast(MaybeObject* object); |
844 | 868 |
845 // Dispatched behavior. | 869 // Dispatched behavior. |
846 void FailurePrint(); | 870 void FailurePrint(); |
847 void FailurePrint(StringStream* accumulator); | 871 void FailurePrint(StringStream* accumulator); |
848 #ifdef DEBUG | 872 #ifdef DEBUG |
849 void FailureVerify(); | 873 void FailureVerify(); |
850 #endif | 874 #endif |
851 | 875 |
852 private: | 876 private: |
853 inline intptr_t value() const; | 877 inline intptr_t value() const; |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1242 // elements array can have one of the two maps in this mode: | 1266 // elements array can have one of the two maps in this mode: |
1243 // fixed_array_map or fixed_cow_array_map (for copy-on-write | 1267 // fixed_array_map or fixed_cow_array_map (for copy-on-write |
1244 // arrays). In the latter case the elements array may be shared by a | 1268 // arrays). In the latter case the elements array may be shared by a |
1245 // few objects and so before writing to any element the array must | 1269 // few objects and so before writing to any element the array must |
1246 // be copied. Use EnsureWritableFastElements in this case. | 1270 // be copied. Use EnsureWritableFastElements in this case. |
1247 // | 1271 // |
1248 // In the slow mode elements is either a NumberDictionary or a | 1272 // In the slow mode elements is either a NumberDictionary or a |
1249 // PixelArray or an ExternalArray. | 1273 // PixelArray or an ExternalArray. |
1250 DECL_ACCESSORS(elements, HeapObject) | 1274 DECL_ACCESSORS(elements, HeapObject) |
1251 inline void initialize_elements(); | 1275 inline void initialize_elements(); |
1252 inline Object* ResetElements(); | 1276 MUST_USE_RESULT inline MaybeObject* ResetElements(); |
1253 inline ElementsKind GetElementsKind(); | 1277 inline ElementsKind GetElementsKind(); |
1254 inline bool HasFastElements(); | 1278 inline bool HasFastElements(); |
1255 inline bool HasDictionaryElements(); | 1279 inline bool HasDictionaryElements(); |
1256 inline bool HasPixelElements(); | 1280 inline bool HasPixelElements(); |
1257 inline bool HasExternalArrayElements(); | 1281 inline bool HasExternalArrayElements(); |
1258 inline bool HasExternalByteElements(); | 1282 inline bool HasExternalByteElements(); |
1259 inline bool HasExternalUnsignedByteElements(); | 1283 inline bool HasExternalUnsignedByteElements(); |
1260 inline bool HasExternalShortElements(); | 1284 inline bool HasExternalShortElements(); |
1261 inline bool HasExternalUnsignedShortElements(); | 1285 inline bool HasExternalUnsignedShortElements(); |
1262 inline bool HasExternalIntElements(); | 1286 inline bool HasExternalIntElements(); |
1263 inline bool HasExternalUnsignedIntElements(); | 1287 inline bool HasExternalUnsignedIntElements(); |
1264 inline bool HasExternalFloatElements(); | 1288 inline bool HasExternalFloatElements(); |
1265 inline bool AllowsSetElementsLength(); | 1289 inline bool AllowsSetElementsLength(); |
1266 inline NumberDictionary* element_dictionary(); // Gets slow elements. | 1290 inline NumberDictionary* element_dictionary(); // Gets slow elements. |
1267 // Requires: this->HasFastElements(). | 1291 // Requires: this->HasFastElements(). |
1268 inline Object* EnsureWritableFastElements(); | 1292 MUST_USE_RESULT inline MaybeObject* EnsureWritableFastElements(); |
1269 | 1293 |
1270 // Collects elements starting at index 0. | 1294 // Collects elements starting at index 0. |
1271 // Undefined values are placed after non-undefined values. | 1295 // Undefined values are placed after non-undefined values. |
1272 // Returns the number of non-undefined values. | 1296 // Returns the number of non-undefined values. |
1273 Object* PrepareElementsForSort(uint32_t limit); | 1297 MUST_USE_RESULT MaybeObject* PrepareElementsForSort(uint32_t limit); |
1274 // As PrepareElementsForSort, but only on objects where elements is | 1298 // As PrepareElementsForSort, but only on objects where elements is |
1275 // a dictionary, and it will stay a dictionary. | 1299 // a dictionary, and it will stay a dictionary. |
1276 MUST_USE_RESULT Object* PrepareSlowElementsForSort(uint32_t limit); | 1300 MUST_USE_RESULT MaybeObject* PrepareSlowElementsForSort(uint32_t limit); |
1277 | 1301 |
1278 Object* SetProperty(String* key, | 1302 MUST_USE_RESULT MaybeObject* SetProperty(String* key, |
1279 Object* value, | 1303 Object* value, |
1280 PropertyAttributes attributes); | 1304 PropertyAttributes attributes); |
1281 Object* SetProperty(LookupResult* result, | 1305 MUST_USE_RESULT MaybeObject* SetProperty(LookupResult* result, |
1282 String* key, | 1306 String* key, |
1283 Object* value, | 1307 Object* value, |
1284 PropertyAttributes attributes); | 1308 PropertyAttributes attributes); |
1285 Object* SetPropertyWithFailedAccessCheck(LookupResult* result, | 1309 MUST_USE_RESULT MaybeObject* SetPropertyWithFailedAccessCheck( |
1286 String* name, | 1310 LookupResult* result, |
1287 Object* value); | 1311 String* name, |
1288 Object* SetPropertyWithCallback(Object* structure, | 1312 Object* value); |
1289 String* name, | 1313 MUST_USE_RESULT MaybeObject* SetPropertyWithCallback(Object* structure, |
1290 Object* value, | 1314 String* name, |
1291 JSObject* holder); | 1315 Object* value, |
1292 Object* SetPropertyWithDefinedSetter(JSFunction* setter, | 1316 JSObject* holder); |
1293 Object* value); | 1317 MUST_USE_RESULT MaybeObject* SetPropertyWithDefinedSetter(JSFunction* setter, |
1294 Object* SetPropertyWithInterceptor(String* name, | 1318 Object* value); |
1295 Object* value, | 1319 MUST_USE_RESULT MaybeObject* SetPropertyWithInterceptor( |
1296 PropertyAttributes attributes); | 1320 String* name, |
1297 Object* SetPropertyPostInterceptor(String* name, | 1321 Object* value, |
1298 Object* value, | 1322 PropertyAttributes attributes); |
1299 PropertyAttributes attributes); | 1323 MUST_USE_RESULT MaybeObject* SetPropertyPostInterceptor( |
1300 Object* IgnoreAttributesAndSetLocalProperty(String* key, | 1324 String* name, |
1301 Object* value, | 1325 Object* value, |
1302 PropertyAttributes attributes); | 1326 PropertyAttributes attributes); |
| 1327 MUST_USE_RESULT MaybeObject* IgnoreAttributesAndSetLocalProperty( |
| 1328 String* key, |
| 1329 Object* value, |
| 1330 PropertyAttributes attributes); |
1303 | 1331 |
1304 // Retrieve a value in a normalized object given a lookup result. | 1332 // Retrieve a value in a normalized object given a lookup result. |
1305 // Handles the special representation of JS global objects. | 1333 // Handles the special representation of JS global objects. |
1306 Object* GetNormalizedProperty(LookupResult* result); | 1334 Object* GetNormalizedProperty(LookupResult* result); |
1307 | 1335 |
1308 // Sets the property value in a normalized object given a lookup result. | 1336 // Sets the property value in a normalized object given a lookup result. |
1309 // Handles the special representation of JS global objects. | 1337 // Handles the special representation of JS global objects. |
1310 Object* SetNormalizedProperty(LookupResult* result, Object* value); | 1338 Object* SetNormalizedProperty(LookupResult* result, Object* value); |
1311 | 1339 |
1312 // Sets the property value in a normalized object given (key, value, details). | 1340 // Sets the property value in a normalized object given (key, value, details). |
1313 // Handles the special representation of JS global objects. | 1341 // Handles the special representation of JS global objects. |
1314 MUST_USE_RESULT Object* SetNormalizedProperty(String* name, | 1342 MUST_USE_RESULT MaybeObject* SetNormalizedProperty(String* name, |
1315 Object* value, | 1343 Object* value, |
1316 PropertyDetails details); | 1344 PropertyDetails details); |
1317 | 1345 |
1318 // Deletes the named property in a normalized object. | 1346 // Deletes the named property in a normalized object. |
1319 MUST_USE_RESULT Object* DeleteNormalizedProperty(String* name, | 1347 MUST_USE_RESULT MaybeObject* DeleteNormalizedProperty(String* name, |
1320 DeleteMode mode); | 1348 DeleteMode mode); |
1321 | 1349 |
1322 // Returns the class name ([[Class]] property in the specification). | 1350 // Returns the class name ([[Class]] property in the specification). |
1323 String* class_name(); | 1351 String* class_name(); |
1324 | 1352 |
1325 // Returns the constructor name (the name (possibly, inferred name) of the | 1353 // Returns the constructor name (the name (possibly, inferred name) of the |
1326 // function that was used to instantiate the object). | 1354 // function that was used to instantiate the object). |
1327 String* constructor_name(); | 1355 String* constructor_name(); |
1328 | 1356 |
1329 // Retrieve interceptors. | 1357 // Retrieve interceptors. |
1330 InterceptorInfo* GetNamedInterceptor(); | 1358 InterceptorInfo* GetNamedInterceptor(); |
1331 InterceptorInfo* GetIndexedInterceptor(); | 1359 InterceptorInfo* GetIndexedInterceptor(); |
1332 | 1360 |
1333 inline PropertyAttributes GetPropertyAttribute(String* name); | 1361 inline PropertyAttributes GetPropertyAttribute(String* name); |
1334 PropertyAttributes GetPropertyAttributeWithReceiver(JSObject* receiver, | 1362 PropertyAttributes GetPropertyAttributeWithReceiver(JSObject* receiver, |
1335 String* name); | 1363 String* name); |
1336 PropertyAttributes GetLocalPropertyAttribute(String* name); | 1364 PropertyAttributes GetLocalPropertyAttribute(String* name); |
1337 | 1365 |
1338 MUST_USE_RESULT Object* DefineAccessor(String* name, | 1366 MUST_USE_RESULT MaybeObject* DefineAccessor(String* name, |
1339 bool is_getter, | 1367 bool is_getter, |
1340 JSFunction* fun, | 1368 JSFunction* fun, |
1341 PropertyAttributes attributes); | 1369 PropertyAttributes attributes); |
1342 Object* LookupAccessor(String* name, bool is_getter); | 1370 Object* LookupAccessor(String* name, bool is_getter); |
1343 | 1371 |
1344 MUST_USE_RESULT Object* DefineAccessor(AccessorInfo* info); | 1372 MUST_USE_RESULT MaybeObject* DefineAccessor(AccessorInfo* info); |
1345 | 1373 |
1346 // Used from Object::GetProperty(). | 1374 // Used from Object::GetProperty(). |
1347 Object* GetPropertyWithFailedAccessCheck(Object* receiver, | 1375 MaybeObject* GetPropertyWithFailedAccessCheck( |
1348 LookupResult* result, | 1376 Object* receiver, |
1349 String* name, | 1377 LookupResult* result, |
1350 PropertyAttributes* attributes); | 1378 String* name, |
1351 Object* GetPropertyWithInterceptor(JSObject* receiver, | 1379 PropertyAttributes* attributes); |
1352 String* name, | 1380 MaybeObject* GetPropertyWithInterceptor( |
1353 PropertyAttributes* attributes); | 1381 JSObject* receiver, |
1354 Object* GetPropertyPostInterceptor(JSObject* receiver, | 1382 String* name, |
1355 String* name, | 1383 PropertyAttributes* attributes); |
1356 PropertyAttributes* attributes); | 1384 MaybeObject* GetPropertyPostInterceptor( |
1357 Object* GetLocalPropertyPostInterceptor(JSObject* receiver, | 1385 JSObject* receiver, |
1358 String* name, | 1386 String* name, |
1359 PropertyAttributes* attributes); | 1387 PropertyAttributes* attributes); |
| 1388 MaybeObject* GetLocalPropertyPostInterceptor(JSObject* receiver, |
| 1389 String* name, |
| 1390 PropertyAttributes* attributes); |
1360 | 1391 |
1361 // Returns true if this is an instance of an api function and has | 1392 // Returns true if this is an instance of an api function and has |
1362 // been modified since it was created. May give false positives. | 1393 // been modified since it was created. May give false positives. |
1363 bool IsDirty(); | 1394 bool IsDirty(); |
1364 | 1395 |
1365 bool HasProperty(String* name) { | 1396 bool HasProperty(String* name) { |
1366 return GetPropertyAttribute(name) != ABSENT; | 1397 return GetPropertyAttribute(name) != ABSENT; |
1367 } | 1398 } |
1368 | 1399 |
1369 // Can cause a GC if it hits an interceptor. | 1400 // Can cause a GC if it hits an interceptor. |
(...skipping 13 matching lines...) Expand all Loading... |
1383 // receiver is a JSGlobalProxy then the auxiliary object is a property | 1414 // receiver is a JSGlobalProxy then the auxiliary object is a property |
1384 // of its prototype. | 1415 // of its prototype. |
1385 // | 1416 // |
1386 // Has/Get/SetHiddenPropertiesObject methods don't allow the holder to be | 1417 // Has/Get/SetHiddenPropertiesObject methods don't allow the holder to be |
1387 // a JSGlobalProxy. Use BypassGlobalProxy method above to get to the real | 1418 // a JSGlobalProxy. Use BypassGlobalProxy method above to get to the real |
1388 // holder. | 1419 // holder. |
1389 // | 1420 // |
1390 // These accessors do not touch interceptors or accessors. | 1421 // These accessors do not touch interceptors or accessors. |
1391 inline bool HasHiddenPropertiesObject(); | 1422 inline bool HasHiddenPropertiesObject(); |
1392 inline Object* GetHiddenPropertiesObject(); | 1423 inline Object* GetHiddenPropertiesObject(); |
1393 inline Object* SetHiddenPropertiesObject(Object* hidden_obj); | 1424 MUST_USE_RESULT inline MaybeObject* SetHiddenPropertiesObject( |
| 1425 Object* hidden_obj); |
1394 | 1426 |
1395 MUST_USE_RESULT Object* DeleteProperty(String* name, DeleteMode mode); | 1427 MUST_USE_RESULT MaybeObject* DeleteProperty(String* name, DeleteMode mode); |
1396 MUST_USE_RESULT Object* DeleteElement(uint32_t index, DeleteMode mode); | 1428 MUST_USE_RESULT MaybeObject* DeleteElement(uint32_t index, DeleteMode mode); |
1397 | 1429 |
1398 // Tests for the fast common case for property enumeration. | 1430 // Tests for the fast common case for property enumeration. |
1399 bool IsSimpleEnum(); | 1431 bool IsSimpleEnum(); |
1400 | 1432 |
1401 // Do we want to keep the elements in fast case when increasing the | 1433 // Do we want to keep the elements in fast case when increasing the |
1402 // capacity? | 1434 // capacity? |
1403 bool ShouldConvertToSlowElements(int new_capacity); | 1435 bool ShouldConvertToSlowElements(int new_capacity); |
1404 // Returns true if the backing storage for the slow-case elements of | 1436 // Returns true if the backing storage for the slow-case elements of |
1405 // this object takes up nearly as much space as a fast-case backing | 1437 // this object takes up nearly as much space as a fast-case backing |
1406 // storage would. In that case the JSObject should have fast | 1438 // storage would. In that case the JSObject should have fast |
1407 // elements. | 1439 // elements. |
1408 bool ShouldConvertToFastElements(); | 1440 bool ShouldConvertToFastElements(); |
1409 | 1441 |
1410 // Return the object's prototype (might be Heap::null_value()). | 1442 // Return the object's prototype (might be Heap::null_value()). |
1411 inline Object* GetPrototype(); | 1443 inline Object* GetPrototype(); |
1412 | 1444 |
1413 // Set the object's prototype (only JSObject and null are allowed). | 1445 // Set the object's prototype (only JSObject and null are allowed). |
1414 Object* SetPrototype(Object* value, bool skip_hidden_prototypes); | 1446 MUST_USE_RESULT MaybeObject* SetPrototype(Object* value, |
| 1447 bool skip_hidden_prototypes); |
1415 | 1448 |
1416 // Tells whether the index'th element is present. | 1449 // Tells whether the index'th element is present. |
1417 inline bool HasElement(uint32_t index); | 1450 inline bool HasElement(uint32_t index); |
1418 bool HasElementWithReceiver(JSObject* receiver, uint32_t index); | 1451 bool HasElementWithReceiver(JSObject* receiver, uint32_t index); |
1419 | 1452 |
1420 // Tells whether the index'th element is present and how it is stored. | 1453 // Tells whether the index'th element is present and how it is stored. |
1421 enum LocalElementType { | 1454 enum LocalElementType { |
1422 // There is no element with given index. | 1455 // There is no element with given index. |
1423 UNDEFINED_ELEMENT, | 1456 UNDEFINED_ELEMENT, |
1424 | 1457 |
1425 // Element with given index is handled by interceptor. | 1458 // Element with given index is handled by interceptor. |
1426 INTERCEPTED_ELEMENT, | 1459 INTERCEPTED_ELEMENT, |
1427 | 1460 |
1428 // Element with given index is character in string. | 1461 // Element with given index is character in string. |
1429 STRING_CHARACTER_ELEMENT, | 1462 STRING_CHARACTER_ELEMENT, |
1430 | 1463 |
1431 // Element with given index is stored in fast backing store. | 1464 // Element with given index is stored in fast backing store. |
1432 FAST_ELEMENT, | 1465 FAST_ELEMENT, |
1433 | 1466 |
1434 // Element with given index is stored in slow backing store. | 1467 // Element with given index is stored in slow backing store. |
1435 DICTIONARY_ELEMENT | 1468 DICTIONARY_ELEMENT |
1436 }; | 1469 }; |
1437 | 1470 |
1438 LocalElementType HasLocalElement(uint32_t index); | 1471 LocalElementType HasLocalElement(uint32_t index); |
1439 | 1472 |
1440 bool HasElementWithInterceptor(JSObject* receiver, uint32_t index); | 1473 bool HasElementWithInterceptor(JSObject* receiver, uint32_t index); |
1441 bool HasElementPostInterceptor(JSObject* receiver, uint32_t index); | 1474 bool HasElementPostInterceptor(JSObject* receiver, uint32_t index); |
1442 | 1475 |
1443 MUST_USE_RESULT Object* SetFastElement(uint32_t index, Object* value); | 1476 MUST_USE_RESULT MaybeObject* SetFastElement(uint32_t index, Object* value); |
1444 | 1477 |
1445 // Set the index'th array element. | 1478 // Set the index'th array element. |
1446 // A Failure object is returned if GC is needed. | 1479 // A Failure object is returned if GC is needed. |
1447 MUST_USE_RESULT Object* SetElement(uint32_t index, Object* value); | 1480 MUST_USE_RESULT MaybeObject* SetElement(uint32_t index, Object* value); |
1448 | 1481 |
1449 // Returns the index'th element. | 1482 // Returns the index'th element. |
1450 // The undefined object if index is out of bounds. | 1483 // The undefined object if index is out of bounds. |
1451 Object* GetElementWithReceiver(JSObject* receiver, uint32_t index); | 1484 MaybeObject* GetElementWithReceiver(JSObject* receiver, uint32_t index); |
1452 Object* GetElementWithInterceptor(JSObject* receiver, uint32_t index); | 1485 MaybeObject* GetElementWithInterceptor(JSObject* receiver, uint32_t index); |
1453 | 1486 |
1454 MUST_USE_RESULT Object* SetFastElementsCapacityAndLength(int capacity, | 1487 MUST_USE_RESULT MaybeObject* SetFastElementsCapacityAndLength(int capacity, |
1455 int length); | 1488 int length); |
1456 MUST_USE_RESULT Object* SetSlowElements(Object* length); | 1489 MUST_USE_RESULT MaybeObject* SetSlowElements(Object* length); |
1457 | 1490 |
1458 // Lookup interceptors are used for handling properties controlled by host | 1491 // Lookup interceptors are used for handling properties controlled by host |
1459 // objects. | 1492 // objects. |
1460 inline bool HasNamedInterceptor(); | 1493 inline bool HasNamedInterceptor(); |
1461 inline bool HasIndexedInterceptor(); | 1494 inline bool HasIndexedInterceptor(); |
1462 | 1495 |
1463 // Support functions for v8 api (needed for correct interceptor behavior). | 1496 // Support functions for v8 api (needed for correct interceptor behavior). |
1464 bool HasRealNamedProperty(String* key); | 1497 bool HasRealNamedProperty(String* key); |
1465 bool HasRealElementProperty(uint32_t index); | 1498 bool HasRealElementProperty(uint32_t index); |
1466 bool HasRealNamedCallbackProperty(String* key); | 1499 bool HasRealNamedCallbackProperty(String* key); |
1467 | 1500 |
1468 // Initializes the array to a certain length | 1501 // Initializes the array to a certain length |
1469 MUST_USE_RESULT Object* SetElementsLength(Object* length); | 1502 MUST_USE_RESULT MaybeObject* SetElementsLength(Object* length); |
1470 | 1503 |
1471 // Get the header size for a JSObject. Used to compute the index of | 1504 // Get the header size for a JSObject. Used to compute the index of |
1472 // internal fields as well as the number of internal fields. | 1505 // internal fields as well as the number of internal fields. |
1473 inline int GetHeaderSize(); | 1506 inline int GetHeaderSize(); |
1474 | 1507 |
1475 inline int GetInternalFieldCount(); | 1508 inline int GetInternalFieldCount(); |
1476 inline Object* GetInternalField(int index); | 1509 inline Object* GetInternalField(int index); |
1477 inline void SetInternalField(int index, Object* value); | 1510 inline void SetInternalField(int index, Object* value); |
1478 | 1511 |
1479 // Lookup a property. If found, the result is valid and has | 1512 // Lookup a property. If found, the result is valid and has |
(...skipping 28 matching lines...) Expand all Loading... |
1508 int GetLocalElementKeys(FixedArray* storage, PropertyAttributes filter); | 1541 int GetLocalElementKeys(FixedArray* storage, PropertyAttributes filter); |
1509 // Count and fill in the enumerable elements into storage. | 1542 // Count and fill in the enumerable elements into storage. |
1510 // (storage->length() == NumberOfEnumElements()). | 1543 // (storage->length() == NumberOfEnumElements()). |
1511 // If storage is NULL, will count the elements without adding | 1544 // If storage is NULL, will count the elements without adding |
1512 // them to any storage. | 1545 // them to any storage. |
1513 // Returns the number of enumerable elements. | 1546 // Returns the number of enumerable elements. |
1514 int GetEnumElementKeys(FixedArray* storage); | 1547 int GetEnumElementKeys(FixedArray* storage); |
1515 | 1548 |
1516 // Add a property to a fast-case object using a map transition to | 1549 // Add a property to a fast-case object using a map transition to |
1517 // new_map. | 1550 // new_map. |
1518 Object* AddFastPropertyUsingMap(Map* new_map, | 1551 MUST_USE_RESULT MaybeObject* AddFastPropertyUsingMap(Map* new_map, |
1519 String* name, | 1552 String* name, |
1520 Object* value); | 1553 Object* value); |
1521 | 1554 |
1522 // Add a constant function property to a fast-case object. | 1555 // Add a constant function property to a fast-case object. |
1523 // This leaves a CONSTANT_TRANSITION in the old map, and | 1556 // This leaves a CONSTANT_TRANSITION in the old map, and |
1524 // if it is called on a second object with this map, a | 1557 // if it is called on a second object with this map, a |
1525 // normal property is added instead, with a map transition. | 1558 // normal property is added instead, with a map transition. |
1526 // This avoids the creation of many maps with the same constant | 1559 // This avoids the creation of many maps with the same constant |
1527 // function, all orphaned. | 1560 // function, all orphaned. |
1528 Object* AddConstantFunctionProperty(String* name, | 1561 MUST_USE_RESULT MaybeObject* AddConstantFunctionProperty( |
1529 JSFunction* function, | 1562 String* name, |
1530 PropertyAttributes attributes); | 1563 JSFunction* function, |
| 1564 PropertyAttributes attributes); |
1531 | 1565 |
1532 Object* ReplaceSlowProperty(String* name, | 1566 MUST_USE_RESULT MaybeObject* ReplaceSlowProperty( |
1533 Object* value, | 1567 String* name, |
1534 PropertyAttributes attributes); | 1568 Object* value, |
| 1569 PropertyAttributes attributes); |
1535 | 1570 |
1536 // Converts a descriptor of any other type to a real field, | 1571 // Converts a descriptor of any other type to a real field, |
1537 // backed by the properties array. Descriptors of visible | 1572 // backed by the properties array. Descriptors of visible |
1538 // types, such as CONSTANT_FUNCTION, keep their enumeration order. | 1573 // types, such as CONSTANT_FUNCTION, keep their enumeration order. |
1539 // Converts the descriptor on the original object's map to a | 1574 // Converts the descriptor on the original object's map to a |
1540 // map transition, and the the new field is on the object's new map. | 1575 // map transition, and the the new field is on the object's new map. |
1541 Object* ConvertDescriptorToFieldAndMapTransition( | 1576 MUST_USE_RESULT MaybeObject* ConvertDescriptorToFieldAndMapTransition( |
1542 String* name, | 1577 String* name, |
1543 Object* new_value, | 1578 Object* new_value, |
1544 PropertyAttributes attributes); | 1579 PropertyAttributes attributes); |
1545 | 1580 |
1546 // Converts a descriptor of any other type to a real field, | 1581 // Converts a descriptor of any other type to a real field, |
1547 // backed by the properties array. Descriptors of visible | 1582 // backed by the properties array. Descriptors of visible |
1548 // types, such as CONSTANT_FUNCTION, keep their enumeration order. | 1583 // types, such as CONSTANT_FUNCTION, keep their enumeration order. |
1549 Object* ConvertDescriptorToField(String* name, | 1584 MUST_USE_RESULT MaybeObject* ConvertDescriptorToField( |
1550 Object* new_value, | 1585 String* name, |
1551 PropertyAttributes attributes); | 1586 Object* new_value, |
| 1587 PropertyAttributes attributes); |
1552 | 1588 |
1553 // Add a property to a fast-case object. | 1589 // Add a property to a fast-case object. |
1554 Object* AddFastProperty(String* name, | 1590 MUST_USE_RESULT MaybeObject* AddFastProperty(String* name, |
1555 Object* value, | 1591 Object* value, |
1556 PropertyAttributes attributes); | 1592 PropertyAttributes attributes); |
1557 | 1593 |
1558 // Add a property to a slow-case object. | 1594 // Add a property to a slow-case object. |
1559 Object* AddSlowProperty(String* name, | 1595 MUST_USE_RESULT MaybeObject* AddSlowProperty(String* name, |
1560 Object* value, | 1596 Object* value, |
1561 PropertyAttributes attributes); | 1597 PropertyAttributes attributes); |
1562 | 1598 |
1563 // Add a property to an object. | 1599 // Add a property to an object. |
1564 Object* AddProperty(String* name, | 1600 MUST_USE_RESULT MaybeObject* AddProperty(String* name, |
1565 Object* value, | 1601 Object* value, |
1566 PropertyAttributes attributes); | 1602 PropertyAttributes attributes); |
1567 | 1603 |
1568 // Convert the object to use the canonical dictionary | 1604 // Convert the object to use the canonical dictionary |
1569 // representation. If the object is expected to have additional properties | 1605 // representation. If the object is expected to have additional properties |
1570 // added this number can be indicated to have the backing store allocated to | 1606 // added this number can be indicated to have the backing store allocated to |
1571 // an initial capacity for holding these properties. | 1607 // an initial capacity for holding these properties. |
1572 Object* NormalizeProperties(PropertyNormalizationMode mode, | 1608 MUST_USE_RESULT MaybeObject* NormalizeProperties( |
1573 int expected_additional_properties); | 1609 PropertyNormalizationMode mode, |
1574 Object* NormalizeElements(); | 1610 int expected_additional_properties); |
| 1611 MUST_USE_RESULT MaybeObject* NormalizeElements(); |
1575 | 1612 |
1576 Object* UpdateMapCodeCache(String* name, Code* code); | 1613 MUST_USE_RESULT MaybeObject* UpdateMapCodeCache(String* name, Code* code); |
1577 | 1614 |
1578 // Transform slow named properties to fast variants. | 1615 // Transform slow named properties to fast variants. |
1579 // Returns failure if allocation failed. | 1616 // Returns failure if allocation failed. |
1580 Object* TransformToFastProperties(int unused_property_fields); | 1617 MUST_USE_RESULT MaybeObject* TransformToFastProperties( |
| 1618 int unused_property_fields); |
1581 | 1619 |
1582 // Access fast-case object properties at index. | 1620 // Access fast-case object properties at index. |
1583 inline Object* FastPropertyAt(int index); | 1621 inline Object* FastPropertyAt(int index); |
1584 inline Object* FastPropertyAtPut(int index, Object* value); | 1622 inline Object* FastPropertyAtPut(int index, Object* value); |
1585 | 1623 |
1586 // Access to in object properties. | 1624 // Access to in object properties. |
1587 inline Object* InObjectPropertyAt(int index); | 1625 inline Object* InObjectPropertyAt(int index); |
1588 inline Object* InObjectPropertyAtPut(int index, | 1626 inline Object* InObjectPropertyAtPut(int index, |
1589 Object* value, | 1627 Object* value, |
1590 WriteBarrierMode mode | 1628 WriteBarrierMode mode |
1591 = UPDATE_WRITE_BARRIER); | 1629 = UPDATE_WRITE_BARRIER); |
1592 | 1630 |
1593 // initializes the body after properties slot, properties slot is | 1631 // initializes the body after properties slot, properties slot is |
1594 // initialized by set_properties | 1632 // initialized by set_properties |
1595 // Note: this call does not update write barrier, it is caller's | 1633 // Note: this call does not update write barrier, it is caller's |
1596 // reponsibility to ensure that *v* can be collected without WB here. | 1634 // reponsibility to ensure that *v* can be collected without WB here. |
1597 inline void InitializeBody(int object_size, Object* value); | 1635 inline void InitializeBody(int object_size, Object* value); |
1598 | 1636 |
1599 // Check whether this object references another object | 1637 // Check whether this object references another object |
1600 bool ReferencesObject(Object* obj); | 1638 bool ReferencesObject(Object* obj); |
1601 | 1639 |
1602 // Casting. | 1640 // Casting. |
1603 static inline JSObject* cast(Object* obj); | 1641 static inline JSObject* cast(Object* obj); |
1604 | 1642 |
1605 // Disalow further properties to be added to the object. | 1643 // Disalow further properties to be added to the object. |
1606 MUST_USE_RESULT Object* PreventExtensions(); | 1644 MUST_USE_RESULT MaybeObject* PreventExtensions(); |
1607 | 1645 |
1608 | 1646 |
1609 // Dispatched behavior. | 1647 // Dispatched behavior. |
1610 void JSObjectShortPrint(StringStream* accumulator); | 1648 void JSObjectShortPrint(StringStream* accumulator); |
1611 #ifdef DEBUG | 1649 #ifdef DEBUG |
1612 void JSObjectPrint(); | 1650 void JSObjectPrint(); |
1613 void JSObjectVerify(); | 1651 void JSObjectVerify(); |
1614 void PrintProperties(); | 1652 void PrintProperties(); |
1615 void PrintElements(); | 1653 void PrintElements(); |
1616 | 1654 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1661 static const int kHeaderSize = kElementsOffset + kPointerSize; | 1699 static const int kHeaderSize = kElementsOffset + kPointerSize; |
1662 | 1700 |
1663 STATIC_CHECK(kHeaderSize == Internals::kJSObjectHeaderSize); | 1701 STATIC_CHECK(kHeaderSize == Internals::kJSObjectHeaderSize); |
1664 | 1702 |
1665 class BodyDescriptor : public FlexibleBodyDescriptor<kPropertiesOffset> { | 1703 class BodyDescriptor : public FlexibleBodyDescriptor<kPropertiesOffset> { |
1666 public: | 1704 public: |
1667 static inline int SizeOf(Map* map, HeapObject* object); | 1705 static inline int SizeOf(Map* map, HeapObject* object); |
1668 }; | 1706 }; |
1669 | 1707 |
1670 private: | 1708 private: |
1671 Object* GetElementWithCallback(Object* receiver, | 1709 MUST_USE_RESULT MaybeObject* GetElementWithCallback(Object* receiver, |
1672 Object* structure, | 1710 Object* structure, |
1673 uint32_t index, | 1711 uint32_t index, |
1674 Object* holder); | 1712 Object* holder); |
1675 Object* SetElementWithCallback(Object* structure, | 1713 MaybeObject* SetElementWithCallback(Object* structure, |
1676 uint32_t index, | 1714 uint32_t index, |
1677 Object* value, | 1715 Object* value, |
1678 JSObject* holder); | 1716 JSObject* holder); |
1679 MUST_USE_RESULT Object* SetElementWithInterceptor(uint32_t index, | 1717 MUST_USE_RESULT MaybeObject* SetElementWithInterceptor(uint32_t index, |
1680 Object* value); | 1718 Object* value); |
1681 MUST_USE_RESULT Object* SetElementWithoutInterceptor(uint32_t index, | 1719 MUST_USE_RESULT MaybeObject* SetElementWithoutInterceptor(uint32_t index, |
1682 Object* value); | 1720 Object* value); |
1683 | 1721 |
1684 Object* GetElementPostInterceptor(JSObject* receiver, uint32_t index); | 1722 MaybeObject* GetElementPostInterceptor(JSObject* receiver, uint32_t index); |
1685 | 1723 |
1686 MUST_USE_RESULT Object* DeletePropertyPostInterceptor(String* name, | 1724 MUST_USE_RESULT MaybeObject* DeletePropertyPostInterceptor(String* name, |
1687 DeleteMode mode); | 1725 DeleteMode mode); |
1688 MUST_USE_RESULT Object* DeletePropertyWithInterceptor(String* name); | 1726 MUST_USE_RESULT MaybeObject* DeletePropertyWithInterceptor(String* name); |
1689 | 1727 |
1690 MUST_USE_RESULT Object* DeleteElementPostInterceptor(uint32_t index, | 1728 MUST_USE_RESULT MaybeObject* DeleteElementPostInterceptor(uint32_t index, |
1691 DeleteMode mode); | 1729 DeleteMode mode); |
1692 MUST_USE_RESULT Object* DeleteElementWithInterceptor(uint32_t index); | 1730 MUST_USE_RESULT MaybeObject* DeleteElementWithInterceptor(uint32_t index); |
1693 | 1731 |
1694 PropertyAttributes GetPropertyAttributePostInterceptor(JSObject* receiver, | 1732 PropertyAttributes GetPropertyAttributePostInterceptor(JSObject* receiver, |
1695 String* name, | 1733 String* name, |
1696 bool continue_search); | 1734 bool continue_search); |
1697 PropertyAttributes GetPropertyAttributeWithInterceptor(JSObject* receiver, | 1735 PropertyAttributes GetPropertyAttributeWithInterceptor(JSObject* receiver, |
1698 String* name, | 1736 String* name, |
1699 bool continue_search); | 1737 bool continue_search); |
1700 PropertyAttributes GetPropertyAttributeWithFailedAccessCheck( | 1738 PropertyAttributes GetPropertyAttributeWithFailedAccessCheck( |
1701 Object* receiver, | 1739 Object* receiver, |
1702 LookupResult* result, | 1740 LookupResult* result, |
1703 String* name, | 1741 String* name, |
1704 bool continue_search); | 1742 bool continue_search); |
1705 PropertyAttributes GetPropertyAttribute(JSObject* receiver, | 1743 PropertyAttributes GetPropertyAttribute(JSObject* receiver, |
1706 LookupResult* result, | 1744 LookupResult* result, |
1707 String* name, | 1745 String* name, |
1708 bool continue_search); | 1746 bool continue_search); |
1709 | 1747 |
1710 // Returns true if most of the elements backing storage is used. | 1748 // Returns true if most of the elements backing storage is used. |
1711 bool HasDenseElements(); | 1749 bool HasDenseElements(); |
1712 | 1750 |
1713 bool CanSetCallback(String* name); | 1751 bool CanSetCallback(String* name); |
1714 MUST_USE_RESULT Object* SetElementCallback(uint32_t index, | 1752 MUST_USE_RESULT MaybeObject* SetElementCallback( |
1715 Object* structure, | 1753 uint32_t index, |
1716 PropertyAttributes attributes); | 1754 Object* structure, |
1717 MUST_USE_RESULT Object* SetPropertyCallback(String* name, | 1755 PropertyAttributes attributes); |
1718 Object* structure, | 1756 MUST_USE_RESULT MaybeObject* SetPropertyCallback( |
1719 PropertyAttributes attributes); | 1757 String* name, |
1720 MUST_USE_RESULT Object* DefineGetterSetter(String* name, | 1758 Object* structure, |
1721 PropertyAttributes attributes); | 1759 PropertyAttributes attributes); |
| 1760 MUST_USE_RESULT MaybeObject* DefineGetterSetter( |
| 1761 String* name, |
| 1762 PropertyAttributes attributes); |
1722 | 1763 |
1723 void LookupInDescriptor(String* name, LookupResult* result); | 1764 void LookupInDescriptor(String* name, LookupResult* result); |
1724 | 1765 |
1725 DISALLOW_IMPLICIT_CONSTRUCTORS(JSObject); | 1766 DISALLOW_IMPLICIT_CONSTRUCTORS(JSObject); |
1726 }; | 1767 }; |
1727 | 1768 |
1728 | 1769 |
1729 // FixedArray describes fixed-sized arrays with element type Object*. | 1770 // FixedArray describes fixed-sized arrays with element type Object*. |
1730 class FixedArray: public HeapObject { | 1771 class FixedArray: public HeapObject { |
1731 public: | 1772 public: |
(...skipping 18 matching lines...) Expand all Loading... |
1750 | 1791 |
1751 // Setters with less debug checks for the GC to use. | 1792 // Setters with less debug checks for the GC to use. |
1752 inline void set_unchecked(int index, Smi* value); | 1793 inline void set_unchecked(int index, Smi* value); |
1753 inline void set_null_unchecked(int index); | 1794 inline void set_null_unchecked(int index); |
1754 inline void set_unchecked(int index, Object* value, WriteBarrierMode mode); | 1795 inline void set_unchecked(int index, Object* value, WriteBarrierMode mode); |
1755 | 1796 |
1756 // Gives access to raw memory which stores the array's data. | 1797 // Gives access to raw memory which stores the array's data. |
1757 inline Object** data_start(); | 1798 inline Object** data_start(); |
1758 | 1799 |
1759 // Copy operations. | 1800 // Copy operations. |
1760 inline Object* Copy(); | 1801 MUST_USE_RESULT inline MaybeObject* Copy(); |
1761 MUST_USE_RESULT Object* CopySize(int new_length); | 1802 MUST_USE_RESULT MaybeObject* CopySize(int new_length); |
1762 | 1803 |
1763 // Add the elements of a JSArray to this FixedArray. | 1804 // Add the elements of a JSArray to this FixedArray. |
1764 MUST_USE_RESULT Object* AddKeysFromJSArray(JSArray* array); | 1805 MUST_USE_RESULT MaybeObject* AddKeysFromJSArray(JSArray* array); |
1765 | 1806 |
1766 // Compute the union of this and other. | 1807 // Compute the union of this and other. |
1767 MUST_USE_RESULT Object* UnionOfKeys(FixedArray* other); | 1808 MUST_USE_RESULT MaybeObject* UnionOfKeys(FixedArray* other); |
1768 | 1809 |
1769 // Copy a sub array from the receiver to dest. | 1810 // Copy a sub array from the receiver to dest. |
1770 void CopyTo(int pos, FixedArray* dest, int dest_pos, int len); | 1811 void CopyTo(int pos, FixedArray* dest, int dest_pos, int len); |
1771 | 1812 |
1772 // Garbage collection support. | 1813 // Garbage collection support. |
1773 static int SizeFor(int length) { return kHeaderSize + length * kPointerSize; } | 1814 static int SizeFor(int length) { return kHeaderSize + length * kPointerSize; } |
1774 | 1815 |
1775 // Code Generation support. | 1816 // Code Generation support. |
1776 static int OffsetOfElementAt(int index) { return SizeFor(index); } | 1817 static int OffsetOfElementAt(int index) { return SizeFor(index); } |
1777 | 1818 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1896 // Transfer complete descriptor from another descriptor array to | 1937 // Transfer complete descriptor from another descriptor array to |
1897 // this one. | 1938 // this one. |
1898 inline void CopyFrom(int index, DescriptorArray* src, int src_index); | 1939 inline void CopyFrom(int index, DescriptorArray* src, int src_index); |
1899 | 1940 |
1900 // Copy the descriptor array, insert a new descriptor and optionally | 1941 // Copy the descriptor array, insert a new descriptor and optionally |
1901 // remove map transitions. If the descriptor is already present, it is | 1942 // remove map transitions. If the descriptor is already present, it is |
1902 // replaced. If a replaced descriptor is a real property (not a transition | 1943 // replaced. If a replaced descriptor is a real property (not a transition |
1903 // or null), its enumeration index is kept as is. | 1944 // or null), its enumeration index is kept as is. |
1904 // If adding a real property, map transitions must be removed. If adding | 1945 // If adding a real property, map transitions must be removed. If adding |
1905 // a transition, they must not be removed. All null descriptors are removed. | 1946 // a transition, they must not be removed. All null descriptors are removed. |
1906 MUST_USE_RESULT Object* CopyInsert(Descriptor* descriptor, | 1947 MUST_USE_RESULT MaybeObject* CopyInsert(Descriptor* descriptor, |
1907 TransitionFlag transition_flag); | 1948 TransitionFlag transition_flag); |
1908 | 1949 |
1909 // Remove all transitions. Return a copy of the array with all transitions | 1950 // Remove all transitions. Return a copy of the array with all transitions |
1910 // removed, or a Failure object if the new array could not be allocated. | 1951 // removed, or a Failure object if the new array could not be allocated. |
1911 MUST_USE_RESULT Object* RemoveTransitions(); | 1952 MUST_USE_RESULT MaybeObject* RemoveTransitions(); |
1912 | 1953 |
1913 // Sort the instance descriptors by the hash codes of their keys. | 1954 // Sort the instance descriptors by the hash codes of their keys. |
1914 // Does not check for duplicates. | 1955 // Does not check for duplicates. |
1915 void SortUnchecked(); | 1956 void SortUnchecked(); |
1916 | 1957 |
1917 // Sort the instance descriptors by the hash codes of their keys. | 1958 // Sort the instance descriptors by the hash codes of their keys. |
1918 // Checks the result for duplicates. | 1959 // Checks the result for duplicates. |
1919 void Sort(); | 1960 void Sort(); |
1920 | 1961 |
1921 // Search the instance descriptors for given name. | 1962 // Search the instance descriptors for given name. |
(...skipping 12 matching lines...) Expand all Loading... |
1934 // with low=0 and high=2. | 1975 // with low=0 and high=2. |
1935 int BinarySearch(String* name, int low, int high); | 1976 int BinarySearch(String* name, int low, int high); |
1936 | 1977 |
1937 // Perform a linear search in the instance descriptors represented | 1978 // Perform a linear search in the instance descriptors represented |
1938 // by this fixed array. len is the number of descriptor indices that are | 1979 // by this fixed array. len is the number of descriptor indices that are |
1939 // valid. Does not require the descriptors to be sorted. | 1980 // valid. Does not require the descriptors to be sorted. |
1940 int LinearSearch(String* name, int len); | 1981 int LinearSearch(String* name, int len); |
1941 | 1982 |
1942 // Allocates a DescriptorArray, but returns the singleton | 1983 // Allocates a DescriptorArray, but returns the singleton |
1943 // empty descriptor array object if number_of_descriptors is 0. | 1984 // empty descriptor array object if number_of_descriptors is 0. |
1944 MUST_USE_RESULT static Object* Allocate(int number_of_descriptors); | 1985 MUST_USE_RESULT static MaybeObject* Allocate(int number_of_descriptors); |
1945 | 1986 |
1946 // Casting. | 1987 // Casting. |
1947 static inline DescriptorArray* cast(Object* obj); | 1988 static inline DescriptorArray* cast(Object* obj); |
1948 | 1989 |
1949 // Constant for denoting key was not found. | 1990 // Constant for denoting key was not found. |
1950 static const int kNotFound = -1; | 1991 static const int kNotFound = -1; |
1951 | 1992 |
1952 static const int kContentArrayIndex = 0; | 1993 static const int kContentArrayIndex = 0; |
1953 static const int kEnumerationIndexIndex = 1; | 1994 static const int kEnumerationIndexIndex = 1; |
1954 static const int kFirstIndex = 2; | 1995 static const int kFirstIndex = 2; |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2074 void ElementRemoved() { | 2115 void ElementRemoved() { |
2075 SetNumberOfElements(NumberOfElements() - 1); | 2116 SetNumberOfElements(NumberOfElements() - 1); |
2076 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1); | 2117 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1); |
2077 } | 2118 } |
2078 void ElementsRemoved(int n) { | 2119 void ElementsRemoved(int n) { |
2079 SetNumberOfElements(NumberOfElements() - n); | 2120 SetNumberOfElements(NumberOfElements() - n); |
2080 SetNumberOfDeletedElements(NumberOfDeletedElements() + n); | 2121 SetNumberOfDeletedElements(NumberOfDeletedElements() + n); |
2081 } | 2122 } |
2082 | 2123 |
2083 // Returns a new HashTable object. Might return Failure. | 2124 // Returns a new HashTable object. Might return Failure. |
2084 MUST_USE_RESULT static Object* Allocate( | 2125 MUST_USE_RESULT static MaybeObject* Allocate( |
2085 int at_least_space_for, | 2126 int at_least_space_for, |
2086 PretenureFlag pretenure = NOT_TENURED); | 2127 PretenureFlag pretenure = NOT_TENURED); |
2087 | 2128 |
2088 // Returns the key at entry. | 2129 // Returns the key at entry. |
2089 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); } | 2130 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); } |
2090 | 2131 |
2091 // Tells whether k is a real key. Null and undefined are not allowed | 2132 // Tells whether k is a real key. Null and undefined are not allowed |
2092 // as keys and can be used to indicate missing or deleted elements. | 2133 // as keys and can be used to indicate missing or deleted elements. |
2093 bool IsKey(Object* k) { | 2134 bool IsKey(Object* k) { |
2094 return !k->IsNull() && !k->IsUndefined(); | 2135 return !k->IsNull() && !k->IsUndefined(); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2170 | 2211 |
2171 static uint32_t FirstProbe(uint32_t hash, uint32_t size) { | 2212 static uint32_t FirstProbe(uint32_t hash, uint32_t size) { |
2172 return hash & (size - 1); | 2213 return hash & (size - 1); |
2173 } | 2214 } |
2174 | 2215 |
2175 static uint32_t NextProbe(uint32_t last, uint32_t number, uint32_t size) { | 2216 static uint32_t NextProbe(uint32_t last, uint32_t number, uint32_t size) { |
2176 return (last + number) & (size - 1); | 2217 return (last + number) & (size - 1); |
2177 } | 2218 } |
2178 | 2219 |
2179 // Ensure enough space for n additional elements. | 2220 // Ensure enough space for n additional elements. |
2180 MUST_USE_RESULT Object* EnsureCapacity(int n, Key key); | 2221 MUST_USE_RESULT MaybeObject* EnsureCapacity(int n, Key key); |
2181 }; | 2222 }; |
2182 | 2223 |
2183 | 2224 |
2184 | 2225 |
2185 // HashTableKey is an abstract superclass for virtual key behavior. | 2226 // HashTableKey is an abstract superclass for virtual key behavior. |
2186 class HashTableKey { | 2227 class HashTableKey { |
2187 public: | 2228 public: |
2188 // Returns whether the other object matches this key. | 2229 // Returns whether the other object matches this key. |
2189 virtual bool IsMatch(Object* other) = 0; | 2230 virtual bool IsMatch(Object* other) = 0; |
2190 // Returns the hash value for this key. | 2231 // Returns the hash value for this key. |
2191 virtual uint32_t Hash() = 0; | 2232 virtual uint32_t Hash() = 0; |
2192 // Returns the hash value for object. | 2233 // Returns the hash value for object. |
2193 virtual uint32_t HashForObject(Object* key) = 0; | 2234 virtual uint32_t HashForObject(Object* key) = 0; |
2194 // Returns the key object for storing into the hash table. | 2235 // Returns the key object for storing into the hash table. |
2195 // If allocations fails a failure object is returned. | 2236 // If allocations fails a failure object is returned. |
2196 MUST_USE_RESULT virtual Object* AsObject() = 0; | 2237 MUST_USE_RESULT virtual MaybeObject* AsObject() = 0; |
2197 // Required. | 2238 // Required. |
2198 virtual ~HashTableKey() {} | 2239 virtual ~HashTableKey() {} |
2199 }; | 2240 }; |
2200 | 2241 |
2201 class SymbolTableShape { | 2242 class SymbolTableShape { |
2202 public: | 2243 public: |
2203 static bool IsMatch(HashTableKey* key, Object* value) { | 2244 static bool IsMatch(HashTableKey* key, Object* value) { |
2204 return key->IsMatch(value); | 2245 return key->IsMatch(value); |
2205 } | 2246 } |
2206 static uint32_t Hash(HashTableKey* key) { | 2247 static uint32_t Hash(HashTableKey* key) { |
2207 return key->Hash(); | 2248 return key->Hash(); |
2208 } | 2249 } |
2209 static uint32_t HashForObject(HashTableKey* key, Object* object) { | 2250 static uint32_t HashForObject(HashTableKey* key, Object* object) { |
2210 return key->HashForObject(object); | 2251 return key->HashForObject(object); |
2211 } | 2252 } |
2212 MUST_USE_RESULT static Object* AsObject(HashTableKey* key) { | 2253 MUST_USE_RESULT static MaybeObject* AsObject(HashTableKey* key) { |
2213 return key->AsObject(); | 2254 return key->AsObject(); |
2214 } | 2255 } |
2215 | 2256 |
2216 static const int kPrefixSize = 0; | 2257 static const int kPrefixSize = 0; |
2217 static const int kEntrySize = 1; | 2258 static const int kEntrySize = 1; |
2218 }; | 2259 }; |
2219 | 2260 |
2220 // SymbolTable. | 2261 // SymbolTable. |
2221 // | 2262 // |
2222 // No special elements in the prefix and the element size is 1 | 2263 // No special elements in the prefix and the element size is 1 |
2223 // because only the symbol itself (the key) needs to be stored. | 2264 // because only the symbol itself (the key) needs to be stored. |
2224 class SymbolTable: public HashTable<SymbolTableShape, HashTableKey*> { | 2265 class SymbolTable: public HashTable<SymbolTableShape, HashTableKey*> { |
2225 public: | 2266 public: |
2226 // Find symbol in the symbol table. If it is not there yet, it is | 2267 // Find symbol in the symbol table. If it is not there yet, it is |
2227 // added. The return value is the symbol table which might have | 2268 // added. The return value is the symbol table which might have |
2228 // been enlarged. If the return value is not a failure, the symbol | 2269 // been enlarged. If the return value is not a failure, the symbol |
2229 // pointer *s is set to the symbol found. | 2270 // pointer *s is set to the symbol found. |
2230 Object* LookupSymbol(Vector<const char> str, Object** s); | 2271 MUST_USE_RESULT MaybeObject* LookupSymbol(Vector<const char> str, Object** s); |
2231 Object* LookupString(String* key, Object** s); | 2272 MUST_USE_RESULT MaybeObject* LookupString(String* key, Object** s); |
2232 | 2273 |
2233 // Looks up a symbol that is equal to the given string and returns | 2274 // Looks up a symbol that is equal to the given string and returns |
2234 // true if it is found, assigning the symbol to the given output | 2275 // true if it is found, assigning the symbol to the given output |
2235 // parameter. | 2276 // parameter. |
2236 bool LookupSymbolIfExists(String* str, String** symbol); | 2277 bool LookupSymbolIfExists(String* str, String** symbol); |
2237 bool LookupTwoCharsSymbolIfExists(uint32_t c1, uint32_t c2, String** symbol); | 2278 bool LookupTwoCharsSymbolIfExists(uint32_t c1, uint32_t c2, String** symbol); |
2238 | 2279 |
2239 // Casting. | 2280 // Casting. |
2240 static inline SymbolTable* cast(Object* obj); | 2281 static inline SymbolTable* cast(Object* obj); |
2241 | 2282 |
2242 private: | 2283 private: |
2243 Object* LookupKey(HashTableKey* key, Object** s); | 2284 MUST_USE_RESULT MaybeObject* LookupKey(HashTableKey* key, Object** s); |
2244 | 2285 |
2245 DISALLOW_IMPLICIT_CONSTRUCTORS(SymbolTable); | 2286 DISALLOW_IMPLICIT_CONSTRUCTORS(SymbolTable); |
2246 }; | 2287 }; |
2247 | 2288 |
2248 | 2289 |
2249 class MapCacheShape { | 2290 class MapCacheShape { |
2250 public: | 2291 public: |
2251 static bool IsMatch(HashTableKey* key, Object* value) { | 2292 static bool IsMatch(HashTableKey* key, Object* value) { |
2252 return key->IsMatch(value); | 2293 return key->IsMatch(value); |
2253 } | 2294 } |
2254 static uint32_t Hash(HashTableKey* key) { | 2295 static uint32_t Hash(HashTableKey* key) { |
2255 return key->Hash(); | 2296 return key->Hash(); |
2256 } | 2297 } |
2257 | 2298 |
2258 static uint32_t HashForObject(HashTableKey* key, Object* object) { | 2299 static uint32_t HashForObject(HashTableKey* key, Object* object) { |
2259 return key->HashForObject(object); | 2300 return key->HashForObject(object); |
2260 } | 2301 } |
2261 | 2302 |
2262 MUST_USE_RESULT static Object* AsObject(HashTableKey* key) { | 2303 MUST_USE_RESULT static MaybeObject* AsObject(HashTableKey* key) { |
2263 return key->AsObject(); | 2304 return key->AsObject(); |
2264 } | 2305 } |
2265 | 2306 |
2266 static const int kPrefixSize = 0; | 2307 static const int kPrefixSize = 0; |
2267 static const int kEntrySize = 2; | 2308 static const int kEntrySize = 2; |
2268 }; | 2309 }; |
2269 | 2310 |
2270 | 2311 |
2271 // MapCache. | 2312 // MapCache. |
2272 // | 2313 // |
2273 // Maps keys that are a fixed array of symbols to a map. | 2314 // Maps keys that are a fixed array of symbols to a map. |
2274 // Used for canonicalize maps for object literals. | 2315 // Used for canonicalize maps for object literals. |
2275 class MapCache: public HashTable<MapCacheShape, HashTableKey*> { | 2316 class MapCache: public HashTable<MapCacheShape, HashTableKey*> { |
2276 public: | 2317 public: |
2277 // Find cached value for a string key, otherwise return null. | 2318 // Find cached value for a string key, otherwise return null. |
2278 Object* Lookup(FixedArray* key); | 2319 Object* Lookup(FixedArray* key); |
2279 Object* Put(FixedArray* key, Map* value); | 2320 MUST_USE_RESULT MaybeObject* Put(FixedArray* key, Map* value); |
2280 static inline MapCache* cast(Object* obj); | 2321 static inline MapCache* cast(Object* obj); |
2281 | 2322 |
2282 private: | 2323 private: |
2283 DISALLOW_IMPLICIT_CONSTRUCTORS(MapCache); | 2324 DISALLOW_IMPLICIT_CONSTRUCTORS(MapCache); |
2284 }; | 2325 }; |
2285 | 2326 |
2286 | 2327 |
2287 template <typename Shape, typename Key> | 2328 template <typename Shape, typename Key> |
2288 class Dictionary: public HashTable<Shape, Key> { | 2329 class Dictionary: public HashTable<Shape, Key> { |
2289 public: | 2330 public: |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2340 // Accessors for next enumeration index. | 2381 // Accessors for next enumeration index. |
2341 void SetNextEnumerationIndex(int index) { | 2382 void SetNextEnumerationIndex(int index) { |
2342 this->fast_set(this, kNextEnumerationIndexIndex, Smi::FromInt(index)); | 2383 this->fast_set(this, kNextEnumerationIndexIndex, Smi::FromInt(index)); |
2343 } | 2384 } |
2344 | 2385 |
2345 int NextEnumerationIndex() { | 2386 int NextEnumerationIndex() { |
2346 return Smi::cast(FixedArray::get(kNextEnumerationIndexIndex))->value(); | 2387 return Smi::cast(FixedArray::get(kNextEnumerationIndexIndex))->value(); |
2347 } | 2388 } |
2348 | 2389 |
2349 // Returns a new array for dictionary usage. Might return Failure. | 2390 // Returns a new array for dictionary usage. Might return Failure. |
2350 MUST_USE_RESULT static Object* Allocate(int at_least_space_for); | 2391 MUST_USE_RESULT static MaybeObject* Allocate(int at_least_space_for); |
2351 | 2392 |
2352 // Ensure enough space for n additional elements. | 2393 // Ensure enough space for n additional elements. |
2353 Object* EnsureCapacity(int n, Key key); | 2394 MUST_USE_RESULT MaybeObject* EnsureCapacity(int n, Key key); |
2354 | 2395 |
2355 #ifdef DEBUG | 2396 #ifdef DEBUG |
2356 void Print(); | 2397 void Print(); |
2357 #endif | 2398 #endif |
2358 // Returns the key (slow). | 2399 // Returns the key (slow). |
2359 Object* SlowReverseLookup(Object* value); | 2400 Object* SlowReverseLookup(Object* value); |
2360 | 2401 |
2361 // Sets the entry to (key, value) pair. | 2402 // Sets the entry to (key, value) pair. |
2362 inline void SetEntry(int entry, | 2403 inline void SetEntry(int entry, |
2363 Object* key, | 2404 Object* key, |
2364 Object* value, | 2405 Object* value, |
2365 PropertyDetails details); | 2406 PropertyDetails details); |
2366 | 2407 |
2367 Object* Add(Key key, Object* value, PropertyDetails details); | 2408 MUST_USE_RESULT MaybeObject* Add(Key key, |
| 2409 Object* value, |
| 2410 PropertyDetails details); |
2368 | 2411 |
2369 protected: | 2412 protected: |
2370 // Generic at put operation. | 2413 // Generic at put operation. |
2371 Object* AtPut(Key key, Object* value); | 2414 MUST_USE_RESULT MaybeObject* AtPut(Key key, Object* value); |
2372 | 2415 |
2373 // Add entry to dictionary. | 2416 // Add entry to dictionary. |
2374 Object* AddEntry(Key key, | 2417 MUST_USE_RESULT MaybeObject* AddEntry(Key key, |
2375 Object* value, | 2418 Object* value, |
2376 PropertyDetails details, | 2419 PropertyDetails details, |
2377 uint32_t hash); | 2420 uint32_t hash); |
2378 | 2421 |
2379 // Generate new enumeration indices to avoid enumeration index overflow. | 2422 // Generate new enumeration indices to avoid enumeration index overflow. |
2380 Object* GenerateNewEnumerationIndices(); | 2423 MUST_USE_RESULT MaybeObject* GenerateNewEnumerationIndices(); |
2381 static const int kMaxNumberKeyIndex = | 2424 static const int kMaxNumberKeyIndex = |
2382 HashTable<Shape, Key>::kPrefixStartIndex; | 2425 HashTable<Shape, Key>::kPrefixStartIndex; |
2383 static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; | 2426 static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; |
2384 }; | 2427 }; |
2385 | 2428 |
2386 | 2429 |
2387 class StringDictionaryShape { | 2430 class StringDictionaryShape { |
2388 public: | 2431 public: |
2389 static inline bool IsMatch(String* key, Object* other); | 2432 static inline bool IsMatch(String* key, Object* other); |
2390 static inline uint32_t Hash(String* key); | 2433 static inline uint32_t Hash(String* key); |
2391 static inline uint32_t HashForObject(String* key, Object* object); | 2434 static inline uint32_t HashForObject(String* key, Object* object); |
2392 MUST_USE_RESULT static inline Object* AsObject(String* key); | 2435 MUST_USE_RESULT static inline MaybeObject* AsObject(String* key); |
2393 static const int kPrefixSize = 2; | 2436 static const int kPrefixSize = 2; |
2394 static const int kEntrySize = 3; | 2437 static const int kEntrySize = 3; |
2395 static const bool kIsEnumerable = true; | 2438 static const bool kIsEnumerable = true; |
2396 }; | 2439 }; |
2397 | 2440 |
2398 | 2441 |
2399 class StringDictionary: public Dictionary<StringDictionaryShape, String*> { | 2442 class StringDictionary: public Dictionary<StringDictionaryShape, String*> { |
2400 public: | 2443 public: |
2401 static inline StringDictionary* cast(Object* obj) { | 2444 static inline StringDictionary* cast(Object* obj) { |
2402 ASSERT(obj->IsDictionary()); | 2445 ASSERT(obj->IsDictionary()); |
2403 return reinterpret_cast<StringDictionary*>(obj); | 2446 return reinterpret_cast<StringDictionary*>(obj); |
2404 } | 2447 } |
2405 | 2448 |
2406 // Copies enumerable keys to preallocated fixed array. | 2449 // Copies enumerable keys to preallocated fixed array. |
2407 void CopyEnumKeysTo(FixedArray* storage, FixedArray* sort_array); | 2450 void CopyEnumKeysTo(FixedArray* storage, FixedArray* sort_array); |
2408 | 2451 |
2409 // For transforming properties of a JSObject. | 2452 // For transforming properties of a JSObject. |
2410 Object* TransformPropertiesToFastFor(JSObject* obj, | 2453 MUST_USE_RESULT MaybeObject* TransformPropertiesToFastFor( |
2411 int unused_property_fields); | 2454 JSObject* obj, |
| 2455 int unused_property_fields); |
2412 | 2456 |
2413 // Find entry for key otherwise return kNotFound. Optimzed version of | 2457 // Find entry for key otherwise return kNotFound. Optimzed version of |
2414 // HashTable::FindEntry. | 2458 // HashTable::FindEntry. |
2415 int FindEntry(String* key); | 2459 int FindEntry(String* key); |
2416 }; | 2460 }; |
2417 | 2461 |
2418 | 2462 |
2419 class NumberDictionaryShape { | 2463 class NumberDictionaryShape { |
2420 public: | 2464 public: |
2421 static inline bool IsMatch(uint32_t key, Object* other); | 2465 static inline bool IsMatch(uint32_t key, Object* other); |
2422 static inline uint32_t Hash(uint32_t key); | 2466 static inline uint32_t Hash(uint32_t key); |
2423 static inline uint32_t HashForObject(uint32_t key, Object* object); | 2467 static inline uint32_t HashForObject(uint32_t key, Object* object); |
2424 MUST_USE_RESULT static inline Object* AsObject(uint32_t key); | 2468 MUST_USE_RESULT static inline MaybeObject* AsObject(uint32_t key); |
2425 static const int kPrefixSize = 2; | 2469 static const int kPrefixSize = 2; |
2426 static const int kEntrySize = 3; | 2470 static const int kEntrySize = 3; |
2427 static const bool kIsEnumerable = false; | 2471 static const bool kIsEnumerable = false; |
2428 }; | 2472 }; |
2429 | 2473 |
2430 | 2474 |
2431 class NumberDictionary: public Dictionary<NumberDictionaryShape, uint32_t> { | 2475 class NumberDictionary: public Dictionary<NumberDictionaryShape, uint32_t> { |
2432 public: | 2476 public: |
2433 static NumberDictionary* cast(Object* obj) { | 2477 static NumberDictionary* cast(Object* obj) { |
2434 ASSERT(obj->IsDictionary()); | 2478 ASSERT(obj->IsDictionary()); |
2435 return reinterpret_cast<NumberDictionary*>(obj); | 2479 return reinterpret_cast<NumberDictionary*>(obj); |
2436 } | 2480 } |
2437 | 2481 |
2438 // Type specific at put (default NONE attributes is used when adding). | 2482 // Type specific at put (default NONE attributes is used when adding). |
2439 Object* AtNumberPut(uint32_t key, Object* value); | 2483 MUST_USE_RESULT MaybeObject* AtNumberPut(uint32_t key, Object* value); |
2440 Object* AddNumberEntry(uint32_t key, | 2484 MUST_USE_RESULT MaybeObject* AddNumberEntry(uint32_t key, |
2441 Object* value, | 2485 Object* value, |
2442 PropertyDetails details); | 2486 PropertyDetails details); |
2443 | 2487 |
2444 // Set an existing entry or add a new one if needed. | 2488 // Set an existing entry or add a new one if needed. |
2445 Object* Set(uint32_t key, Object* value, PropertyDetails details); | 2489 MUST_USE_RESULT MaybeObject* Set(uint32_t key, |
| 2490 Object* value, |
| 2491 PropertyDetails details); |
2446 | 2492 |
2447 void UpdateMaxNumberKey(uint32_t key); | 2493 void UpdateMaxNumberKey(uint32_t key); |
2448 | 2494 |
2449 // If slow elements are required we will never go back to fast-case | 2495 // If slow elements are required we will never go back to fast-case |
2450 // for the elements kept in this dictionary. We require slow | 2496 // for the elements kept in this dictionary. We require slow |
2451 // elements if an element has been added at an index larger than | 2497 // elements if an element has been added at an index larger than |
2452 // kRequiresSlowElementsLimit or set_requires_slow_elements() has been called | 2498 // kRequiresSlowElementsLimit or set_requires_slow_elements() has been called |
2453 // when defining a getter or setter with a number key. | 2499 // when defining a getter or setter with a number key. |
2454 inline bool requires_slow_elements(); | 2500 inline bool requires_slow_elements(); |
2455 inline void set_requires_slow_elements(); | 2501 inline void set_requires_slow_elements(); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2502 }; | 2548 }; |
2503 | 2549 |
2504 | 2550 |
2505 // The cache for maps used by normalized (dictionary mode) objects. | 2551 // The cache for maps used by normalized (dictionary mode) objects. |
2506 // Such maps do not have property descriptors, so a typical program | 2552 // Such maps do not have property descriptors, so a typical program |
2507 // needs very limited number of distinct normalized maps. | 2553 // needs very limited number of distinct normalized maps. |
2508 class NormalizedMapCache: public FixedArray { | 2554 class NormalizedMapCache: public FixedArray { |
2509 public: | 2555 public: |
2510 static const int kEntries = 64; | 2556 static const int kEntries = 64; |
2511 | 2557 |
2512 Object* Get(JSObject* object, PropertyNormalizationMode mode); | 2558 MUST_USE_RESULT MaybeObject* Get(JSObject* object, |
| 2559 PropertyNormalizationMode mode); |
2513 | 2560 |
2514 void Clear(); | 2561 void Clear(); |
2515 | 2562 |
2516 // Casting | 2563 // Casting |
2517 static inline NormalizedMapCache* cast(Object* obj); | 2564 static inline NormalizedMapCache* cast(Object* obj); |
2518 | 2565 |
2519 #ifdef DEBUG | 2566 #ifdef DEBUG |
2520 void NormalizedMapCacheVerify(); | 2567 void NormalizedMapCacheVerify(); |
2521 #endif | 2568 #endif |
2522 | 2569 |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2679 | 2726 |
2680 | 2727 |
2681 class ExternalByteArray: public ExternalArray { | 2728 class ExternalByteArray: public ExternalArray { |
2682 public: | 2729 public: |
2683 // Setter and getter. | 2730 // Setter and getter. |
2684 inline int8_t get(int index); | 2731 inline int8_t get(int index); |
2685 inline void set(int index, int8_t value); | 2732 inline void set(int index, int8_t value); |
2686 | 2733 |
2687 // This accessor applies the correct conversion from Smi, HeapNumber | 2734 // This accessor applies the correct conversion from Smi, HeapNumber |
2688 // and undefined. | 2735 // and undefined. |
2689 Object* SetValue(uint32_t index, Object* value); | 2736 MaybeObject* SetValue(uint32_t index, Object* value); |
2690 | 2737 |
2691 // Casting. | 2738 // Casting. |
2692 static inline ExternalByteArray* cast(Object* obj); | 2739 static inline ExternalByteArray* cast(Object* obj); |
2693 | 2740 |
2694 #ifdef DEBUG | 2741 #ifdef DEBUG |
2695 void ExternalByteArrayPrint(); | 2742 void ExternalByteArrayPrint(); |
2696 void ExternalByteArrayVerify(); | 2743 void ExternalByteArrayVerify(); |
2697 #endif // DEBUG | 2744 #endif // DEBUG |
2698 | 2745 |
2699 private: | 2746 private: |
2700 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalByteArray); | 2747 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalByteArray); |
2701 }; | 2748 }; |
2702 | 2749 |
2703 | 2750 |
2704 class ExternalUnsignedByteArray: public ExternalArray { | 2751 class ExternalUnsignedByteArray: public ExternalArray { |
2705 public: | 2752 public: |
2706 // Setter and getter. | 2753 // Setter and getter. |
2707 inline uint8_t get(int index); | 2754 inline uint8_t get(int index); |
2708 inline void set(int index, uint8_t value); | 2755 inline void set(int index, uint8_t value); |
2709 | 2756 |
2710 // This accessor applies the correct conversion from Smi, HeapNumber | 2757 // This accessor applies the correct conversion from Smi, HeapNumber |
2711 // and undefined. | 2758 // and undefined. |
2712 Object* SetValue(uint32_t index, Object* value); | 2759 MaybeObject* SetValue(uint32_t index, Object* value); |
2713 | 2760 |
2714 // Casting. | 2761 // Casting. |
2715 static inline ExternalUnsignedByteArray* cast(Object* obj); | 2762 static inline ExternalUnsignedByteArray* cast(Object* obj); |
2716 | 2763 |
2717 #ifdef DEBUG | 2764 #ifdef DEBUG |
2718 void ExternalUnsignedByteArrayPrint(); | 2765 void ExternalUnsignedByteArrayPrint(); |
2719 void ExternalUnsignedByteArrayVerify(); | 2766 void ExternalUnsignedByteArrayVerify(); |
2720 #endif // DEBUG | 2767 #endif // DEBUG |
2721 | 2768 |
2722 private: | 2769 private: |
2723 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUnsignedByteArray); | 2770 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUnsignedByteArray); |
2724 }; | 2771 }; |
2725 | 2772 |
2726 | 2773 |
2727 class ExternalShortArray: public ExternalArray { | 2774 class ExternalShortArray: public ExternalArray { |
2728 public: | 2775 public: |
2729 // Setter and getter. | 2776 // Setter and getter. |
2730 inline int16_t get(int index); | 2777 inline int16_t get(int index); |
2731 inline void set(int index, int16_t value); | 2778 inline void set(int index, int16_t value); |
2732 | 2779 |
2733 // This accessor applies the correct conversion from Smi, HeapNumber | 2780 // This accessor applies the correct conversion from Smi, HeapNumber |
2734 // and undefined. | 2781 // and undefined. |
2735 Object* SetValue(uint32_t index, Object* value); | 2782 MaybeObject* SetValue(uint32_t index, Object* value); |
2736 | 2783 |
2737 // Casting. | 2784 // Casting. |
2738 static inline ExternalShortArray* cast(Object* obj); | 2785 static inline ExternalShortArray* cast(Object* obj); |
2739 | 2786 |
2740 #ifdef DEBUG | 2787 #ifdef DEBUG |
2741 void ExternalShortArrayPrint(); | 2788 void ExternalShortArrayPrint(); |
2742 void ExternalShortArrayVerify(); | 2789 void ExternalShortArrayVerify(); |
2743 #endif // DEBUG | 2790 #endif // DEBUG |
2744 | 2791 |
2745 private: | 2792 private: |
2746 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalShortArray); | 2793 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalShortArray); |
2747 }; | 2794 }; |
2748 | 2795 |
2749 | 2796 |
2750 class ExternalUnsignedShortArray: public ExternalArray { | 2797 class ExternalUnsignedShortArray: public ExternalArray { |
2751 public: | 2798 public: |
2752 // Setter and getter. | 2799 // Setter and getter. |
2753 inline uint16_t get(int index); | 2800 inline uint16_t get(int index); |
2754 inline void set(int index, uint16_t value); | 2801 inline void set(int index, uint16_t value); |
2755 | 2802 |
2756 // This accessor applies the correct conversion from Smi, HeapNumber | 2803 // This accessor applies the correct conversion from Smi, HeapNumber |
2757 // and undefined. | 2804 // and undefined. |
2758 Object* SetValue(uint32_t index, Object* value); | 2805 MaybeObject* SetValue(uint32_t index, Object* value); |
2759 | 2806 |
2760 // Casting. | 2807 // Casting. |
2761 static inline ExternalUnsignedShortArray* cast(Object* obj); | 2808 static inline ExternalUnsignedShortArray* cast(Object* obj); |
2762 | 2809 |
2763 #ifdef DEBUG | 2810 #ifdef DEBUG |
2764 void ExternalUnsignedShortArrayPrint(); | 2811 void ExternalUnsignedShortArrayPrint(); |
2765 void ExternalUnsignedShortArrayVerify(); | 2812 void ExternalUnsignedShortArrayVerify(); |
2766 #endif // DEBUG | 2813 #endif // DEBUG |
2767 | 2814 |
2768 private: | 2815 private: |
2769 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUnsignedShortArray); | 2816 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUnsignedShortArray); |
2770 }; | 2817 }; |
2771 | 2818 |
2772 | 2819 |
2773 class ExternalIntArray: public ExternalArray { | 2820 class ExternalIntArray: public ExternalArray { |
2774 public: | 2821 public: |
2775 // Setter and getter. | 2822 // Setter and getter. |
2776 inline int32_t get(int index); | 2823 inline int32_t get(int index); |
2777 inline void set(int index, int32_t value); | 2824 inline void set(int index, int32_t value); |
2778 | 2825 |
2779 // This accessor applies the correct conversion from Smi, HeapNumber | 2826 // This accessor applies the correct conversion from Smi, HeapNumber |
2780 // and undefined. | 2827 // and undefined. |
2781 Object* SetValue(uint32_t index, Object* value); | 2828 MaybeObject* SetValue(uint32_t index, Object* value); |
2782 | 2829 |
2783 // Casting. | 2830 // Casting. |
2784 static inline ExternalIntArray* cast(Object* obj); | 2831 static inline ExternalIntArray* cast(Object* obj); |
2785 | 2832 |
2786 #ifdef DEBUG | 2833 #ifdef DEBUG |
2787 void ExternalIntArrayPrint(); | 2834 void ExternalIntArrayPrint(); |
2788 void ExternalIntArrayVerify(); | 2835 void ExternalIntArrayVerify(); |
2789 #endif // DEBUG | 2836 #endif // DEBUG |
2790 | 2837 |
2791 private: | 2838 private: |
2792 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalIntArray); | 2839 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalIntArray); |
2793 }; | 2840 }; |
2794 | 2841 |
2795 | 2842 |
2796 class ExternalUnsignedIntArray: public ExternalArray { | 2843 class ExternalUnsignedIntArray: public ExternalArray { |
2797 public: | 2844 public: |
2798 // Setter and getter. | 2845 // Setter and getter. |
2799 inline uint32_t get(int index); | 2846 inline uint32_t get(int index); |
2800 inline void set(int index, uint32_t value); | 2847 inline void set(int index, uint32_t value); |
2801 | 2848 |
2802 // This accessor applies the correct conversion from Smi, HeapNumber | 2849 // This accessor applies the correct conversion from Smi, HeapNumber |
2803 // and undefined. | 2850 // and undefined. |
2804 Object* SetValue(uint32_t index, Object* value); | 2851 MaybeObject* SetValue(uint32_t index, Object* value); |
2805 | 2852 |
2806 // Casting. | 2853 // Casting. |
2807 static inline ExternalUnsignedIntArray* cast(Object* obj); | 2854 static inline ExternalUnsignedIntArray* cast(Object* obj); |
2808 | 2855 |
2809 #ifdef DEBUG | 2856 #ifdef DEBUG |
2810 void ExternalUnsignedIntArrayPrint(); | 2857 void ExternalUnsignedIntArrayPrint(); |
2811 void ExternalUnsignedIntArrayVerify(); | 2858 void ExternalUnsignedIntArrayVerify(); |
2812 #endif // DEBUG | 2859 #endif // DEBUG |
2813 | 2860 |
2814 private: | 2861 private: |
2815 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUnsignedIntArray); | 2862 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalUnsignedIntArray); |
2816 }; | 2863 }; |
2817 | 2864 |
2818 | 2865 |
2819 class ExternalFloatArray: public ExternalArray { | 2866 class ExternalFloatArray: public ExternalArray { |
2820 public: | 2867 public: |
2821 // Setter and getter. | 2868 // Setter and getter. |
2822 inline float get(int index); | 2869 inline float get(int index); |
2823 inline void set(int index, float value); | 2870 inline void set(int index, float value); |
2824 | 2871 |
2825 // This accessor applies the correct conversion from Smi, HeapNumber | 2872 // This accessor applies the correct conversion from Smi, HeapNumber |
2826 // and undefined. | 2873 // and undefined. |
2827 Object* SetValue(uint32_t index, Object* value); | 2874 MaybeObject* SetValue(uint32_t index, Object* value); |
2828 | 2875 |
2829 // Casting. | 2876 // Casting. |
2830 static inline ExternalFloatArray* cast(Object* obj); | 2877 static inline ExternalFloatArray* cast(Object* obj); |
2831 | 2878 |
2832 #ifdef DEBUG | 2879 #ifdef DEBUG |
2833 void ExternalFloatArrayPrint(); | 2880 void ExternalFloatArrayPrint(); |
2834 void ExternalFloatArrayVerify(); | 2881 void ExternalFloatArrayVerify(); |
2835 #endif // DEBUG | 2882 #endif // DEBUG |
2836 | 2883 |
2837 private: | 2884 private: |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3185 DECL_ACCESSORS(constructor, Object) | 3232 DECL_ACCESSORS(constructor, Object) |
3186 | 3233 |
3187 inline JSFunction* unchecked_constructor(); | 3234 inline JSFunction* unchecked_constructor(); |
3188 | 3235 |
3189 // [instance descriptors]: describes the object. | 3236 // [instance descriptors]: describes the object. |
3190 DECL_ACCESSORS(instance_descriptors, DescriptorArray) | 3237 DECL_ACCESSORS(instance_descriptors, DescriptorArray) |
3191 | 3238 |
3192 // [stub cache]: contains stubs compiled for this map. | 3239 // [stub cache]: contains stubs compiled for this map. |
3193 DECL_ACCESSORS(code_cache, Object) | 3240 DECL_ACCESSORS(code_cache, Object) |
3194 | 3241 |
3195 MUST_USE_RESULT Object* CopyDropDescriptors(); | 3242 MUST_USE_RESULT MaybeObject* CopyDropDescriptors(); |
3196 | 3243 |
3197 MUST_USE_RESULT Object* CopyNormalized(PropertyNormalizationMode mode, | 3244 MUST_USE_RESULT MaybeObject* CopyNormalized(PropertyNormalizationMode mode, |
3198 NormalizedMapSharingMode sharing); | 3245 NormalizedMapSharingMode sharing); |
3199 | 3246 |
3200 // Returns a copy of the map, with all transitions dropped from the | 3247 // Returns a copy of the map, with all transitions dropped from the |
3201 // instance descriptors. | 3248 // instance descriptors. |
3202 MUST_USE_RESULT Object* CopyDropTransitions(); | 3249 MUST_USE_RESULT MaybeObject* CopyDropTransitions(); |
3203 | 3250 |
3204 // Returns this map if it has the fast elements bit set, otherwise | 3251 // Returns this map if it has the fast elements bit set, otherwise |
3205 // returns a copy of the map, with all transitions dropped from the | 3252 // returns a copy of the map, with all transitions dropped from the |
3206 // descriptors and the fast elements bit set. | 3253 // descriptors and the fast elements bit set. |
3207 inline Object* GetFastElementsMap(); | 3254 MUST_USE_RESULT inline MaybeObject* GetFastElementsMap(); |
3208 | 3255 |
3209 // Returns this map if it has the fast elements bit cleared, | 3256 // Returns this map if it has the fast elements bit cleared, |
3210 // otherwise returns a copy of the map, with all transitions dropped | 3257 // otherwise returns a copy of the map, with all transitions dropped |
3211 // from the descriptors and the fast elements bit cleared. | 3258 // from the descriptors and the fast elements bit cleared. |
3212 inline Object* GetSlowElementsMap(); | 3259 MUST_USE_RESULT inline MaybeObject* GetSlowElementsMap(); |
3213 | 3260 |
3214 // Returns the property index for name (only valid for FAST MODE). | 3261 // Returns the property index for name (only valid for FAST MODE). |
3215 int PropertyIndexFor(String* name); | 3262 int PropertyIndexFor(String* name); |
3216 | 3263 |
3217 // Returns the next free property index (only valid for FAST MODE). | 3264 // Returns the next free property index (only valid for FAST MODE). |
3218 int NextFreePropertyIndex(); | 3265 int NextFreePropertyIndex(); |
3219 | 3266 |
3220 // Returns the number of properties described in instance_descriptors. | 3267 // Returns the number of properties described in instance_descriptors. |
3221 int NumberOfDescribedProperties(); | 3268 int NumberOfDescribedProperties(); |
3222 | 3269 |
3223 // Casting. | 3270 // Casting. |
3224 static inline Map* cast(Object* obj); | 3271 static inline Map* cast(Object* obj); |
3225 | 3272 |
3226 // Locate an accessor in the instance descriptor. | 3273 // Locate an accessor in the instance descriptor. |
3227 AccessorDescriptor* FindAccessor(String* name); | 3274 AccessorDescriptor* FindAccessor(String* name); |
3228 | 3275 |
3229 // Code cache operations. | 3276 // Code cache operations. |
3230 | 3277 |
3231 // Clears the code cache. | 3278 // Clears the code cache. |
3232 inline void ClearCodeCache(); | 3279 inline void ClearCodeCache(); |
3233 | 3280 |
3234 // Update code cache. | 3281 // Update code cache. |
3235 MUST_USE_RESULT Object* UpdateCodeCache(String* name, Code* code); | 3282 MUST_USE_RESULT MaybeObject* UpdateCodeCache(String* name, Code* code); |
3236 | 3283 |
3237 // Returns the found code or undefined if absent. | 3284 // Returns the found code or undefined if absent. |
3238 Object* FindInCodeCache(String* name, Code::Flags flags); | 3285 Object* FindInCodeCache(String* name, Code::Flags flags); |
3239 | 3286 |
3240 // Returns the non-negative index of the code object if it is in the | 3287 // Returns the non-negative index of the code object if it is in the |
3241 // cache and -1 otherwise. | 3288 // cache and -1 otherwise. |
3242 int IndexInCodeCache(Object* name, Code* code); | 3289 int IndexInCodeCache(Object* name, Code* code); |
3243 | 3290 |
3244 // Removes a code object from the code cache at the given index. | 3291 // Removes a code object from the code cache at the given index. |
3245 void RemoveFromCodeCache(String* name, Code* code, int index); | 3292 void RemoveFromCodeCache(String* name, Code* code, int index); |
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3874 | 3921 |
3875 // Get and set the prototype property on a JSFunction. If the | 3922 // Get and set the prototype property on a JSFunction. If the |
3876 // function has an initial map the prototype is set on the initial | 3923 // function has an initial map the prototype is set on the initial |
3877 // map. Otherwise, the prototype is put in the initial map field | 3924 // map. Otherwise, the prototype is put in the initial map field |
3878 // until an initial map is needed. | 3925 // until an initial map is needed. |
3879 inline bool has_prototype(); | 3926 inline bool has_prototype(); |
3880 inline bool has_instance_prototype(); | 3927 inline bool has_instance_prototype(); |
3881 inline Object* prototype(); | 3928 inline Object* prototype(); |
3882 inline Object* instance_prototype(); | 3929 inline Object* instance_prototype(); |
3883 Object* SetInstancePrototype(Object* value); | 3930 Object* SetInstancePrototype(Object* value); |
3884 MUST_USE_RESULT Object* SetPrototype(Object* value); | 3931 MUST_USE_RESULT MaybeObject* SetPrototype(Object* value); |
3885 | 3932 |
3886 // After prototype is removed, it will not be created when accessed, and | 3933 // After prototype is removed, it will not be created when accessed, and |
3887 // [[Construct]] from this function will not be allowed. | 3934 // [[Construct]] from this function will not be allowed. |
3888 Object* RemovePrototype(); | 3935 Object* RemovePrototype(); |
3889 inline bool should_have_prototype(); | 3936 inline bool should_have_prototype(); |
3890 | 3937 |
3891 // Accessor for this function's initial map's [[class]] | 3938 // Accessor for this function's initial map's [[class]] |
3892 // property. This is primarily used by ECMA native functions. This | 3939 // property. This is primarily used by ECMA native functions. This |
3893 // method sets the class_name field of this function's initial map | 3940 // method sets the class_name field of this function's initial map |
3894 // to a given value. It creates an initial map if this function does | 3941 // to a given value. It creates an initial map if this function does |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3984 | 4031 |
3985 // [global context]: the global context corresponding to this global object. | 4032 // [global context]: the global context corresponding to this global object. |
3986 DECL_ACCESSORS(global_context, Context) | 4033 DECL_ACCESSORS(global_context, Context) |
3987 | 4034 |
3988 // [global receiver]: the global receiver object of the context | 4035 // [global receiver]: the global receiver object of the context |
3989 DECL_ACCESSORS(global_receiver, JSObject) | 4036 DECL_ACCESSORS(global_receiver, JSObject) |
3990 | 4037 |
3991 // Retrieve the property cell used to store a property. | 4038 // Retrieve the property cell used to store a property. |
3992 Object* GetPropertyCell(LookupResult* result); | 4039 Object* GetPropertyCell(LookupResult* result); |
3993 | 4040 |
| 4041 // This is like GetProperty, but is used when you know the lookup won't fail |
| 4042 // by throwing an exception. This is for the debug and builtins global |
| 4043 // objects, where it is known which properties can be expected to be present |
| 4044 // on the object. |
| 4045 Object* GetPropertyNoExceptionThrown(String* key) { |
| 4046 Object* answer = GetProperty(key)->ToObjectUnchecked(); |
| 4047 return answer; |
| 4048 } |
| 4049 |
3994 // Ensure that the global object has a cell for the given property name. | 4050 // Ensure that the global object has a cell for the given property name. |
3995 Object* EnsurePropertyCell(String* name); | 4051 MUST_USE_RESULT MaybeObject* EnsurePropertyCell(String* name); |
3996 | 4052 |
3997 // Casting. | 4053 // Casting. |
3998 static inline GlobalObject* cast(Object* obj); | 4054 static inline GlobalObject* cast(Object* obj); |
3999 | 4055 |
4000 // Layout description. | 4056 // Layout description. |
4001 static const int kBuiltinsOffset = JSObject::kHeaderSize; | 4057 static const int kBuiltinsOffset = JSObject::kHeaderSize; |
4002 static const int kGlobalContextOffset = kBuiltinsOffset + kPointerSize; | 4058 static const int kGlobalContextOffset = kBuiltinsOffset + kPointerSize; |
4003 static const int kGlobalReceiverOffset = kGlobalContextOffset + kPointerSize; | 4059 static const int kGlobalReceiverOffset = kGlobalContextOffset + kPointerSize; |
4004 static const int kHeaderSize = kGlobalReceiverOffset + kPointerSize; | 4060 static const int kHeaderSize = kGlobalReceiverOffset + kPointerSize; |
4005 | 4061 |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4215 } | 4271 } |
4216 | 4272 |
4217 static inline uint32_t Hash(HashTableKey* key) { | 4273 static inline uint32_t Hash(HashTableKey* key) { |
4218 return key->Hash(); | 4274 return key->Hash(); |
4219 } | 4275 } |
4220 | 4276 |
4221 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { | 4277 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { |
4222 return key->HashForObject(object); | 4278 return key->HashForObject(object); |
4223 } | 4279 } |
4224 | 4280 |
4225 MUST_USE_RESULT static Object* AsObject(HashTableKey* key) { | 4281 MUST_USE_RESULT static MaybeObject* AsObject(HashTableKey* key) { |
4226 return key->AsObject(); | 4282 return key->AsObject(); |
4227 } | 4283 } |
4228 | 4284 |
4229 static const int kPrefixSize = 0; | 4285 static const int kPrefixSize = 0; |
4230 static const int kEntrySize = 2; | 4286 static const int kEntrySize = 2; |
4231 }; | 4287 }; |
4232 | 4288 |
4233 | 4289 |
4234 class CompilationCacheTable: public HashTable<CompilationCacheShape, | 4290 class CompilationCacheTable: public HashTable<CompilationCacheShape, |
4235 HashTableKey*> { | 4291 HashTableKey*> { |
4236 public: | 4292 public: |
4237 // Find cached value for a string key, otherwise return null. | 4293 // Find cached value for a string key, otherwise return null. |
4238 Object* Lookup(String* src); | 4294 Object* Lookup(String* src); |
4239 Object* LookupEval(String* src, Context* context); | 4295 Object* LookupEval(String* src, Context* context); |
4240 Object* LookupRegExp(String* source, JSRegExp::Flags flags); | 4296 Object* LookupRegExp(String* source, JSRegExp::Flags flags); |
4241 Object* Put(String* src, Object* value); | 4297 MaybeObject* Put(String* src, Object* value); |
4242 Object* PutEval(String* src, Context* context, Object* value); | 4298 MaybeObject* PutEval(String* src, Context* context, Object* value); |
4243 Object* PutRegExp(String* src, JSRegExp::Flags flags, FixedArray* value); | 4299 MaybeObject* PutRegExp(String* src, JSRegExp::Flags flags, FixedArray* value); |
4244 | 4300 |
4245 static inline CompilationCacheTable* cast(Object* obj); | 4301 static inline CompilationCacheTable* cast(Object* obj); |
4246 | 4302 |
4247 private: | 4303 private: |
4248 DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheTable); | 4304 DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheTable); |
4249 }; | 4305 }; |
4250 | 4306 |
4251 | 4307 |
4252 class CodeCache: public Struct { | 4308 class CodeCache: public Struct { |
4253 public: | 4309 public: |
4254 DECL_ACCESSORS(default_cache, FixedArray) | 4310 DECL_ACCESSORS(default_cache, FixedArray) |
4255 DECL_ACCESSORS(normal_type_cache, Object) | 4311 DECL_ACCESSORS(normal_type_cache, Object) |
4256 | 4312 |
4257 // Add the code object to the cache. | 4313 // Add the code object to the cache. |
4258 MUST_USE_RESULT Object* Update(String* name, Code* code); | 4314 MUST_USE_RESULT MaybeObject* Update(String* name, Code* code); |
4259 | 4315 |
4260 // Lookup code object in the cache. Returns code object if found and undefined | 4316 // Lookup code object in the cache. Returns code object if found and undefined |
4261 // if not. | 4317 // if not. |
4262 Object* Lookup(String* name, Code::Flags flags); | 4318 Object* Lookup(String* name, Code::Flags flags); |
4263 | 4319 |
4264 // Get the internal index of a code object in the cache. Returns -1 if the | 4320 // Get the internal index of a code object in the cache. Returns -1 if the |
4265 // code object is not in that cache. This index can be used to later call | 4321 // code object is not in that cache. This index can be used to later call |
4266 // RemoveByIndex. The cache cannot be modified between a call to GetIndex and | 4322 // RemoveByIndex. The cache cannot be modified between a call to GetIndex and |
4267 // RemoveByIndex. | 4323 // RemoveByIndex. |
4268 int GetIndex(Object* name, Code* code); | 4324 int GetIndex(Object* name, Code* code); |
4269 | 4325 |
4270 // Remove an object from the cache with the provided internal index. | 4326 // Remove an object from the cache with the provided internal index. |
4271 void RemoveByIndex(Object* name, Code* code, int index); | 4327 void RemoveByIndex(Object* name, Code* code, int index); |
4272 | 4328 |
4273 static inline CodeCache* cast(Object* obj); | 4329 static inline CodeCache* cast(Object* obj); |
4274 | 4330 |
4275 #ifdef DEBUG | 4331 #ifdef DEBUG |
4276 void CodeCachePrint(); | 4332 void CodeCachePrint(); |
4277 void CodeCacheVerify(); | 4333 void CodeCacheVerify(); |
4278 #endif | 4334 #endif |
4279 | 4335 |
4280 static const int kDefaultCacheOffset = HeapObject::kHeaderSize; | 4336 static const int kDefaultCacheOffset = HeapObject::kHeaderSize; |
4281 static const int kNormalTypeCacheOffset = | 4337 static const int kNormalTypeCacheOffset = |
4282 kDefaultCacheOffset + kPointerSize; | 4338 kDefaultCacheOffset + kPointerSize; |
4283 static const int kSize = kNormalTypeCacheOffset + kPointerSize; | 4339 static const int kSize = kNormalTypeCacheOffset + kPointerSize; |
4284 | 4340 |
4285 private: | 4341 private: |
4286 MUST_USE_RESULT Object* UpdateDefaultCache(String* name, Code* code); | 4342 MUST_USE_RESULT MaybeObject* UpdateDefaultCache(String* name, Code* code); |
4287 MUST_USE_RESULT Object* UpdateNormalTypeCache(String* name, Code* code); | 4343 MUST_USE_RESULT MaybeObject* UpdateNormalTypeCache(String* name, Code* code); |
4288 Object* LookupDefaultCache(String* name, Code::Flags flags); | 4344 Object* LookupDefaultCache(String* name, Code::Flags flags); |
4289 Object* LookupNormalTypeCache(String* name, Code::Flags flags); | 4345 Object* LookupNormalTypeCache(String* name, Code::Flags flags); |
4290 | 4346 |
4291 // Code cache layout of the default cache. Elements are alternating name and | 4347 // Code cache layout of the default cache. Elements are alternating name and |
4292 // code objects for non normal load/store/call IC's. | 4348 // code objects for non normal load/store/call IC's. |
4293 static const int kCodeCacheEntrySize = 2; | 4349 static const int kCodeCacheEntrySize = 2; |
4294 static const int kCodeCacheEntryNameOffset = 0; | 4350 static const int kCodeCacheEntryNameOffset = 0; |
4295 static const int kCodeCacheEntryCodeOffset = 1; | 4351 static const int kCodeCacheEntryCodeOffset = 1; |
4296 | 4352 |
4297 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCache); | 4353 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCache); |
4298 }; | 4354 }; |
4299 | 4355 |
4300 | 4356 |
4301 class CodeCacheHashTableShape { | 4357 class CodeCacheHashTableShape { |
4302 public: | 4358 public: |
4303 static inline bool IsMatch(HashTableKey* key, Object* value) { | 4359 static inline bool IsMatch(HashTableKey* key, Object* value) { |
4304 return key->IsMatch(value); | 4360 return key->IsMatch(value); |
4305 } | 4361 } |
4306 | 4362 |
4307 static inline uint32_t Hash(HashTableKey* key) { | 4363 static inline uint32_t Hash(HashTableKey* key) { |
4308 return key->Hash(); | 4364 return key->Hash(); |
4309 } | 4365 } |
4310 | 4366 |
4311 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { | 4367 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { |
4312 return key->HashForObject(object); | 4368 return key->HashForObject(object); |
4313 } | 4369 } |
4314 | 4370 |
4315 MUST_USE_RESULT static Object* AsObject(HashTableKey* key) { | 4371 MUST_USE_RESULT static MaybeObject* AsObject(HashTableKey* key) { |
4316 return key->AsObject(); | 4372 return key->AsObject(); |
4317 } | 4373 } |
4318 | 4374 |
4319 static const int kPrefixSize = 0; | 4375 static const int kPrefixSize = 0; |
4320 static const int kEntrySize = 2; | 4376 static const int kEntrySize = 2; |
4321 }; | 4377 }; |
4322 | 4378 |
4323 | 4379 |
4324 class CodeCacheHashTable: public HashTable<CodeCacheHashTableShape, | 4380 class CodeCacheHashTable: public HashTable<CodeCacheHashTableShape, |
4325 HashTableKey*> { | 4381 HashTableKey*> { |
4326 public: | 4382 public: |
4327 Object* Lookup(String* name, Code::Flags flags); | 4383 Object* Lookup(String* name, Code::Flags flags); |
4328 MUST_USE_RESULT Object* Put(String* name, Code* code); | 4384 MUST_USE_RESULT MaybeObject* Put(String* name, Code* code); |
4329 | 4385 |
4330 int GetIndex(String* name, Code::Flags flags); | 4386 int GetIndex(String* name, Code::Flags flags); |
4331 void RemoveByIndex(int index); | 4387 void RemoveByIndex(int index); |
4332 | 4388 |
4333 static inline CodeCacheHashTable* cast(Object* obj); | 4389 static inline CodeCacheHashTable* cast(Object* obj); |
4334 | 4390 |
4335 // Initial size of the fixed array backing the hash table. | 4391 // Initial size of the fixed array backing the hash table. |
4336 static const int kInitialSize = 64; | 4392 static const int kInitialSize = 64; |
4337 | 4393 |
4338 private: | 4394 private: |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4485 // the second component is the empty string. If allocation fails, | 4541 // the second component is the empty string. If allocation fails, |
4486 // this function returns a failure. If flattening succeeds, this | 4542 // this function returns a failure. If flattening succeeds, this |
4487 // function returns the sequential string that is now the first | 4543 // function returns the sequential string that is now the first |
4488 // component of the cons string. | 4544 // component of the cons string. |
4489 // | 4545 // |
4490 // Degenerate cons strings are handled specially by the garbage | 4546 // Degenerate cons strings are handled specially by the garbage |
4491 // collector (see IsShortcutCandidate). | 4547 // collector (see IsShortcutCandidate). |
4492 // | 4548 // |
4493 // Use FlattenString from Handles.cc to flatten even in case an | 4549 // Use FlattenString from Handles.cc to flatten even in case an |
4494 // allocation failure happens. | 4550 // allocation failure happens. |
4495 inline Object* TryFlatten(PretenureFlag pretenure = NOT_TENURED); | 4551 inline MaybeObject* TryFlatten(PretenureFlag pretenure = NOT_TENURED); |
4496 | 4552 |
4497 // Convenience function. Has exactly the same behavior as | 4553 // Convenience function. Has exactly the same behavior as |
4498 // TryFlatten(), except in the case of failure returns the original | 4554 // TryFlatten(), except in the case of failure returns the original |
4499 // string. | 4555 // string. |
4500 inline String* TryFlattenGetString(PretenureFlag pretenure = NOT_TENURED); | 4556 inline String* TryFlattenGetString(PretenureFlag pretenure = NOT_TENURED); |
4501 | 4557 |
4502 Vector<const char> ToAsciiVector(); | 4558 Vector<const char> ToAsciiVector(); |
4503 Vector<const uc16> ToUC16Vector(); | 4559 Vector<const uc16> ToUC16Vector(); |
4504 | 4560 |
4505 // Mark the string as an undetectable object. It only applies to | 4561 // Mark the string as an undetectable object. It only applies to |
4506 // ascii and two byte string types. | 4562 // ascii and two byte string types. |
4507 bool MarkAsUndetectable(); | 4563 bool MarkAsUndetectable(); |
4508 | 4564 |
4509 // Return a substring. | 4565 // Return a substring. |
4510 Object* SubString(int from, int to, PretenureFlag pretenure = NOT_TENURED); | 4566 MUST_USE_RESULT MaybeObject* SubString(int from, |
| 4567 int to, |
| 4568 PretenureFlag pretenure = NOT_TENURED); |
4511 | 4569 |
4512 // String equality operations. | 4570 // String equality operations. |
4513 inline bool Equals(String* other); | 4571 inline bool Equals(String* other); |
4514 bool IsEqualTo(Vector<const char> str); | 4572 bool IsEqualTo(Vector<const char> str); |
4515 | 4573 |
4516 // Return a UTF8 representation of the string. The string is null | 4574 // Return a UTF8 representation of the string. The string is null |
4517 // terminated but may optionally contain nulls. Length is returned | 4575 // terminated but may optionally contain nulls. Length is returned |
4518 // in length_output if length_output is not a null pointer The string | 4576 // in length_output if length_output is not a null pointer The string |
4519 // should be nearly flat, otherwise the performance of this method may | 4577 // should be nearly flat, otherwise the performance of this method may |
4520 // be very slow (quadratic in the length). Setting robustness_flag to | 4578 // be very slow (quadratic in the length). Setting robustness_flag to |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4702 unsigned max_chars); | 4760 unsigned max_chars); |
4703 static void ReadBlockIntoBuffer(String* input, | 4761 static void ReadBlockIntoBuffer(String* input, |
4704 ReadBlockBuffer* buffer, | 4762 ReadBlockBuffer* buffer, |
4705 unsigned* offset_ptr, | 4763 unsigned* offset_ptr, |
4706 unsigned max_chars); | 4764 unsigned max_chars); |
4707 | 4765 |
4708 private: | 4766 private: |
4709 // Try to flatten the top level ConsString that is hiding behind this | 4767 // Try to flatten the top level ConsString that is hiding behind this |
4710 // string. This is a no-op unless the string is a ConsString. Flatten | 4768 // string. This is a no-op unless the string is a ConsString. Flatten |
4711 // mutates the ConsString and might return a failure. | 4769 // mutates the ConsString and might return a failure. |
4712 Object* SlowTryFlatten(PretenureFlag pretenure); | 4770 MUST_USE_RESULT MaybeObject* SlowTryFlatten(PretenureFlag pretenure); |
4713 | 4771 |
4714 static inline bool IsHashFieldComputed(uint32_t field); | 4772 static inline bool IsHashFieldComputed(uint32_t field); |
4715 | 4773 |
4716 // Slow case of String::Equals. This implementation works on any strings | 4774 // Slow case of String::Equals. This implementation works on any strings |
4717 // but it is most efficient on strings that are almost flat. | 4775 // but it is most efficient on strings that are almost flat. |
4718 bool SlowEquals(String* other); | 4776 bool SlowEquals(String* other); |
4719 | 4777 |
4720 // Slow case of AsArrayIndex. | 4778 // Slow case of AsArrayIndex. |
4721 bool SlowAsArrayIndex(uint32_t* index); | 4779 bool SlowAsArrayIndex(uint32_t* index); |
4722 | 4780 |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5094 | 5152 |
5095 // Casting. | 5153 // Casting. |
5096 static inline Oddball* cast(Object* obj); | 5154 static inline Oddball* cast(Object* obj); |
5097 | 5155 |
5098 // Dispatched behavior. | 5156 // Dispatched behavior. |
5099 #ifdef DEBUG | 5157 #ifdef DEBUG |
5100 void OddballVerify(); | 5158 void OddballVerify(); |
5101 #endif | 5159 #endif |
5102 | 5160 |
5103 // Initialize the fields. | 5161 // Initialize the fields. |
5104 Object* Initialize(const char* to_string, Object* to_number); | 5162 MUST_USE_RESULT MaybeObject* Initialize(const char* to_string, |
| 5163 Object* to_number); |
5105 | 5164 |
5106 // Layout description. | 5165 // Layout description. |
5107 static const int kToStringOffset = HeapObject::kHeaderSize; | 5166 static const int kToStringOffset = HeapObject::kHeaderSize; |
5108 static const int kToNumberOffset = kToStringOffset + kPointerSize; | 5167 static const int kToNumberOffset = kToStringOffset + kPointerSize; |
5109 static const int kSize = kToNumberOffset + kPointerSize; | 5168 static const int kSize = kToNumberOffset + kPointerSize; |
5110 | 5169 |
5111 typedef FixedBodyDescriptor<kToStringOffset, | 5170 typedef FixedBodyDescriptor<kToStringOffset, |
5112 kToNumberOffset + kPointerSize, | 5171 kToNumberOffset + kPointerSize, |
5113 kSize> BodyDescriptor; | 5172 kSize> BodyDescriptor; |
5114 | 5173 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5186 // - slow, backing storage is a HashTable with numbers as keys. | 5245 // - slow, backing storage is a HashTable with numbers as keys. |
5187 class JSArray: public JSObject { | 5246 class JSArray: public JSObject { |
5188 public: | 5247 public: |
5189 // [length]: The length property. | 5248 // [length]: The length property. |
5190 DECL_ACCESSORS(length, Object) | 5249 DECL_ACCESSORS(length, Object) |
5191 | 5250 |
5192 // Overload the length setter to skip write barrier when the length | 5251 // Overload the length setter to skip write barrier when the length |
5193 // is set to a smi. This matches the set function on FixedArray. | 5252 // is set to a smi. This matches the set function on FixedArray. |
5194 inline void set_length(Smi* length); | 5253 inline void set_length(Smi* length); |
5195 | 5254 |
5196 MUST_USE_RESULT Object* JSArrayUpdateLengthFromIndex(uint32_t index, | 5255 MUST_USE_RESULT MaybeObject* JSArrayUpdateLengthFromIndex(uint32_t index, |
5197 Object* value); | 5256 Object* value); |
5198 | 5257 |
5199 // Initialize the array with the given capacity. The function may | 5258 // Initialize the array with the given capacity. The function may |
5200 // fail due to out-of-memory situations, but only if the requested | 5259 // fail due to out-of-memory situations, but only if the requested |
5201 // capacity is non-zero. | 5260 // capacity is non-zero. |
5202 MUST_USE_RESULT Object* Initialize(int capacity); | 5261 MUST_USE_RESULT MaybeObject* Initialize(int capacity); |
5203 | 5262 |
5204 // Set the content of the array to the content of storage. | 5263 // Set the content of the array to the content of storage. |
5205 inline void SetContent(FixedArray* storage); | 5264 inline void SetContent(FixedArray* storage); |
5206 | 5265 |
5207 // Casting. | 5266 // Casting. |
5208 static inline JSArray* cast(Object* obj); | 5267 static inline JSArray* cast(Object* obj); |
5209 | 5268 |
5210 // Uses handles. Ensures that the fixed array backing the JSArray has at | 5269 // Uses handles. Ensures that the fixed array backing the JSArray has at |
5211 // least the stated size. | 5270 // least the stated size. |
5212 inline void EnsureSize(int minimum_size_of_backing_fixed_array); | 5271 inline void EnsureSize(int minimum_size_of_backing_fixed_array); |
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5714 } else { | 5773 } else { |
5715 value &= ~(1 << bit_position); | 5774 value &= ~(1 << bit_position); |
5716 } | 5775 } |
5717 return value; | 5776 return value; |
5718 } | 5777 } |
5719 }; | 5778 }; |
5720 | 5779 |
5721 } } // namespace v8::internal | 5780 } } // namespace v8::internal |
5722 | 5781 |
5723 #endif // V8_OBJECTS_H_ | 5782 #endif // V8_OBJECTS_H_ |
OLD | NEW |