// 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 RUNTIME_VM_OBJECT_STORE_H_
#define RUNTIME_VM_OBJECT_STORE_H_

#include "vm/object.h"

namespace dart {

// Forward declarations.
class Isolate;
class ObjectPointerVisitor;

// The object store is a per isolate instance which stores references to
// objects used by the VM.
// TODO(iposva): Move the actual store into the object heap for quick handling
// by snapshots eventually.
class ObjectStore {
 public:
  enum BootstrapLibraryId {
    kNone = 0,
    kAsync,
    kCore,
    kCollection,
    kConvert,
    kDeveloper,
    kInternal,
    kIsolate,
    kMath,
    kMirrors,
    kProfiler,
    kTypedData,
    kVMService,
  };

  ~ObjectStore();

  RawClass* object_class() const {
    ASSERT(object_class_ != Object::null());
    return object_class_;
  }
  void set_object_class(const Class& value) { object_class_ = value.raw(); }
  static intptr_t object_class_offset() {
    return OFFSET_OF(ObjectStore, object_class_);
  }

  RawType* object_type() const { return object_type_; }
  void set_object_type(const Type& value) {
    object_type_ = value.raw();
  }

  RawClass* null_class() const {
    ASSERT(null_class_ != Object::null());
    return null_class_;
  }
  void set_null_class(const Class& value) { null_class_ = value.raw(); }

  RawType* null_type() const { return null_type_; }
  void set_null_type(const Type& value) {
    null_type_ = value.raw();
  }

  RawType* function_type() const { return function_type_; }
  void set_function_type(const Type& value) {
    function_type_ = value.raw();
  }

  RawClass* closure_class() const { return closure_class_; }
  void set_closure_class(const Class& value) {
    closure_class_ = value.raw();
  }

  RawType* number_type() const { return number_type_; }
  void set_number_type(const Type& value) {
    number_type_ = value.raw();
  }

  RawType* int_type() const { return int_type_; }
  void set_int_type(const Type& value) {
    int_type_ = value.raw();
  }
  static intptr_t int_type_offset() {
    return OFFSET_OF(ObjectStore, int_type_);
  }

  RawClass* integer_implementation_class() const {
    return integer_implementation_class_;
  }
  void set_integer_implementation_class(const Class& value) {
    integer_implementation_class_ = value.raw();
  }

  RawClass* smi_class() const { return smi_class_; }
  void set_smi_class(const Class& value) { smi_class_ = value.raw(); }

  RawType* smi_type() const { return smi_type_; }
  void set_smi_type(const Type& value) { smi_type_ = value.raw(); }

  RawClass* double_class() const { return double_class_; }
  void set_double_class(const Class& value) { double_class_ = value.raw(); }

  RawType* double_type() const { return double_type_; }
  void set_double_type(const Type& value) { double_type_ = value.raw(); }
  static intptr_t double_type_offset() {
    return OFFSET_OF(ObjectStore, double_type_);
  }

  RawClass* mint_class() const { return mint_class_; }
  void set_mint_class(const Class& value) { mint_class_ = value.raw(); }

  RawType* mint_type() const { return mint_type_; }
  void set_mint_type(const Type& value) { mint_type_ = value.raw(); }

  RawClass* bigint_class() const { return bigint_class_; }
  void set_bigint_class(const Class& value) { bigint_class_ = value.raw(); }

  RawType* string_type() const { return string_type_; }
  void set_string_type(const Type& value) {
    string_type_ = value.raw();
  }
  static intptr_t string_type_offset() {
    return OFFSET_OF(ObjectStore, string_type_);
  }

  RawClass* compiletime_error_class() const {
    return compiletime_error_class_;
  }
  void set_compiletime_error_class(const Class& value) {
    compiletime_error_class_ = value.raw();
  }

  RawClass* future_class() const { return future_class_; }
  void set_future_class(const Class& value) {
    future_class_ = value.raw();
  }

  RawClass* completer_class() const { return completer_class_; }
  void set_completer_class(const Class& value) {
    completer_class_ = value.raw();
  }

  RawClass* stream_iterator_class() const { return stream_iterator_class_; }
  void set_stream_iterator_class(const Class& value) {
    stream_iterator_class_ = value.raw();
  }

  RawClass* symbol_class() { return symbol_class_; }
  void set_symbol_class(const Class& value) {
    symbol_class_ = value.raw();
  }

