@@ -239,8 +239,6 @@ def write(self):
239
239
240
240
if swift_return_type_is_array :
241
241
body += self .write_array_call (num_function_name , function_call )
242
- body += inset + inset
243
- body += "}"
244
242
else :
245
243
if not self .spine_function .return_type == "void" :
246
244
body += "return "
@@ -305,24 +303,46 @@ def write_c_function_call(self, spine_params):
305
303
function_call += " != 0"
306
304
307
305
return function_call
308
-
309
- def write_array_call (self , num_function_name , function_call ):
310
- array_call = f"let num = Int( { num_function_name } ( { self . spine_object . var_name } )) "
306
+
307
+ def write_array_spine_class (self , num_function_name , function_call ):
308
+ array_call = f"let ptr = { function_call } "
311
309
array_call += "\n "
312
310
array_call += inset + inset
313
- array_call += f" let ptr = { function_call } "
311
+ array_call += "guard let validPtr = ptr else { return [] }"
314
312
array_call += "\n "
315
313
array_call += inset + inset
316
- array_call += "return (0..<num).compactMap {"
314
+ array_call += f"let num = Int({ num_function_name } ({ self .spine_object .var_name } ))"
315
+ array_call += "\n "
316
+ array_call += inset + inset
317
+ array_call += "let buffer = UnsafeBufferPointer(start: validPtr, count: num)"
318
+ array_call += "\n "
319
+ array_call += inset + inset
320
+ array_call += "return buffer.compactMap {"
317
321
array_call += "\n "
318
322
array_call += inset + inset + inset
319
-
323
+ array_call += "$0.flatMap { .init($0) }"
324
+ array_call += "\n "
325
+ array_call += inset + inset
326
+ array_call += "}"
327
+ return array_call
328
+
329
+ def write_array_call (self , num_function_name , function_call ):
320
330
if self .spine_function .isReturningSpineClass ():
321
- array_call += "ptr?[$0].flatMap { .init($0) }"
322
- else :
323
- array_call += "ptr?[$0]"
331
+ return self .write_array_spine_class (num_function_name , function_call )
332
+ array_call = f"let ptr = { function_call } "
333
+ array_call += "\n "
334
+ array_call += inset + inset
335
+ array_call += "guard let validPtr = ptr else { return [] }"
336
+ array_call += "\n "
337
+ array_call += inset + inset
338
+ array_call += f"let num = Int({ num_function_name } ({ self .spine_object .var_name } ))"
339
+ array_call += "\n "
340
+ array_call += inset + inset
324
341
342
+ array_call += "let buffer = UnsafeBufferPointer(start: validPtr, count: num)"
325
343
array_call += "\n "
344
+ array_call += inset + inset
345
+ array_call += "return Array(buffer)"
326
346
return array_call
327
347
328
348
def write_dispose_call (self ):
0 commit comments