diff --git a/src/core/capi.c b/src/core/capi.c index 20f6f7f2..b0f8bd1f 100644 --- a/src/core/capi.c +++ b/src/core/capi.c @@ -26,6 +26,16 @@ #include "fiber.h" #endif +static JanetBuildConfig *api_build_config = &(JanetBuildConfig){ + .api_version = JANET_API_VERSION, + .single_threaded = JANET_SINGLE_THREADED_BIT, + .nanbox = JANET_NANBOX_BIT +}; + +const JanetBuildConfig *janet_build_config() { + return api_build_config; +} + void janet_panicv(Janet message) { if (janet_vm_return_reg != NULL) { *janet_vm_return_reg = message; diff --git a/src/include/janet.h b/src/include/janet.h index f77cc3db..a83b9ab5 100644 --- a/src/include/janet.h +++ b/src/include/janet.h @@ -31,6 +31,8 @@ extern "C" { #include "janetconf.h" +#define JANET_API_VERSION 1 + #ifndef JANET_VERSION #define JANET_VERSION "latest" #endif @@ -184,6 +186,26 @@ extern "C" { #endif #endif + +/* Runtime config constants */ +#ifdef JANET_NO_NANBOX +#define JANET_NANBOX_BIT 0 +#else +#define JANET_NANBOX_BIT 1 +#endif + +#ifdef JANET_SINGLE_THREADED +#define JANET_SINGLE_THREADED_BIT 1 +#else +#define JANET_SINGLE_THREADED_BIT 0 +#endif + +typedef struct { + int api_version; + int single_threaded : 1; + int nanbox : 1; +} JanetBuildConfig; + /***** END SECTION CONFIG *****/ /***** START SECTION TYPES *****/ @@ -1255,6 +1277,15 @@ JANET_API void janet_register(const char *name, JanetCFunction cfun); /* New C API */ #define JANET_MODULE_ENTRY JANET_API void _janet_init + +JANET_API int janet_api_version(); +JANET_API const JanetBuildConfig *janet_build_config(); + +#define janet_api_compatible() \ + ((janet_api_build_config()->api_version == JANET_API_VERSION) \ + && (janet_api_build_config()->nanbox == JANET_NANBOX_BIT) \ + && (janet_api_build_config()->single_threaded == JANET_SINGLE_THREADED_BIT)) + JANET_API void janet_panicv(Janet message); JANET_API void janet_panic(const char *message); JANET_API void janet_panics(const uint8_t *message);