5#ifndef LIB_TONIC_DART_WRAPPABLE_H_
6#define LIB_TONIC_DART_WRAPPABLE_H_
8#include "third_party/dart/runtime/include/dart_api.h"
48 return dart_wrapper_.
value();
59 static void FinalizeDartWrapper(
void* isolate_callback_data,
void* peer);
66#define DEFINE_WRAPPERTYPEINFO() \
68 const tonic::DartWrapperInfo& GetDartWrapperInfo() const override { \
69 return dart_wrapper_info_; \
71 static Dart_PersistentHandle GetDartType(tonic::DartState* dart_state) { \
72 return GetTypeForWrapper(dart_state, dart_wrapper_info_); \
76 static const tonic::DartWrapperInfo& dart_wrapper_info_
78#define IMPLEMENT_WRAPPERTYPEINFO(LibraryName, ClassName) \
79 static const tonic::DartWrapperInfo \
80 kDartWrapperInfo_##LibraryName_##ClassName(#LibraryName, #ClassName); \
81 const tonic::DartWrapperInfo& ClassName::dart_wrapper_info_ = \
82 kDartWrapperInfo_##LibraryName_##ClassName;
88 Dart_Handle& exception);
94 typename std::enable_if<
95 std::is_convertible<T*, const DartWrappable*>::value>
::type> {
97 static constexpr const char* kFfiRepresentation =
"Pointer";
98 static constexpr const char* kDartRepresentation =
"Pointer";
99 static constexpr bool kAllowedInLeafCall =
true;
105 if (Dart_WeakPersistentHandle wrapper = val->
dart_wrapper()) {
106 auto strong_handle = Dart_HandleFromWeakPersistent(wrapper);
107 if (!Dart_IsNull(strong_handle)) {
108 return strong_handle;
118 bool auto_scope =
true) {
120 Dart_SetReturnValue(
args, Dart_Null());
122 }
else if (Dart_WeakPersistentHandle wrapper = val->
dart_wrapper()) {
123 auto strong_handle = Dart_HandleFromWeakPersistent(wrapper);
124 if (!Dart_IsNull(strong_handle)) {
125 Dart_SetReturnValue(
args, strong_handle);
141 Dart_Handle& exception,
142 bool auto_scope =
true) {
144 return static_cast<T*
>(
160template <
template <
typename T>
class PTR,
typename T>
164 static constexpr const char* kFfiRepresentation =
"Handle";
165 static constexpr const char* kDartRepresentation =
"Object";
166 static constexpr bool kAllowedInLeafCall =
false;
178 Dart_Handle& exception,
179 bool auto_scope =
true) {
186 bool auto_scope =
true) {
200 Dart_Handle result = Dart_GetNativeReceiver(
args, &receiver);
203 Dart_ThrowException(
ToDart(
"Object has been disposed."));
204 return static_cast<T*
>(
reinterpret_cast<DartWrappable*
>(receiver));
static DartState * Current()
Dart_WeakPersistentHandle value() const
Dart_Handle CreateDartWrapper(DartState *dart_state)
virtual const DartWrapperInfo & GetDartWrapperInfo() const =0
Dart_WeakPersistentHandle dart_wrapper() const
void AssociateWithDartWrapper(Dart_Handle wrappable)
virtual void ReleaseDartWrappableReference() const =0
virtual void RetainDartWrappableReference() const =0
static Dart_PersistentHandle GetTypeForWrapper(tonic::DartState *dart_state, const tonic::DartWrapperInfo &wrapper_info)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
Dart_Handle ToDart(const T &object)
T * GetReceiver(Dart_NativeArguments args)
static FfiType ToFfi(const NativeType &val)
static bool AllowedInLeafCall()
static NativeType FromDart(Dart_Handle handle)
static Dart_Handle ToDart(const NativeType &val)
static NativeType FromFfi(FfiType val)
static const char * GetDartRepresentation()
static void SetReturnValue(Dart_NativeArguments args, const NativeType &val, bool auto_scope=true)
static const char * GetFfiRepresentation()
static NativeType FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception, bool auto_scope=true)
static T * FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception, bool auto_scope=true)
static T * FromDart(Dart_Handle handle)
static Dart_Handle ToDart(DartWrappable *val)
static const char * GetFfiRepresentation()
static bool AllowedInLeafCall()
static FfiType ToFfi(T *val)
static void SetReturnValue(Dart_NativeArguments args, DartWrappable *val, bool auto_scope=true)
static T * FromFfi(FfiType val)
static const char * GetDartRepresentation()
static DartWrappable * FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception)
static DartWrappable * FromDart(Dart_Handle handle)
#define TONIC_DISALLOW_COPY_AND_ASSIGN(TypeName)