Skip to content

Commit 63cb57b

Browse files
committed
KissXML now recycles existing DDXML wrapper nodes. This means faster operation if your code accesses the same element over and over again.
1 parent b54de0e commit 63cb57b

File tree

7 files changed

+680
-391
lines changed

7 files changed

+680
-391
lines changed

DDXMLDocument.m

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,41 @@ @implementation DDXMLDocument
77

88
+ (id)nodeWithPrimitive:(xmlKindPtr)nodePtr
99
{
10-
return [[[DDXMLDocument alloc] initWithPrimitive:nodePtr] autorelease];
10+
if(nodePtr == NULL || nodePtr->type != XML_DOCUMENT_NODE)
11+
{
12+
return nil;
13+
}
14+
15+
xmlDocPtr doc = (xmlDocPtr)nodePtr;
16+
if(doc->_private == NULL)
17+
return [[[DDXMLDocument alloc] initWithCheckedPrimitive:nodePtr] autorelease];
18+
else
19+
return [[((DDXMLDocument *)(doc->_private)) retain] autorelease];
1120
}
1221

13-
- (id)initWithPrimitive:(xmlKindPtr)nodePtr
22+
- (id)initWithUncheckedPrimitive:(xmlKindPtr)nodePtr
1423
{
1524
if(nodePtr == NULL || nodePtr->type != XML_DOCUMENT_NODE)
1625
{
1726
[self release];
1827
return nil;
1928
}
2029

21-
self = [super initWithPrimitive:nodePtr];
30+
xmlDocPtr doc = (xmlDocPtr)nodePtr;
31+
if(doc->_private == NULL)
32+
{
33+
return [self initWithCheckedPrimitive:nodePtr];
34+
}
35+
else
36+
{
37+
[self release];
38+
return [((DDXMLDocument *)(doc->_private)) retain];
39+
}
40+
}
41+
42+
- (id)initWithCheckedPrimitive:(xmlKindPtr)nodePtr
43+
{
44+
self = [super initWithCheckedPrimitive:nodePtr];
2245
return self;
2346
}
2447

@@ -65,7 +88,7 @@ - (id)initWithData:(NSData *)data options:(NSUInteger)mask error:(NSError **)err
6588
return nil;
6689
}
6790

68-
return [self initWithPrimitive:(xmlKindPtr)doc];
91+
return [self initWithCheckedPrimitive:(xmlKindPtr)doc];
6992
}
7093

