diff options
Diffstat (limited to 'src/perl/perl.c')
-rw-r--r-- | src/perl/perl.c | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/src/perl/perl.c b/src/perl/perl.c index b4639ef9..e9fb27cb 100644 --- a/src/perl/perl.c +++ b/src/perl/perl.c @@ -170,6 +170,8 @@ static void irssi_perl_start(void) perl_parse(irssi_perl_interp, xs_init, 3, args, NULL); perl_eval_pv(eval_file_code, TRUE); + + perl_common_init(); } static int signal_destroy_hash(void *key, GSList **list, const char *package) @@ -295,6 +297,9 @@ static void irssi_perl_stop(void) g_slist_free(perl_scripts); perl_scripts = NULL; + /* perl-common stuff */ + perl_common_deinit(); + /* perl interpreter */ perl_destruct(irssi_perl_interp); perl_free(irssi_perl_interp); @@ -373,6 +378,34 @@ static void cmd_run(const char *data) LEAVE; } +static void cmd_perl(const char *data) +{ + dSP; + GString *code; + + ENTER; + SAVETMPS; + + PUSHMARK(SP); + + code = g_string_new("use Irssi;\n"); + g_string_append(code, data); + perl_eval_pv(code->str, G_NOARGS|G_EVAL|G_DISCARD); + g_string_free(code, TRUE); + + SPAGAIN; + + if (SvTRUE(ERRSV)) { + STRLEN n_a; + + signal_emit("gui dialog", 2, "error", SvPV(ERRSV, n_a)); + } + + PUTBACK; + FREETMPS; + LEAVE; +} + static void cmd_unload(const char *data) { char *name; @@ -604,8 +637,7 @@ static int perl_get_args(int signal, SV **args, va_list va) args[n] = irssi_bless((SERVER_REC *) arg); } else { /* blessed object */ - stash = gv_stashpv(rec->args[n], 0); - args[n] = new_bless(arg, stash); + args[n] = irssi_bless_plain(rec->args[n], arg); } } return n; @@ -724,24 +756,23 @@ void perl_init(void) perl_scripts = NULL; command_bind("run", NULL, (SIGNAL_FUNC) cmd_run); command_bind_first("unload", NULL, (SIGNAL_FUNC) cmd_unload); + command_bind("perl", NULL, (SIGNAL_FUNC) cmd_perl); command_bind("perlflush", NULL, (SIGNAL_FUNC) cmd_perlflush); signal_grabbed = siglast_grabbed = FALSE; PL_perl_destruct_level = 1; irssi_perl_start(); - - perl_common_init(); irssi_perl_autorun(); } void perl_deinit(void) { irssi_perl_stop(); - perl_common_deinit(); if (signal_grabbed) signal_remove("signal", (SIGNAL_FUNC) sig_signal); if (siglast_grabbed) signal_remove("last signal", (SIGNAL_FUNC) sig_lastsignal); command_unbind("run", (SIGNAL_FUNC) cmd_run); command_unbind("unload", (SIGNAL_FUNC) cmd_unload); + command_unbind("perl", (SIGNAL_FUNC) cmd_perl); command_unbind("perlflush", (SIGNAL_FUNC) cmd_perlflush); } |