@@ -77,6 +77,18 @@ const int kRejectTag = 7;
7777
7878bool allowDartInternalImport = false ;
7979
80+ // Bytecode generator, optionally injected in
81+ // pkg/dart2bytecode/bin/kernel_service.dart.
82+ Uint8List Function (
83+ Component component,
84+ List <Library > libraries,
85+ CoreTypes coreTypes,
86+ ClassHierarchy hierarchy,
87+ Target target,
88+ bool enableAsserts,
89+ )?
90+ bytecodeGenerator;
91+
8092CompilerOptions setupCompilerOptions (
8193 FileSystem fileSystem,
8294 Uri ? platformKernelPath,
@@ -165,6 +177,7 @@ abstract class Compiler {
165177 final String invocationModes;
166178 final String verbosityLevel;
167179 final bool enableMirrors;
180+ final bool generateBytecode;
168181
169182 // Code coverage and hot reload are only supported by incremental compiler,
170183 // which is used if vm-service is enabled.
@@ -189,6 +202,7 @@ abstract class Compiler {
189202 this .invocationModes = '' ,
190203 this .verbosityLevel = Verbosity .defaultValue,
191204 required this .enableMirrors,
205+ required this .generateBytecode,
192206 }) {
193207 Uri ? packagesUri = null ;
194208 final packageConfig = this .packageConfig ?? Platform .packageConfig;
@@ -309,6 +323,7 @@ class IncrementalCompilerWrapper extends Compiler {
309323 String invocationModes = '' ,
310324 String verbosityLevel = Verbosity .defaultValue,
311325 required bool enableMirrors,
326+ required super .generateBytecode,
312327 }) : super (
313328 isolateGroupId,
314329 fileSystem,
@@ -333,6 +348,7 @@ class IncrementalCompilerWrapper extends Compiler {
333348 String ? packageConfig,
334349 String invocationModes = '' ,
335350 required bool enableMirrors,
351+ required bool generateBytecode,
336352 }) {
337353 IncrementalCompilerWrapper result = IncrementalCompilerWrapper (
338354 isolateGroupId,
@@ -343,6 +359,7 @@ class IncrementalCompilerWrapper extends Compiler {
343359 packageConfig: packageConfig,
344360 invocationModes: invocationModes,
345361 enableMirrors: enableMirrors,
362+ generateBytecode: generateBytecode,
346363 );
347364 result.generator = new IncrementalCompiler .forExpressionCompilationOnly (
348365 component,
@@ -381,6 +398,7 @@ class IncrementalCompilerWrapper extends Compiler {
381398 packageConfig: packageConfig,
382399 invocationModes: invocationModes,
383400 enableMirrors: enableMirrors,
401+ generateBytecode: generateBytecode,
384402 );
385403 final generator = this .generator! ;
386404 // TODO(VM TEAM): This does not seem safe. What if cloning while having
@@ -424,6 +442,7 @@ class SingleShotCompilerWrapper extends Compiler {
424442 String invocationModes = '' ,
425443 String verbosityLevel = Verbosity .defaultValue,
426444 required bool enableMirrors,
445+ required super .generateBytecode,
427446 }) : super (
428447 isolateGroupId,
429448 fileSystem,
@@ -483,6 +502,7 @@ Future<Compiler> lookupOrBuildNewIncrementalCompiler(
483502 String invocationModes = '' ,
484503 String verbosityLevel = Verbosity .defaultValue,
485504 required bool enableMirrors,
505+ required bool generateBytecode,
486506}) async {
487507 IncrementalCompilerWrapper ? compiler = lookupIncrementalCompiler (
488508 isolateGroupId,
@@ -520,6 +540,7 @@ Future<Compiler> lookupOrBuildNewIncrementalCompiler(
520540 invocationModes: invocationModes,
521541 verbosityLevel: verbosityLevel,
522542 enableMirrors: enableMirrors,
543+ generateBytecode: generateBytecode,
523544 );
524545 }
525546 isolateCompilers[isolateGroupId] = compiler;
@@ -578,6 +599,7 @@ Future _processExpressionCompilationRequest(request) async {
578599 final List <String >? experimentalFlags =
579600 request[19 ] != null ? request[19 ].cast <String >() : null ;
580601 final bool enableMirrors = request[20 ];
602+ final bool generateBytecode = request[21 ];
581603
582604 IncrementalCompilerWrapper ? compiler = isolateCompilers[isolateGroupId];
583605
@@ -676,6 +698,7 @@ Future _processExpressionCompilationRequest(request) async {
676698 experimentalFlags: experimentalFlags,
677699 packageConfig: packageConfigFile,
678700 enableMirrors: enableMirrors,
701+ generateBytecode: generateBytecode,
679702 );
680703 isolateCompilers[isolateGroupId] = compiler;
681704 await compiler.compile (
@@ -737,7 +760,20 @@ Future _processExpressionCompilationRequest(request) async {
737760 result = new CompilationResult .errors (compiler.errorsPlain);
738761 } else {
739762 Component component = createExpressionEvaluationComponent (procedure);
740- result = new CompilationResult .ok (serializeComponent (component));
763+ Uint8List bytes;
764+ if (compiler.generateBytecode) {
765+ bytes = bytecodeGenerator! .call (
766+ component,
767+ component.libraries,
768+ compiler.generator! .lastKnownGoodResult! .coreTypes,
769+ compiler.generator! .lastKnownGoodResult! .classHierarchy,
770+ compiler.options.target! ,
771+ compiler.enableAsserts,
772+ );
773+ } else {
774+ bytes = serializeComponent (component);
775+ }
776+ result = new CompilationResult .ok (bytes);
741777 }
742778 } catch (error, stack) {
743779 result = new CompilationResult .crash (error, stack);
@@ -867,6 +903,7 @@ Future _processLoadRequest(request) async {
867903 final String ? multirootScheme = request[13 ];
868904 final String verbosityLevel = request[14 ];
869905 final bool enableMirrors = request[15 ];
906+ final bool generateBytecode = request[16 ];
870907 Uri platformKernelPath;
871908 List <int >? platformKernel = null ;
872909 if (request[3 ] is String ) {
@@ -952,6 +989,7 @@ Future _processLoadRequest(request) async {
952989 invocationModes: invocationModes,
953990 verbosityLevel: verbosityLevel,
954991 enableMirrors: enableMirrors,
992+ generateBytecode: generateBytecode,
955993 );
956994 fileSystem = compiler.fileSystem;
957995 } else {
@@ -973,6 +1011,7 @@ Future _processLoadRequest(request) async {
9731011 invocationModes: invocationModes,
9741012 verbosityLevel: verbosityLevel,
9751013 enableMirrors: enableMirrors,
1014+ generateBytecode: generateBytecode,
9761015 );
9771016 }
9781017
@@ -1028,13 +1067,30 @@ Future _processLoadRequest(request) async {
10281067 // these sources built-in. Everything loaded as a summary in
10291068 // [kernelForProgram] is marked `external`, so we can use that bit to
10301069 // decide what to exclude.
1031- result = new CompilationResult .ok (
1032- serializeComponent (
1070+ Uint8List bytes;
1071+ if (compiler.generateBytecode) {
1072+ final generator = bytecodeGenerator;
1073+ if (generator == null ) {
1074+ throw 'Cannot generate bytecode as dynamic modules are disabled.' ;
1075+ }
1076+ bytes = generator (
1077+ compilerResult.component! ,
1078+ compilerResult.component! .libraries
1079+ .where ((lib) => ! loadedLibraries.contains (lib))
1080+ .toList (),
1081+ compilerResult.coreTypes! ,
1082+ compilerResult.classHierarchy! ,
1083+ compiler.options.target! ,
1084+ compiler.enableAsserts,
1085+ );
1086+ } else {
1087+ bytes = serializeComponent (
10331088 compilerResult.component! ,
10341089 filter: (lib) => ! loadedLibraries.contains (lib),
10351090 nativeAssetsComponent: nativeAssetsComponent,
1036- ),
1037- );
1091+ );
1092+ }
1093+ result = new CompilationResult .ok (bytes);
10381094 }
10391095 } catch (error, stack) {
10401096 result = new CompilationResult .crash (error, stack);
@@ -1232,7 +1288,7 @@ Future trainInternal(String scriptUri, String? platformKernelPath) async {
12321288 null /* multirootScheme */ ,
12331289 'all' /* CFE logging mode */ ,
12341290 true /* enableMirrors */ ,
1235- null /* native assets yaml */ ,
1291+ false /* generateBytecode */ ,
12361292 ];
12371293 await _processLoadRequest (request);
12381294}
0 commit comments