| /* |
| * 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 <string.h> |
| |
| #define DART_API_DL_DEFINITIONS(name, R, A) name##_Type name##_DL = NULL; |
| |
| DART_API_ALL_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; |
| } |
| |
| 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 |
| |
| return 0; |
| } |