JSDOMConvertBase.h [plain text]
#pragma once
#include "JSDOMExceptionHandling.h"
#include <runtime/Error.h>
namespace WebCore {
template<typename T> struct Converter;
namespace Detail {
template <typename T> inline T* getPtrOrRef(const T* p) { return const_cast<T*>(p); }
template <typename T> inline T& getPtrOrRef(const T& p) { return const_cast<T&>(p); }
template <typename T> inline T* getPtrOrRef(const RefPtr<T>& p) { return p.get(); }
template <typename T> inline T& getPtrOrRef(const Ref<T>& p) { return p.get(); }
}
struct DefaultExceptionThrower {
void operator()(JSC::ExecState& state, JSC::ThrowScope& scope)
{
throwTypeError(&state, scope);
}
};
template<typename T> typename Converter<T>::ReturnType convert(JSC::ExecState&, JSC::JSValue);
template<typename T> typename Converter<T>::ReturnType convert(JSC::ExecState&, JSC::JSValue, JSC::JSObject&);
template<typename T> typename Converter<T>::ReturnType convert(JSC::ExecState&, JSC::JSValue, JSDOMGlobalObject&);
template<typename T, typename ExceptionThrower> typename Converter<T>::ReturnType convert(JSC::ExecState&, JSC::JSValue, ExceptionThrower&&);
template<typename T, typename ExceptionThrower> typename Converter<T>::ReturnType convert(JSC::ExecState&, JSC::JSValue, JSC::JSObject&, ExceptionThrower&&);
template<typename T, typename ExceptionThrower> typename Converter<T>::ReturnType convert(JSC::ExecState&, JSC::JSValue, JSDOMGlobalObject&, ExceptionThrower&&);
template<typename T> inline typename Converter<T>::ReturnType convert(JSC::ExecState& state, JSC::JSValue value)
{
return Converter<T>::convert(state, value);
}
template<typename T> inline typename Converter<T>::ReturnType convert(JSC::ExecState& state, JSC::JSValue value, JSC::JSObject& thisObject)
{
return Converter<T>::convert(state, value, thisObject);
}
template<typename T> inline typename Converter<T>::ReturnType convert(JSC::ExecState& state, JSC::JSValue value, JSDOMGlobalObject& globalObject)
{
return Converter<T>::convert(state, value, globalObject);
}
template<typename T, typename ExceptionThrower> inline typename Converter<T>::ReturnType convert(JSC::ExecState& state, JSC::JSValue value, ExceptionThrower&& exceptionThrower)
{
return Converter<T>::convert(state, value, std::forward<ExceptionThrower>(exceptionThrower));
}
template<typename T, typename ExceptionThrower> inline typename Converter<T>::ReturnType convert(JSC::ExecState& state, JSC::JSValue value, JSC::JSObject& thisObject, ExceptionThrower&& exceptionThrower)
{
return Converter<T>::convert(state, value, thisObject, std::forward<ExceptionThrower>(exceptionThrower));
}
template<typename T, typename ExceptionThrower> inline typename Converter<T>::ReturnType convert(JSC::ExecState& state, JSC::JSValue value, JSDOMGlobalObject& globalObject, ExceptionThrower&& exceptionThrower)
{
return Converter<T>::convert(state, value, globalObject, std::forward<ExceptionThrower>(exceptionThrower));
}
template<typename T> struct JSConverter;
template<typename T, typename U> inline JSC::JSValue toJS(U&&);
template<typename T, typename U> inline JSC::JSValue toJS(JSC::ExecState&, U&&);
template<typename T, typename U> inline JSC::JSValue toJS(JSC::ExecState&, JSDOMGlobalObject&, U&&);
template<typename T, typename U> inline JSC::JSValue toJS(JSC::ExecState&, JSC::ThrowScope&, ExceptionOr<U>&&);
template<typename T, typename U> inline JSC::JSValue toJS(JSC::ExecState&, JSDOMGlobalObject&, JSC::ThrowScope&, ExceptionOr<U>&&);
template<typename T, typename U> inline JSC::JSValue toJSNewlyCreated(JSC::ExecState&, JSDOMGlobalObject&, U&&);
template<typename T, typename U> inline JSC::JSValue toJSNewlyCreated(JSC::ExecState&, JSDOMGlobalObject&, JSC::ThrowScope&, ExceptionOr<U>&&);
template<typename T, bool needsState = JSConverter<T>::needsState, bool needsGlobalObject = JSConverter<T>::needsGlobalObject>
struct JSConverterOverloader;
template<typename T>
struct JSConverterOverloader<T, true, true> {
template<typename U> static JSC::JSValue convert(JSC::ExecState& state, JSDOMGlobalObject& globalObject, U&& value)
{
return JSConverter<T>::convert(state, globalObject, std::forward<U>(value));
}
};
template<typename T>
struct JSConverterOverloader<T, true, false> {
template<typename U> static JSC::JSValue convert(JSC::ExecState& state, U&& value)
{
return JSConverter<T>::convert(state, std::forward<U>(value));
}
template<typename U> static JSC::JSValue convert(JSC::ExecState& state, JSDOMGlobalObject&, U&& value)
{
return JSConverter<T>::convert(state, std::forward<U>(value));
}
};
template<typename T>
struct JSConverterOverloader<T, false, false> {
template<typename U> static JSC::JSValue convert(JSC::ExecState&, U&& value)
{
return JSConverter<T>::convert(std::forward<U>(value));
}
template<typename U> static JSC::JSValue convert(JSC::ExecState&, JSDOMGlobalObject&, U&& value)
{
return JSConverter<T>::convert(std::forward<U>(value));
}
};
template<typename T, typename U> inline JSC::JSValue toJS(U&& value)
{
return JSConverter<T>::convert(std::forward<U>(value));
}
template<typename T, typename U> inline JSC::JSValue toJS(JSC::ExecState& state, U&& value)
{
return JSConverterOverloader<T>::convert(state, std::forward<U>(value));
}
template<typename T, typename U> inline JSC::JSValue toJS(JSC::ExecState& state, JSDOMGlobalObject& globalObject, U&& value)
{
return JSConverterOverloader<T>::convert(state, globalObject, std::forward<U>(value));
}
template<typename T, typename U> inline JSC::JSValue toJS(JSC::ExecState& state, JSC::ThrowScope& throwScope, ExceptionOr<U>&& value)
{
if (UNLIKELY(value.hasException())) {
propagateException(state, throwScope, value.releaseException());
return { };
}
return toJS<T>(state, value.releaseReturnValue());
}
template<typename T, typename U> inline JSC::JSValue toJS(JSC::ExecState& state, JSDOMGlobalObject& globalObject, JSC::ThrowScope& throwScope, ExceptionOr<U>&& value)
{
if (UNLIKELY(value.hasException())) {
propagateException(state, throwScope, value.releaseException());
return { };
}
return toJS<T>(state, globalObject, value.releaseReturnValue());
}
template<typename T, typename U> inline JSC::JSValue toJSNewlyCreated(JSC::ExecState& state, JSDOMGlobalObject& globalObject, U&& value)
{
return JSConverter<T>::convertNewlyCreated(state, globalObject, std::forward<U>(value));
}
template<typename T, typename U> inline JSC::JSValue toJSNewlyCreated(JSC::ExecState& state, JSDOMGlobalObject& globalObject, JSC::ThrowScope& throwScope, ExceptionOr<U>&& value)
{
if (UNLIKELY(value.hasException())) {
propagateException(state, throwScope, value.releaseException());
return { };
}
return toJSNewlyCreated<T>(state, globalObject, value.releaseReturnValue());
}
template<typename T> struct DefaultConverter {
using ReturnType = typename T::ImplementationType;
static constexpr bool conversionHasSideEffects = true;
};
}