diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart index d91154e4ff5..7fbf03c919a 100644 --- a/pkg/vm/lib/target/vm.dart +++ b/pkg/vm/lib/target/vm.dart @@ -21,6 +21,7 @@ import 'package:kernel/vm/constants_native_effects.dart' import '../transformations/call_site_annotator.dart' as callSiteAnnotator; import '../transformations/lowering.dart' as lowering show transformLibraries, transformProcedure; +import '../transformations/ffi.dart' as ffiHelper show importsFfi; import '../transformations/ffi_definitions.dart' as transformFfiDefinitions show transformLibraries; import '../transformations/ffi_use_sites.dart' as transformFfiUseSites @@ -153,17 +154,29 @@ class VmTarget extends Target { this, coreTypes, hierarchy, libraries, referenceFromIndex); logger?.call("Transformed mixin applications"); - final ffiTransformerData = transformFfiDefinitions.transformLibraries( - component, - coreTypes, - hierarchy, - libraries, - diagnosticReporter, - referenceFromIndex, - changedStructureNotifier); - transformFfiUseSites.transformLibraries(component, coreTypes, hierarchy, - libraries, diagnosticReporter, ffiTransformerData, referenceFromIndex); - logger?.call("Transformed ffi annotations"); + if (!ffiHelper.importsFfi(component, libraries)) { + logger?.call("Skipped ffi transformation"); + } else { + // TODO(jensj/dacoharkes): We can probably limit the transformations to + // libraries that transitivley depend on dart:ffi. + final ffiTransformerData = transformFfiDefinitions.transformLibraries( + component, + coreTypes, + hierarchy, + libraries, + diagnosticReporter, + referenceFromIndex, + changedStructureNotifier); + transformFfiUseSites.transformLibraries( + component, + coreTypes, + hierarchy, + libraries, + diagnosticReporter, + ffiTransformerData, + referenceFromIndex); + logger?.call("Transformed ffi annotations"); + } // TODO(kmillikin): Make this run on a per-method basis. bool productMode = environmentDefines["dart.vm.product"] == "true"; diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart index 209e4df3118..f2262e8368e 100644 --- a/pkg/vm/lib/transformations/ffi.dart +++ b/pkg/vm/lib/transformations/ffi.dart @@ -570,3 +570,17 @@ class FfiTransformerData { FfiTransformerData( this.replacedGetters, this.replacedSetters, this.emptyStructs); } + +/// Checks if any library depends on dart:ffi. +bool importsFfi(Component component, List libraries) { + Set allLibs = {...component.libraries, ...libraries}; + final Uri dartFfiUri = Uri.parse("dart:ffi"); + for (Library lib in allLibs) { + for (LibraryDependency dependency in lib.dependencies) { + if (dependency.targetLibrary.importUri == dartFfiUri) { + return true; + } + } + } + return false; +}