Index: src/ports/SkFontConfigParser_android.cpp |
diff --git a/src/ports/SkFontConfigParser_android.cpp b/src/ports/SkFontConfigParser_android.cpp |
index 991552fc712bcc93aec7ef1206ceadc294e28ba2..6ee9e6b642dc655a35c9c612594c70283e6b423a 100644 |
--- a/src/ports/SkFontConfigParser_android.cpp |
+++ b/src/ports/SkFontConfigParser_android.cpp |
@@ -58,11 +58,11 @@ struct FamilyData { |
currentFontInfo(NULL), |
currentTag(NO_TAG) {}; |
- XML_Parser parser; // The expat parser doing the work, owned by caller |
- SkTDArray<FontFamily*>& families; // The array to append families, owned by caller |
- FontFamily* currentFamily; // The current family being created, owned by this |
- FontFileInfo* currentFontInfo; // The current fontInfo being created, owned by currentFamily |
- int currentTag; // A flag to indicate whether we're in nameset/fileset tags |
+ XML_Parser parser; // The expat parser doing the work, owned by caller |
+ SkTDArray<FontFamily*>& families; // The array to append families, owned by caller |
mtklein
2015/01/30 23:07:41
Who cleans up things we add here?
bungeman-skia
2015/01/30 23:14:56
This is completely owned by the caller (this is th
|
+ SkAutoTDelete<FontFamily> currentFamily; // The family being created, owned by this |
mtklein
2015/01/30 23:07:41
So, uh.... we were just never deleting this? I ca
bungeman-skia
2015/01/30 23:14:56
This is the 'working' FontFamily. When we finish b
|
+ FontFileInfo* currentFontInfo; // The fontInfo being created, owned by currentFamily |
+ int currentTag; // Flag to indicate when we're in nameset/fileset tags |
}; |
/** http://www.w3.org/TR/html-markup/datatypes.html#common.data.integer.non-negative-def */ |
@@ -207,7 +207,7 @@ void startElementHandler(void* data, const char* tag, const char** attributes) { |
FamilyData* familyData = (FamilyData*) data; |
size_t len = strlen(tag); |
if (len == 6 && !strncmp(tag, "family", len)) { |
- familyData->currentFamily = new FontFamily(); |
+ familyData->currentFamily.reset(new FontFamily()); |
familyElementHandler(familyData->currentFamily, attributes); |
} else if (len == 4 && !strncmp(tag, "font", len)) { |
FontFileInfo* file = &familyData->currentFamily->fFonts.push_back(); |
@@ -222,8 +222,7 @@ void endElementHandler(void* data, const char* tag) { |
FamilyData* familyData = (FamilyData*) data; |
size_t len = strlen(tag); |
if (len == 6 && strncmp(tag, "family", len) == 0) { |
- *familyData->families.append() = familyData->currentFamily; |
- familyData->currentFamily = NULL; |
+ *familyData->families.append() = familyData->currentFamily.detach(); |
} else if (len == 4 && !strncmp(tag, "font", len)) { |
XML_SetCharacterDataHandler(familyData->parser, NULL); |
} |
@@ -240,7 +239,7 @@ namespace jbParser { |
static void textHandler(void* data, const char* s, int len) { |
FamilyData* familyData = (FamilyData*) data; |
// Make sure we're in the right state to store this name information |
- if (familyData->currentFamily && |
+ if (familyData->currentFamily.get() && |
(familyData->currentTag == NAMESET_TAG || familyData->currentTag == FILESET_TAG)) { |
switch (familyData->currentTag) { |
case NAMESET_TAG: { |
@@ -334,7 +333,7 @@ static void startElementHandler(void* data, const char* tag, const char** atts) |
} |
} |
} else if (len == 6 && strncmp(tag, "family", len) == 0) { |
- familyData->currentFamily = new FontFamily(); |
+ familyData->currentFamily.reset(new FontFamily()); |
// The Family tag has an optional "order" attribute with an integer value >= 0 |
// If this attribute does not exist, the default value is -1 |
for (size_t i = 0; atts[i] != NULL && |
@@ -367,8 +366,7 @@ static void endElementHandler(void* data, const char* tag) { |
size_t len = strlen(tag); |
if (len == 6 && strncmp(tag, "family", len)== 0) { |
// Done parsing a Family - store the created currentFamily in the families array |
- *familyData->families.append() = familyData->currentFamily; |
- familyData->currentFamily = NULL; |
+ *familyData->families.append() = familyData->currentFamily.detach(); |
} else if (len == 7 && strncmp(tag, "nameset", len) == 0) { |
familyData->currentTag = NO_TAG; |
} else if (len == 7 && strncmp(tag, "fileset", len) == 0) { |
@@ -401,8 +399,8 @@ static void parseConfigFile(const char* filename, SkTDArray<FontFamily*> &famili |
} |
XML_Parser parser = XML_ParserCreate(NULL); |
- FamilyData* familyData = new FamilyData(parser, families); |
- XML_SetUserData(parser, familyData); |
+ FamilyData familyData(parser, families); |
+ XML_SetUserData(parser, &familyData); |
// Start parsing oldschool; switch these in flight if we detect a newer version of the file. |
XML_SetElementHandler(parser, jbParser::startElementHandler, jbParser::endElementHandler); |