// Copyright (c) 2019, 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. library vm.bytecode.options; /// Collection of options for bytecode generator. class BytecodeOptions { static Map commandLineFlags = { 'annotations': 'Emit Dart annotations', 'local-var-info': 'Emit debug information about local variables', 'debugger-stops': 'Emit bytecode instructions for stopping in the debugger', '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)', 'avoid-closure-call-instructions': 'Do not emit closure call instructions (useful if collecting code ' 'coverage, as closure call instructions are not tracked by code ' 'coverage)', }; bool enableAsserts; bool causalAsyncStacks; bool emitSourcePositions; bool emitSourceFiles; bool emitLocalVarInfo; bool emitDebuggerStops; bool emitAnnotations; bool emitInstanceFieldInitializers; bool omitAssertSourcePositions; bool keepUnreachableCode; bool avoidClosureCallInstructions; bool showBytecodeSizeStatistics; Map environmentDefines; BytecodeOptions( {this.enableAsserts = false, this.causalAsyncStacks, this.emitSourcePositions = false, this.emitSourceFiles = false, this.emitLocalVarInfo = false, this.emitDebuggerStops = false, this.emitAnnotations = false, this.emitInstanceFieldInitializers = false, this.omitAssertSourcePositions = false, this.keepUnreachableCode = false, this.avoidClosureCallInstructions = false, this.showBytecodeSizeStatistics = false, bool aot = false, this.environmentDefines = const {}}) { causalAsyncStacks ??= environmentDefines['dart.developer.causal_async_stacks'] == 'true'; if (aot) { emitSourcePositions = true; emitLocalVarInfo = true; causalAsyncStacks = true; } } void parseCommandLineFlags(List 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 'debugger-stops': emitDebuggerStops = true; break; case 'annotations': emitAnnotations = true; break; case 'instance-field-initializers': emitInstanceFieldInitializers = true; break; case 'keep-unreachable-code': keepUnreachableCode = true; break; case 'avoid-closure-call-instructions': avoidClosureCallInstructions = true; break; case 'show-bytecode-size-stat': showBytecodeSizeStatistics = true; break; default: throw 'Unexpected bytecode flag $flag'; } } } }