r207882 - [leaks] Parse the schema file every time we try to verify the XML. Yes,
Chandler Carruth
chandlerc at gmail.com
Fri May 2 16:30:59 PDT 2014
Author: chandlerc
Date: Fri May 2 18:30:59 2014
New Revision: 207882
URL: http://llvm.org/viewvc/llvm-project?rev=207882&view=rev
Log:
[leaks] Parse the schema file every time we try to verify the XML. Yes,
this is wasteful, blah blah, but this is a test utility only. It turns
out that without doing this, libxml2 will always leak a bunch of the XML
data, and that is causing failures with LSan. This is also quite a bit
simpler and I don't think it is slow enough to really be a show stopper.
If someone yells about the runtime of c-index-test, we can do other
things to try to mitigate it, but the current strategy wasn't working
well.
Modified:
cfe/trunk/tools/c-index-test/c-index-test.c
Modified: cfe/trunk/tools/c-index-test/c-index-test.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=207882&r1=207881&r2=207882&view=diff
==============================================================================
--- cfe/trunk/tools/c-index-test/c-index-test.c (original)
+++ cfe/trunk/tools/c-index-test/c-index-test.c Fri May 2 18:30:59 2014
@@ -542,33 +542,23 @@ static void DumpCXComment(CXComment Comm
printf("]");
}
-typedef struct {
- const char *CommentSchemaFile;
+static void ValidateCommentXML(const char *Str, const char *CommentSchemaFile) {
#ifdef CLANG_HAVE_LIBXML
xmlRelaxNGParserCtxtPtr RNGParser;
xmlRelaxNGPtr Schema;
-#endif
-} CommentXMLValidationData;
-
-static void ValidateCommentXML(const char *Str,
- CommentXMLValidationData *ValidationData) {
-#ifdef CLANG_HAVE_LIBXML
xmlDocPtr Doc;
xmlRelaxNGValidCtxtPtr ValidationCtxt;
int status;
- if (!ValidationData || !ValidationData->CommentSchemaFile)
+ if (!CommentSchemaFile)
return;
- if (!ValidationData->RNGParser) {
- ValidationData->RNGParser =
- xmlRelaxNGNewParserCtxt(ValidationData->CommentSchemaFile);
- ValidationData->Schema = xmlRelaxNGParse(ValidationData->RNGParser);
- }
- if (!ValidationData->RNGParser) {
+ RNGParser = xmlRelaxNGNewParserCtxt(CommentSchemaFile);
+ if (!RNGParser) {
printf(" libXMLError");
return;
}
+ Schema = xmlRelaxNGParse(RNGParser);
Doc = xmlParseDoc((const xmlChar *) Str);
@@ -578,7 +568,7 @@ static void ValidateCommentXML(const cha
return;
}
- ValidationCtxt = xmlRelaxNGNewValidCtxt(ValidationData->Schema);
+ ValidationCtxt = xmlRelaxNGNewValidCtxt(Schema);
status = xmlRelaxNGValidateDoc(ValidationCtxt, Doc);
if (!status)
printf(" CommentXMLValid");
@@ -590,11 +580,13 @@ static void ValidateCommentXML(const cha
xmlRelaxNGFreeValidCtxt(ValidationCtxt);
xmlFreeDoc(Doc);
+ xmlRelaxNGFree(Schema);
+ xmlRelaxNGFreeParserCtxt(RNGParser);
#endif
}
static void PrintCursorComments(CXCursor Cursor,
- CommentXMLValidationData *ValidationData) {
+ const char *CommentSchemaFile) {
{
CXString RawComment;
const char *RawCommentCString;
@@ -625,7 +617,7 @@ static void PrintCursorComments(CXCursor
CXString XML;
XML = clang_FullComment_getAsXML(Comment);
PrintCXStringWithPrefix("FullCommentAsXML", XML);
- ValidateCommentXML(clang_getCString(XML), ValidationData);
+ ValidateCommentXML(clang_getCString(XML), CommentSchemaFile);
clang_disposeString(XML);
}
@@ -647,8 +639,7 @@ static int lineCol_cmp(const void *p1, c
return (int)lhs->col - (int)rhs->col;
}
-static void PrintCursor(CXCursor Cursor,
- CommentXMLValidationData *ValidationData) {
+static void PrintCursor(CXCursor Cursor, const char *CommentSchemaFile) {
CXTranslationUnit TU = clang_Cursor_getTranslationUnit(Cursor);
if (clang_isInvalid(Cursor.kind)) {
CXString ks = clang_getCursorKindSpelling(Cursor.kind);
@@ -869,7 +860,7 @@ static void PrintCursor(CXCursor Cursor,
PrintRange(RefNameRange, "RefName");
}
- PrintCursorComments(Cursor, ValidationData);
+ PrintCursorComments(Cursor, CommentSchemaFile);
{
unsigned PropAttrs = clang_Cursor_getObjCPropertyAttributes(Cursor, 0);
@@ -1039,7 +1030,7 @@ static void PrintCursorExtent(CXCursor C
typedef struct {
CXTranslationUnit TU;
enum CXCursorKind *Filter;
- CommentXMLValidationData ValidationData;
+ const char *CommentSchemaFile;
} VisitorData;
@@ -1053,7 +1044,7 @@ enum CXChildVisitResult FilteredPrinting
clang_getSpellingLocation(Loc, 0, &line, &column, 0);
printf("// %s: %s:%d:%d: ", FileCheckPrefix,
GetCursorSource(Cursor), line, column);
- PrintCursor(Cursor, &Data->ValidationData);
+ PrintCursor(Cursor, Data->CommentSchemaFile);
PrintCursorExtent(Cursor);
if (clang_isDeclaration(Cursor.kind)) {
enum CX_CXXAccessSpecifier access = clang_getCXXAccessSpecifier(Cursor);
@@ -1123,7 +1114,7 @@ static enum CXChildVisitResult FunctionS
} else if (Ref.kind != CXCursor_FunctionDecl) {
printf("// %s: %s:%d:%d: ", FileCheckPrefix, GetCursorSource(Ref),
curLine, curColumn);
- PrintCursor(Ref, &Data->ValidationData);
+ PrintCursor(Ref, Data->CommentSchemaFile);
printf("\n");
}
}
@@ -1430,11 +1421,7 @@ static int perform_test_load(CXIndex Idx
Data.TU = TU;
Data.Filter = ck;
- Data.ValidationData.CommentSchemaFile = CommentSchemaFile;
-#ifdef CLANG_HAVE_LIBXML
- Data.ValidationData.RNGParser = NULL;
- Data.ValidationData.Schema = NULL;
-#endif
+ Data.CommentSchemaFile = CommentSchemaFile;
clang_visitChildren(clang_getTranslationUnitCursor(TU), Visitor, &Data);
}
More information about the cfe-commits
mailing list