blob: 1eedd8d1db92d874cd428be32627e6fe5c8ba5eb [file] [log] [blame]
// 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<String, String> 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<String, String> 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 <String, String>{}}) {
causalAsyncStacks ??=
environmentDefines['dart.developer.causal_async_stacks'] == 'true';
if (aot) {
emitSourcePositions = true;
emitLocalVarInfo = true;
causalAsyncStacks = true;
}
}
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 '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';
}
}
}
}