Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #ifndef SkTemplatesPriv_DEFINED | 10 #ifndef SkTemplatesPriv_DEFINED |
| 11 #define SkTemplatesPriv_DEFINED | 11 #define SkTemplatesPriv_DEFINED |
| 12 | 12 |
| 13 #include "SkTemplates.h" | 13 #include "SkTemplates.h" |
| 14 | 14 |
| 15 //////////////////////////////////////////////////////////////////////////////// | 15 //////////////////////////////////////////////////////////////////////////////// |
| 16 | 16 |
| 17 #ifdef SK_BUILD_FOR_WIN32 | 17 #ifdef SK_BUILD_FOR_WIN32 |
|
bungeman-skia
2014/02/11 17:06:21
This seems to be an anachronism. I see no indicati
| |
| 18 #define SK_PLACEMENT_NEW(result, classname, storage, storageSize) \ | 18 #define SK_PLACEMENT_NEW(result, classname, storage, storageSize) \ |
| 19 result = SkNEW(classname) | 19 result = SkNEW(classname) |
| 20 | 20 |
| 21 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storageSize, args) \ | 21 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storageSize, args) \ |
| 22 result = SkNEW_ARGS(classname, args) | 22 result = SkNEW_ARGS(classname, args) |
| 23 | |
| 24 #define SK_PLACEMENT_SAFE_NEW(result, classname, storage, storageSize) \ | |
| 25 result = SkNEW(classname) | |
|
scroggo
2014/02/11 15:51:29
Yikes! This will result in a memory leak if the ca
Dominik Grewe
2014/02/11 16:04:31
I guess the same is true for the normal placement
scroggo
2014/02/11 16:14:26
Well, this one is actually safer than the normal p
| |
| 26 | |
| 27 #define SK_PLACEMENT_SAFE_NEW_ARGS(result, classname, storage, storageSize, args) \ | |
| 28 result = SkNEW_ARGS(classname, args) | |
| 23 #else | 29 #else |
| 24 #include <new> | 30 #include <new> |
| 25 #define SK_PLACEMENT_NEW(result, classname, storage, storagesize) \ | 31 #define SK_PLACEMENT_NEW(result, classname, storage, storagesize) \ |
|
bungeman-skia
2014/02/11 17:06:21
Every current user of this does the same dance whe
| |
| 26 do { \ | 32 do { \ |
| 27 if (storagesize) \ | 33 if (storagesize) \ |
| 28 { \ | 34 { \ |
| 29 SkASSERT(storageSize >= sizeof(classname)); \ | 35 SkASSERT(storageSize >= sizeof(classname)); \ |
| 30 result = new(storage) classname; \ | 36 result = new(storage) classname; \ |
| 31 } \ | 37 } \ |
| 32 else \ | 38 else \ |
| 33 result = SkNEW(classname); \ | 39 result = SkNEW(classname); \ |
| 34 } while (0) | 40 } while (0) |
| 35 | 41 |
| 36 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storagesize, args) \ | 42 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storagesize, args) \ |
| 37 do { \ | 43 do { \ |
| 38 if (storagesize) \ | 44 if (storagesize) \ |
| 39 { \ | 45 { \ |
| 40 SkASSERT(storageSize >= sizeof(classname)); \ | 46 SkASSERT(storageSize >= sizeof(classname)); \ |
| 41 result = new(storage) classname args; \ | 47 result = new(storage) classname args; \ |
| 42 } \ | 48 } \ |
| 43 else \ | 49 else \ |
| 44 result = SkNEW_ARGS(classname, args); \ | 50 result = SkNEW_ARGS(classname, args); \ |
| 45 } while (0) | 51 } while (0) |
| 52 | |
| 53 #define SK_PLACEMENT_SAFE_NEW(result, classname, storage, storagesize) \ | |
|
bungeman-skia
2014/02/11 17:06:21
Why are we multiplying entities without necessity
| |
| 54 do { \ | |
| 55 if (storagesize >= sizeof(classname)) \ | |
| 56 result = new(storage) classname; \ | |
| 57 else \ | |
| 58 result = SkNEW(classname); \ | |
| 59 } while (0) | |
| 60 | |
| 61 #define SK_PLACEMENT_SAFE_NEW_ARGS(result, classname, storage, storagesize, args) \ | |
| 62 do { \ | |
| 63 if (storagesize >= sizeof(classname)) \ | |
| 64 result = new(storage) classname args; \ | |
| 65 else \ | |
| 66 result = SkNEW_ARGS(classname, args); \ | |
| 67 } while (0) | |
| 46 #endif | 68 #endif |
| 47 | 69 |
| 48 //////////////////////////////////////////////////////////////////////////////// | 70 //////////////////////////////////////////////////////////////////////////////// |
| 49 | 71 |
| 50 template <class T> class SkAutoTPlacementDelete { | 72 template <class T> class SkAutoTPlacementDelete { |
| 51 public: | 73 public: |
| 52 SkAutoTPlacementDelete(T* obj, void* storage) : fObj(obj), fStorage(storage) | 74 SkAutoTPlacementDelete(T* obj, void* storage) : fObj(obj), fStorage(storage) |
| 53 { | 75 { |
| 54 } | 76 } |
| 55 ~SkAutoTPlacementDelete() | 77 ~SkAutoTPlacementDelete() |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 67 T* obj = fObj; | 89 T* obj = fObj; |
| 68 fObj = NULL; | 90 fObj = NULL; |
| 69 return obj; | 91 return obj; |
| 70 } | 92 } |
| 71 private: | 93 private: |
| 72 T* fObj; | 94 T* fObj; |
| 73 void* fStorage; | 95 void* fStorage; |
| 74 }; | 96 }; |
| 75 | 97 |
| 76 #endif | 98 #endif |
| OLD | NEW |