// Copyright (c) 2016, 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.

part of models;

enum CodeKind { dart, native, stub, tag, collected }

bool isSyntheticCode(CodeKind kind) {
  switch (kind) {
    case CodeKind.collected:
    case CodeKind.native:
    case CodeKind.tag:
      return true;
    default:
      return false;
  }
}

bool isDartCode(CodeKind kind) => !isSyntheticCode(kind);

abstract class CodeRef extends ObjectRef {
  /// The name of this class.
  String get name;

  // What kind of code object is this?
  CodeKind get kind;

  bool get isOptimized;
}

abstract class Code extends Object implements CodeRef {
  FunctionRef get function;
  ObjectPoolRef get objectPool;
  Iterable<FunctionRef> get inlinedFunctions;
}
