Skip to content

Commit 6cb26c0

Browse files
committed
fix: typed array offset
1 parent aa97bc1 commit 6cb26c0

4 files changed

Lines changed: 41 additions & 2 deletions

File tree

NativeScript/runtime/NSDataAdapter.mm

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,12 @@ - (void*)mutableBytes {
4141

4242
Local<ArrayBufferView> bufferView = obj.As<ArrayBufferView>();
4343
if (bufferView->HasBuffer()) {
44-
void* data = bufferView->Buffer()->GetBackingStore()->Data();
45-
return data;
44+
uint8_t* data = static_cast<uint8_t*>(bufferView->Buffer()->GetBackingStore()->Data());
45+
if (data == nullptr) {
46+
return nullptr;
47+
}
48+
49+
return data + bufferView->ByteOffset();
4650
}
4751

4852
size_t length = bufferView->ByteLength();

TestFixtures/Marshalling/TNSObjCTypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ typedef int (^NumberReturner)(int, int, int);
3636
- (id)methodWithNSArrayWrappingDictionary:(id)array;
3737
- (NSDictionary*)methodWithNSDictionary:(NSDictionary*)dictionary;
3838
- (NSData*)methodWithNSData:(NSData*)data;
39+
- (NSMutableData*)methodWithNSMutableData:(NSMutableData*)data;
3940
- (NSDecimalNumber*)methodWithNSDecimalNumber:(NSDecimalNumber*)number;
4041
- (NSNumber*)methodWithNSCFBool;
4142
- (NSNull*)methodWithNSNull;

TestFixtures/Marshalling/TNSObjCTypes.m

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,15 @@ - (NSData*)methodWithNSData:(NSData*)data {
115115
return data;
116116
}
117117

118+
- (NSMutableData*)methodWithNSMutableData:(NSMutableData*)data {
119+
if (data.length > 0) {
120+
uint8_t* bytes = (uint8_t*)data.mutableBytes;
121+
bytes[0] = 'A';
122+
}
123+
124+
return data;
125+
}
126+
118127
- (NSDecimalNumber*)methodWithNSDecimalNumber:(NSDecimalNumber*)number {
119128
TNSLog([number stringValue]);
120129
return number;

TestRunner/app/tests/Marshalling/ObjCTypesTests.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,31 @@ describe(module.id, function () {
263263
TNSClearOutput();
264264
});
265265

266+
it("should respect ArrayBufferView byteOffset when wrapping in NSData", function () {
267+
var source = new Uint8Array([48, 49, 50, 51, 52, 53]);
268+
var view = new Uint8Array(source.buffer, 1, 4);
269+
270+
var wrappedArrayBufferViewData = TNSObjCTypes.alloc().init().methodWithNSData(view);
271+
272+
expect(TNSGetOutput()).toBe('1234');
273+
expect(wrappedArrayBufferViewData).toBe(view);
274+
TNSClearOutput();
275+
});
276+
277+
it("should respect ArrayBufferView byteOffset when mutating NSMutableData", function () {
278+
var source = new Uint8Array([48, 49, 50, 51, 52]);
279+
var view = new Uint8Array(source.buffer, 2, 2);
280+
281+
var wrappedArrayBufferViewData = TNSObjCTypes.alloc().init().methodWithNSMutableData(view);
282+
283+
expect(wrappedArrayBufferViewData).toBe(view);
284+
expect(source[0]).toEqual(48);
285+
expect(source[1]).toEqual(49);
286+
expect(source[2]).toEqual(65);
287+
expect(source[3]).toEqual(51);
288+
expect(source[4]).toEqual(52);
289+
});
290+
266291
it("should be possible to wrap NSData in an ArrayBuffer", function () {
267292
var data = NSString.stringWithString("test").dataUsingEncoding(NSUTF8StringEncoding);
268293

0 commit comments

Comments
 (0)