7194
/**

DDXMLElement.m

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,27 @@ - (id)initWithName:(NSString *)name
1010
// Note: Make every guarantee that genericPtr is not null
1111

1212
xmlNodePtr node = xmlNewNode(NULL, [name xmlChar]);
13+
if(node == NULL)
14+
{
15+
[self release];
16+
return nil;
17+
}
1318

14-
return [self initWithPrimitive:(xmlKindPtr)node];
19+
return [self initWithCheckedPrimitive:(xmlKindPtr)node];
1520
}
1621

1722
- (id)initWithName:(NSString *)name URI:(NSString *)URI
1823
{
1924
// Note: Make every guarantee that genericPtr is not null
2025

2126
xmlNodePtr node = xmlNewNode(NULL, [name xmlChar]);
27+
if(node == NULL)
28+
{
29+
[self release];
30+
return nil;
31+
}
2232

23-
id result = [self initWithPrimitive:(xmlKindPtr)node];
33+
DDXMLElement *result = [self initWithCheckedPrimitive:(xmlKindPtr)node];
2434
[result setURI:URI];
2535

2636
return result;
@@ -31,8 +41,13 @@ - (id)initWithName:(NSString *)name stringValue:(NSString *)string
3141
// Note: Make every guarantee that genericPtr is not null
3242

3343
xmlNodePtr node = xmlNewNode(NULL, [name xmlChar]);
44+
if(node == NULL)
45+
{
46+
[self release];
47+
return nil;
48+
}
3449

35-
id result = [self initWithPrimitive:(xmlKindPtr)node];
50+
DDXMLElement *result = [self initWithCheckedPrimitive:(xmlKindPtr)node];
3651
[result setStringValue:string];
3752

3853
return result;
@@ -41,33 +56,57 @@ - (id)initWithName:(NSString *)name stringValue:(NSString *)string
4156
- (id)initWithXMLString:(NSString *)string error:(NSError **)error
4257
{
4358
DDXMLDocument *doc = [[DDXMLDocument alloc] initWithXMLString:string options:0 error:error];
44-
4559
if(doc == nil)
4660
{
61+
[self release];
4762
return nil;
4863
}
4964

50-
DDXMLNode *result = [doc rootElement];
65+
DDXMLElement *result = [doc rootElement];
5166
[result detach];
5267
[doc release];
5368

69+
[self release];
5470
return [result retain];
5571
}
5672

5773
+ (id)nodeWithPrimitive:(xmlKindPtr)nodePtr
5874
{
59-
return [[[DDXMLElement alloc] initWithPrimitive:nodePtr] autorelease];
75+
if(nodePtr == NULL || nodePtr->type != XML_ELEMENT_NODE)
76+
{
77+
return nil;
78+
}
79+
80+
xmlNodePtr node = (xmlNodePtr)nodePtr;
81+
if(node->_private == NULL)
82+
return [[[DDXMLElement alloc] initWithCheckedPrimitive:nodePtr] autorelease];
83+
else
84+
return [[((DDXMLElement *)(node->_private)) retain] autorelease];
6085
}
6186

62-
- (id)initWithPrimitive:(xmlKindPtr)nodePtr
87+
- (id)initWithUncheckedPrimitive:(xmlKindPtr)nodePtr
6388
{
6489
if(nodePtr == NULL || nodePtr->type != XML_ELEMENT_NODE)
6590
{
6691
[self release];
6792
return nil;
6893
}
6994

70-
self = [super initWithPrimitive:nodePtr];
95+
xmlNodePtr node = (xmlNodePtr)nodePtr;
96+
if(node->_private == NULL)
97+
{
98+
return [self initWithCheckedPrimitive:nodePtr];
99+
}
100+
else
101+
{
102+
[self release];
103+
return [((DDXMLElement *)(node->_private)) retain];
104+
}
105+
}
106+
107+
- (id)initWithCheckedPrimitive:(xmlKindPtr)nodePtr
108+
{
109+
self = [super initWithCheckedPrimitive:nodePtr];
71110
return self;
72111
}
73112

@@ -174,10 +213,7 @@ - (NSArray *)elementsWithName:(NSString *)name uri:(NSString *)uri
174213

175214
if(match)
176215
{
177-
DDXMLElement *childElement = [[DDXMLElement alloc] initWithPrimitive:(xmlKindPtr)child];
178-
179-
[result addObject:childElement];
180-
[childElement release];
216+
[result addObject:[DDXMLElement nodeWithPrimitive:(xmlKindPtr)child]];
181217
}
182218
}
183219

@@ -241,10 +277,7 @@ - (NSArray *)attributes
241277
xmlAttrPtr attr = ((xmlNodePtr)genericPtr)->properties;
242278
while(attr != NULL)
243279
{
244-
DDXMLNode *attrNode = [[DDXMLNode alloc] initWithPrimitive:(xmlKindPtr)attr];
245-
246-
[result addObject:attrNode];
247-
[attrNode release];
280+
[result addObject:[DDXMLNode nodeWithPrimitive:(xmlKindPtr)attr]];
248281

249282
attr = attr->next;
250283
}
@@ -362,10 +395,7 @@ - (NSArray *)namespaces
362395
xmlNsPtr ns = ((xmlNodePtr)genericPtr)->nsDef;
363396
while(ns != NULL)
364397
{
365-
DDXMLNode *nsNode = [[DDXMLNode alloc] initWithPrimitive:(xmlKindPtr)ns nsParent:(xmlNodePtr)genericPtr];
366-
367-
[result addObject:nsNode];
368-
[nsNode release];
398+
[result addObject:[DDXMLNode nodeWithPrimitive:(xmlKindPtr)ns nsParent:(xmlNodePtr)genericPtr]];
369399

370400
ns = ns->next;
371401
}

0 commit comments

Comments
 (0)