// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_WASM_C_API_H_
#define V8_WASM_C_API_H_

#include "include/v8.h"
#include "src/common/globals.h"
#include "src/handles/handles.h"
#include "third_party/wasm-api/wasm.hh"

namespace v8 {
namespace internal {

class JSWeakMap;

}  // namespace internal
}  // namespace v8

namespace wasm {

class StoreImpl {
 public:
  ~StoreImpl();

  v8::Isolate* isolate() const { return isolate_; }
  i::Isolate* i_isolate() const {
    return reinterpret_cast<i::Isolate*>(isolate_);
  }

  v8::Local<v8::Context> context() const { return context_.Get(isolate_); }

  static StoreImpl* get(i::Isolate* isolate) {
    return static_cast<StoreImpl*>(
        reinterpret_cast<v8::Isolate*>(isolate)->GetData(0));
  }

  void SetHostInfo(i::Handle<i::Object> object, void* info,
                   void (*finalizer)(void*));
  void* GetHostInfo(i::Handle<i::Object> key);

 private:
  friend own<Store> Store::make(Engine*);

  StoreImpl() = default;

  v8::Isolate::CreateParams create_params_;
  v8::Isolate* isolate_ = nullptr;
  v8::Eternal<v8::Context> context_;
  i::Handle<i::JSWeakMap> host_info_map_;
};

}  // namespace wasm

#endif  // V8_WASM_C_API_H_
