libpurple/plugins/perl/perl-common.c

changeset 23980
a38cbb35eecf
parent 23915
b62601fd6e7d
child 26826
eef9f07b6874
equal deleted inserted replaced
23979:936d7ef5cece 23980:a38cbb35eecf
174 int 174 int
175 execute_perl(const char *function, int argc, char **args) 175 execute_perl(const char *function, int argc, char **args)
176 { 176 {
177 int count = 0, i, ret_value = 1; 177 int count = 0, i, ret_value = 1;
178 SV *sv_args[argc]; 178 SV *sv_args[argc];
179 STRLEN na;
180 dSP; 179 dSP;
181 PERL_SET_CONTEXT(my_perl); 180 PERL_SET_CONTEXT(my_perl);
182 /* 181 /*
183 * Set up the perl environment, push arguments onto the 182 * Set up the perl environment, push arguments onto the
184 * perl stack, then call the given function 183 * perl stack, then call the given function
205 * return value. 204 * return value.
206 */ 205 */
207 if (SvTRUE(ERRSV)) { 206 if (SvTRUE(ERRSV)) {
208 purple_debug(PURPLE_DEBUG_ERROR, "perl", 207 purple_debug(PURPLE_DEBUG_ERROR, "perl",
209 "Perl function %s exited abnormally: %s\n", 208 "Perl function %s exited abnormally: %s\n",
210 function, SvPV(ERRSV, na)); 209 function, SvPVutf8_nolen(ERRSV));
211 (void)POPs; 210 (void)POPs;
212 } else if (count != 1) { 211 } else if (count != 1) {
213 /* 212 /*
214 * This should NEVER happen. G_SCALAR ensures that we WILL 213 * This should NEVER happen. G_SCALAR ensures that we WILL
215 * have 1 parameter. 214 * have 1 parameter.
233 * very well. See, it's aggregate... Oh, but if 2 perl scripts 232 * very well. See, it's aggregate... Oh, but if 2 perl scripts
234 * both modify the data, _that's_ a memleak. This is really kind 233 * both modify the data, _that's_ a memleak. This is really kind
235 * of hackish. I should fix it. Look how long this comment is. 234 * of hackish. I should fix it. Look how long this comment is.
236 * Holy crap. 235 * Holy crap.
237 */ 236 */
238 args[i] = g_strdup(SvPV(sv_args[i], na)); 237 args[i] = g_strdup(SvPVutf8_nolen(sv_args[i]));
239 } 238 }
240 } 239 }
241 240
242 PUTBACK; 241 PUTBACK;
243 FREETMPS; 242 FREETMPS;
379 #endif 378 #endif
380 379
381 void * 380 void *
382 purple_perl_data_from_sv(PurpleValue *value, SV *sv) 381 purple_perl_data_from_sv(PurpleValue *value, SV *sv)
383 { 382 {
384 STRLEN na;
385 383
386 switch (purple_value_get_type(value)) { 384 switch (purple_value_get_type(value)) {
387 case PURPLE_TYPE_BOOLEAN: return (void *)SvIV(sv); 385 case PURPLE_TYPE_BOOLEAN: return (void *)SvIV(sv);
388 case PURPLE_TYPE_INT: return (void *)SvIV(sv); 386 case PURPLE_TYPE_INT: return (void *)SvIV(sv);
389 case PURPLE_TYPE_UINT: return (void *)SvUV(sv); 387 case PURPLE_TYPE_UINT: return (void *)SvUV(sv);
390 case PURPLE_TYPE_LONG: return (void *)SvIV(sv); 388 case PURPLE_TYPE_LONG: return (void *)SvIV(sv);
391 case PURPLE_TYPE_ULONG: return (void *)SvUV(sv); 389 case PURPLE_TYPE_ULONG: return (void *)SvUV(sv);
392 case PURPLE_TYPE_INT64: return (void *)SvIV(sv); 390 case PURPLE_TYPE_INT64: return (void *)SvIV(sv);
393 case PURPLE_TYPE_UINT64: return (void *)SvUV(sv); 391 case PURPLE_TYPE_UINT64: return (void *)SvUV(sv);
394 case PURPLE_TYPE_STRING: return g_strdup((void *)SvPV(sv, na)); 392 case PURPLE_TYPE_STRING: return g_strdup(SvPVutf8_nolen(sv));
395 case PURPLE_TYPE_POINTER: return (void *)SvIV(sv); 393 case PURPLE_TYPE_POINTER: return (void *)SvIV(sv);
396 case PURPLE_TYPE_BOXED: return (void *)SvIV(sv); 394 case PURPLE_TYPE_BOXED: return (void *)SvIV(sv);
397 395
398 default: 396 default:
399 return NULL; 397 return NULL;

mercurial