Index: src/OFString.m ================================================================== --- src/OFString.m +++ src/OFString.m @@ -834,35 +834,27 @@ } - (instancetype)initWithUTF8StringNoCopy: (char *)UTF8String freeWhenDone: (bool)freeWhenDone { - id ret; - - @try { - ret = [self initWithUTF8String: UTF8String]; - } @finally { - if (freeWhenDone) - free(UTF8String); - } + id ret = [self initWithUTF8String: UTF8String]; + + if (freeWhenDone) + free(UTF8String); return ret; } - (instancetype)initWithUTF8StringNoCopy: (char *)UTF8String length: (size_t)UTF8StringLength freeWhenDone: (bool)freeWhenDone { - id ret; - - @try { - ret = [self initWithUTF8String: UTF8String - length: UTF8StringLength]; - } @finally { - if (freeWhenDone) - free(UTF8String); - } + id ret = [self initWithUTF8String: UTF8String + length: UTF8StringLength]; + + if (freeWhenDone) + free(UTF8String); return ret; } - (instancetype)initWithCString: (const char *)cString Index: src/OFUTF8String.m ================================================================== --- src/OFUTF8String.m +++ src/OFUTF8String.m @@ -402,41 +402,35 @@ - (instancetype)initWithUTF8StringNoCopy: (char *)UTF8String length: (size_t)UTF8StringLength freeWhenDone: (bool)freeWhenDone { - @try { - self = [super init]; - } @catch (id e) { - if (freeWhenDone) - free(UTF8String); - @throw e; - } + self = [super init]; @try { _s = &_storage; - if (freeWhenDone) - _s->freeWhenDone = UTF8String; - if (UTF8StringLength >= 3 && memcmp(UTF8String, "\xEF\xBB\xBF", 3) == 0) { UTF8String += 3; UTF8StringLength -= 3; } - _s->cString = (char *)UTF8String; - _s->cStringLength = UTF8StringLength; - switch (of_string_utf8_check(UTF8String, UTF8StringLength, &_s->length)) { case 1: _s->isUTF8 = true; break; case -1: @throw [OFInvalidEncodingException exception]; } + + _s->cString = (char *)UTF8String; + _s->cStringLength = UTF8StringLength; + + if (freeWhenDone) + _s->freeWhenDone = UTF8String; } @catch (id e) { [self release]; @throw e; }