Mercurial > pidgin
diff plugins/perl/perl-handlers.c @ 6920:13f78c350cd3
[gaim-migrate @ 7467]
Fixed problems with the wrong data being sent to signal callbacks in perl
plugins. The resulting code has more sanity checks, but is extremely ugly,
and is therefore rated R. Parents, don't let your children see
perl-common.c.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Wed, 24 Sep 2003 00:03:08 +0000 |
parents | 1aa771990188 |
children | 11d05ddf30a3 |
line wrap: on
line diff
--- a/plugins/perl/perl-handlers.c Tue Sep 23 22:35:00 2003 +0000 +++ b/plugins/perl/perl-handlers.c Wed Sep 24 00:03:08 2003 +0000 @@ -71,7 +71,7 @@ int value_count; GaimValue *ret_value, **values; SV **sv_args; - STRLEN na; + void **copy_args; dSP; ENTER; @@ -81,15 +81,14 @@ gaim_signal_get_values(handler->instance, handler->signal, &ret_value, &value_count, &values); - sv_args = g_new(SV *, value_count); + sv_args = g_new(SV *, value_count); + copy_args = g_new(void *, value_count); for (i = 0; i < value_count; i++) { - SV *sv = gaim_perl_sv_from_vargs(values[i], args); + sv_args[i] = gaim_perl_sv_from_vargs(values[i], &args, ©_args[i]); - sv_args[i] = sv; - - XPUSHs(sv); + XPUSHs(sv_args[i]); } XPUSHs((SV *)handler->data); @@ -105,55 +104,7 @@ if (count != 1) croak("Uh oh! call_sv returned %i != 1", i); else - { - SV *temp_ret_val = POPs; - - switch (gaim_value_get_type(ret_value)) - { - case GAIM_TYPE_BOOLEAN: - ret_val = (void *)SvIV(temp_ret_val); - break; - - case GAIM_TYPE_INT: - ret_val = (void *)SvIV(temp_ret_val); - break; - - case GAIM_TYPE_UINT: - ret_val = (void *)SvUV(temp_ret_val); - break; - - case GAIM_TYPE_LONG: - ret_val = (void *)SvIV(temp_ret_val); - break; - - case GAIM_TYPE_ULONG: - ret_val = (void *)SvUV(temp_ret_val); - break; - - case GAIM_TYPE_INT64: - ret_val = (void *)SvIV(temp_ret_val); - break; - - case GAIM_TYPE_UINT64: - ret_val = (void *)SvUV(temp_ret_val); - break; - - case GAIM_TYPE_STRING: - ret_val = (void *)SvPV(temp_ret_val, na); - break; - - case GAIM_TYPE_POINTER: - ret_val = (void *)SvIV(temp_ret_val); - break; - - case GAIM_TYPE_BOXED: - ret_val = (void *)SvIV(temp_ret_val); - break; - - default: - ret_val = NULL; - } - } + ret_val = gaim_perl_data_from_sv(ret_value, POPs); } else call_sv(handler->callback, G_SCALAR); @@ -163,55 +114,8 @@ { if (gaim_value_is_outgoing(values[i])) { - switch (gaim_value_get_type(values[i])) - { - case GAIM_TYPE_BOOLEAN: - *va_arg(args, gboolean *) = SvIV(sv_args[i]); - break; - - case GAIM_TYPE_INT: - *va_arg(args, int *) = SvIV(sv_args[i]); - break; - - case GAIM_TYPE_UINT: - *va_arg(args, unsigned int *) = SvUV(sv_args[i]); - break; - - case GAIM_TYPE_LONG: - *va_arg(args, long *) = SvIV(sv_args[i]); - break; - - case GAIM_TYPE_ULONG: - *va_arg(args, unsigned long *) = SvUV(sv_args[i]); - break; - - case GAIM_TYPE_INT64: - *va_arg(args, gint64 *) = SvIV(sv_args[i]); - break; - - case GAIM_TYPE_UINT64: - *va_arg(args, guint64 *) = SvUV(sv_args[i]); - break; - - case GAIM_TYPE_STRING: - /* XXX Memory leak! */ - *va_arg(args, char **) = SvPV(sv_args[i], na); - break; - - case GAIM_TYPE_POINTER: - /* XXX Possible memory leak! */ - *va_arg(args, void **) = (void *)SvIV(sv_args[i]); - break; - - case GAIM_TYPE_BOXED: - /* Uh.. I dunno. Try this? Likely won't work. Heh. */ - /* XXX Possible memory leak! */ - *va_arg(args, void **) = (void *)SvIV(sv_args[i]); - break; - - default: - return FALSE; - } + *((void **)copy_args[i]) = gaim_perl_data_from_sv(values[i], + sv_args[i]); } } @@ -219,6 +123,7 @@ LEAVE; g_free(sv_args); + g_free(copy_args); gaim_debug_misc("perl", "ret_val = %p\n", ret_val);