| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 89 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 100 | 100 | 
| 101 | 101 | 
| 102 template <typename T> | 102 template <typename T> | 
| 103 struct LeakyInstanceTrait { | 103 struct LeakyInstanceTrait { | 
| 104   static void Destroy(T* /* instance */) {} | 104   static void Destroy(T* /* instance */) {} | 
| 105 }; | 105 }; | 
| 106 | 106 | 
| 107 | 107 | 
| 108 // Traits that define how an instance is allocated and accessed. | 108 // Traits that define how an instance is allocated and accessed. | 
| 109 | 109 | 
|  | 110 // TODO(kalmard): __alignof__ is only defined for GCC > 4.2. Fix alignment issue | 
|  | 111 // on MIPS with other compilers. | 
|  | 112 #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) | 
|  | 113 #define LAZY_ALIGN(x) __attribute__((aligned(__alignof__(x)))) | 
|  | 114 #else | 
|  | 115 #define LAZY_ALIGN(x) | 
|  | 116 #endif | 
|  | 117 | 
| 110 template <typename T> | 118 template <typename T> | 
| 111 struct StaticallyAllocatedInstanceTrait { | 119 struct StaticallyAllocatedInstanceTrait { | 
| 112   typedef char StorageType[sizeof(T)]; | 120   typedef char StorageType[sizeof(T)] LAZY_ALIGN(T); | 
| 113 | 121 | 
| 114   static T* MutableInstance(StorageType* storage) { | 122   static T* MutableInstance(StorageType* storage) { | 
| 115     return reinterpret_cast<T*>(storage); | 123     return reinterpret_cast<T*>(storage); | 
| 116   } | 124   } | 
| 117 | 125 | 
| 118   template <typename ConstructTrait> | 126   template <typename ConstructTrait> | 
| 119   static void InitStorageUsingTrait(StorageType* storage) { | 127   static void InitStorageUsingTrait(StorageType* storage) { | 
| 120     ConstructTrait::Construct(MutableInstance(storage)); | 128     ConstructTrait::Construct(MutableInstance(storage)); | 
| 121   } | 129   } | 
| 122 }; | 130 }; | 
| 123 | 131 | 
|  | 132 #undef LAZY_ALIGN | 
|  | 133 | 
| 124 | 134 | 
| 125 template <typename T> | 135 template <typename T> | 
| 126 struct DynamicallyAllocatedInstanceTrait { | 136 struct DynamicallyAllocatedInstanceTrait { | 
| 127   typedef T* StorageType; | 137   typedef T* StorageType; | 
| 128 | 138 | 
| 129   static T* MutableInstance(StorageType* storage) { | 139   static T* MutableInstance(StorageType* storage) { | 
| 130     return *storage; | 140     return *storage; | 
| 131   } | 141   } | 
| 132 | 142 | 
| 133   template <typename CreateTrait> | 143   template <typename CreateTrait> | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 201     return AllocationTrait::MutableInstance(&storage_); | 211     return AllocationTrait::MutableInstance(&storage_); | 
| 202   } | 212   } | 
| 203 | 213 | 
| 204   const T& Get() const { | 214   const T& Get() const { | 
| 205     Init(); | 215     Init(); | 
| 206     return *AllocationTrait::MutableInstance(&storage_); | 216     return *AllocationTrait::MutableInstance(&storage_); | 
| 207   } | 217   } | 
| 208 | 218 | 
| 209   mutable OnceType once_; | 219   mutable OnceType once_; | 
| 210   // Note that the previous field, OnceType, is an AtomicWord which guarantees | 220   // Note that the previous field, OnceType, is an AtomicWord which guarantees | 
| 211   // the correct alignment of the storage field below. | 221   // 4-byte alignment of the storage field below. If compiling with GCC (>4.2), | 
|  | 222   // the LAZY_ALIGN macro above will guarantee correctness for any alignment. | 
| 212   mutable StorageType storage_; | 223   mutable StorageType storage_; | 
| 213 }; | 224 }; | 
| 214 | 225 | 
| 215 | 226 | 
| 216 template <typename T, | 227 template <typename T, | 
| 217           typename CreateTrait = DefaultConstructTrait<T>, | 228           typename CreateTrait = DefaultConstructTrait<T>, | 
| 218           typename InitOnceTrait = SingleThreadInitOnceTrait, | 229           typename InitOnceTrait = SingleThreadInitOnceTrait, | 
| 219           typename DestroyTrait = LeakyInstanceTrait<T> > | 230           typename DestroyTrait = LeakyInstanceTrait<T> > | 
| 220 struct LazyStaticInstance { | 231 struct LazyStaticInstance { | 
| 221   typedef LazyInstanceImpl<T, StaticallyAllocatedInstanceTrait<T>, | 232   typedef LazyInstanceImpl<T, StaticallyAllocatedInstanceTrait<T>, | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 239           typename InitOnceTrait = SingleThreadInitOnceTrait, | 250           typename InitOnceTrait = SingleThreadInitOnceTrait, | 
| 240           typename DestroyTrait = LeakyInstanceTrait<T> > | 251           typename DestroyTrait = LeakyInstanceTrait<T> > | 
| 241 struct LazyDynamicInstance { | 252 struct LazyDynamicInstance { | 
| 242   typedef LazyInstanceImpl<T, DynamicallyAllocatedInstanceTrait<T>, | 253   typedef LazyInstanceImpl<T, DynamicallyAllocatedInstanceTrait<T>, | 
| 243       CreateTrait, InitOnceTrait, DestroyTrait> type; | 254       CreateTrait, InitOnceTrait, DestroyTrait> type; | 
| 244 }; | 255 }; | 
| 245 | 256 | 
| 246 } }  // namespace v8::internal | 257 } }  // namespace v8::internal | 
| 247 | 258 | 
| 248 #endif  // V8_LAZY_INSTANCE_H_ | 259 #endif  // V8_LAZY_INSTANCE_H_ | 
| OLD | NEW | 
|---|