  RawClass* one_byte_string_class() const { return one_byte_string_class_; }
  void set_one_byte_string_class(const Class& value) {
    one_byte_string_class_ = value.raw();
  }

  RawClass* two_byte_string_class() const { return two_byte_string_class_; }
  void set_two_byte_string_class(const Class& value) {
    two_byte_string_class_ = value.raw();
  }

  RawClass* external_one_byte_string_class() const {
    return external_one_byte_string_class_;
  }
  void set_external_one_byte_string_class(const Class& value) {
    external_one_byte_string_class_ = value.raw();
  }

  RawClass* external_two_byte_string_class() const {
    return external_two_byte_string_class_;
  }
  void set_external_two_byte_string_class(const Class& value) {
    external_two_byte_string_class_ = value.raw();
  }

  RawType* bool_type() const { return bool_type_; }
  void set_bool_type(const Type& value) { bool_type_ = value.raw(); }

  RawClass* bool_class() const { return bool_class_; }
  void set_bool_class(const Class& value) { bool_class_ = value.raw(); }

  RawClass* array_class() const { return array_class_; }
  void set_array_class(const Class& value) { array_class_ = value.raw(); }
  static intptr_t array_class_offset() {
    return OFFSET_OF(ObjectStore, array_class_);
  }

  RawType* array_type() const { return array_type_; }
  void set_array_type(const Type& value) { array_type_ = value.raw(); }

  RawClass* immutable_array_class() const { return immutable_array_class_; }
  void set_immutable_array_class(const Class& value) {
    immutable_array_class_ = value.raw();
  }

  RawClass* growable_object_array_class() const {
    return growable_object_array_class_;
  }
  void set_growable_object_array_class(const Class& value) {
    growable_object_array_class_ = value.raw();
  }
  static intptr_t growable_object_array_class_offset() {
    return OFFSET_OF(ObjectStore, growable_object_array_class_);
  }

  RawClass* linked_hash_map_class() const {
    return linked_hash_map_class_;
  }
  void set_linked_hash_map_class(const Class& value) {
    linked_hash_map_class_ = value.raw();
  }

  RawClass* float32x4_class() const {
    return float32x4_class_;
  }
  void set_float32x4_class(const Class& value) {
    float32x4_class_ = value.raw();
  }

  RawType* float32x4_type() const { return float32x4_type_; }
  void set_float32x4_type(const Type& value) { float32x4_type_ = value.raw(); }

  RawClass* int32x4_class() const {
    return int32x4_class_;
  }
  void set_int32x4_class(const Class& value) {
    int32x4_class_ = value.raw();
  }

  RawType* int32x4_type() const { return int32x4_type_; }
  void set_int32x4_type(const Type& value) { int32x4_type_ = value.raw(); }

  RawClass* float64x2_class() const {
    return float64x2_class_;
  }
  void set_float64x2_class(const Class& value) {
    float64x2_class_ = value.raw();
  }

  RawType* float64x2_type() const { return float64x2_type_; }
  void set_float64x2_type(const Type& value) { float64x2_type_ = value.raw(); }

  RawClass* error_class() const {
    return error_class_;
  }
  void set_error_class(const Class& value) {
    error_class_ = value.raw();
  }
  static intptr_t error_class_offset() {
    return OFFSET_OF(ObjectStore, error_class_);
  }

  RawClass* weak_property_class() const {
    return weak_property_class_;
  }
  void set_weak_property_class(const Class& value) {
    weak_property_class_ = value.raw();
  }

  RawArray* symbol_table() const { return symbol_table_; }
  void set_symbol_table(const Array& value) { symbol_table_ = value.raw(); }

  RawArray* canonical_types() const {
    return canonical_types_;
  }
  void set_canonical_types(const Array& value) {
    canonical_types_ = value.raw();
  }

  RawArray* canonical_type_arguments() const {
    return canonical_type_arguments_;
  }
  void set_canonical_type_arguments(const Array& value) {
    canonical_type_arguments_ = value.raw();
  }

  RawLibrary* async_library() const { return async_library_; }
  RawLibrary* builtin_library() const { return builtin_library_; }
  RawLibrary* core_library() const { return core_library_; }
  RawLibrary* collection_library() const { return collection_library_; }
  RawLibrary* convert_library() const { return convert_library_; }
  RawLibrary* developer_library() const { return developer_library_; }
  RawLibrary* internal_library() const { return internal_library_; }
  RawLibrary* isolate_library() const { return isolate_library_; }
  RawLibrary* math_library() const { return math_library_; }
  RawLibrary* mirrors_library() const { return mirrors_library_; }
  RawLibrary* profiler_library() const { return profiler_library_; }
  RawLibrary* typed_data_library() const { return typed_data_library_; }
  RawLibrary* vmservice_library() const { return vmservice_library_; }

