Created
December 8, 2021 10:53
-
-
Save dcharkes/6371a0088a6057d754d6a259c60e19f9 to your computer and use it in GitHub Desktop.
Standalone dart_api_dl.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file | |
* for details. All rights reserved. Use of this source code is governed by a | |
* BSD-style license that can be found in the LICENSE file. | |
*/ | |
#ifndef RUNTIME_INCLUDE_DART_API_DL_H_ | |
#define RUNTIME_INCLUDE_DART_API_DL_H_ | |
#ifndef __STDC_FORMAT_MACROS | |
#define __STDC_FORMAT_MACROS | |
#endif | |
#include <assert.h> | |
#include <inttypes.h> | |
#include <stdbool.h> | |
#ifdef __cplusplus | |
#define DART_EXTERN_C extern "C" | |
#else | |
#define DART_EXTERN_C extern | |
#endif | |
#if defined(__CYGWIN__) | |
#error Tool chain and platform not supported. | |
#elif defined(_WIN32) | |
#if defined(DART_SHARED_LIB) | |
#define DART_EXPORT DART_EXTERN_C __declspec(dllexport) | |
#else | |
#define DART_EXPORT DART_EXTERN_C | |
#endif | |
#else | |
#if __GNUC__ >= 4 | |
#if defined(DART_SHARED_LIB) | |
#define DART_EXPORT \ | |
DART_EXTERN_C __attribute__((visibility("default"))) __attribute((used)) | |
#else | |
#define DART_EXPORT DART_EXTERN_C | |
#endif | |
#else | |
#error Tool chain not supported. | |
#endif | |
#endif | |
typedef struct _Dart_Handle *Dart_Handle; | |
typedef Dart_Handle Dart_PersistentHandle; | |
typedef struct _Dart_WeakPersistentHandle *Dart_WeakPersistentHandle; | |
typedef struct _Dart_FinalizableHandle *Dart_FinalizableHandle; | |
typedef void (*Dart_HandleFinalizer)(void *isolate_callback_data, void *peer); | |
/** | |
* A port is used to send or receive inter-isolate messages | |
*/ | |
typedef int64_t Dart_Port; | |
/* | |
* ========== | |
* Typed Data | |
* ========== | |
*/ | |
typedef enum { | |
Dart_TypedData_kByteData = 0, | |
Dart_TypedData_kInt8, | |
Dart_TypedData_kUint8, | |
Dart_TypedData_kUint8Clamped, | |
Dart_TypedData_kInt16, | |
Dart_TypedData_kUint16, | |
Dart_TypedData_kInt32, | |
Dart_TypedData_kUint32, | |
Dart_TypedData_kInt64, | |
Dart_TypedData_kUint64, | |
Dart_TypedData_kFloat32, | |
Dart_TypedData_kFloat64, | |
Dart_TypedData_kInt32x4, | |
Dart_TypedData_kFloat32x4, | |
Dart_TypedData_kFloat64x2, | |
Dart_TypedData_kInvalid | |
} Dart_TypedData_Type; | |
/** | |
* A Dart_CObject is used for representing Dart objects as native C | |
* data outside the Dart heap. These objects are totally detached from | |
* the Dart heap. Only a subset of the Dart objects have a | |
* representation as a Dart_CObject. | |
* | |
* The string encoding in the 'value.as_string' is UTF-8. | |
* | |
* All the different types from dart:typed_data are exposed as type | |
* kTypedData. The specific type from dart:typed_data is in the type | |
* field of the as_typed_data structure. The length in the | |
* as_typed_data structure is always in bytes. | |
* | |
* The data for kTypedData is copied on message send and ownership remains with | |
* the caller. The ownership of data for kExternalTyped is passed to the VM on | |
* message send and returned when the VM invokes the | |
* Dart_HandleFinalizer callback; a non-NULL callback must be provided. | |
*/ | |
typedef enum { | |
Dart_CObject_kNull = 0, | |
Dart_CObject_kBool, | |
Dart_CObject_kInt32, | |
Dart_CObject_kInt64, | |
Dart_CObject_kDouble, | |
Dart_CObject_kString, | |
Dart_CObject_kArray, | |
Dart_CObject_kTypedData, | |
Dart_CObject_kExternalTypedData, | |
Dart_CObject_kSendPort, | |
Dart_CObject_kCapability, | |
Dart_CObject_kNativePointer, | |
Dart_CObject_kUnsupported, | |
Dart_CObject_kNumberOfTypes | |
} Dart_CObject_Type; | |
typedef struct _Dart_CObject { | |
Dart_CObject_Type type; | |
union { | |
bool as_bool; | |
int32_t as_int32; | |
int64_t as_int64; | |
double as_double; | |
char *as_string; | |
struct { | |
Dart_Port id; | |
Dart_Port origin_id; | |
} as_send_port; | |
struct { | |
int64_t id; | |
} as_capability; | |
struct { | |
intptr_t length; | |
struct _Dart_CObject **values; | |
} as_array; | |
struct { | |
Dart_TypedData_Type type; | |
intptr_t length; /* in elements, not bytes */ | |
uint8_t *values; | |
} as_typed_data; | |
struct { | |
Dart_TypedData_Type type; | |
intptr_t length; /* in elements, not bytes */ | |
uint8_t *data; | |
void *peer; | |
Dart_HandleFinalizer callback; | |
} as_external_typed_data; | |
struct { | |
intptr_t ptr; | |
intptr_t size; | |
Dart_HandleFinalizer callback; | |
} as_native_pointer; | |
} value; | |
} Dart_CObject; | |
// This struct is versioned by DART_API_DL_MAJOR_VERSION, bump the version when | |
// changing this struct. | |
/** \mainpage Dynamically Linked Dart API | |
* | |
* This exposes a subset of symbols from dart_api.h and dart_native_api.h | |
* available in every Dart embedder through dynamic linking. | |
* | |
* All symbols are postfixed with _DL to indicate that they are dynamically | |
* linked and to prevent conflicts with the original symbol. | |
* | |
* Link `dart_api_dl.c` file into your library and invoke | |
* `Dart_InitializeApiDL` with `NativeApi.initializeApiDLData`. | |
*/ | |
DART_EXPORT intptr_t Dart_InitializeApiDL(void *data); | |
// ============================================================================ | |
// IMPORTANT! Never update these signatures without properly updating | |
// DART_API_DL_MAJOR_VERSION and DART_API_DL_MINOR_VERSION. | |
// | |
// Verbatim copy of `dart_native_api.h` and `dart_api.h` symbol names and types | |
// to trigger compile-time errors if the sybols in those files are updated | |
// without updating these. | |
// | |
// Function return and argument types, and typedefs are carbon copied. Structs | |
// are typechecked nominally in C/C++, so they are not copied, instead a | |
// comment is added to their definition. | |
typedef int64_t Dart_Port_DL; | |
typedef void (*Dart_NativeMessageHandler_DL)(Dart_Port_DL dest_port_id, | |
Dart_CObject *message); | |
// dart_native_api.h symbols can be called on any thread. | |
#define DART_NATIVE_API_DL_SYMBOLS(F) \ | |
/***** dart_native_api.h *****/ \ | |
/* Dart_Port */ \ | |
F(Dart_PostCObject, bool, (Dart_Port_DL port_id, Dart_CObject * message)) \ | |
F(Dart_PostInteger, bool, (Dart_Port_DL port_id, int64_t message)) \ | |
F(Dart_NewNativePort, Dart_Port_DL, \ | |
(const char *name, Dart_NativeMessageHandler_DL handler, \ | |
bool handle_concurrently)) \ | |
F(Dart_CloseNativePort, bool, (Dart_Port_DL native_port_id)) | |
// dart_api.h symbols can only be called on Dart threads. | |
#define DART_API_DL_SYMBOLS(F) \ | |
/***** dart_api.h *****/ \ | |
/* Errors */ \ | |
F(Dart_IsError, bool, (Dart_Handle handle)) \ | |
F(Dart_IsApiError, bool, (Dart_Handle handle)) \ | |
F(Dart_IsUnhandledExceptionError, bool, (Dart_Handle handle)) \ | |
F(Dart_IsCompilationError, bool, (Dart_Handle handle)) \ | |
F(Dart_IsFatalError, bool, (Dart_Handle handle)) \ | |
F(Dart_GetError, const char *, (Dart_Handle handle)) \ | |
F(Dart_ErrorHasException, bool, (Dart_Handle handle)) \ | |
F(Dart_ErrorGetException, Dart_Handle, (Dart_Handle handle)) \ | |
F(Dart_ErrorGetStackTrace, Dart_Handle, (Dart_Handle handle)) \ | |
F(Dart_NewApiError, Dart_Handle, (const char *error)) \ | |
F(Dart_NewCompilationError, Dart_Handle, (const char *error)) \ | |
F(Dart_NewUnhandledExceptionError, Dart_Handle, (Dart_Handle exception)) \ | |
F(Dart_PropagateError, void, (Dart_Handle handle)) \ | |
/* Dart_Handle, Dart_PersistentHandle, Dart_WeakPersistentHandle */ \ | |
F(Dart_HandleFromPersistent, Dart_Handle, (Dart_PersistentHandle object)) \ | |
F(Dart_HandleFromWeakPersistent, Dart_Handle, \ | |
(Dart_WeakPersistentHandle object)) \ | |
F(Dart_NewPersistentHandle, Dart_PersistentHandle, (Dart_Handle object)) \ | |
F(Dart_SetPersistentHandle, void, \ | |
(Dart_PersistentHandle obj1, Dart_Handle obj2)) \ | |
F(Dart_DeletePersistentHandle, void, (Dart_PersistentHandle object)) \ | |
F(Dart_NewWeakPersistentHandle, Dart_WeakPersistentHandle, \ | |
(Dart_Handle object, void *peer, intptr_t external_allocation_size, \ | |
Dart_HandleFinalizer callback)) \ | |
F(Dart_DeleteWeakPersistentHandle, void, (Dart_WeakPersistentHandle object)) \ | |
F(Dart_UpdateExternalSize, void, \ | |
(Dart_WeakPersistentHandle object, intptr_t external_allocation_size)) \ | |
F(Dart_NewFinalizableHandle, Dart_FinalizableHandle, \ | |
(Dart_Handle object, void *peer, intptr_t external_allocation_size, \ | |
Dart_HandleFinalizer callback)) \ | |
F(Dart_DeleteFinalizableHandle, void, \ | |
(Dart_FinalizableHandle object, Dart_Handle strong_ref_to_object)) \ | |
F(Dart_UpdateFinalizableExternalSize, void, \ | |
(Dart_FinalizableHandle object, Dart_Handle strong_ref_to_object, \ | |
intptr_t external_allocation_size)) \ | |
/* Dart_Port */ \ | |
F(Dart_Post, bool, (Dart_Port_DL port_id, Dart_Handle object)) \ | |
F(Dart_NewSendPort, Dart_Handle, (Dart_Port_DL port_id)) \ | |
F(Dart_SendPortGetId, Dart_Handle, \ | |
(Dart_Handle port, Dart_Port_DL * port_id)) \ | |
/* Scopes */ \ | |
F(Dart_EnterScope, void, (void)) \ | |
F(Dart_ExitScope, void, (void)) | |
#define DART_API_ALL_DL_SYMBOLS(F) \ | |
DART_NATIVE_API_DL_SYMBOLS(F) \ | |
DART_API_DL_SYMBOLS(F) | |
// IMPORTANT! Never update these signatures without properly updating | |
// DART_API_DL_MAJOR_VERSION and DART_API_DL_MINOR_VERSION. | |
// | |
// End of verbatim copy. | |
// ============================================================================ | |
// Copy of definition of DART_EXPORT without 'used' attribute. | |
// | |
// The 'used' attribute cannot be used with DART_API_ALL_DL_SYMBOLS because | |
// they are not function declarations, but variable declarations with a | |
// function pointer type. | |
// | |
// The function pointer variables are initialized with the addresses of the | |
// functions in the VM. If we were to use function declarations instead, we | |
// would need to forward the call to the VM adding indirection. | |
#if defined(__CYGWIN__) | |
#error Tool chain and platform not supported. | |
#elif defined(_WIN32) | |
#if defined(DART_SHARED_LIB) | |
#define DART_EXPORT_DL DART_EXTERN_C __declspec(dllexport) | |
#else | |
#define DART_EXPORT_DL DART_EXTERN_C | |
#endif | |
#else | |
#if __GNUC__ >= 4 | |
#if defined(DART_SHARED_LIB) | |
#define DART_EXPORT_DL DART_EXTERN_C __attribute__((visibility("default"))) | |
#else | |
#define DART_EXPORT_DL DART_EXTERN_C | |
#endif | |
#else | |
#error Tool chain not supported. | |
#endif | |
#endif | |
#define DART_API_DL_DECLARATIONS(name, R, A) \ | |
typedef R(*name##_Type) A; \ | |
DART_EXPORT_DL name##_Type name##_DL; | |
DART_API_ALL_DL_SYMBOLS(DART_API_DL_DECLARATIONS) | |
#undef DART_API_DL_DECLARATIONS | |
#undef DART_EXPORT_DL | |
#endif /* RUNTIME_INCLUDE_DART_API_DL_H_ */ /* NOLINT */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment