| /* |
| * Copyright (c) 2025, 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 SAMPLES_EMBEDDER_HELPERS_H_ |
| #define SAMPLES_EMBEDDER_HELPERS_H_ |
| |
| #include <functional> |
| #include <iostream> |
| #include <string> |
| #include <string_view> |
| #include "include/dart_api.h" |
| #include "include/dart_engine.h" |
| |
| // Loads kernel/AOT snapshot from path depending on |
| // whether we use precompiled runtime. |
| inline DartEngine_SnapshotData AutoSnapshotFromFile(std::string_view path, |
| char** error) { |
| std::string path_string(path); |
| if (Dart_IsPrecompiledRuntime()) { |
| return DartEngine_AotSnapshotFromFile(path_string.c_str(), error); |
| } else { |
| return DartEngine_KernelFromFile(path_string.c_str(), error); |
| } |
| } |
| |
| inline void CheckError(char* error, std::string_view context = "") { |
| if (error != nullptr) { |
| std::cerr << "Error " << context << ": " << error << std::endl; |
| std::exit(1); |
| } |
| } |
| |
| inline Dart_Handle CheckError(Dart_Handle handle, |
| std::string_view context = "") { |
| if (Dart_IsError(handle)) { |
| std::cerr << "Error " << context << ": " << Dart_GetError(handle) |
| << std::endl; |
| std::exit(1); |
| } |
| return handle; |
| } |
| |
| inline std::string StringFromHandle(Dart_Handle handle) { |
| CheckError(handle, "StringFromHandle received an error"); |
| |
| if (!Dart_IsString(handle)) { |
| std::cerr << "StringFromHandle handle is not a string" << std::endl; |
| std::exit(1); |
| } |
| |
| const char* return_value_tmp; |
| Dart_Handle to_string_result = |
| Dart_StringToCString(handle, &return_value_tmp); |
| CheckError(to_string_result, "Dart_StringToCString"); |
| |
| return std::string(return_value_tmp); |
| } |
| |
| inline int64_t IntFromHandle(Dart_Handle handle) { |
| CheckError(handle, "IntFromHandle received an error"); |
| |
| if (!Dart_IsInteger(handle)) { |
| std::cerr << "IntFromHandle handle is not an int" << std::endl; |
| std::exit(1); |
| } |
| |
| int64_t result; |
| Dart_Handle to_int64_result = Dart_IntegerToInt64(handle, &result); |
| CheckError(to_int64_result, "Dart_IntegerToInt64"); |
| return result; |
| } |
| |
| class DartScope { |
| public: |
| DartScope() { Dart_EnterScope(); } |
| virtual ~DartScope() { Dart_ExitScope(); } |
| |
| private: |
| DartScope(const DartScope&) = delete; |
| void operator=(const DartScope&) = delete; |
| }; |
| |
| class IsolateScope { |
| public: |
| explicit IsolateScope(Dart_Isolate isolate) { |
| DartEngine_AcquireIsolate(isolate); |
| } |
| virtual ~IsolateScope() { DartEngine_ReleaseIsolate(); } |
| |
| private: |
| IsolateScope(const IsolateScope&) = delete; |
| void operator=(const IsolateScope&) = delete; |
| }; |
| |
| template <typename T> |
| inline T WithIsolate(Dart_Isolate isolate, std::function<T()> body) { |
| IsolateScope isolate_scope(isolate); |
| DartScope dart_scope; |
| |
| return body(); |
| } |
| |
| #endif /* SAMPLES_EMBEDDER_HELPERS_H_ */ |