Skip to content

Commit 0005241

Browse files
authored
Use a strong NSError when returning from methods with nested autoreleasepool
Otherwise, the output NSError arg get assigned an autoreleasing NSError object that gets deallocated when the nested autorelease pool is drained and no error is reported
1 parent a325c56 commit 0005241

File tree

1 file changed

+46
-40
lines changed

1 file changed

+46
-40
lines changed

backends/apple/coreml/runtime/delegate/ETCoreMLModelManager.mm

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,8 @@ - (BOOL)executeModelWithHandle:(ModelHandle *)handle
728728
args.count);
729729
return NO;
730730
}
731+
NSError *localError = nil;
732+
NSArray<MLMultiArray *> *modelOutputs = nil;
731733
@autoreleasepool {
732734
NSArray<MLMultiArray *> *inputs = [args subarrayWithRange:NSMakeRange(0, model.orderedInputNames.count)];
733735
NSArray<MLMultiArray *> *outputs = [args subarrayWithRange:NSMakeRange(model.orderedInputNames.count, args.count - model.orderedInputNames.count)];
@@ -736,19 +738,22 @@ - (BOOL)executeModelWithHandle:(ModelHandle *)handle
736738
outputBackings = outputs;
737739
}
738740

739-
NSArray<MLMultiArray *> *modelOutputs = [self executeModelUsingExecutor:executor
740-
inputs:inputs
741-
outputBackings:outputBackings
742-
loggingOptions:loggingOptions
743-
eventLogger:eventLogger
744-
error:error];
745-
if (!modelOutputs) {
746-
return NO;
741+
modelOutputs = [self executeModelUsingExecutor:executor
742+
inputs:inputs
743+
outputBackings:outputBackings
744+
loggingOptions:loggingOptions
745+
eventLogger:eventLogger
746+
error:error];
747+
if (modelOutputs) {
748+
::set_outputs(outputs, modelOutputs);
747749
}
748-
749-
::set_outputs(outputs, modelOutputs);
750750
}
751-
751+
if (!modelOutputs) {
752+
if (error) {
753+
*error = localError;
754+
}
755+
return NO;
756+
}
752757
return YES;
753758
}
754759

@@ -777,40 +782,41 @@ - (BOOL)executeModelWithHandle:(ModelHandle *)handle
777782

778783
std::vector<executorchcoreml::MultiArray> inputArgs(argsVec.begin(), argsVec.begin() + model.orderedInputNames.count);
779784
std::vector<executorchcoreml::MultiArray> outputArgs(argsVec.begin() + model.orderedInputNames.count, argsVec.end());
785+
NSError *localError = nil;
786+
NSArray<MLMultiArray *> *modelOutputs = nil;
780787
@autoreleasepool {
781788
NSArray<MLMultiArray *> *inputs = [model prepareInputs:inputArgs error:error];
782-
if (!inputs) {
783-
return NO;
784-
}
785-
786-
NSArray<MLMultiArray *> *outputBackings = @[];
787-
if (executor.ignoreOutputBackings == NO) {
788-
outputBackings = [model prepareOutputBackings:outputArgs error:error];
789-
}
790-
791-
if (!outputBackings) {
792-
return NO;
793-
}
794-
795-
NSArray<MLMultiArray *> *modelOutputs = [self executeModelUsingExecutor:executor
796-
inputs:inputs
797-
outputBackings:outputBackings
798-
loggingOptions:loggingOptions
799-
eventLogger:eventLogger
800-
error:error];
801-
if (!modelOutputs) {
802-
return NO;
789+
if (inputs) {
790+
NSArray<MLMultiArray *> *outputBackings = @[];
791+
if (executor.ignoreOutputBackings == NO) {
792+
outputBackings = [model prepareOutputBackings:outputArgs error:error];
793+
}
794+
if (outputBackings) {
795+
modelOutputs = [self executeModelUsingExecutor:executor
796+
inputs:inputs
797+
outputBackings:outputBackings
798+
loggingOptions:loggingOptions
799+
eventLogger:eventLogger
800+
error:error];
801+
if (!modelOutputs) {
802+
// Resize for dynamic shapes
803+
for (int i = 0; i < outputArgs.size(); i++) {
804+
auto new_size = to_vector<size_t>(modelOutputs[i].shape);
805+
outputArgs[i].resize(new_size);
806+
argsVec[model.orderedInputNames.count + i].resize(new_size);
807+
}
808+
::set_outputs(outputArgs, modelOutputs);
809+
}
810+
}
803811
}
804-
805-
// Resize for dynamic shapes
806-
for (int i = 0; i < outputArgs.size(); i++) {
807-
auto new_size = to_vector<size_t>(modelOutputs[i].shape);
808-
outputArgs[i].resize(new_size);
809-
argsVec[model.orderedInputNames.count + i].resize(new_size);
812+
}
813+
if (!modelOutputs) {
814+
if (error) {
815+
*error = localError;
810816
}
811-
::set_outputs(outputArgs, modelOutputs);
812-
return YES;
817+
return NO;
813818
}
819+
return YES;
814820
}
815821

816822
- (BOOL)unloadModelWithHandle:(ModelHandle *)handle {

0 commit comments

Comments
 (0)