Chromium Code Reviews| Index: src/core/SkData.cpp |
| =================================================================== |
| --- src/core/SkData.cpp (revision 9507) |
| +++ src/core/SkData.cpp (working copy) |
| @@ -58,7 +58,7 @@ |
| return gEmptyRef; |
| } |
| -// assumes fPtr was allocated via sk_malloc |
| +/** Assumes ptr was allocated via sk_malloc, ignores the size and context. */ |
| static void sk_free_releaseproc(const void* ptr, size_t, void*) { |
| sk_free((void*)ptr); |
| } |
| @@ -67,14 +67,34 @@ |
| return new SkData(data, length, sk_free_releaseproc, NULL); |
| } |
| +/** This is a global marker function which does nothing itself. |
| + * When set as the release proc and the ref count goes to zero, |
| + * the destructor will be called, followed by sk_free(context). |
| + */ |
| +static void sk_free_after_destructor_releaseproc(const void*, size_t, void*) { |
| + // This function intentionally left blank. |
|
reed1
2013/06/11 21:28:15
SkASSERT(!"don't call me");
bungeman-skia
2013/06/11 22:25:32
Removed this function.
|
| +} |
| + |
| +void SkData::internal_dispose() const { |
| + if (sk_free_after_destructor_releaseproc == this->fReleaseProc) { |
| + this->internal_dispose_restore_refcnt_to_1(); |
| + void* context = this->fReleaseProcContext; |
|
reed1
2013/06/11 21:28:15
Isn't context always == this? can we call free on
bungeman-skia
2013/06/11 22:25:32
Hmmmm... yes, we do magically know that. In fact,
|
| + this->~SkData(); |
| + sk_free(context); |
| + return; |
| + } |
| + this->INHERITED::internal_dispose(); |
| +} |
| + |
| SkData* SkData::NewWithCopy(const void* data, size_t length) { |
| if (0 == length) { |
| return SkData::NewEmpty(); |
| } |
| - void* copy = sk_malloc_throw(length); // balanced in sk_free_releaseproc |
| + char* everything = reinterpret_cast<char*>(sk_malloc_throw(sizeof(SkData) + length)); |
|
reed1
2013/06/11 21:28:15
This is an 80-col file...
bungeman-skia
2013/06/11 22:25:32
Done.
|
| + char* copy = everything + sizeof(SkData); |
| memcpy(copy, data, length); |
| - return new SkData(copy, length, sk_free_releaseproc, NULL); |
| + return SkNEW_PLACEMENT_ARGS(everything, SkData, (copy, length, sk_free_after_destructor_releaseproc, everything)); |
| } |
| SkData* SkData::NewWithProc(const void* data, size_t length, |