/*
 * Copyright 2011, The Android Open Source Project
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef JavaValueV8_h
#define JavaValueV8_h

#if ENABLE(JAVA_BRIDGE)

#include "JavaType.h"

#include <wtf/text/WTFString.h>

namespace JSC {

namespace Bindings {

class JavaInstance;

// A variant used to represent a Java value, almost identical to the JNI
// jvalue type. It exists because the logic to convert between JavaScript
// objects (as JavaNPObject or JSValue) and Java objects should not depend upon
// JNI, to allow ports to provide a JavaInstance object etc which does not use
// JNI. This means that the 'object' field of this variant uses JavaInstance,
// not jobject.
//
// Note that this class is independent of the JavaScript engine, but is
// currently used only with V8.
// See https://bugs.webkit.org/show_bug.cgi?id=57023.
struct JavaValue {
// ANDROID
    JavaValue()
        : m_type(JavaTypeInvalid)
        , m_booleanValue(false)
        , m_byteValue(0)
        , m_charValue(0)
        , m_shortValue(0)
        , m_intValue(0)
        , m_longValue(0)
        , m_floatValue(0.0)
        , m_doubleValue(0.0) {}
// ANDROID

    JavaType m_type;
    // We don't use a union because we want to be able to ref-count some of the
    // values. This requires types with non-trivial constructors.
    RefPtr<JavaInstance> m_objectValue;
    bool m_booleanValue;
    signed char m_byteValue;
    unsigned short m_charValue;
    short m_shortValue;
    int m_intValue;
    long long m_longValue;
    float m_floatValue;
    double m_doubleValue;
    String m_stringValue;
};

} // namespace Bindings

} // namespace JSC

#endif // ENABLE(JAVA_BRIDGE)

#endif // JavaValueV8_h
