#include #include "./std/unistd.h" #include "./gc.h" #include "./closures.h" #include "./effects.h" struct ShedEffectHandler { struct ShedGcObjectHeader gc_object_header; struct ShedEffectHandler* parent; ShedClosurePointer methods[]; }; typedef struct ShedEffectHandler ShedEffectHandler; struct ShedEffectHandler* shed__runtime__current_effect_handler = NULL; ShedEffectHandler* shed__runtime__effects_get_handler() { return shed__runtime__current_effect_handler; } void shed__runtime__effects_set_handler(ShedEffectHandler* effect_handler) { shed__runtime__current_effect_handler = effect_handler; } void shed__runtime__effects_push_handler( ShedEffectHandler* effect_handler ) { effect_handler->parent = shed__runtime__current_effect_handler; shed__runtime__current_effect_handler = effect_handler; } void shed__runtime__effects_pop_handler() { shed__runtime__current_effect_handler = shed__runtime__current_effect_handler->parent; } ShedClosurePointer shed__runtime__effects_find_handler_method( ShedEffectTag effect_tag, ShedEffectMethodIndex method_index ) { ShedEffectHandler* handler = shed__runtime__current_effect_handler; while (handler != NULL) { if (handler->gc_object_header.runtime_type_tag == effect_tag) { return handler->methods[method_index]; } handler = handler->parent; } // TODO: more informative error return NULL; }