  void set_bootstrap_library(BootstrapLibraryId index, const Library& value) {
    switch (index) {
      case kAsync:
        async_library_ = value.raw();
        break;
      case kCore:
        core_library_ = value.raw();
        break;
      case kCollection:
        collection_library_ = value.raw();
        break;
      case kConvert:
        convert_library_ = value.raw();
        break;
      case kDeveloper:
        developer_library_ = value.raw();
        break;
      case kInternal:
        internal_library_ = value.raw();
        break;
      case kIsolate:
        isolate_library_ = value.raw();
        break;
      case kMath:
        math_library_ = value.raw();
        break;
      case kMirrors:
        mirrors_library_ = value.raw();
        break;
      case kProfiler:
        profiler_library_ = value.raw();
        break;
      case kTypedData:
        typed_data_library_ = value.raw();
        break;
      case kVMService:
        vmservice_library_ = value.raw();
        break;
      default:
        UNREACHABLE();
    }
  }

  void set_builtin_library(const Library& value) {
    builtin_library_ = value.raw();
  }

  RawLibrary* native_wrappers_library() const {
    return native_wrappers_library_;
  }
  void set_native_wrappers_library(const Library& value) {
    native_wrappers_library_ = value.raw();
  }

  RawLibrary* root_library() const { return root_library_; }
  void set_root_library(const Library& value) {
    root_library_ = value.raw();
  }

  RawGrowableObjectArray* libraries() const { return libraries_; }
  void set_libraries(const GrowableObjectArray& value) {
    libraries_ = value.raw();
  }

  RawArray* libraries_map() const { return libraries_map_; }
  void set_libraries_map(const Array& value) {
    libraries_map_ = value.raw();
  }

  RawGrowableObjectArray* closure_functions() const {
    return closure_functions_;
  }
  void set_closure_functions(const GrowableObjectArray& value) {
    ASSERT(!value.IsNull());
    closure_functions_ = value.raw();
  }

  RawGrowableObjectArray* pending_classes() const { return pending_classes_; }
  void set_pending_classes(const GrowableObjectArray& value) {
    ASSERT(!value.IsNull());
    pending_classes_ = value.raw();
  }

  RawGrowableObjectArray* pending_deferred_loads() const {
    return pending_deferred_loads_;
  }
  void clear_pending_deferred_loads() {
    pending_deferred_loads_ = GrowableObjectArray::New();
  }

  RawGrowableObjectArray* resume_capabilities() const {
    return resume_capabilities_;
  }

  RawGrowableObjectArray* exit_listeners() const {
    return exit_listeners_;
  }

  RawGrowableObjectArray* error_listeners() const {
    return error_listeners_;
  }

  RawContext* empty_context() const { return empty_context_; }
  void set_empty_context(const Context& value) {
    empty_context_ = value.raw();
  }

  RawInstance* stack_overflow() const { return stack_overflow_; }
  void set_stack_overflow(const Instance& value) {
    stack_overflow_ = value.raw();
  }

  RawInstance* out_of_memory() const { return out_of_memory_; }
  void set_out_of_memory(const Instance& value) {
    out_of_memory_ = value.raw();
  }

  RawUnhandledException* preallocated_unhandled_exception() const {
    return preallocated_unhandled_exception_;
  }
  void set_preallocated_unhandled_exception(const UnhandledException& value) {
    preallocated_unhandled_exception_ = value.raw();
  }

  RawStacktrace* preallocated_stack_trace() const {
    return preallocated_stack_trace_;
  }
  void set_preallocated_stack_trace(const Stacktrace& value) {
    preallocated_stack_trace_ = value.raw();
  }

  RawFunction* lookup_port_handler() const {
    return lookup_port_handler_;
  }
  void set_lookup_port_handler(const Function& function) {
    lookup_port_handler_ = function.raw();
  }

  RawTypedData* empty_uint32_array() const {
    return empty_uint32_array_;
  }
  void set_empty_uint32_array(const TypedData& array) {
    // Only set once.
    ASSERT(empty_uint32_array_ == TypedData::null());
    ASSERT(!array.IsNull());
    empty_uint32_array_ = array.raw();
  }

