// Copyright (c) 2018, 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.gen_bytecode; import 'package:kernel/ast.dart' hide MapEntry; import 'package:kernel/class_hierarchy.dart' show ClassHierarchy; import 'package:kernel/clone.dart'; import 'package:kernel/core_types.dart' show CoreTypes; import 'package:kernel/library_index.dart' show LibraryIndex; import 'package:kernel/transformations/constants.dart' show ConstantEvaluator, ConstantsBackend, EvaluationEnvironment; import 'package:kernel/type_algebra.dart' show Substitution, containsTypeVariable; import 'package:kernel/type_environment.dart' show TypeEnvironment; import 'package:kernel/vm/constants_native_effects.dart' show VmConstantsBackend; import 'package:vm/bytecode/assembler.dart'; import 'package:vm/bytecode/constant_pool.dart'; import 'package:vm/bytecode/dbc.dart'; import 'package:vm/bytecode/exceptions.dart'; import 'package:vm/bytecode/local_vars.dart' show LocalVariables; import 'package:vm/metadata/bytecode.dart'; /// Flag to toggle generation of bytecode in kernel files. const bool isKernelBytecodeEnabled = false; /// Flag to toggle generation of bytecode in platform kernel files. const bool isKernelBytecodeEnabledForPlatform = isKernelBytecodeEnabled; const bool isTraceEnabled = false; void generateBytecode(Component component, {bool strongMode: true, bool dropAST: false}) { final coreTypes = new CoreTypes(component); void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {} final hierarchy = new ClassHierarchy(component, onAmbiguousSupertypes: ignoreAmbiguousSupertypes); final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy, strongMode: strongMode); final constantsBackend = new VmConstantsBackend(null, coreTypes); new BytecodeGenerator(component, coreTypes, hierarchy, typeEnvironment, constantsBackend, strongMode) .visitComponent(component); if (dropAST) { new DropAST().visitComponent(component); } } class BytecodeGenerator extends RecursiveVisitor { final Component component; final CoreTypes coreTypes; final ClassHierarchy hierarchy; final TypeEnvironment typeEnvironment; final ConstantsBackend constantsBackend; final bool strongMode; final BytecodeMetadataRepository metadata = new BytecodeMetadataRepository(); Class enclosingClass; Member enclosingMember; Set classTypeParameters; Set functionTypeParameters; List instantiatorTypeArguments; LocalVariables locals; ConstantEvaluator constantEvaluator; Map labeledStatements; Map switchCases; Map tryCatches; Map> finallyBlocks; List