#pragma once #include "gdjn.h" #include "type.h" Janet gdjn_janetize_typed ( GDExtensionTypePtr const v, GDExtensionVariantType const t ); static inline Janet gdjn_janetize(gd_variant* const v) { return gdjn_janetize_typed(v, _t(variant).getType(v)); } void gdjn_dejanetize_typed ( GDExtensionTypePtr v, /* out */ GDExtensionVariantType const t, Janet val /* in */ ); // typedef struct gdjn_vm_class { // // } gdjn_vm_class; JanetTable* gdjn_vm_api_build_compTime(void); JanetTable* gdjn_vm_api_build_core(void); JanetTable* gdjn_vm_compile ( pstr const body, JanetTable* api, const char* ctx ); pstr gdjn_vm_image ( JanetTable* env, JanetTable* binds ); typedef struct gdjn_vm_bind { enum gdjn_vm_bind_kind { gdjn_vm_bind_flag_static = 1 << 5, gdjn_vm_bind_flag_doc = 1 << 6, gdjn_vm_bind_flag_umask = ~( gdjn_vm_bind_flag_static | gdjn_vm_bind_flag_doc ), gdjn_vm_bind_none = 0, gdjn_vm_bind_const, gdjn_vm_bind_prop, gdjn_vm_bind_method, gdjn_vm_bind_class, gdjn_vm_bind_mac, /* always static unfortunately */ gdjn_vm_bind_prop_static = gdjn_vm_bind_prop | gdjn_vm_bind_flag_static, gdjn_vm_bind_method_static = gdjn_vm_bind_method | gdjn_vm_bind_flag_static, } kind; Janet val, meta; } gdjn_vm_bind; static inline bool gdjn_vm_metaKey ( JanetTable* const bind, char const* const kw, Janet * valSlot ) { Janet jv; if (valSlot == nullptr) valSlot = &jv; *valSlot = janet_table_get(bind, janet_ckeywordv(kw)); return (janet_type(*valSlot) != JANET_NIL); } static inline bool gdjn_vm_metaFlag ( JanetTable* const bind, char const* const kw ) { Janet v = janet_table_get(bind, janet_ckeywordv(kw)); return janet_truthy(v); } gdjn_vm_bind gdjn_vm_meta ( JanetTable* bind ); gdjn_vm_bind gdjn_vm_resv ( JanetTable* env, Janet key );