static void context_cleanup(EEL_state *es, EEL_context *c) { switch((EEL_ctxtypes)c->type) { case ECTX_MODULE: eel_unlock_modules(es); break; case ECTX_BLOCK: case ECTX_BODY: case ECTX_FUNCTION: break; } while(c->endjumps) { EEL_codemark *cm = c->endjumps; ej_unlink(c, cm); eel_free(es->vm, cm); } while(c->contjumps) { EEL_codemark *cm = c->contjumps; cj_unlink(c, cm); eel_free(es->vm, cm); } while(c->firstel) eel_e_close(c->firstel); if((c->flags & ECTX_OWNS_BIO) && c->bio) eel_bio_close(c->bio); if((c->flags & ECTX_OWNS_CODER) && c->coder) eel_coder_close(c->coder); DBGD(printf("Killed context '%s'\n", c->name);)
/*---------------------------------------------------------- Unloading ----------------------------------------------------------*/ static EEL_xno eb_net_unload(EEL_object *m, int closing) { if(closing) { eel_free(m->vm, eb_sockets); eb_sockets = NULL; return 0; } else return EEL_XREFUSE; }
void eel_close() { int h; if(!_eel_users) return; for(h = 0; h < MAX_SCRIPTS; ++h) eel_free(h); eel_s_freeall(); eel_set_path(NULL); eel_s_close(); eel_lexer_cleanup(); --_eel_users; }
void eel_s_free(EEL_state *es, EEL_symbol *s) { /* Unlink */ if(s->parent) eel_s_unlink(s->parent, s); /* Cleanup */ while(s->symbols) eel_s_free(es, s->symbols); switch(s->type) { case EEL_SUNDEFINED: case EEL_SKEYWORD: case EEL_SVARIABLE: case EEL_SUPVALUE: case EEL_SBODY: case EEL_SNAMESPACE: break; case EEL_SCONSTANT: eel_v_disown(&s->v.value); break; case EEL_SCLASS: case EEL_SMODULE: case EEL_SFUNCTION: if(s->v.object) eel_o_disown_nz(s->v.object); break; case EEL_SOPERATOR: eel_operator_free(s->v.op); break; } if(s->name) eel_o_disown_nz(s->name); /* Destroy */ eel_free(es->vm, s); }