diff options
author | Benoit Foucher <benoit@zeroc.com> | 2017-07-03 18:52:30 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2017-07-03 18:52:30 +0200 |
commit | 29d7a7f90140262987b59905b788fce195638e82 (patch) | |
tree | bea08a71749af9e2d6ac90d2dbebc2353b57d879 /cpp/src | |
parent | Fixed servant locator leak (diff) | |
download | ice-29d7a7f90140262987b59905b788fce195638e82.tar.bz2 ice-29d7a7f90140262987b59905b788fce195638e82.tar.xz ice-29d7a7f90140262987b59905b788fce195638e82.zip |
Additional Objective-C leak fixes for ICE-8204
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/slice2objc/Gen.cpp | 68 | ||||
-rw-r--r-- | cpp/src/slice2objc/ObjCUtil.cpp | 4 |
2 files changed, 35 insertions, 37 deletions
diff --git a/cpp/src/slice2objc/Gen.cpp b/cpp/src/slice2objc/Gen.cpp index 9872a07388f..17a91efac8e 100644 --- a/cpp/src/slice2objc/Gen.cpp +++ b/cpp/src/slice2objc/Gen.cpp @@ -1892,10 +1892,13 @@ Slice::Gen::TypesVisitor::writeMemberDefaultValueInit(const DataMemberList& data _M << nl << "self->" << name << " = " << firstEnum << ';'; } - StructPtr st = StructPtr::dynamicCast((*p)->type()); - if(st) + if(!(*p)->optional()) { - _M << nl << "self->" << name << " = [[" << typeToString(st) << " alloc] init];"; + StructPtr st = StructPtr::dynamicCast((*p)->type()); + if(st) + { + _M << nl << "self->" << name << " = [[" << typeToString(st) << " alloc] init];"; + } } } } @@ -2146,48 +2149,43 @@ Slice::Gen::TypesVisitor::writeMemberEquals(const DataMemberList& dataMembers, i void Slice::Gen::TypesVisitor::writeMemberDealloc(const DataMemberList& dataMembers, int baseType, const string& slicedData) const { - if(dataMembers.empty()) + bool needsDealloc = !slicedData.empty(); + for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q) { - return; + if(!isValueType((*q)->type())) + { + needsDealloc = true; + break; + } + } + if(!needsDealloc) + { + return; // No reference type data members. } - bool once = false; + _M << sp; + _M.zeroIndent(); + _M << nl << "#if defined(__clang__) && !__has_feature(objc_arc)"; + _M.restoreIndent(); + _M << nl << "-(void) dealloc"; + _M << sb; for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q) { - TypePtr type = (*q)->type(); - if(!isValueType(type)) + if(!isValueType((*q)->type())) { - if(!once) - { - once = true; - _M << sp; - _M.zeroIndent(); - _M << nl << "#if defined(__clang__) && !__has_feature(objc_arc)"; - _M.restoreIndent(); - _M << nl << "-(void) dealloc"; - _M << sb; - } - - bool isValue = isValueType(type); - if(!isValue) - { - _M << nl << "[self->" << fixId((*q)->name(), baseType) << " release];"; - } + _M << nl << "[self->" << fixId((*q)->name(), baseType) << " release];"; } } - if(once) + if(!slicedData.empty()) { - if(!slicedData.empty()) - { - _M << nl << "[(NSObject*)" << slicedData << " release];"; - } - _M << nl << "[super dealloc];"; - _M << eb; - _M.zeroIndent(); - _M << nl << "#endif"; - _M.restoreIndent(); - _H << nl << "// This class also overrides dealloc"; + _M << nl << "[(NSObject*)" << slicedData << " release];"; } + _M << nl << "[super dealloc];"; + _M << eb; + _M.zeroIndent(); + _M << nl << "#endif"; + _M.restoreIndent(); + _H << nl << "// This class also overrides dealloc"; } void diff --git a/cpp/src/slice2objc/ObjCUtil.cpp b/cpp/src/slice2objc/ObjCUtil.cpp index 3cdb4da3107..253519c837a 100644 --- a/cpp/src/slice2objc/ObjCUtil.cpp +++ b/cpp/src/slice2objc/ObjCUtil.cpp @@ -871,11 +871,11 @@ Slice::ObjCGenerator::writeMarshalUnmarshalCode(Output &out, const TypePtr& type { if(autoreleased) { - out << nl << param << " = [" << name << " read:" << stream << " value:" << param << "];"; + out << nl << "[" << name << " read:" << stream << " value:&" << param << "];"; } else { - out << nl << param << " = [" << name << " readRetained:" << stream << " value:" << param << "];"; + out << nl << "[" << name << " readRetained:" << stream << " value:&" << param << "];"; } } else |