Skip to content

Commit 1fff52a

Browse files
dcharkescommit-bot@chromium.org
authored andcommitted
[vm/ffi] Rewrite Pointer.elementAt calls in CFE
This rewrites `elementAt` calls in the CFE to skip the runtime entry for `sizeOf` when the type argument is constant. The runtime entry is still used when the type argument is generic. Forcing the type argument to be constant and removing the runtime entry will be done in follow up CLs. Bug: #44621 Bug: #38721 TEST=tests/ffi/data_test.dart Change-Id: I480db43e7c115c24bd45f0ddab0cfea7eb8cfa58 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/182263 Reviewed-by: Clement Skau <[email protected]>
1 parent 64bf734 commit 1fff52a

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

pkg/vm/lib/transformations/ffi.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ class FfiTransformer extends Transformer {
206206
final Field pragmaOptions;
207207
final Procedure listElementAt;
208208
final Procedure numAddition;
209+
final Procedure numMultiplication;
209210

210211
final Library ffiLibrary;
211212
final Class allocatorClass;
@@ -267,6 +268,7 @@ class FfiTransformer extends Transformer {
267268
pragmaOptions = coreTypes.pragmaOptions,
268269
listElementAt = coreTypes.index.getMember('dart:core', 'List', '[]'),
269270
numAddition = coreTypes.index.getMember('dart:core', 'num', '+'),
271+
numMultiplication = coreTypes.index.getMember('dart:core', 'num', '*'),
270272
ffiLibrary = index.getLibrary('dart:ffi'),
271273
allocatorClass = index.getClass('dart:ffi', 'Allocator'),
272274
nativeFunctionClass = index.getClass('dart:ffi', 'NativeFunction'),

pkg/vm/lib/transformations/ffi_use_sites.dart

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import 'ffi.dart'
3131
FfiTransformerData,
3232
NativeType,
3333
FfiTransformer,
34-
optimizedTypes,
3534
nativeTypeSizes,
3635
WORD_SIZE,
3736
UNKNOWN,
@@ -432,20 +431,26 @@ class _FfiUseSiteTransformer extends FfiTransformer {
432431

433432
_warningNativeTypeValid(nativeType, node);
434433

434+
// TODO(http://dartbug.com/38721): Change this to an error.
435435
if (nativeType is TypeParameterType) {
436436
// Do not rewire generic invocations.
437437
return node;
438438
}
439-
final Class nativeClass = (nativeType as InterfaceType).classNode;
440-
final NativeType nt = getType(nativeClass);
441-
if (optimizedTypes.contains(nt)) {
442-
final typeArguments = [
443-
if (nt == NativeType.kPointer) _pointerTypeGetTypeArg(nativeType)
444-
];
445-
return StaticInvocation(
446-
elementAtMethods[nt],
447-
Arguments([node.receiver, node.arguments.positional[0]],
448-
types: typeArguments));
439+
440+
Expression inlineSizeOf = _inlineSizeOf(nativeType);
441+
if (inlineSizeOf != null) {
442+
// Generates `receiver.offsetBy(inlineSizeOfExpression)`.
443+
return MethodInvocation(
444+
node.receiver,
445+
offsetByMethod.name,
446+
Arguments([
447+
MethodInvocation(
448+
node.arguments.positional.single,
449+
numMultiplication.name,
450+
Arguments([inlineSizeOf]),
451+
numMultiplication)
452+
], types: node.arguments.types),
453+
offsetByMethod);
449454
}
450455
}
451456
} on _FfiStaticTypeError {

0 commit comments

Comments
 (0)