Add dart api bridge
This commit is contained in:
35
bridge/bridge.go
Normal file
35
bridge/bridge.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package bridge
|
||||||
|
|
||||||
|
// #include "stdint.h"
|
||||||
|
// #include "include/dart_api_dl.c"
|
||||||
|
//
|
||||||
|
// // Go does not allow calling C function pointers directly. So we are
|
||||||
|
// // forced to provide a trampoline.
|
||||||
|
// bool GoDart_PostCObject(Dart_Port_DL port, Dart_CObject* obj) {
|
||||||
|
// return Dart_PostCObject_DL(port, obj);
|
||||||
|
// }
|
||||||
|
import "C"
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
func InitializeDartApi(api unsafe.Pointer) {
|
||||||
|
if C.Dart_InitializeApiDL(api) != 0 {
|
||||||
|
panic("failed to initialize Dart DL C API: version mismatch. " +
|
||||||
|
"must update include/ to match Dart SDK version")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendStringToPort(port int64, msg string) {
|
||||||
|
var obj C.Dart_CObject
|
||||||
|
obj._type = C.Dart_CObject_kString
|
||||||
|
msg_obj := C.CString(msg) // go string -> char*s
|
||||||
|
// union type, we do a force conversion
|
||||||
|
ptr := unsafe.Pointer(&obj.value[0])
|
||||||
|
*(**C.char)(ptr) = msg_obj
|
||||||
|
ret := C.GoDart_PostCObject(C.Dart_Port_DL(port), &obj)
|
||||||
|
if !ret {
|
||||||
|
fmt.Println("ERROR: post to port ", port, " failed", msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
23
bridge/include/BUILD.gn
Normal file
23
bridge/include/BUILD.gn
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Copyright (c) 2021, 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.
|
||||||
|
|
||||||
|
import("../../sdk_args.gni")
|
||||||
|
|
||||||
|
# This rule copies header files to include/
|
||||||
|
copy("copy_headers") {
|
||||||
|
visibility = [ "../../sdk:copy_headers" ]
|
||||||
|
|
||||||
|
sources = [
|
||||||
|
"dart_api.h",
|
||||||
|
"dart_api_dl.c",
|
||||||
|
"dart_api_dl.h",
|
||||||
|
"dart_native_api.h",
|
||||||
|
"dart_tools_api.h",
|
||||||
|
"dart_version.h",
|
||||||
|
"internal/dart_api_dl_impl.h",
|
||||||
|
]
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
[ "$root_out_dir/$dart_sdk_output/include/{{source_target_relative}}" ]
|
||||||
|
}
|
||||||
30
bridge/include/analyze_snapshot_api.h
Normal file
30
bridge/include/analyze_snapshot_api.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021, 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_ANALYZE_SNAPSHOT_API_H_
|
||||||
|
#define RUNTIME_INCLUDE_ANALYZE_SNAPSHOT_API_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
|
namespace dart {
|
||||||
|
namespace snapshot_analyzer {
|
||||||
|
typedef struct {
|
||||||
|
const uint8_t* vm_snapshot_data;
|
||||||
|
const uint8_t* vm_snapshot_instructions;
|
||||||
|
const uint8_t* vm_isolate_data;
|
||||||
|
const uint8_t* vm_isolate_instructions;
|
||||||
|
} Dart_SnapshotAnalyzerInformation;
|
||||||
|
|
||||||
|
void Dart_DumpSnapshotInformationAsJson(
|
||||||
|
const Dart_SnapshotAnalyzerInformation& info,
|
||||||
|
char** buffer,
|
||||||
|
intptr_t* buffer_length);
|
||||||
|
|
||||||
|
} // namespace snapshot_analyzer
|
||||||
|
} // namespace dart
|
||||||
|
|
||||||
|
#endif // RUNTIME_INCLUDE_ANALYZE_SNAPSHOT_API_H_
|
||||||
69
bridge/include/bin/dart_io_api.h
Normal file
69
bridge/include/bin/dart_io_api.h
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
// Copyright (c) 2015, 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_BIN_DART_IO_API_H_
|
||||||
|
#define RUNTIME_INCLUDE_BIN_DART_IO_API_H_
|
||||||
|
|
||||||
|
#include "dart_tools_api.h"
|
||||||
|
|
||||||
|
namespace dart {
|
||||||
|
namespace bin {
|
||||||
|
|
||||||
|
// Bootstraps 'dart:io'.
|
||||||
|
void BootstrapDartIo();
|
||||||
|
|
||||||
|
// Cleans up 'dart:io'.
|
||||||
|
void CleanupDartIo();
|
||||||
|
|
||||||
|
// Lets dart:io know where the system temporary directory is located.
|
||||||
|
// Currently only wired up on Android.
|
||||||
|
void SetSystemTempDirectory(const char* system_temp);
|
||||||
|
|
||||||
|
// Tells the system whether to capture Stdout events.
|
||||||
|
void SetCaptureStdout(bool value);
|
||||||
|
|
||||||
|
// Tells the system whether to capture Stderr events.
|
||||||
|
void SetCaptureStderr(bool value);
|
||||||
|
|
||||||
|
// Should Stdout events be captured?
|
||||||
|
bool ShouldCaptureStdout();
|
||||||
|
|
||||||
|
// Should Stderr events be captured?
|
||||||
|
bool ShouldCaptureStderr();
|
||||||
|
|
||||||
|
// Set the executable name used by Platform.executable.
|
||||||
|
void SetExecutableName(const char* executable_name);
|
||||||
|
|
||||||
|
// Set the arguments used by Platform.executableArguments.
|
||||||
|
void SetExecutableArguments(int script_index, char** argv);
|
||||||
|
|
||||||
|
// Set dart:io implementation specific fields of Dart_EmbedderInformation.
|
||||||
|
void GetIOEmbedderInformation(Dart_EmbedderInformation* info);
|
||||||
|
|
||||||
|
// Appropriate to assign to Dart_InitializeParams.file_open/read/write/close.
|
||||||
|
void* OpenFile(const char* name, bool write);
|
||||||
|
void ReadFile(uint8_t** data, intptr_t* file_len, void* stream);
|
||||||
|
void WriteFile(const void* buffer, intptr_t num_bytes, void* stream);
|
||||||
|
void CloseFile(void* stream);
|
||||||
|
|
||||||
|
// Generates 'length' random bytes into 'buffer'. Returns true on success
|
||||||
|
// and false on failure. This is appropriate to assign to
|
||||||
|
// Dart_InitializeParams.entropy_source.
|
||||||
|
bool GetEntropy(uint8_t* buffer, intptr_t length);
|
||||||
|
|
||||||
|
// Performs a lookup of the I/O Dart_NativeFunction with a specified 'name' and
|
||||||
|
// 'argument_count'. Returns NULL if no I/O native function with a matching
|
||||||
|
// name and parameter count is found.
|
||||||
|
Dart_NativeFunction LookupIONative(Dart_Handle name,
|
||||||
|
int argument_count,
|
||||||
|
bool* auto_setup_scope);
|
||||||
|
|
||||||
|
// Returns the symbol for I/O native function 'nf'. Returns NULL if 'nf' is not
|
||||||
|
// a valid I/O native function.
|
||||||
|
const uint8_t* LookupIONativeSymbol(Dart_NativeFunction nf);
|
||||||
|
|
||||||
|
} // namespace bin
|
||||||
|
} // namespace dart
|
||||||
|
|
||||||
|
#endif // RUNTIME_INCLUDE_BIN_DART_IO_API_H_
|
||||||
4172
bridge/include/dart_api.h
Normal file
4172
bridge/include/dart_api.h
Normal file
File diff suppressed because it is too large
Load Diff
79
bridge/include/dart_api_dl.c
Normal file
79
bridge/include/dart_api_dl.c
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dart_api_dl.h" /* NOLINT */
|
||||||
|
#include "dart_version.h" /* NOLINT */
|
||||||
|
#include "internal/dart_api_dl_impl.h" /* NOLINT */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define DART_API_DL_DEFINITIONS(name, R, A) name##_Type name##_DL = NULL;
|
||||||
|
|
||||||
|
DART_API_ALL_DL_SYMBOLS(DART_API_DL_DEFINITIONS)
|
||||||
|
DART_API_DEPRECATED_DL_SYMBOLS(DART_API_DL_DEFINITIONS)
|
||||||
|
|
||||||
|
#undef DART_API_DL_DEFINITIONS
|
||||||
|
|
||||||
|
typedef void* DartApiEntry_function;
|
||||||
|
|
||||||
|
DartApiEntry_function FindFunctionPointer(const DartApiEntry* entries,
|
||||||
|
const char* name) {
|
||||||
|
while (entries->name != NULL) {
|
||||||
|
if (strcmp(entries->name, name) == 0) return entries->function;
|
||||||
|
entries++;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
DART_EXPORT void Dart_UpdateExternalSize_Deprecated(
|
||||||
|
Dart_WeakPersistentHandle object, intptr_t external_size) {
|
||||||
|
printf("Dart_UpdateExternalSize is a nop, it has been deprecated\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
DART_EXPORT void Dart_UpdateFinalizableExternalSize_Deprecated(
|
||||||
|
Dart_FinalizableHandle object,
|
||||||
|
Dart_Handle strong_ref_to_object,
|
||||||
|
intptr_t external_allocation_size) {
|
||||||
|
printf("Dart_UpdateFinalizableExternalSize is a nop, "
|
||||||
|
"it has been deprecated\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
intptr_t Dart_InitializeApiDL(void* data) {
|
||||||
|
DartApi* dart_api_data = (DartApi*)data;
|
||||||
|
|
||||||
|
if (dart_api_data->major != DART_API_DL_MAJOR_VERSION) {
|
||||||
|
// If the DartVM we're running on does not have the same version as this
|
||||||
|
// file was compiled against, refuse to initialize. The symbols are not
|
||||||
|
// compatible.
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// Minor versions are allowed to be different.
|
||||||
|
// If the DartVM has a higher minor version, it will provide more symbols
|
||||||
|
// than we initialize here.
|
||||||
|
// If the DartVM has a lower minor version, it will not provide all symbols.
|
||||||
|
// In that case, we leave the missing symbols un-initialized. Those symbols
|
||||||
|
// should not be used by the Dart and native code. The client is responsible
|
||||||
|
// for checking the minor version number himself based on which symbols it
|
||||||
|
// is using.
|
||||||
|
// (If we would error out on this case, recompiling native code against a
|
||||||
|
// newer SDK would break all uses on older SDKs, which is too strict.)
|
||||||
|
|
||||||
|
const DartApiEntry* dart_api_function_pointers = dart_api_data->functions;
|
||||||
|
|
||||||
|
#define DART_API_DL_INIT(name, R, A) \
|
||||||
|
name##_DL = \
|
||||||
|
(name##_Type)(FindFunctionPointer(dart_api_function_pointers, #name));
|
||||||
|
DART_API_ALL_DL_SYMBOLS(DART_API_DL_INIT)
|
||||||
|
#undef DART_API_DL_INIT
|
||||||
|
|
||||||
|
#define DART_API_DEPRECATED_DL_INIT(name, R, A) \
|
||||||
|
name##_DL = name##_Deprecated;
|
||||||
|
DART_API_DEPRECATED_DL_SYMBOLS(DART_API_DEPRECATED_DL_INIT)
|
||||||
|
#undef DART_API_DEPRECATED_DL_INIT
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
162
bridge/include/dart_api_dl.h
Normal file
162
bridge/include/dart_api_dl.h
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
/*
|
||||||
|
* 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_
|
||||||
|
|
||||||
|
#include "dart_api.h" /* NOLINT */
|
||||||
|
#include "dart_native_api.h" /* NOLINT */
|
||||||
|
|
||||||
|
/** \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 symbols 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_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)) \
|
||||||
|
/* Isolates */ \
|
||||||
|
F(Dart_CurrentIsolate, Dart_Isolate, (void)) \
|
||||||
|
F(Dart_ExitIsolate, void, (void)) \
|
||||||
|
F(Dart_EnterIsolate, void, (Dart_Isolate)) \
|
||||||
|
/* 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)) \
|
||||||
|
/* Objects */ \
|
||||||
|
F(Dart_IsNull, bool, (Dart_Handle))
|
||||||
|
|
||||||
|
// dart_api.h symbols that have been deprecated but are retained here
|
||||||
|
// until we can make a breaking change bumping the major version number
|
||||||
|
// (DART_API_DL_MAJOR_VERSION)
|
||||||
|
#define DART_API_DEPRECATED_DL_SYMBOLS(F) \
|
||||||
|
F(Dart_UpdateExternalSize, void, \
|
||||||
|
(Dart_WeakPersistentHandle object, intptr_t external_allocation_size)) \
|
||||||
|
F(Dart_UpdateFinalizableExternalSize, void, \
|
||||||
|
(Dart_FinalizableHandle object, Dart_Handle strong_ref_to_object, \
|
||||||
|
intptr_t external_allocation_size))
|
||||||
|
|
||||||
|
#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)
|
||||||
|
DART_API_DEPRECATED_DL_SYMBOLS(DART_API_DL_DECLARATIONS)
|
||||||
|
|
||||||
|
#undef DART_API_DL_DECLARATIONS
|
||||||
|
|
||||||
|
#undef DART_EXPORT_DL
|
||||||
|
|
||||||
|
#endif /* RUNTIME_INCLUDE_DART_API_DL_H_ */ /* NOLINT */
|
||||||
108
bridge/include/dart_embedder_api.h
Normal file
108
bridge/include/dart_embedder_api.h
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
// Copyright (c) 2018, 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_EMBEDDER_API_H_
|
||||||
|
#define RUNTIME_INCLUDE_DART_EMBEDDER_API_H_
|
||||||
|
|
||||||
|
#include "include/dart_api.h"
|
||||||
|
#include "include/dart_tools_api.h"
|
||||||
|
|
||||||
|
namespace dart {
|
||||||
|
namespace embedder {
|
||||||
|
|
||||||
|
// Initialize all subsystems of the embedder.
|
||||||
|
//
|
||||||
|
// Must be called before the `Dart_Initialize()` call to initialize the
|
||||||
|
// Dart VM.
|
||||||
|
//
|
||||||
|
// Returns true on success and false otherwise, in which case error would
|
||||||
|
// contain error message.
|
||||||
|
DART_WARN_UNUSED_RESULT bool InitOnce(char** error);
|
||||||
|
|
||||||
|
// Cleans up all subsystems of the embedder.
|
||||||
|
//
|
||||||
|
// Must be called after the `Dart_Cleanup()` call to initialize the
|
||||||
|
// Dart VM.
|
||||||
|
void Cleanup();
|
||||||
|
|
||||||
|
// Common arguments that are passed to isolate creation callback and to
|
||||||
|
// API methods that create isolates.
|
||||||
|
struct IsolateCreationData {
|
||||||
|
// URI for the main script that will be running in the isolate.
|
||||||
|
const char* script_uri;
|
||||||
|
|
||||||
|
// Advisory name of the main method that will be run by isolate.
|
||||||
|
// Only used for error messages.
|
||||||
|
const char* main;
|
||||||
|
|
||||||
|
// Isolate creation flags. Might be absent.
|
||||||
|
Dart_IsolateFlags* flags;
|
||||||
|
|
||||||
|
// Isolate group callback data.
|
||||||
|
void* isolate_group_data;
|
||||||
|
|
||||||
|
// Isolate callback data.
|
||||||
|
void* isolate_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create and initialize kernel-service isolate. This method should be used
|
||||||
|
// when VM invokes isolate creation callback with DART_KERNEL_ISOLATE_NAME as
|
||||||
|
// script_uri.
|
||||||
|
// The isolate is created from the given snapshot (might be kernel data or
|
||||||
|
// app-jit snapshot).
|
||||||
|
DART_WARN_UNUSED_RESULT Dart_Isolate
|
||||||
|
CreateKernelServiceIsolate(const IsolateCreationData& data,
|
||||||
|
const uint8_t* buffer,
|
||||||
|
intptr_t buffer_size,
|
||||||
|
char** error);
|
||||||
|
|
||||||
|
// Service isolate configuration.
|
||||||
|
struct VmServiceConfiguration {
|
||||||
|
enum {
|
||||||
|
kBindHttpServerToAFreePort = 0,
|
||||||
|
kDoNotAutoStartHttpServer = -1
|
||||||
|
};
|
||||||
|
|
||||||
|
// Address to which HTTP server will be bound.
|
||||||
|
const char* ip;
|
||||||
|
|
||||||
|
// Default port. See enum above for special values.
|
||||||
|
int port;
|
||||||
|
|
||||||
|
// If non-null, connection information for the VM service will be output to a
|
||||||
|
// file in JSON format at the location specified.
|
||||||
|
const char* write_service_info_filename;
|
||||||
|
|
||||||
|
// TODO(vegorov) document these ones.
|
||||||
|
bool dev_mode;
|
||||||
|
bool deterministic;
|
||||||
|
bool disable_auth_codes;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create and initialize vm-service isolate from the given AOT snapshot, which
|
||||||
|
// is expected to contain all necessary 'vm-service' libraries.
|
||||||
|
// This method should be used when VM invokes isolate creation callback with
|
||||||
|
// DART_VM_SERVICE_ISOLATE_NAME as script_uri.
|
||||||
|
DART_WARN_UNUSED_RESULT Dart_Isolate
|
||||||
|
CreateVmServiceIsolate(const IsolateCreationData& data,
|
||||||
|
const VmServiceConfiguration& config,
|
||||||
|
const uint8_t* isolate_data,
|
||||||
|
const uint8_t* isolate_instr,
|
||||||
|
char** error);
|
||||||
|
|
||||||
|
// Create and initialize vm-service isolate from the given kernel binary, which
|
||||||
|
// is expected to contain all necessary 'vm-service' libraries.
|
||||||
|
// This method should be used when VM invokes isolate creation callback with
|
||||||
|
// DART_VM_SERVICE_ISOLATE_NAME as script_uri.
|
||||||
|
DART_WARN_UNUSED_RESULT Dart_Isolate
|
||||||
|
CreateVmServiceIsolateFromKernel(const IsolateCreationData& data,
|
||||||
|
const VmServiceConfiguration& config,
|
||||||
|
const uint8_t* kernel_buffer,
|
||||||
|
intptr_t kernel_buffer_size,
|
||||||
|
char** error);
|
||||||
|
|
||||||
|
} // namespace embedder
|
||||||
|
} // namespace dart
|
||||||
|
|
||||||
|
#endif // RUNTIME_INCLUDE_DART_EMBEDDER_API_H_
|
||||||
207
bridge/include/dart_native_api.h
Normal file
207
bridge/include/dart_native_api.h
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2013, 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_NATIVE_API_H_
|
||||||
|
#define RUNTIME_INCLUDE_DART_NATIVE_API_H_
|
||||||
|
|
||||||
|
#include "dart_api.h" /* NOLINT */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ==========================================
|
||||||
|
* Message sending/receiving from native code
|
||||||
|
* ==========================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Note that Dart_CObject_kNativePointer is intended for internal use by
|
||||||
|
* dart:io implementation and has no connection to dart:ffi Pointer class.
|
||||||
|
* It represents a pointer to a native resource of a known type.
|
||||||
|
* The receiving side will only see this pointer as an integer and will not
|
||||||
|
* see the specified finalizer.
|
||||||
|
* The specified finalizer will only be invoked if the message is not delivered.
|
||||||
|
*/
|
||||||
|
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_kUnmodifiableExternalTypedData,
|
||||||
|
Dart_CObject_kNumberOfTypes
|
||||||
|
} Dart_CObject_Type;
|
||||||
|
// This enum is versioned by DART_API_DL_MAJOR_VERSION, only add at the end
|
||||||
|
// and bump the DART_API_DL_MINOR_VERSION.
|
||||||
|
|
||||||
|
typedef struct _Dart_CObject {
|
||||||
|
Dart_CObject_Type type;
|
||||||
|
union {
|
||||||
|
bool as_bool;
|
||||||
|
int32_t as_int32;
|
||||||
|
int64_t as_int64;
|
||||||
|
double as_double;
|
||||||
|
const 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 */
|
||||||
|
const 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.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Posts a message on some port. The message will contain the Dart_CObject
|
||||||
|
* object graph rooted in 'message'.
|
||||||
|
*
|
||||||
|
* While the message is being sent the state of the graph of Dart_CObject
|
||||||
|
* structures rooted in 'message' should not be accessed, as the message
|
||||||
|
* generation will make temporary modifications to the data. When the message
|
||||||
|
* has been sent the graph will be fully restored.
|
||||||
|
*
|
||||||
|
* If true is returned, the message was enqueued, and finalizers for external
|
||||||
|
* typed data will eventually run, even if the receiving isolate shuts down
|
||||||
|
* before processing the message. If false is returned, the message was not
|
||||||
|
* enqueued and ownership of external typed data in the message remains with the
|
||||||
|
* caller.
|
||||||
|
*
|
||||||
|
* This function may be called on any thread when the VM is running (that is,
|
||||||
|
* after Dart_Initialize has returned and before Dart_Cleanup has been called).
|
||||||
|
*
|
||||||
|
* \param port_id The destination port.
|
||||||
|
* \param message The message to send.
|
||||||
|
*
|
||||||
|
* \return True if the message was posted.
|
||||||
|
*/
|
||||||
|
DART_EXPORT bool Dart_PostCObject(Dart_Port port_id, Dart_CObject* message);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Posts a message on some port. The message will contain the integer 'message'.
|
||||||
|
*
|
||||||
|
* \param port_id The destination port.
|
||||||
|
* \param message The message to send.
|
||||||
|
*
|
||||||
|
* \return True if the message was posted.
|
||||||
|
*/
|
||||||
|
DART_EXPORT bool Dart_PostInteger(Dart_Port port_id, int64_t message);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A native message handler.
|
||||||
|
*
|
||||||
|
* This handler is associated with a native port by calling
|
||||||
|
* Dart_NewNativePort.
|
||||||
|
*
|
||||||
|
* The message received is decoded into the message structure. The
|
||||||
|
* lifetime of the message data is controlled by the caller. All the
|
||||||
|
* data references from the message are allocated by the caller and
|
||||||
|
* will be reclaimed when returning to it.
|
||||||
|
*/
|
||||||
|
typedef void (*Dart_NativeMessageHandler)(Dart_Port dest_port_id,
|
||||||
|
Dart_CObject* message);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new native port. When messages are received on this
|
||||||
|
* native port, then they will be dispatched to the provided native
|
||||||
|
* message handler.
|
||||||
|
*
|
||||||
|
* \param name The name of this port in debugging messages.
|
||||||
|
* \param handler The C handler to run when messages arrive on the port.
|
||||||
|
* \param handle_concurrently Is it okay to process requests on this
|
||||||
|
* native port concurrently?
|
||||||
|
*
|
||||||
|
* \return If successful, returns the port id for the native port. In
|
||||||
|
* case of error, returns ILLEGAL_PORT.
|
||||||
|
*/
|
||||||
|
DART_EXPORT Dart_Port Dart_NewNativePort(const char* name,
|
||||||
|
Dart_NativeMessageHandler handler,
|
||||||
|
bool handle_concurrently);
|
||||||
|
/* TODO(turnidge): Currently handle_concurrently is ignored. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the native port with the given id.
|
||||||
|
*
|
||||||
|
* The port must have been allocated by a call to Dart_NewNativePort.
|
||||||
|
*
|
||||||
|
* \param native_port_id The id of the native port to close.
|
||||||
|
*
|
||||||
|
* \return Returns true if the port was closed successfully.
|
||||||
|
*/
|
||||||
|
DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ==================
|
||||||
|
* Verification Tools
|
||||||
|
* ==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forces all loaded classes and functions to be compiled eagerly in
|
||||||
|
* the current isolate..
|
||||||
|
*
|
||||||
|
* TODO(turnidge): Document.
|
||||||
|
*/
|
||||||
|
DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finalizes all classes.
|
||||||
|
*/
|
||||||
|
DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_FinalizeAllClasses(void);
|
||||||
|
|
||||||
|
/* This function is intentionally undocumented.
|
||||||
|
*
|
||||||
|
* It should not be used outside internal tests.
|
||||||
|
*/
|
||||||
|
DART_EXPORT void* Dart_ExecuteInternalCommand(const char* command, void* arg);
|
||||||
|
|
||||||
|
#endif /* INCLUDE_DART_NATIVE_API_H_ */ /* NOLINT */
|
||||||
658
bridge/include/dart_tools_api.h
Normal file
658
bridge/include/dart_tools_api.h
Normal file
@@ -0,0 +1,658 @@
|
|||||||
|
// Copyright (c) 2011, 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_TOOLS_API_H_
|
||||||
|
#define RUNTIME_INCLUDE_DART_TOOLS_API_H_
|
||||||
|
|
||||||
|
#include "dart_api.h" /* NOLINT */
|
||||||
|
|
||||||
|
/** \mainpage Dart Tools Embedding API Reference
|
||||||
|
*
|
||||||
|
* This reference describes the Dart embedding API for tools. Tools include
|
||||||
|
* a debugger, service protocol, and timeline.
|
||||||
|
*
|
||||||
|
* NOTE: The APIs described in this file are unstable and subject to change.
|
||||||
|
*
|
||||||
|
* This reference is generated from the header include/dart_tools_api.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ========
|
||||||
|
* Debugger
|
||||||
|
* ========
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ILLEGAL_ISOLATE_ID is a number guaranteed never to be associated with a
|
||||||
|
* valid isolate.
|
||||||
|
*/
|
||||||
|
#define ILLEGAL_ISOLATE_ID ILLEGAL_PORT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ILLEGAL_ISOLATE_GROUP_ID is a number guaranteed never to be associated with a
|
||||||
|
* valid isolate group.
|
||||||
|
*/
|
||||||
|
#define ILLEGAL_ISOLATE_GROUP_ID 0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* =======
|
||||||
|
* Service
|
||||||
|
* =======
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A service request callback function.
|
||||||
|
*
|
||||||
|
* These callbacks, registered by the embedder, are called when the VM receives
|
||||||
|
* a service request it can't handle and the service request command name
|
||||||
|
* matches one of the embedder registered handlers.
|
||||||
|
*
|
||||||
|
* The return value of the callback indicates whether the response
|
||||||
|
* should be used as a regular result or an error result.
|
||||||
|
* Specifically, if the callback returns true, a regular JSON-RPC
|
||||||
|
* response is built in the following way:
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* "jsonrpc": "2.0",
|
||||||
|
* "result": <json_object>,
|
||||||
|
* "id": <some sequence id>,
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* If the callback returns false, a JSON-RPC error is built like this:
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* "jsonrpc": "2.0",
|
||||||
|
* "error": <json_object>,
|
||||||
|
* "id": <some sequence id>,
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* \param method The rpc method name.
|
||||||
|
* \param param_keys Service requests can have key-value pair parameters. The
|
||||||
|
* keys and values are flattened and stored in arrays.
|
||||||
|
* \param param_values The values associated with the keys.
|
||||||
|
* \param num_params The length of the param_keys and param_values arrays.
|
||||||
|
* \param user_data The user_data pointer registered with this handler.
|
||||||
|
* \param result A C string containing a valid JSON object. The returned
|
||||||
|
* pointer will be freed by the VM by calling free.
|
||||||
|
*
|
||||||
|
* \return True if the result is a regular JSON-RPC response, false if the
|
||||||
|
* result is a JSON-RPC error.
|
||||||
|
*/
|
||||||
|
typedef bool (*Dart_ServiceRequestCallback)(const char* method,
|
||||||
|
const char** param_keys,
|
||||||
|
const char** param_values,
|
||||||
|
intptr_t num_params,
|
||||||
|
void* user_data,
|
||||||
|
const char** json_object);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a Dart_ServiceRequestCallback to be called to handle
|
||||||
|
* requests for the named rpc on a specific isolate. The callback will
|
||||||
|
* be invoked with the current isolate set to the request target.
|
||||||
|
*
|
||||||
|
* \param method The name of the method that this callback is responsible for.
|
||||||
|
* \param callback The callback to invoke.
|
||||||
|
* \param user_data The user data passed to the callback.
|
||||||
|
*
|
||||||
|
* NOTE: If multiple callbacks with the same name are registered, only
|
||||||
|
* the last callback registered will be remembered.
|
||||||
|
*/
|
||||||
|
DART_EXPORT void Dart_RegisterIsolateServiceRequestCallback(
|
||||||
|
const char* method,
|
||||||
|
Dart_ServiceRequestCallback callback,
|
||||||
|
void* user_data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a Dart_ServiceRequestCallback to be called to handle
|
||||||
|
* requests for the named rpc. The callback will be invoked without a
|
||||||
|
* current isolate.
|
||||||
|
*
|
||||||
|
* \param method The name of the command that this callback is responsible for.
|
||||||
|
* \param callback The callback to invoke.
|
||||||
|
* \param user_data The user data passed to the callback.
|
||||||
|
*
|
||||||
|
* NOTE: If multiple callbacks with the same name are registered, only
|
||||||
|
* the last callback registered will be remembered.
|
||||||
|
*/
|
||||||
|
DART_EXPORT void Dart_RegisterRootServiceRequestCallback(
|
||||||
|
const char* method,
|
||||||
|
Dart_ServiceRequestCallback callback,
|
||||||
|
void* user_data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Embedder information which can be requested by the VM for internal or
|
||||||
|
* reporting purposes.
|
||||||
|
*
|
||||||
|
* The pointers in this structure are not going to be cached or freed by the VM.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DART_EMBEDDER_INFORMATION_CURRENT_VERSION (0x00000001)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t version;
|
||||||
|
const char* name; // [optional] The name of the embedder
|
||||||
|
int64_t current_rss; // [optional] the current RSS of the embedder
|
||||||
|
int64_t max_rss; // [optional] the maximum RSS of the embedder
|
||||||
|
} Dart_EmbedderInformation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback provided by the embedder that is used by the VM to request
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \return Returns a pointer to a Dart_EmbedderInformation structure.
|
||||||
|
* The embedder keeps the ownership of the structure and any field in it.
|
||||||
|
* The embedder must ensure that the structure will remain valid until the
|
||||||
|
* next invocation of the callback.
|
||||||
|
*/
|
||||||
|
typedef void (*Dart_EmbedderInformationCallback)(
|
||||||
|
Dart_EmbedderInformation* info);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a Dart_ServiceRequestCallback to be called to handle
|
||||||
|
* requests for the named rpc. The callback will be invoked without a
|
||||||
|
* current isolate.
|
||||||
|
*
|
||||||
|
* \param method The name of the command that this callback is responsible for.
|
||||||
|
* \param callback The callback to invoke.
|
||||||
|
* \param user_data The user data passed to the callback.
|
||||||
|
*
|
||||||
|
* NOTE: If multiple callbacks are registered, only the last callback registered
|
||||||
|
* will be remembered.
|
||||||
|
*/
|
||||||
|
DART_EXPORT void Dart_SetEmbedderInformationCallback(
|
||||||
|
Dart_EmbedderInformationCallback callback);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoke a vm-service method and wait for its result.
|
||||||
|
*
|
||||||
|
* \param request_json The utf8-encoded json-rpc request.
|
||||||
|
* \param request_json_length The length of the json-rpc request.
|
||||||
|
*
|
||||||
|
* \param response_json The returned utf8-encoded json response, must be
|
||||||
|
* free()ed by caller.
|
||||||
|
* \param response_json_length The length of the returned json response.
|
||||||
|
* \param error An optional error, must be free()ed by caller.
|
||||||
|
*
|
||||||
|
* \return Whether the call was successfully performed.
|
||||||
|
*
|
||||||
|
* NOTE: This method does not need a current isolate and must not have the
|
||||||
|
* vm-isolate being the current isolate. It must be called after
|
||||||
|
* Dart_Initialize() and before Dart_Cleanup().
|
||||||
|
*/
|
||||||
|
DART_EXPORT bool Dart_InvokeVMServiceMethod(uint8_t* request_json,
|
||||||
|
intptr_t request_json_length,
|
||||||
|
uint8_t** response_json,
|
||||||
|
intptr_t* response_json_length,
|
||||||
|
char** error);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ========
|
||||||
|
* Event Streams
|
||||||
|
* ========
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A callback invoked when the VM service gets a request to listen to
|
||||||
|
* some stream.
|
||||||
|
*
|
||||||
|
* \return Returns true iff the embedder supports the named stream id.
|
||||||
|
*/
|
||||||
|
typedef bool (*Dart_ServiceStreamListenCallback)(const char* stream_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A callback invoked when the VM service gets a request to cancel
|
||||||
|
* some stream.
|
||||||
|
*/
|
||||||
|
typedef void (*Dart_ServiceStreamCancelCallback)(const char* stream_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds VM service stream callbacks.
|
||||||
|
*
|
||||||
|
* \param listen_callback A function pointer to a listen callback function.
|
||||||
|
* A listen callback function should not be already set when this function
|
||||||
|
* is called. A NULL value removes the existing listen callback function
|
||||||
|
* if any.
|
||||||
|
*
|
||||||
|
* \param cancel_callback A function pointer to a cancel callback function.
|
||||||
|
* A cancel callback function should not be already set when this function
|
||||||
|
* is called. A NULL value removes the existing cancel callback function
|
||||||
|
* if any.
|
||||||
|
*
|
||||||
|
* \return Success if the callbacks were added. Otherwise, returns an
|
||||||
|
* error handle.
|
||||||
|
*/
|
||||||
|
DART_EXPORT char* Dart_SetServiceStreamCallbacks(
|
||||||
|
Dart_ServiceStreamListenCallback listen_callback,
|
||||||
|
Dart_ServiceStreamCancelCallback cancel_callback);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a data event to clients of the VM Service.
|
||||||
|
*
|
||||||
|
* A data event is used to pass an array of bytes to subscribed VM
|
||||||
|
* Service clients. For example, in the standalone embedder, this is
|
||||||
|
* function used to provide WriteEvents on the Stdout and Stderr
|
||||||
|
* streams.
|
||||||
|
*
|
||||||
|
* If the embedder passes in a stream id for which no client is
|
||||||
|
* subscribed, then the event is ignored.
|
||||||
|
*
|
||||||
|
* \param stream_id The id of the stream on which to post the event.
|
||||||
|
*
|
||||||
|
* \param event_kind A string identifying what kind of event this is.
|
||||||
|
* For example, 'WriteEvent'.
|
||||||
|
*
|
||||||
|
* \param bytes A pointer to an array of bytes.
|
||||||
|
*
|
||||||
|
* \param bytes_length The length of the byte array.
|
||||||
|
*
|
||||||
|
* \return NULL if the arguments are well formed. Otherwise, returns an
|
||||||
|
* error string. The caller is responsible for freeing the error message.
|
||||||
|
*/
|
||||||
|
DART_EXPORT char* Dart_ServiceSendDataEvent(const char* stream_id,
|
||||||
|
const char* event_kind,
|
||||||
|
const uint8_t* bytes,
|
||||||
|
intptr_t bytes_length);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ========
|
||||||
|
* Reload support
|
||||||
|
* ========
|
||||||
|
*
|
||||||
|
* These functions are used to implement reloading in the Dart VM.
|
||||||
|
* This is an experimental feature, so embedders should be prepared
|
||||||
|
* for these functions to change.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A callback which determines whether the file at some url has been
|
||||||
|
* modified since some time. If the file cannot be found, true should
|
||||||
|
* be returned.
|
||||||
|
*/
|
||||||
|
typedef bool (*Dart_FileModifiedCallback)(const char* url, int64_t since);
|
||||||
|
|
||||||
|
DART_EXPORT char* Dart_SetFileModifiedCallback(
|
||||||
|
Dart_FileModifiedCallback file_modified_callback);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if isolate is currently reloading.
|
||||||
|
*/
|
||||||
|
DART_EXPORT bool Dart_IsReloading();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ========
|
||||||
|
* Timeline
|
||||||
|
* ========
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable tracking of specified timeline category. This is operational
|
||||||
|
* only when systrace timeline functionality is turned on.
|
||||||
|
*
|
||||||
|
* \param categories A comma separated list of categories that need to
|
||||||
|
* be enabled, the categories are
|
||||||
|
* "all" : All categories
|
||||||
|
* "API" - Execution of Dart C API functions
|
||||||
|
* "Compiler" - Execution of Dart JIT compiler
|
||||||
|
* "CompilerVerbose" - More detailed Execution of Dart JIT compiler
|
||||||
|
* "Dart" - Execution of Dart code
|
||||||
|
* "Debugger" - Execution of Dart debugger
|
||||||
|
* "Embedder" - Execution of Dart embedder code
|
||||||
|
* "GC" - Execution of Dart Garbage Collector
|
||||||
|
* "Isolate" - Dart Isolate lifecycle execution
|
||||||
|
* "VM" - Execution in Dart VM runtime code
|
||||||
|
* "" - None
|
||||||
|
*
|
||||||
|
* When "all" is specified all the categories are enabled.
|
||||||
|
* When a comma separated list of categories is specified, the categories
|
||||||
|
* that are specified will be enabled and the rest will be disabled.
|
||||||
|
* When "" is specified all the categories are disabled.
|
||||||
|
* The category names are case sensitive.
|
||||||
|
* eg: Dart_EnableTimelineCategory("all");
|
||||||
|
* Dart_EnableTimelineCategory("GC,API,Isolate");
|
||||||
|
* Dart_EnableTimelineCategory("GC,Debugger,Dart");
|
||||||
|
*
|
||||||
|
* \return True if the categories were successfully enabled, False otherwise.
|
||||||
|
*/
|
||||||
|
DART_EXPORT bool Dart_SetEnabledTimelineCategory(const char* categories);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a timestamp in microseconds. This timestamp is suitable for
|
||||||
|
* passing into the timeline system, and uses the same monotonic clock
|
||||||
|
* as dart:developer's Timeline.now.
|
||||||
|
*
|
||||||
|
* \return A timestamp that can be passed to the timeline system.
|
||||||
|
*/
|
||||||
|
DART_EXPORT int64_t Dart_TimelineGetMicros();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a raw timestamp in from the monotonic clock.
|
||||||
|
*
|
||||||
|
* \return A raw timestamp from the monotonic clock.
|
||||||
|
*/
|
||||||
|
DART_EXPORT int64_t Dart_TimelineGetTicks();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the frequency of the monotonic clock.
|
||||||
|
*
|
||||||
|
* \return The frequency of the monotonic clock.
|
||||||
|
*/
|
||||||
|
DART_EXPORT int64_t Dart_TimelineGetTicksFrequency();
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
Dart_Timeline_Event_Begin, // Phase = 'B'.
|
||||||
|
Dart_Timeline_Event_End, // Phase = 'E'.
|
||||||
|
Dart_Timeline_Event_Instant, // Phase = 'i'.
|
||||||
|
Dart_Timeline_Event_Duration, // Phase = 'X'.
|
||||||
|
Dart_Timeline_Event_Async_Begin, // Phase = 'b'.
|
||||||
|
Dart_Timeline_Event_Async_End, // Phase = 'e'.
|
||||||
|
Dart_Timeline_Event_Async_Instant, // Phase = 'n'.
|
||||||
|
Dart_Timeline_Event_Counter, // Phase = 'C'.
|
||||||
|
Dart_Timeline_Event_Flow_Begin, // Phase = 's'.
|
||||||
|
Dart_Timeline_Event_Flow_Step, // Phase = 't'.
|
||||||
|
Dart_Timeline_Event_Flow_End, // Phase = 'f'.
|
||||||
|
} Dart_Timeline_Event_Type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a timeline event to the embedder stream.
|
||||||
|
*
|
||||||
|
* DEPRECATED: this function will be removed in Dart SDK v3.2.
|
||||||
|
*
|
||||||
|
* \param label The name of the event. Its lifetime must extend at least until
|
||||||
|
* Dart_Cleanup.
|
||||||
|
* \param timestamp0 The first timestamp of the event.
|
||||||
|
* \param timestamp1_or_id When reporting an event of type
|
||||||
|
* |Dart_Timeline_Event_Duration|, the second (end) timestamp of the event
|
||||||
|
* should be passed through |timestamp1_or_id|. When reporting an event of
|
||||||
|
* type |Dart_Timeline_Event_Async_Begin|, |Dart_Timeline_Event_Async_End|,
|
||||||
|
* or |Dart_Timeline_Event_Async_Instant|, the async ID associated with the
|
||||||
|
* event should be passed through |timestamp1_or_id|. When reporting an
|
||||||
|
* event of type |Dart_Timeline_Event_Flow_Begin|,
|
||||||
|
* |Dart_Timeline_Event_Flow_Step|, or |Dart_Timeline_Event_Flow_End|, the
|
||||||
|
* flow ID associated with the event should be passed through
|
||||||
|
* |timestamp1_or_id|. When reporting an event of type
|
||||||
|
* |Dart_Timeline_Event_Begin| or |Dart_Timeline_Event_End|, the event ID
|
||||||
|
* associated with the event should be passed through |timestamp1_or_id|.
|
||||||
|
* Note that this event ID will only be used by the MacOS recorder. The
|
||||||
|
* argument to |timestamp1_or_id| will not be used when reporting events of
|
||||||
|
* other types.
|
||||||
|
* \param argument_count The number of argument names and values.
|
||||||
|
* \param argument_names An array of names of the arguments. The lifetime of the
|
||||||
|
* names must extend at least until Dart_Cleanup. The array may be reclaimed
|
||||||
|
* when this call returns.
|
||||||
|
* \param argument_values An array of values of the arguments. The values and
|
||||||
|
* the array may be reclaimed when this call returns.
|
||||||
|
*/
|
||||||
|
DART_EXPORT void Dart_TimelineEvent(const char* label,
|
||||||
|
int64_t timestamp0,
|
||||||
|
int64_t timestamp1_or_id,
|
||||||
|
Dart_Timeline_Event_Type type,
|
||||||
|
intptr_t argument_count,
|
||||||
|
const char** argument_names,
|
||||||
|
const char** argument_values);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a timeline event to the embedder stream.
|
||||||
|
*
|
||||||
|
* Note regarding flow events: events must be associated with flow IDs in two
|
||||||
|
* different ways to allow flow events to be serialized correctly in both
|
||||||
|
* Chrome's JSON trace event format and Perfetto's proto trace format. Events
|
||||||
|
* of type |Dart_Timeline_Event_Flow_Begin|, |Dart_Timeline_Event_Flow_Step|,
|
||||||
|
* and |Dart_Timeline_Event_Flow_End| must be reported to support serialization
|
||||||
|
* in Chrome's trace format. The |flow_ids| argument must be supplied when
|
||||||
|
* reporting events of type |Dart_Timeline_Event_Begin|,
|
||||||
|
* |Dart_Timeline_Event_Duration|, |Dart_Timeline_Event_Instant|,
|
||||||
|
* |Dart_Timeline_Event_Async_Begin|, and |Dart_Timeline_Event_Async_Instant| to
|
||||||
|
* support serialization in Perfetto's proto format.
|
||||||
|
*
|
||||||
|
* \param label The name of the event. Its lifetime must extend at least until
|
||||||
|
* Dart_Cleanup.
|
||||||
|
* \param timestamp0 The first timestamp of the event.
|
||||||
|
* \param timestamp1_or_id When reporting an event of type
|
||||||
|
* |Dart_Timeline_Event_Duration|, the second (end) timestamp of the event
|
||||||
|
* should be passed through |timestamp1_or_id|. When reporting an event of
|
||||||
|
* type |Dart_Timeline_Event_Async_Begin|, |Dart_Timeline_Event_Async_End|,
|
||||||
|
* or |Dart_Timeline_Event_Async_Instant|, the async ID associated with the
|
||||||
|
* event should be passed through |timestamp1_or_id|. When reporting an
|
||||||
|
* event of type |Dart_Timeline_Event_Flow_Begin|,
|
||||||
|
* |Dart_Timeline_Event_Flow_Step|, or |Dart_Timeline_Event_Flow_End|, the
|
||||||
|
* flow ID associated with the event should be passed through
|
||||||
|
* |timestamp1_or_id|. When reporting an event of type
|
||||||
|
* |Dart_Timeline_Event_Begin| or |Dart_Timeline_Event_End|, the event ID
|
||||||
|
* associated with the event should be passed through |timestamp1_or_id|.
|
||||||
|
* Note that this event ID will only be used by the MacOS recorder. The
|
||||||
|
* argument to |timestamp1_or_id| will not be used when reporting events of
|
||||||
|
* other types.
|
||||||
|
* \param flow_id_count The number of flow IDs associated with this event.
|
||||||
|
* \param flow_ids An array of flow IDs associated with this event. The array
|
||||||
|
* may be reclaimed when this call returns.
|
||||||
|
* \param argument_count The number of argument names and values.
|
||||||
|
* \param argument_names An array of names of the arguments. The lifetime of the
|
||||||
|
* names must extend at least until Dart_Cleanup. The array may be reclaimed
|
||||||
|
* when this call returns.
|
||||||
|
* \param argument_values An array of values of the arguments. The values and
|
||||||
|
* the array may be reclaimed when this call returns.
|
||||||
|
*/
|
||||||
|
DART_EXPORT void Dart_RecordTimelineEvent(const char* label,
|
||||||
|
int64_t timestamp0,
|
||||||
|
int64_t timestamp1_or_id,
|
||||||
|
intptr_t flow_id_count,
|
||||||
|
const int64_t* flow_ids,
|
||||||
|
Dart_Timeline_Event_Type type,
|
||||||
|
intptr_t argument_count,
|
||||||
|
const char** argument_names,
|
||||||
|
const char** argument_values);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Associates a name with the current thread. This name will be used to name
|
||||||
|
* threads in the timeline. Can only be called after a call to Dart_Initialize.
|
||||||
|
*
|
||||||
|
* \param name The name of the thread.
|
||||||
|
*/
|
||||||
|
DART_EXPORT void Dart_SetThreadName(const char* name);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char* name;
|
||||||
|
const char* value;
|
||||||
|
} Dart_TimelineRecorderEvent_Argument;
|
||||||
|
|
||||||
|
#define DART_TIMELINE_RECORDER_CURRENT_VERSION (0x00000002)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* Set to DART_TIMELINE_RECORDER_CURRENT_VERSION */
|
||||||
|
int32_t version;
|
||||||
|
|
||||||
|
/* The event's type / phase. */
|
||||||
|
Dart_Timeline_Event_Type type;
|
||||||
|
|
||||||
|
/* The event's timestamp according to the same clock as
|
||||||
|
* Dart_TimelineGetMicros. For a duration event, this is the beginning time.
|
||||||
|
*/
|
||||||
|
int64_t timestamp0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For a duration event, this is the end time. For an async event, this is the
|
||||||
|
* async ID. For a flow event, this is the flow ID. For a begin or end event,
|
||||||
|
* this is the event ID (which is only referenced by the MacOS recorder).
|
||||||
|
*/
|
||||||
|
int64_t timestamp1_or_id;
|
||||||
|
|
||||||
|
/* The current isolate of the event, as if by Dart_GetMainPortId, or
|
||||||
|
* ILLEGAL_PORT if the event had no current isolate. */
|
||||||
|
Dart_Port isolate;
|
||||||
|
|
||||||
|
/* The current isolate group of the event, as if by
|
||||||
|
* Dart_CurrentIsolateGroupId, or ILLEGAL_PORT if the event had no current
|
||||||
|
* isolate group. */
|
||||||
|
Dart_IsolateGroupId isolate_group;
|
||||||
|
|
||||||
|
/* The callback data associated with the isolate if any. */
|
||||||
|
void* isolate_data;
|
||||||
|
|
||||||
|
/* The callback data associated with the isolate group if any. */
|
||||||
|
void* isolate_group_data;
|
||||||
|
|
||||||
|
/* The name / label of the event. */
|
||||||
|
const char* label;
|
||||||
|
|
||||||
|
/* The stream / category of the event. */
|
||||||
|
const char* stream;
|
||||||
|
|
||||||
|
intptr_t argument_count;
|
||||||
|
Dart_TimelineRecorderEvent_Argument* arguments;
|
||||||
|
} Dart_TimelineRecorderEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback provided by the embedder to handle the completion of timeline
|
||||||
|
* events.
|
||||||
|
*
|
||||||
|
* \param event A timeline event that has just been completed. The VM keeps
|
||||||
|
* ownership of the event and any field in it (i.e., the embedder should copy
|
||||||
|
* any values it needs after the callback returns).
|
||||||
|
*/
|
||||||
|
typedef void (*Dart_TimelineRecorderCallback)(
|
||||||
|
Dart_TimelineRecorderEvent* event);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a `Dart_TimelineRecorderCallback` to be called as timeline events
|
||||||
|
* are completed.
|
||||||
|
*
|
||||||
|
* The callback will be invoked without a current isolate.
|
||||||
|
*
|
||||||
|
* The callback will be invoked on the thread completing the event. Because
|
||||||
|
* `Dart_TimelineEvent` may be called by any thread, the callback may be called
|
||||||
|
* on any thread.
|
||||||
|
*
|
||||||
|
* The callback may be invoked at any time after `Dart_Initialize` is called and
|
||||||
|
* before `Dart_Cleanup` returns.
|
||||||
|
*
|
||||||
|
* If multiple callbacks are registered, only the last callback registered
|
||||||
|
* will be remembered. Providing a NULL callback will clear the registration
|
||||||
|
* (i.e., a NULL callback produced a no-op instead of a crash).
|
||||||
|
*
|
||||||
|
* Setting a callback is insufficient to receive events through the callback. The
|
||||||
|
* VM flag `timeline_recorder` must also be set to `callback`.
|
||||||
|
*/
|
||||||
|
DART_EXPORT void Dart_SetTimelineRecorderCallback(
|
||||||
|
Dart_TimelineRecorderCallback callback);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* =======
|
||||||
|
* Metrics
|
||||||
|
* =======
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return metrics gathered for the VM and individual isolates.
|
||||||
|
*/
|
||||||
|
DART_EXPORT int64_t
|
||||||
|
Dart_IsolateGroupHeapOldUsedMetric(Dart_IsolateGroup group); // Byte
|
||||||
|
DART_EXPORT int64_t
|
||||||
|
Dart_IsolateGroupHeapOldCapacityMetric(Dart_IsolateGroup group); // Byte
|
||||||
|
DART_EXPORT int64_t
|
||||||
|
Dart_IsolateGroupHeapOldExternalMetric(Dart_IsolateGroup group); // Byte
|
||||||
|
DART_EXPORT int64_t
|
||||||
|
Dart_IsolateGroupHeapNewUsedMetric(Dart_IsolateGroup group); // Byte
|
||||||
|
DART_EXPORT int64_t
|
||||||
|
Dart_IsolateGroupHeapNewCapacityMetric(Dart_IsolateGroup group); // Byte
|
||||||
|
DART_EXPORT int64_t
|
||||||
|
Dart_IsolateGroupHeapNewExternalMetric(Dart_IsolateGroup group); // Byte
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ========
|
||||||
|
* UserTags
|
||||||
|
* ========
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Gets the current isolate's currently set UserTag instance.
|
||||||
|
*
|
||||||
|
* \return The currently set UserTag instance.
|
||||||
|
*/
|
||||||
|
DART_EXPORT Dart_Handle Dart_GetCurrentUserTag();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Gets the current isolate's default UserTag instance.
|
||||||
|
*
|
||||||
|
* \return The default UserTag with label 'Default'
|
||||||
|
*/
|
||||||
|
DART_EXPORT Dart_Handle Dart_GetDefaultUserTag();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Creates a new UserTag instance.
|
||||||
|
*
|
||||||
|
* \param label The name of the new UserTag.
|
||||||
|
*
|
||||||
|
* \return The newly created UserTag instance or an error handle.
|
||||||
|
*/
|
||||||
|
DART_EXPORT Dart_Handle Dart_NewUserTag(const char* label);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Updates the current isolate's UserTag to a new value.
|
||||||
|
*
|
||||||
|
* \param user_tag The UserTag to be set as the current UserTag.
|
||||||
|
*
|
||||||
|
* \return The previously set UserTag instance or an error handle.
|
||||||
|
*/
|
||||||
|
DART_EXPORT Dart_Handle Dart_SetCurrentUserTag(Dart_Handle user_tag);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the label of a given UserTag instance.
|
||||||
|
*
|
||||||
|
* \param user_tag The UserTag from which the label will be retrieved.
|
||||||
|
*
|
||||||
|
* \return The UserTag's label. NULL if the user_tag is invalid. The caller is
|
||||||
|
* responsible for freeing the returned label.
|
||||||
|
*/
|
||||||
|
DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_GetUserTagLabel(
|
||||||
|
Dart_Handle user_tag);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* =======
|
||||||
|
* Heap Snapshot
|
||||||
|
* =======
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback provided by the caller of `Dart_WriteHeapSnapshot` which is
|
||||||
|
* used to write out chunks of the requested heap snapshot.
|
||||||
|
*
|
||||||
|
* \param context An opaque context which was passed to `Dart_WriteHeapSnapshot`
|
||||||
|
* together with this callback.
|
||||||
|
*
|
||||||
|
* \param buffer Pointer to the buffer containing a chunk of the snapshot.
|
||||||
|
* The callback owns the buffer and needs to `free` it.
|
||||||
|
*
|
||||||
|
* \param size Number of bytes in the `buffer` to be written.
|
||||||
|
*
|
||||||
|
* \param is_last Set to `true` for the last chunk. The callback will not
|
||||||
|
* be invoked again after it was invoked once with `is_last` set to `true`.
|
||||||
|
*/
|
||||||
|
typedef void (*Dart_HeapSnapshotWriteChunkCallback)(void* context,
|
||||||
|
uint8_t* buffer,
|
||||||
|
intptr_t size,
|
||||||
|
bool is_last);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate heap snapshot of the current isolate group and stream it into the
|
||||||
|
* given `callback`. VM would produce snapshot in chunks and send these chunks
|
||||||
|
* one by one back to the embedder by invoking the provided `callback`.
|
||||||
|
*
|
||||||
|
* This API enables embedder to stream snapshot into a file or socket without
|
||||||
|
* allocating a buffer to hold the whole snapshot in memory.
|
||||||
|
*
|
||||||
|
* The isolate group will be paused for the duration of this operation.
|
||||||
|
*
|
||||||
|
* \param write Callback used to write chunks of the heap snapshot.
|
||||||
|
*
|
||||||
|
* \param context Opaque context which would be passed on each invocation of
|
||||||
|
* `write` callback.
|
||||||
|
*
|
||||||
|
* \returns `nullptr` if the operation is successful otherwise error message.
|
||||||
|
* Caller owns error message string and needs to `free` it.
|
||||||
|
*/
|
||||||
|
DART_EXPORT char* Dart_WriteHeapSnapshot(
|
||||||
|
Dart_HeapSnapshotWriteChunkCallback write,
|
||||||
|
void* context);
|
||||||
|
|
||||||
|
#endif // RUNTIME_INCLUDE_DART_TOOLS_API_H_
|
||||||
16
bridge/include/dart_version.h
Normal file
16
bridge/include/dart_version.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* 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_VERSION_H_
|
||||||
|
#define RUNTIME_INCLUDE_DART_VERSION_H_
|
||||||
|
|
||||||
|
// On breaking changes the major version is increased.
|
||||||
|
// On backwards compatible changes the minor version is increased.
|
||||||
|
// The versioning covers the symbols exposed in dart_api_dl.h
|
||||||
|
#define DART_API_DL_MAJOR_VERSION 2
|
||||||
|
#define DART_API_DL_MINOR_VERSION 3
|
||||||
|
|
||||||
|
#endif /* RUNTIME_INCLUDE_DART_VERSION_H_ */ /* NOLINT */
|
||||||
21
bridge/include/internal/dart_api_dl_impl.h
Normal file
21
bridge/include/internal/dart_api_dl_impl.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* 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_INTERNAL_DART_API_DL_IMPL_H_
|
||||||
|
#define RUNTIME_INCLUDE_INTERNAL_DART_API_DL_IMPL_H_
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char* name;
|
||||||
|
void (*function)(void);
|
||||||
|
} DartApiEntry;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const int major;
|
||||||
|
const int minor;
|
||||||
|
const DartApiEntry* const functions;
|
||||||
|
} DartApi;
|
||||||
|
|
||||||
|
#endif /* RUNTIME_INCLUDE_INTERNAL_DART_API_DL_IMPL_H_ */ /* NOLINT */
|
||||||
Reference in New Issue
Block a user