aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Yong-Hwan Baek <meisterdevhwan@gmail.com>2018-07-09 14:14:26 +0900
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-07-09 17:20:17 +0000
commit688a8e53314b1b69003590e471052a36108cfa02 (patch)
tree4d62ff123906843ebea0a1b466c5b9d996f14bb8
parent7828b6201bd9b480eb090def5d81fb9b98b1926a (diff)
More workarounds on Windows Debug DLL crash.
SkData and SkTextBlob overwrites delete operator in header file. Which causes crash on Windows Debug DLL Builds. Sample Solution can be found in https://github.com/DevHwan/SkiaDLLTest Bug: skia: Change-Id: I36bc9445f5cd17afdf852009a0695036ee18ecf0 Reviewed-on: https://skia-review.googlesource.com/139680 Reviewed-by: Mike Klein <mtklein@google.com> Commit-Queue: Mike Klein <mtklein@google.com>
-rw-r--r--include/core/SkData.h2
-rw-r--r--include/core/SkTextBlob.h9
-rw-r--r--src/core/SkData.cpp4
-rw-r--r--src/core/SkTextBlob.cpp13
4 files changed, 21 insertions, 7 deletions
diff --git a/include/core/SkData.h b/include/core/SkData.h
index 8eca45095f..931749a9c1 100644
--- a/include/core/SkData.h
+++ b/include/core/SkData.h
@@ -169,7 +169,7 @@ private:
~SkData();
// Ensure the unsized delete is called.
- void operator delete(void* p) { ::operator delete(p); }
+ void operator delete(void* p);
// shared internal factory
static sk_sp<SkData> PrivateNewWithCopy(const void* srcOrNull, size_t length);
diff --git a/include/core/SkTextBlob.h b/include/core/SkTextBlob.h
index 59151d3002..672cc20c5c 100644
--- a/include/core/SkTextBlob.h
+++ b/include/core/SkTextBlob.h
@@ -95,12 +95,9 @@ private:
// Memory for objects of this class is created with sk_malloc rather than operator new and must
// be freed with sk_free.
- void operator delete(void* p) { sk_free(p); }
- void* operator new(size_t) {
- SK_ABORT("All blobs are created by placement new.");
- return sk_malloc_throw(0);
- }
- void* operator new(size_t, void* p) { return p; }
+ void operator delete(void* p);
+ void* operator new(size_t);
+ void* operator new(size_t, void* p);
static unsigned ScalarsPerGlyph(GlyphPositioning pos);
diff --git a/src/core/SkData.cpp b/src/core/SkData.cpp
index 253945ea56..04efb35cca 100644
--- a/src/core/SkData.cpp
+++ b/src/core/SkData.cpp
@@ -59,6 +59,10 @@ size_t SkData::copyRange(size_t offset, size_t length, void* buffer) const {
return length;
}
+void SkData::operator delete(void* p) {
+ ::operator delete(p);
+}
+
sk_sp<SkData> SkData::PrivateNewWithCopy(const void* srcOrNull, size_t length) {
if (0 == length) {
return SkData::MakeEmpty();
diff --git a/src/core/SkTextBlob.cpp b/src/core/SkTextBlob.cpp
index 6e0cf64a8b..6d636ce4b6 100644
--- a/src/core/SkTextBlob.cpp
+++ b/src/core/SkTextBlob.cpp
@@ -347,6 +347,19 @@ unsigned SkTextBlob::ScalarsPerGlyph(GlyphPositioning pos) {
return pos;
}
+void SkTextBlob::operator delete(void* p) {
+ sk_free(p);
+}
+
+void* SkTextBlob::operator new(size_t) {
+ SK_ABORT("All blobs are created by placement new.");
+ return sk_malloc_throw(0);
+}
+
+void* SkTextBlob::operator new(size_t, void* p) {
+ return p;
+}
+
SkTextBlobRunIterator::SkTextBlobRunIterator(const SkTextBlob* blob)
: fCurrentRun(SkTextBlob::RunRecord::First(blob)) {
SkDEBUGCODE(fStorageTop = (uint8_t*)blob + blob->fStorageSize;)