| // Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| /// Collection of options for bytecode generator. | |
| class BytecodeOptions { | |
| static Map<String, String> commandLineFlags = { | |
| 'annotations': 'Emit Dart annotations', | |
| 'local-var-info': 'Emit debug information about local variables', | |
| 'show-bytecode-size-stat': 'Show bytecode size breakdown', | |
| 'source-positions': 'Emit source positions', | |
| 'instance-field-initializers': 'Emit separate instance field initializers', | |
| 'keep-unreachable-code': | |
| 'Do not remove unreachable code (useful if collecting code coverage)', | |
| 'closure-context-lowering': | |
| 'Use the closure context lowering in Kernel AST instead of computing it', | |
| 'embed-source-text': 'Embed the source text of scripts', | |
| 'record-coverage': 'Emit instructions and metadata for recording coverage', | |
| }; | |
| bool enableAsserts; | |
| bool emitSourcePositions; | |
| bool emitLocalVarInfo; | |
| bool emitAnnotations; | |
| bool emitInstanceFieldInitializers; | |
| bool omitAssertSourcePositions; | |
| bool keepUnreachableCode; | |
| bool showBytecodeSizeStatistics; | |
| bool isClosureContextLoweringEnabled; | |
| bool embedSourceText; | |
| bool recordCoverage; | |
| BytecodeOptions({ | |
| this.enableAsserts = false, | |
| this.emitSourcePositions = false, | |
| this.emitLocalVarInfo = false, | |
| this.emitAnnotations = false, | |
| this.emitInstanceFieldInitializers = false, | |
| this.omitAssertSourcePositions = false, | |
| this.keepUnreachableCode = false, | |
| this.showBytecodeSizeStatistics = false, | |
| this.isClosureContextLoweringEnabled = false, | |
| this.embedSourceText = false, | |
| this.recordCoverage = false, | |
| }) {} | |
| void parseCommandLineFlags(List<String>? flags) { | |
| if (flags == null) { | |
| return; | |
| } | |
| for (String flag in flags) { | |
| switch (flag) { | |
| case 'source-positions': | |
| emitSourcePositions = true; | |
| break; | |
| case 'local-var-info': | |
| emitLocalVarInfo = true; | |
| break; | |
| case 'annotations': | |
| emitAnnotations = true; | |
| break; | |
| case 'instance-field-initializers': | |
| emitInstanceFieldInitializers = true; | |
| break; | |
| case 'keep-unreachable-code': | |
| keepUnreachableCode = true; | |
| break; | |
| case 'show-bytecode-size-stat': | |
| showBytecodeSizeStatistics = true; | |
| break; | |
| case 'closure-context-lowering': | |
| isClosureContextLoweringEnabled = true; | |
| break; | |
| case 'embed-source-text': | |
| embedSourceText = true; | |
| break; | |
| case 'record-coverage': | |
| recordCoverage = true; | |
| break; | |
| default: | |
| throw 'Unexpected bytecode flag $flag'; | |
| } | |
| } | |
| } | |
| } |