@@ -39,30 +39,51 @@ main(List<String> arguments) {
39
39
final args = argParser ().parse (arguments);
40
40
Uri path = Uri .parse (args['path' ]);
41
41
42
- generate (path, "ffi.g.dart" , generatePublicExtension);
43
- generate (path, "ffi_patch.g.dart" , generatePatchExtension);
42
+ update (Uri .file ('sdk/lib/ffi/ffi.dart' ), generatePublicExtension);
43
+ update (Uri .file ('sdk/lib/_internal/vm/lib/ffi_patch.dart' ),
44
+ generatePatchExtension);
44
45
}
45
46
46
- void generate (Uri path, String fileName,
47
- Function (StringBuffer , Config , String ) generator) {
47
+ void update (Uri fileName, Function (StringBuffer , Config , String ) generator) {
48
+ final file = File .fromUri (fileName);
49
+ if (! file.existsSync ()) {
50
+ print ('$fileName does not exist, run from the root of the SDK.' );
51
+ return ;
52
+ }
53
+
54
+ final fileContents = file.readAsStringSync ();
55
+ final split1 = fileContents.split (header);
56
+ if (split1.length != 2 ) {
57
+ print ('$fileName has unexpected contents.' );
58
+ print (split1.length);
59
+ return ;
60
+ }
61
+ final split2 = split1[1 ].split (footer);
62
+ if (split2.length != 2 ) {
63
+ print ('$fileName has unexpected contents 2.' );
64
+ print (split2.length);
65
+ return ;
66
+ }
67
+
48
68
final buffer = StringBuffer ();
49
- generateHeader (buffer);
69
+ buffer.write (split1[0 ]);
70
+ buffer.write (header);
50
71
configuration.forEach ((Config c) => generator (buffer, c, "Pointer" ));
51
72
configuration.forEach ((Config c) => generator (buffer, c, "Array" ));
52
- generateFooter (buffer);
73
+ buffer.write (footer);
74
+ buffer.write (split2[1 ]);
53
75
54
- final fullPath = path. resolve (fileName).path ;
55
- File (fullPath). writeAsStringSync (buffer. toString ());
56
- final fmtResult = Process .runSync (dartPath ().path, ["format" , fullPath ]);
76
+ file. writeAsStringSync (buffer. toString ()) ;
77
+ final fmtResult =
78
+ Process .runSync (dartPath ().path, ["format" , fileName. toFilePath () ]);
57
79
if (fmtResult.exitCode != 0 ) {
58
80
throw Exception (
59
81
"Formatting failed:\n ${fmtResult .stdout }\n ${fmtResult .stderr }\n " );
60
82
}
61
- print ("Generated $ fullPath ." );
83
+ print ("Updated $ fileName ." );
62
84
}
63
85
64
- void generateHeader (StringBuffer buffer) {
65
- const header = """
86
+ const header = """
66
87
//
67
88
// The following code is generated, do not edit by hand.
68
89
//
@@ -71,6 +92,7 @@ void generateHeader(StringBuffer buffer) {
71
92
72
93
""" ;
73
94
95
+ void generateHeader (StringBuffer buffer) {
74
96
buffer.write (header);
75
97
}
76
98
@@ -173,7 +195,15 @@ void generatePublicExtension(
173
195
///
174
196
/// The user has to ensure the memory range is accessible while using the
175
197
/// returned list.
176
- $alignment external $typedListType asTypedList(int length);
198
+ ///
199
+ /// If provided, [finalizer] will be run on the pointer once the typed list
200
+ /// is GCed. If provided, [token] will be passed to [finalizer], otherwise
201
+ /// the this pointer itself will be passed.
202
+ $alignment external $typedListType asTypedList(
203
+ int length, {
204
+ @Since('3.1') Pointer<NativeFinalizerFunction>? finalizer,
205
+ @Since('3.1') Pointer<Void>? token,
206
+ });
177
207
""" ;
178
208
179
209
if (container == "Pointer" ) {
@@ -228,12 +258,20 @@ void generatePatchExtension(
228
258
? ""
229
259
: """
230
260
@patch
231
- $typedListType asTypedList(int length) {
261
+ $typedListType asTypedList(
262
+ int length, {
263
+ Pointer<NativeFinalizerFunction>? finalizer,
264
+ Pointer<Void>? token,
265
+ }) {
232
266
ArgumentError.checkNotNull(this, "Pointer<$nativeType >");
233
267
ArgumentError.checkNotNull(length, "length");
234
268
_checkExternalTypedDataLength(length, $elementSize );
235
269
_checkPointerAlignment(address, $elementSize );
236
- return _asExternalTypedData$nativeType (this, length);
270
+ final result = _asExternalTypedData$nativeType (this, length);
271
+ if (finalizer != null) {
272
+ _attachAsTypedListFinalizer(finalizer, result, token ?? this, $sizeTimes length);
273
+ }
274
+ return result;
237
275
}
238
276
""" ;
239
277
@@ -279,13 +317,13 @@ extension ${nativeType}Array on Array<$nativeType> {
279
317
}
280
318
}
281
319
282
- void generateFooter (StringBuffer buffer) {
283
- final footer = """
320
+ final footer = """
284
321
//
285
322
// End of generated code.
286
323
//
287
324
""" ;
288
325
326
+ void generateFooter (StringBuffer buffer) {
289
327
buffer.write (footer);
290
328
}
291
329
0 commit comments