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

#ifndef VM_SNAPSHOT_IDS_H_
#define VM_SNAPSHOT_IDS_H_

#include "vm/raw_object.h"
#include "vm/dart_entry.h"

namespace dart {

// Index for predefined singleton objects used in a snapshot.
enum {
  kNullObject = 0,
  kSentinelObject,
  kTransitionSentinelObject,
  kEmptyArrayObject,
  kZeroArrayObject,
  kTrueValue,
  kFalseValue,
  // Marker for special encoding of double objects in message snapshots.
  kDoubleObject,
  // Object id has been optimized away; reader should use next available id.
  kOmittedObjectId,

  kClassIdsOffset = kOmittedObjectId,

  // The class ids of predefined classes are included in this list
  // at an offset of kClassIdsOffset.

  kObjectType = (kNumPredefinedCids + kClassIdsOffset),
  kNullType,
  kDynamicType,
  kVoidType,
  kFunctionType,
  kNumberType,
  kSmiType,
  kMintType,
  kDoubleType,
  kIntType,
  kBoolType,
  kStringType,
  kArrayType,

  kExtractorParameterTypes,
  kExtractorParameterNames,
  kEmptyContextScopeObject,
  kImplicitClosureScopeObject,
  kEmptyObjectPool,
  kEmptyDescriptors,
  kEmptyVarDescriptors,
  kEmptyExceptionHandlers,
  kCachedArgumentsDescriptor0,
  kCachedArgumentsDescriptorN = (kCachedArgumentsDescriptor0 +
      ArgumentsDescriptor::kCachedDescriptorCount - 1),
  kCachedICDataArray0,
  kCachedICDataArrayN = (kCachedICDataArray0 +
      ICData::kCachedICDataArrayCount - 1),

  kInstanceObjectId,
  kStaticImplicitClosureObjectId,
  kMaxPredefinedObjectIds,
  kInvalidIndex = -1,
};

}  // namespace dart

#endif  // VM_SNAPSHOT_IDS_H_