  RawFunction* handle_message_function() const {
    return handle_message_function_;
  }
  void set_handle_message_function(const Function& function) {
    handle_message_function_ = function.raw();
  }

  RawArray* library_load_error_table() const {
    return library_load_error_table_;
  }
  void set_library_load_error_table(const Array& table) {
    library_load_error_table_ = table.raw();
  }
  static intptr_t library_load_error_table_offset() {
    return OFFSET_OF(ObjectStore, library_load_error_table_);
  }

  RawArray* unique_dynamic_targets() const {
    return unique_dynamic_targets_;
  }
  void set_unique_dynamic_targets(const Array& value) {
    unique_dynamic_targets_ = value.raw();
  }

  RawGrowableObjectArray* token_objects() const {
    return token_objects_;
  }
  void set_token_objects(const GrowableObjectArray& value) {
    token_objects_ = value.raw();
  }

  RawArray* token_objects_map() const {
    return token_objects_map_;
  }
  void set_token_objects_map(const Array& value) {
    token_objects_map_ = value.raw();
  }

  RawGrowableObjectArray* megamorphic_cache_table() const {
    return megamorphic_cache_table_;
  }
  void set_megamorphic_cache_table(const GrowableObjectArray& value) {
    megamorphic_cache_table_ = value.raw();
  }
  RawCode* megamorphic_miss_code() const {
    return megamorphic_miss_code_;
  }
  RawFunction* megamorphic_miss_function() const {
    return megamorphic_miss_function_;
  }
  void SetMegamorphicMissHandler(const Code& code, const Function& func) {
    // Hold onto the code so it is traced and not detached from the function.
    megamorphic_miss_code_ = code.raw();
    megamorphic_miss_function_ = func.raw();
  }

  RawFunction* simple_instance_of_function() const {
    return simple_instance_of_function_;
  }
  RawFunction* simple_instance_of_true_function() const {
    return simple_instance_of_true_function_;
  }
  RawFunction* simple_instance_of_false_function() const {
    return simple_instance_of_false_function_;
  }

  // Visit all object pointers.
  void VisitObjectPointers(ObjectPointerVisitor* visitor);

  // Called to initialize objects required by the vm but which invoke
  // dart code.  If an error occurs the error object is returned otherwise
  // a null object is returned.
  RawError* PreallocateObjects();

  void InitKnownObjects();

  static void Init(Isolate* isolate);

#ifndef PRODUCT
  void PrintToJSONObject(JSONObject* jsobj);
#endif

 private:
  ObjectStore();

