OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
835 template<typename T> | 835 template<typename T> |
836 struct TypenameStringTrait { | 836 struct TypenameStringTrait { |
837 static const String& get() | 837 static const String& get() |
838 { | 838 { |
839 DEFINE_STATIC_LOCAL(String, typenameString, (WTF::extractTypeNameFromFun
ctionName(WTF::extractNameFunction<T>()))); | 839 DEFINE_STATIC_LOCAL(String, typenameString, (WTF::extractTypeNameFromFun
ctionName(WTF::extractNameFunction<T>()))); |
840 return typenameString; | 840 return typenameString; |
841 } | 841 } |
842 }; | 842 }; |
843 #endif | 843 #endif |
844 | 844 |
845 // s_gcInfoTable is a map used to encode a GCInfo* into a 15 bit integer. | 845 // s_gcInfoTable holds the per-class GCInfo descriptors; each heap |
846 const size_t gcInfoIndexMax = 1 << 15; | 846 // object header keeps its index into this table. |
847 extern PLATFORM_EXPORT int s_gcInfoIndex; | |
848 extern PLATFORM_EXPORT GCInfo const** s_gcInfoTable; | 847 extern PLATFORM_EXPORT GCInfo const** s_gcInfoTable; |
849 | 848 |
| 849 class GCInfoTable { |
| 850 public: |
| 851 PLATFORM_EXPORT static size_t allocateGCInfoSlot(); |
| 852 |
| 853 static void init(); |
| 854 static void shutdown(); |
| 855 |
| 856 // The (max + 1) GCInfo index supported. |
| 857 static const size_t maxIndex = 1 << 15; |
| 858 |
| 859 private: |
| 860 static void resize(size_t); |
| 861 |
| 862 static int s_gcInfoIndex; |
| 863 static size_t s_gcInfoTableSize; |
| 864 }; |
| 865 |
850 // This macro should be used when returning a unique 15 bit integer | 866 // This macro should be used when returning a unique 15 bit integer |
851 // for a given gcInfo. | 867 // for a given gcInfo. |
852 #define RETURN_GCINFO_INDEX() \ | 868 #define RETURN_GCINFO_INDEX() \ |
853 static const size_t gcInfoIndex = atomicIncrement(&s_gcInfoIndex); \ | 869 static const size_t gcInfoIndex = GCInfoTable::allocateGCInfoSlot(); \ |
854 ASSERT(gcInfoIndex >= 1); \ | 870 ASSERT(gcInfoIndex >= 1); \ |
855 ASSERT(gcInfoIndex < gcInfoIndexMax); \ | 871 ASSERT(gcInfoIndex < GCInfoTable::maxIndex); \ |
856 ASSERT(s_gcInfoTable); \ | 872 ASSERT(s_gcInfoTable); \ |
857 s_gcInfoTable[gcInfoIndex] = &gcInfo; \ | 873 s_gcInfoTable[gcInfoIndex] = &gcInfo; \ |
858 return gcInfoIndex; | 874 return gcInfoIndex; |
859 | 875 |
860 template<typename T> | 876 template<typename T> |
861 struct GCInfoAtBase { | 877 struct GCInfoAtBase { |
862 static size_t index() | 878 static size_t index() |
863 { | 879 { |
864 static const GCInfo gcInfo = { | 880 static const GCInfo gcInfo = { |
865 TraceTrait<T>::trace, | 881 TraceTrait<T>::trace, |
(...skipping 24 matching lines...) Expand all Loading... |
890 struct GCInfoTrait { | 906 struct GCInfoTrait { |
891 static size_t index() | 907 static size_t index() |
892 { | 908 { |
893 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::index(); | 909 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::index(); |
894 } | 910 } |
895 }; | 911 }; |
896 | 912 |
897 } | 913 } |
898 | 914 |
899 #endif | 915 #endif |
OLD | NEW |