From 6d9d73c0b45572357f211a72f36478cb40a625bb Mon Sep 17 00:00:00 2001 From: rfm Date: Tue, 8 Jan 2013 08:25:18 +0000 Subject: [PATCH] tiny optimisation to allow intermeidate substrings to be released earlier git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@35939 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 9 +++++++++ Source/GSString.m | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/ChangeLog b/ChangeLog index 1d5edacc2..8cfc31980 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2013-01-08 Richard Frith-Macdonald + + * Source/GSString.m: + When creating a substring (A) of a substring (B) or a string (C), + we now retain the (C) in (A) rather than having (C) retain (B) + which in turn retains (A). This has the advantage that it is + possible for the intermediate (B) to be released if nothing else + ues it. + 2013-01-05 00:49-EST Gregory John Casamento * Headers/Foundation/NSMetadata.h: Add _ to delegate. diff --git a/Source/GSString.m b/Source/GSString.m index 766f7d839..c4021e270 100644 --- a/Source/GSString.m +++ b/Source/GSString.m @@ -3846,6 +3846,33 @@ agree, create a new GSCInlineString otherwise. DESTROY(_parent); [super dealloc]; } + +- (NSString*) substringFromRange: (NSRange)aRange +{ + id s; + + GS_RANGE_CHECK(aRange, _count); + s = createTinyString((char*)_contents.c + aRange.location, aRange.length); + if (nil == s) + { + s = substring_c((GSStr)_parent, aRange); + } + return s; +} + +- (NSString*) substringWithRange: (NSRange)aRange +{ + id s; + + GS_RANGE_CHECK(aRange, _count); + s = createTinyString((char*)_contents.c + aRange.location, aRange.length); + if (nil == s) + { + s = substring_c((GSStr)_parent, aRange); + } + return s; +} + @end @@ -4220,6 +4247,21 @@ agree, create a new GSUInlineString otherwise. DESTROY(_parent); [super dealloc]; } + +- (NSString*) substringFromRange: (NSRange)aRange +{ + GS_RANGE_CHECK(aRange, _count); + aRange.location += (_contents.u - _parent->_contents.u); + return substring_u((GSStr)_parent, aRange); +} + +- (NSString*) substringWithRange: (NSRange)aRange +{ + GS_RANGE_CHECK(aRange, _count); + aRange.location += (_contents.u - _parent->_contents.u); + return substring_u((GSStr)_parent, aRange); +} + @end