  // Finds a core library private method in Object.
  RawFunction* PrivateObjectLookup(const String& name);

#define OBJECT_STORE_FIELD_LIST(V)                                             \
  V(RawClass*, object_class_)                                                  \
  V(RawType*, object_type_)                                                    \
  V(RawClass*, null_class_)                                                    \
  V(RawType*, null_type_)                                                      \
  V(RawType*, function_type_)                                                  \
  V(RawClass*, closure_class_)                                                 \
  V(RawType*, number_type_)                                                    \
  V(RawType*, int_type_)                                                       \
  V(RawClass*, integer_implementation_class_)                                  \
  V(RawClass*, smi_class_)                                                     \
  V(RawType*, smi_type_)                                                       \
  V(RawClass*, mint_class_)                                                    \
  V(RawType*, mint_type_)                                                      \
  V(RawClass*, bigint_class_)                                                  \
  V(RawClass*, double_class_)                                                  \
  V(RawType*, double_type_)                                                    \
  V(RawType*, float32x4_type_)                                                 \
  V(RawType*, int32x4_type_)                                                   \
  V(RawType*, float64x2_type_)                                                 \
  V(RawType*, string_type_)                                                    \
  V(RawClass*, compiletime_error_class_)                                       \
  V(RawClass*, future_class_)                                                  \
  V(RawClass*, completer_class_)                                               \
  V(RawClass*, stream_iterator_class_)                                         \
  V(RawClass*, symbol_class_)                                                  \
  V(RawClass*, one_byte_string_class_)                                         \
  V(RawClass*, two_byte_string_class_)                                         \
  V(RawClass*, external_one_byte_string_class_)                                \
  V(RawClass*, external_two_byte_string_class_)                                \
  V(RawType*, bool_type_)                                                      \
  V(RawClass*, bool_class_)                                                    \
  V(RawClass*, array_class_)                                                   \
  V(RawType*, array_type_)                                                     \
  V(RawClass*, immutable_array_class_)                                         \
  V(RawClass*, growable_object_array_class_)                                   \
  V(RawClass*, linked_hash_map_class_)                                         \
  V(RawClass*, float32x4_class_)                                               \
  V(RawClass*, int32x4_class_)                                                 \
  V(RawClass*, float64x2_class_)                                               \
  V(RawClass*, error_class_)                                                   \
  V(RawClass*, weak_property_class_)                                           \
  V(RawArray*, symbol_table_)                                                  \
  V(RawArray*, canonical_types_)                                               \
  V(RawArray*, canonical_type_arguments_)                                      \
  V(RawLibrary*, async_library_)                                               \
  V(RawLibrary*, builtin_library_)                                             \
  V(RawLibrary*, core_library_)                                                \
  V(RawLibrary*, collection_library_)                                          \
  V(RawLibrary*, convert_library_)                                             \
  V(RawLibrary*, developer_library_)                                           \
  V(RawLibrary*, internal_library_)                                            \
  V(RawLibrary*, isolate_library_)                                             \
  V(RawLibrary*, math_library_)                                                \
  V(RawLibrary*, mirrors_library_)                                             \
  V(RawLibrary*, native_wrappers_library_)                                     \
  V(RawLibrary*, profiler_library_)                                            \
  V(RawLibrary*, root_library_)                                                \
  V(RawLibrary*, typed_data_library_)                                          \
  V(RawLibrary*, vmservice_library_)                                           \
  V(RawGrowableObjectArray*, libraries_)                                       \
  V(RawArray*, libraries_map_)                                                 \
  V(RawGrowableObjectArray*, closure_functions_)                               \
  V(RawGrowableObjectArray*, pending_classes_)                                 \
  V(RawGrowableObjectArray*, pending_deferred_loads_)                          \
  V(RawGrowableObjectArray*, resume_capabilities_)                             \
  V(RawGrowableObjectArray*, exit_listeners_)                                  \
  V(RawGrowableObjectArray*, error_listeners_)                                 \
  V(RawContext*, empty_context_)                                               \
  V(RawInstance*, stack_overflow_)                                             \
  V(RawInstance*, out_of_memory_)                                              \
  V(RawUnhandledException*, preallocated_unhandled_exception_)                 \
  V(RawStacktrace*, preallocated_stack_trace_)                                 \
  V(RawFunction*, lookup_port_handler_)                                        \
  V(RawTypedData*, empty_uint32_array_)                                        \
  V(RawFunction*, handle_message_function_)                                    \
  V(RawFunction*, simple_instance_of_function_)                                \
  V(RawFunction*, simple_instance_of_true_function_)                           \
  V(RawFunction*, simple_instance_of_false_function_)                          \
  V(RawArray*, library_load_error_table_)                                      \
  V(RawArray*, unique_dynamic_targets_)                                        \
  V(RawGrowableObjectArray*, token_objects_)                                   \
  V(RawArray*, token_objects_map_)                                             \
  V(RawGrowableObjectArray*, megamorphic_cache_table_)                         \
  V(RawCode*, megamorphic_miss_code_)                                          \
  V(RawFunction*, megamorphic_miss_function_)                                  \
  // Please remember the last entry must be referred in the 'to' function below.

  RawObject** from() { return reinterpret_cast<RawObject**>(&object_class_); }
#define DECLARE_OBJECT_STORE_FIELD(type, name)                                 \
  type name;
OBJECT_STORE_FIELD_LIST(DECLARE_OBJECT_STORE_FIELD)
#undef DECLARE_OBJECT_STORE_FIELD
  RawObject** to() {
    return reinterpret_cast<RawObject**>(&megamorphic_miss_function_);
  }
  RawObject** to_snapshot(Snapshot::Kind kind) {
    switch (kind) {
      case Snapshot::kCore:
        return reinterpret_cast<RawObject**>(&library_load_error_table_);
      case Snapshot::kAppWithJIT:
      case Snapshot::kAppNoJIT:
        return to();
      case Snapshot::kScript:
      case Snapshot::kMessage:
      case Snapshot::kNone:
      case Snapshot::kInvalid:
        break;
    }
    UNREACHABLE();
    return NULL;
  }

  friend class Serializer;
  friend class Deserializer;

  DISALLOW_COPY_AND_ASSIGN(ObjectStore);
};

}  // namespace dart

#endif  // RUNTIME_VM_OBJECT_STORE_H_
