// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef XFA_FXJSE_UTIL_INLINE_H_
#define XFA_FXJSE_UTIL_INLINE_H_

#include "xfa/fxjse/context.h"

static V8_INLINE v8::Local<v8::Object> FXJSE_GetGlobalObjectFromContext(
    const v8::Local<v8::Context>& hContext) {
  return hContext->Global()->GetPrototype().As<v8::Object>();
}
static V8_INLINE void FXJSE_UpdateObjectBinding(v8::Local<v8::Object>& hObject,
                                                void* lpNewBinding) {
  ASSERT(!hObject.IsEmpty());
  ASSERT(hObject->InternalFieldCount() > 0);
  hObject->SetAlignedPointerInInternalField(0, lpNewBinding);
}
static V8_INLINE void* FXJSE_RetrieveObjectBinding(
    const v8::Local<v8::Object>& hJSObject,
    CFXJSE_Class* lpClass = NULL) {
  ASSERT(!hJSObject.IsEmpty());
  if (!hJSObject->IsObject()) {
    return NULL;
  }
  v8::Local<v8::Object> hObject = hJSObject;
  if (hObject->InternalFieldCount() == 0) {
    v8::Local<v8::Value> hProtoObject = hObject->GetPrototype();
    if (hProtoObject.IsEmpty() || !hProtoObject->IsObject()) {
      return NULL;
    }
    hObject = hProtoObject.As<v8::Object>();
    if (hObject->InternalFieldCount() == 0) {
      return NULL;
    }
  }
  if (lpClass) {
    v8::Local<v8::FunctionTemplate> hClass =
        v8::Local<v8::FunctionTemplate>::New(
            lpClass->GetContext()->GetRuntime(), lpClass->GetTemplate());
    if (!hClass->HasInstance(hObject)) {
      return NULL;
    }
  }
  return hObject->GetAlignedPointerFromInternalField(0);
}

#endif  // XFA_FXJSE_UTIL_INLINE_H_
