static void cmd_script_exec(const char *data) { PERL_SCRIPT_REC *script; GHashTable *optlist; char *code; void *free_arg; if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_GETREST, "script exec", &optlist, &code)) return; if (*code == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); script = perl_script_load_data(code); if (script != NULL && g_hash_table_lookup(optlist, "permanent") == NULL) { /* not a permanent script, unload immediately */ perl_script_unload(script); } cmd_params_free(free_arg); }
/* Destroy all perl scripts and deinitialize perl interpreter */ void perl_scripts_deinit(void) { if (my_perl == NULL) return; /* unload all scripts */ while (perl_scripts != NULL) perl_script_unload(perl_scripts->data); signal_emit("perl scripts deinit", 0); perl_signals_stop(); perl_sources_stop(); perl_common_stop(); /* Unload all perl libraries loaded with dynaloader */ perl_eval_pv("foreach my $lib (@DynaLoader::dl_modules) { if ($lib =~ /^Irssi\\b/) { $lib .= '::deinit();'; eval $lib; } }", TRUE); /* We could unload all libraries .. but this crashes with some libraries, probably because we don't call some deinit function.. Anyway, this would free some memory with /SCRIPT RESET, but it leaks memory anyway. */ /*perl_eval_pv("eval { foreach my $lib (@DynaLoader::dl_librefs) { DynaLoader::dl_unload_file($lib); } }", TRUE);*/ /* perl interpreter */ perl_destruct(my_perl); perl_free(my_perl); my_perl = NULL; }
static void sig_script_error(PERL_SCRIPT_REC *script, const char *error) { char *str; if (print_script_errors) { str = g_strdup_printf("Script '%s' error:", script == NULL ? "??" : script->name); signal_emit("gui dialog", 2, "error", str); signal_emit("gui dialog", 2, "error", error); g_free(str); } if (script != NULL) { perl_script_unload(script); signal_stop(); } }
/* Destroy all perl scripts and deinitialize perl interpreter */ void perl_scripts_deinit(void) { if (my_perl == NULL) return; /* unload all scripts */ while (perl_scripts != NULL) perl_script_unload(perl_scripts->data); signal_emit("perl scripts deinit", 0); perl_signals_stop(); perl_sources_stop(); perl_common_stop(); /* Unload all perl libraries loaded with dynaloader */ perl_eval_pv("foreach my $lib (@DynaLoader::dl_modules) { if ($lib =~ /^Irssi\\b/) { $lib .= '::deinit();'; eval $lib; } }", TRUE); #if PERL_STATIC_LIBS == 1 /* If perl is statically built we should manually deinit the modules which are booted in boot_Irssi_Core above */ perl_eval_pv("foreach my $lib (qw(" "Irssi" " " "Irssi::Irc" " " "Irssi::UI" " " "Irssi::TextUI" ")) { eval $lib . '::deinit();'; }", TRUE); #endif /* We could unload all libraries .. but this crashes with some libraries, probably because we don't call some deinit function.. Anyway, this would free some memory with /SCRIPT RESET, but it leaks memory anyway. */ /*perl_eval_pv("eval { foreach my $lib (@DynaLoader::dl_librefs) { DynaLoader::dl_unload_file($lib); } }", TRUE);*/ /* perl interpreter */ PL_perl_destruct_level = 1; perl_destruct(my_perl); perl_free(my_perl); my_perl = NULL; }
/* NOTE: name must not be free'd */ static PERL_SCRIPT_REC *script_load(char *name, const char *path, const char *data) { PERL_SCRIPT_REC *script; /* if there's a script with a same name, destroy it */ script = perl_script_find(name); if (script != NULL) perl_script_unload(script); script = g_new0(PERL_SCRIPT_REC, 1); script->name = name; script->package = g_strdup_printf("Irssi::Script::%s", name); script->path = g_strdup(path); script->data = g_strdup(data); perl_scripts = g_slist_append(perl_scripts, script); signal_emit("script created", 1, script); if (!perl_script_eval(script)) script = NULL; /* the script is destroyed in "script error" signal */ return script; }
static void cmd_script_unload(const char *data) { PERL_SCRIPT_REC *script; char *name; void *free_arg; if (!cmd_get_params(data, &free_arg, 1, &name)) return; if (*name == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); script_fix_name(name); script = perl_script_find(name); if (script == NULL) { printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, TXT_SCRIPT_NOT_LOADED, name); } else { printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, TXT_SCRIPT_UNLOADED, script->name); perl_script_unload(script); } cmd_params_free(free_arg); }