Skip to content

Commit c947697

Browse files
authored
Tensor view keeps original tensor alive. (#15057)
Summary: A view on a tensor created with NSData should keep the data alive Differential Revision: D84512175
1 parent b18243b commit c947697

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

extension/apple/ExecuTorch/Exported/ExecuTorchTensor.mm

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,11 @@ - (instancetype)initWithTensor:(ExecuTorchTensor *)otherTensor {
131131
auto tensor = make_tensor_ptr(
132132
*reinterpret_cast<TensorPtr *>(otherTensor.nativeInstance)
133133
);
134-
return [self initWithNativeInstance:&tensor];
134+
self = [self initWithNativeInstance:&tensor];
135+
if (self) {
136+
_data = otherTensor->_data;
137+
}
138+
return self;
135139
}
136140

137141
- (instancetype)copy {

extension/apple/ExecuTorch/__tests__/TensorTest.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,19 @@ class TensorTest: XCTestCase {
9696
XCTAssertEqual(tensor.scalars(), dataArray)
9797
}
9898

99+
func testInitDataViewSurvivesSourceScopeEnd() {
100+
let dataArray: [Float] = [1.0, 2.0, 3.0, 4.0]
101+
var view: Tensor<Float>!
102+
autoreleasepool {
103+
let data = Data(bytes: dataArray, count: dataArray.count * MemoryLayout<Float>.size)
104+
let tensor = Tensor<Float>(data: data, shape: [4])
105+
view = Tensor<Float>(tensor)
106+
XCTAssertEqual(view.scalars(), dataArray)
107+
}
108+
XCTAssertEqual(view.count, 4)
109+
XCTAssertEqual(view.scalars(), dataArray)
110+
}
111+
99112
func testWithCustomStridesAndDimensionOrder() {
100113
let data: [Float] = [1.0, 2.0, 3.0, 4.0]
101114
let tensor = Tensor<Float>(

0 commit comments

Comments
 (0)