Differences From Artifact [103672a799]:
- File src/OFXMLElement.m — part of check-in [8892ae9fcc] at 2012-07-12 01:28:46 on branch trunk — Don't access isa directly. (user: js, size: 26278) [annotate] [blame] [check-ins using]
To Artifact [01c2a13f7b]:
- File
src/OFXMLElement.m
— part of check-in
[1255f3a11a]
at
2012-08-10 20:08:24
on branch trunk
— Directly use the runtime's autorelease pools.
This greatly improves performance, as it gets rid of the overhead of
OFAutoreleasePool. (user: js, size: 26203) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
25 26 27 28 29 30 31 | #import "OFDictionary.h" #import "OFDataArray.h" #import "OFXMLAttribute.h" #import "OFXMLCharacters.h" #import "OFXMLCDATA.h" #import "OFXMLParser.h" #import "OFXMLElementBuilder.h" | < > | 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #import "OFDictionary.h" #import "OFDataArray.h" #import "OFXMLAttribute.h" #import "OFXMLCharacters.h" #import "OFXMLCDATA.h" #import "OFXMLParser.h" #import "OFXMLElementBuilder.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFMalformedXMLException.h" #import "OFNotImplementedException.h" #import "OFUnboundNamespaceException.h" #import "autorelease.h" #import "macros.h" /* References for static linking */ void _references_to_categories_of_OFXMLElement(void) { _OFXMLElement_Serialization_reference = 1; } |
︙ | ︙ | |||
206 207 208 209 210 211 212 | } return self; } - initWithXMLString: (OFString*)string { | | | | | | | | | 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 | } return self; } - initWithXMLString: (OFString*)string { void *pool; OFXMLParser *parser; OFXMLElementBuilder *builder; OFXMLElement_OFXMLElementBuilderDelegate *delegate; Class c; c = [self class]; [self release]; if (string == nil) @throw [OFInvalidArgumentException exceptionWithClass: c selector: _cmd]; pool = objc_autoreleasePoolPush(); parser = [OFXMLParser parser]; builder = [OFXMLElementBuilder elementBuilder]; delegate = [[[OFXMLElement_OFXMLElementBuilderDelegate alloc] init] autorelease]; [parser setDelegate: builder]; [builder setDelegate: delegate]; [parser parseString: string]; if (![parser finishedParsing]) @throw [OFMalformedXMLException exceptionWithClass: c parser: parser]; self = [delegate->element retain]; objc_autoreleasePoolPop(pool); return self; } - initWithFile: (OFString*)path { void *pool; OFXMLParser *parser; OFXMLElementBuilder *builder; OFXMLElement_OFXMLElementBuilderDelegate *delegate; Class c; c = [self class]; [self release]; pool = objc_autoreleasePoolPush(); parser = [OFXMLParser parser]; builder = [OFXMLElementBuilder elementBuilder]; delegate = [[[OFXMLElement_OFXMLElementBuilderDelegate alloc] init] autorelease]; [parser setDelegate: builder]; [builder setDelegate: delegate]; [parser parseFile: path]; if (![parser finishedParsing]) @throw [OFMalformedXMLException exceptionWithClass: c parser: parser]; self = [delegate->element retain]; objc_autoreleasePoolPop(pool); return self; } - initWithSerialization: (OFXMLElement*)element { self = [super init]; @try { void *pool = objc_autoreleasePoolPush(); OFXMLElement *attributesElement, *namespacesElement; OFXMLElement *childrenElement; OFEnumerator *keyEnumerator, *objectEnumerator; id key, object; if (![[element name] isEqual: [self className]] || ![[element namespace] isEqual: OF_SERIALIZATION_NS]) |
︙ | ︙ | |||
367 368 369 370 371 372 373 | forKey: @"http://www.w3.org/2000/xmlns/"]; if (name == nil) @throw [OFInvalidArgumentException exceptionWithClass: [self class] selector: _cmd]; | | | 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 | forKey: @"http://www.w3.org/2000/xmlns/"]; if (name == nil) @throw [OFInvalidArgumentException exceptionWithClass: [self class] selector: _cmd]; objc_autoreleasePoolPop(pool); } @catch (id e) { [self release]; @throw e; } return self; } |
︙ | ︙ | |||
418 419 420 421 422 423 424 | - (OFArray*)children { OF_GETTER(children, YES) } - (void)setStringValue: (OFString*)stringValue { | | | < < > > | > < < | | | 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 | - (OFArray*)children { OF_GETTER(children, YES) } - (void)setStringValue: (OFString*)stringValue { void *pool = objc_autoreleasePoolPush(); [self setChildren: [OFArray arrayWithObject: [OFXMLCharacters charactersWithString: stringValue]]]; objc_autoreleasePoolPop(pool); } - (OFString*)stringValue { OFMutableString *ret; OFXMLElement **objects; size_t i, count = [children count]; if (count == 0) return @""; ret = [OFMutableString string]; objects = [children objects]; for (i = 0; i < count; i++) { void *pool = objc_autoreleasePoolPush(); [ret appendString: [objects[i] stringValue]]; objc_autoreleasePoolPop(pool); } [ret makeImmutable]; return ret; } - (OFString*)_XMLStringWithParent: (OFXMLElement*)parent namespaces: (OFDictionary*)allNamespaces indentation: (unsigned int)indentation level: (unsigned int)level { void *pool; char *cString; size_t length, i, j, attributesCount; OFString *prefix, *parentPrefix; OFXMLAttribute **attributesObjects; OFString *ret; OFString *defaultNS; pool = objc_autoreleasePoolPush(); parentPrefix = [allNamespaces objectForKey: (parent != nil && parent->ns != nil ? parent->ns : (OFString*)@"")]; /* Add the namespaces of the current element */ if (allNamespaces != nil) { OFEnumerator *keyEnumerator = [namespaces keyEnumerator]; |
︙ | ︙ | |||
550 551 552 553 554 555 556 | cString[i++] = '\''; } /* Attributes */ attributesObjects = [attributes objects]; attributesCount = [attributes count]; | < > | 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 | cString[i++] = '\''; } /* Attributes */ attributesObjects = [attributes objects]; attributesCount = [attributes count]; for (j = 0; j < attributesCount; j++) { void *pool2 = objc_autoreleasePoolPush(); OFString *attributeName = [attributesObjects[j] name]; OFString *attributePrefix = nil; OFString *tmp = [[attributesObjects[j] stringValue] stringByXMLEscaping]; if ([attributesObjects[j] namespace] != nil && (attributePrefix = [allNamespaces objectForKey: |
︙ | ︙ | |||
594 595 596 597 598 599 600 | i += [attributeName UTF8StringLength]; cString[i++] = '='; cString[i++] = '\''; memcpy(cString + i, [tmp UTF8String], [tmp UTF8StringLength]); i += [tmp UTF8StringLength]; cString[i++] = '\''; | | | 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 | i += [attributeName UTF8StringLength]; cString[i++] = '='; cString[i++] = '\''; memcpy(cString + i, [tmp UTF8String], [tmp UTF8StringLength]); i += [tmp UTF8StringLength]; cString[i++] = '\''; objc_autoreleasePoolPop(pool2); } /* Childen */ if (children != nil) { OFXMLElement **childrenObjects = [children objects]; size_t childrenCount = [children count]; OFDataArray *tmp = [OFDataArray dataArray]; |
︙ | ︙ | |||
689 690 691 692 693 694 695 | i += [name UTF8StringLength]; } else cString[i++] = '/'; cString[i++] = '>'; assert(i == length); | | | 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 | i += [name UTF8StringLength]; } else cString[i++] = '/'; cString[i++] = '>'; assert(i == length); objc_autoreleasePoolPop(pool); @try { ret = [OFString stringWithUTF8String: cString length: length]; } @finally { [self freeMemory: cString]; } |
︙ | ︙ | |||
727 728 729 730 731 732 733 | namespaces: nil indentation: indentation level: level]; } - (OFXMLElement*)XMLElementBySerializing { | | | 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 | namespaces: nil indentation: indentation level: level]; } - (OFXMLElement*)XMLElementBySerializing { void *pool = objc_autoreleasePoolPush(); OFXMLElement *element; element = [OFXMLElement elementWithName: [self className] namespace: OF_SERIALIZATION_NS]; if (name != nil) [element addAttributeWithName: @"name" |
︙ | ︙ | |||
787 788 789 790 791 792 793 | [OFXMLElement elementWithName: @"children" namespace: OF_SERIALIZATION_NS]; [childrenElement addChild: [children XMLElementBySerializing]]; [element addChild: childrenElement]; } [element retain]; | | | | | 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 | [OFXMLElement elementWithName: @"children" namespace: OF_SERIALIZATION_NS]; [childrenElement addChild: [children XMLElementBySerializing]]; [element addChild: childrenElement]; } [element retain]; objc_autoreleasePoolPop(pool); return [element autorelease]; } - (void)addAttribute: (OFXMLAttribute*)attribute { if (attributes == nil) attributes = [[OFMutableArray alloc] init]; |
︙ | ︙ | |||
815 816 817 818 819 820 821 | stringValue: stringValue]; } - (void)addAttributeWithName: (OFString*)name_ namespace: (OFString*)ns_ stringValue: (OFString*)stringValue { | | | | 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 | stringValue: stringValue]; } - (void)addAttributeWithName: (OFString*)name_ namespace: (OFString*)ns_ stringValue: (OFString*)stringValue { void *pool = objc_autoreleasePoolPush(); [self addAttribute: [OFXMLAttribute attributeWithName: name_ namespace: ns_ stringValue: stringValue]]; objc_autoreleasePoolPop(pool); } - (OFXMLAttribute*)attributeForName: (OFString*)attributeName { OFXMLAttribute **objects = [attributes objects]; size_t i, count = [attributes count]; |
︙ | ︙ |