comparison src/signals.c @ 8090:fb0eab758560

[gaim-migrate @ 8789] Thanks to Ben Herrenschmidt for pointing this out. committer: Tailor Script <tailor@pidgin.im>
author Ethan Blanton <elb@pidgin.im>
date Tue, 13 Jan 2004 02:15:46 +0000
parents fa6395637e2c
children 47046ceedf0b
comparison
equal deleted inserted replaced
8089:35db601609e3 8090:fb0eab758560
413 { 413 {
414 GaimInstanceData *instance_data; 414 GaimInstanceData *instance_data;
415 GaimSignalData *signal_data; 415 GaimSignalData *signal_data;
416 GaimSignalHandlerData *handler_data; 416 GaimSignalHandlerData *handler_data;
417 GList *l, *l_next; 417 GList *l, *l_next;
418 va_list tmp;
418 419
419 g_return_if_fail(instance != NULL); 420 g_return_if_fail(instance != NULL);
420 g_return_if_fail(signal != NULL); 421 g_return_if_fail(signal != NULL);
421 422
422 instance_data = 423 instance_data =
438 { 439 {
439 l_next = l->next; 440 l_next = l->next;
440 441
441 handler_data = (GaimSignalHandlerData *)l->data; 442 handler_data = (GaimSignalHandlerData *)l->data;
442 443
444 /* This is necessary because a va_list may only be
445 * evaluated once */
446 va_copy(tmp, args);
447
443 if (handler_data->use_vargs) 448 if (handler_data->use_vargs)
444 { 449 {
445 ((void (*)(va_list, void *))handler_data->cb)(args, 450 ((void (*)(va_list, void *))handler_data->cb)(tmp,
446 handler_data->data); 451 handler_data->data);
447 } 452 }
448 else 453 else
449 { 454 {
450 signal_data->marshal(handler_data->cb, args, 455 signal_data->marshal(handler_data->cb, tmp,
451 handler_data->data, NULL); 456 handler_data->data, NULL);
452 } 457 }
458
459 va_end(tmp);
453 } 460 }
454 } 461 }
455 462
456 void * 463 void *
457 gaim_signal_emit_return_1(void *instance, const char *signal, ...) 464 gaim_signal_emit_return_1(void *instance, const char *signal, ...)