mirror of
https://github.com/janet-lang/janet
synced 2024-11-29 03:19:54 +00:00
Use separate registry table for abstract types.
This avoids overloading the registry table, which is intended for names of c functions.
This commit is contained in:
parent
6a3a983f43
commit
a3aaa6634d
@ -53,6 +53,10 @@ extern JANET_THREAD_LOCAL Janet *janet_vm_return_reg;
|
|||||||
* along with otherwise bare c function pointers. */
|
* along with otherwise bare c function pointers. */
|
||||||
extern JANET_THREAD_LOCAL JanetTable *janet_vm_registry;
|
extern JANET_THREAD_LOCAL JanetTable *janet_vm_registry;
|
||||||
|
|
||||||
|
/* Registry for abstract abstract types that can be marshalled.
|
||||||
|
* We need this to look up the constructors when unmarshalling. */
|
||||||
|
extern JANET_THREAD_LOCAL JanetTable *janet_vm_abstract_registry;
|
||||||
|
|
||||||
/* Immutable value cache */
|
/* Immutable value cache */
|
||||||
extern JANET_THREAD_LOCAL const uint8_t **janet_vm_cache;
|
extern JANET_THREAD_LOCAL const uint8_t **janet_vm_cache;
|
||||||
extern JANET_THREAD_LOCAL uint32_t janet_vm_cache_capacity;
|
extern JANET_THREAD_LOCAL uint32_t janet_vm_cache_capacity;
|
||||||
|
@ -421,40 +421,23 @@ void janet_cfuns(JanetTable *env, const char *regprefix, const JanetReg *cfuns)
|
|||||||
free(longname_buffer);
|
free(longname_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Abstract type introspection - not meant to be used directly */
|
/* Abstract type introspection */
|
||||||
|
|
||||||
static const JanetAbstractType janet_abstract_info_type = {
|
|
||||||
"core/abstract-info",
|
|
||||||
JANET_ATEND_NAME
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
const JanetAbstractType *at;
|
|
||||||
} JanetAbstractTypeWrap;
|
|
||||||
|
|
||||||
void janet_register_abstract_type(const JanetAbstractType *at) {
|
void janet_register_abstract_type(const JanetAbstractType *at) {
|
||||||
JanetAbstractTypeWrap *abstract = (JanetAbstractTypeWrap *)
|
|
||||||
janet_abstract(&janet_abstract_info_type, sizeof(JanetAbstractTypeWrap));
|
|
||||||
abstract->at = at;
|
|
||||||
Janet sym = janet_csymbolv(at->name);
|
Janet sym = janet_csymbolv(at->name);
|
||||||
if (!(janet_checktype(janet_table_get(janet_vm_registry, sym), JANET_NIL))) {
|
if (!(janet_checktype(janet_table_get(janet_vm_abstract_registry, sym), JANET_NIL))) {
|
||||||
janet_panicf("cannot register abstract type %s, "
|
janet_panicf("cannot register abstract type %s, "
|
||||||
"a type with the same name exists", at->name);
|
"a type with the same name exists", at->name);
|
||||||
}
|
}
|
||||||
janet_table_put(janet_vm_registry, sym, janet_wrap_abstract(abstract));
|
janet_table_put(janet_vm_abstract_registry, sym, janet_wrap_pointer((void *) at));
|
||||||
}
|
}
|
||||||
|
|
||||||
const JanetAbstractType *janet_get_abstract_type(Janet key) {
|
const JanetAbstractType *janet_get_abstract_type(Janet key) {
|
||||||
Janet twrap = janet_table_get(janet_vm_registry, key);
|
Janet wrapped = janet_table_get(janet_vm_abstract_registry, key);
|
||||||
if (janet_checktype(twrap, JANET_NIL)) {
|
if (janet_checktype(wrapped, JANET_NIL)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!janet_checktype(twrap, JANET_ABSTRACT) ||
|
return (JanetAbstractType *)(janet_unwrap_pointer(wrapped));
|
||||||
(janet_abstract_type(janet_unwrap_abstract(twrap)) != &janet_abstract_info_type)) {
|
|
||||||
janet_panic("expected abstract type");
|
|
||||||
}
|
|
||||||
JanetAbstractTypeWrap *w = (JanetAbstractTypeWrap *)janet_unwrap_abstract(twrap);
|
|
||||||
return w->at;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef JANET_BOOTSTRAP
|
#ifndef JANET_BOOTSTRAP
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
/* VM state */
|
/* VM state */
|
||||||
JANET_THREAD_LOCAL JanetTable *janet_vm_core_env;
|
JANET_THREAD_LOCAL JanetTable *janet_vm_core_env;
|
||||||
JANET_THREAD_LOCAL JanetTable *janet_vm_registry;
|
JANET_THREAD_LOCAL JanetTable *janet_vm_registry;
|
||||||
|
JANET_THREAD_LOCAL JanetTable *janet_vm_abstract_registry;
|
||||||
JANET_THREAD_LOCAL int janet_vm_stackn = 0;
|
JANET_THREAD_LOCAL int janet_vm_stackn = 0;
|
||||||
JANET_THREAD_LOCAL JanetFiber *janet_vm_fiber = NULL;
|
JANET_THREAD_LOCAL JanetFiber *janet_vm_fiber = NULL;
|
||||||
JANET_THREAD_LOCAL Janet *janet_vm_return_reg = NULL;
|
JANET_THREAD_LOCAL Janet *janet_vm_return_reg = NULL;
|
||||||
@ -1380,7 +1381,9 @@ int janet_init(void) {
|
|||||||
janet_scratch_cap = 0;
|
janet_scratch_cap = 0;
|
||||||
/* Initialize registry */
|
/* Initialize registry */
|
||||||
janet_vm_registry = janet_table(0);
|
janet_vm_registry = janet_table(0);
|
||||||
|
janet_vm_abstract_registry = janet_table(0);
|
||||||
janet_gcroot(janet_wrap_table(janet_vm_registry));
|
janet_gcroot(janet_wrap_table(janet_vm_registry));
|
||||||
|
janet_gcroot(janet_wrap_table(janet_vm_abstract_registry));
|
||||||
/* Core env */
|
/* Core env */
|
||||||
janet_vm_core_env = NULL;
|
janet_vm_core_env = NULL;
|
||||||
/* Seed RNG */
|
/* Seed RNG */
|
||||||
@ -1401,6 +1404,7 @@ void janet_deinit(void) {
|
|||||||
janet_vm_root_count = 0;
|
janet_vm_root_count = 0;
|
||||||
janet_vm_root_capacity = 0;
|
janet_vm_root_capacity = 0;
|
||||||
janet_vm_registry = NULL;
|
janet_vm_registry = NULL;
|
||||||
|
janet_vm_abstract_registry = NULL;
|
||||||
janet_vm_core_env = NULL;
|
janet_vm_core_env = NULL;
|
||||||
#ifdef JANET_THREADS
|
#ifdef JANET_THREADS
|
||||||
janet_threads_deinit();
|
janet_threads_deinit();
|
||||||
|
Loading…
Reference in New Issue
Block a user