Chromium Code Reviews| 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 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 856 } | 856 } |
| 857 }; | 857 }; |
| 858 #endif | 858 #endif |
| 859 | 859 |
| 860 // s_gcInfoTable holds the per-class GCInfo descriptors; each heap | 860 // s_gcInfoTable holds the per-class GCInfo descriptors; each heap |
| 861 // object header keeps its index into this table. | 861 // object header keeps its index into this table. |
| 862 extern PLATFORM_EXPORT GCInfo const** s_gcInfoTable; | 862 extern PLATFORM_EXPORT GCInfo const** s_gcInfoTable; |
| 863 | 863 |
| 864 class GCInfoTable { | 864 class GCInfoTable { |
| 865 public: | 865 public: |
| 866 PLATFORM_EXPORT static size_t allocateGCInfoSlot(); | 866 PLATFORM_EXPORT static bool allocateGCInfoSlot(size_t&); |
| 867 | 867 |
| 868 static void init(); | 868 static void init(); |
| 869 static void shutdown(); | 869 static void shutdown(); |
| 870 | 870 |
| 871 // The (max + 1) GCInfo index supported. | 871 // The (max + 1) GCInfo index supported. |
| 872 static const size_t maxIndex = 1 << 15; | 872 static const size_t maxIndex = 1 << 15; |
| 873 | 873 |
| 874 private: | 874 private: |
| 875 static void resize(size_t); | 875 static void resize(); |
| 876 | 876 |
| 877 static int s_gcInfoIndex; | 877 static int s_gcInfoIndex; |
| 878 static size_t s_gcInfoTableSize; | 878 static size_t s_gcInfoTableSize; |
| 879 }; | 879 }; |
| 880 | 880 |
| 881 // This macro should be used when returning a unique 15 bit integer | 881 // This macro should be used when returning a unique 15 bit integer |
| 882 // for a given gcInfo. | 882 // for a given gcInfo. |
| 883 #define RETURN_GCINFO_INDEX() \ | 883 #define RETURN_GCINFO_INDEX() \ |
| 884 static const size_t gcInfoIndex = GCInfoTable::allocateGCInfoSlot(); \ | 884 static size_t gcInfoIndex = 0; \ |
| 885 ASSERT(gcInfoIndex >= 1); \ | 885 ASSERT(s_gcInfoTable); \ |
| 886 ASSERT(gcInfoIndex < GCInfoTable::maxIndex); \ | 886 if (!gcInfoIndex && GCInfoTable::allocateGCInfoSlot(gcInfoIndex)) \ |
| 887 ASSERT(s_gcInfoTable); \ | 887 s_gcInfoTable[gcInfoIndex] = &gcInfo; \ |
|
haraken
2015/01/10 08:37:24
Can we do this assignment in allocateGCInfoSlot? P
sof
2015/01/10 08:42:46
I suppose, but I don't see the overall benefit.
haraken
2015/01/10 08:48:45
up to you :)
sof
2015/01/10 08:54:23
Done.
| |
| 888 s_gcInfoTable[gcInfoIndex] = &gcInfo; \ | 888 ASSERT(gcInfoIndex >= 1); \ |
| 889 ASSERT(gcInfoIndex < GCInfoTable::maxIndex); \ | |
| 889 return gcInfoIndex; | 890 return gcInfoIndex; |
| 890 | 891 |
| 891 template<typename T> | 892 template<typename T> |
| 892 struct GCInfoAtBase { | 893 struct GCInfoAtBase { |
| 893 static size_t index() | 894 static size_t index() |
| 894 { | 895 { |
| 895 static const GCInfo gcInfo = { | 896 static const GCInfo gcInfo = { |
| 896 TraceTrait<T>::trace, | 897 TraceTrait<T>::trace, |
| 897 FinalizerTrait<T>::finalize, | 898 FinalizerTrait<T>::finalize, |
| 898 FinalizerTrait<T>::nonTrivialFinalizer, | 899 FinalizerTrait<T>::nonTrivialFinalizer, |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 921 struct GCInfoTrait { | 922 struct GCInfoTrait { |
| 922 static size_t index() | 923 static size_t index() |
| 923 { | 924 { |
| 924 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::index(); | 925 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::index(); |
| 925 } | 926 } |
| 926 }; | 927 }; |
| 927 | 928 |
| 928 } | 929 } |
| 929 | 930 |
| 930 #endif | 931 #endif |
| OLD | NEW |