diff plugins/perl/perl.c @ 6520:2e2593d95121

[gaim-migrate @ 7037] Added timeout handler support to perl. It may not work. Probably should, but who knows. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Wed, 20 Aug 2003 10:25:58 +0000
parents cbd24b37350d
children 0c5233faceb8
line wrap: on
line diff
--- a/plugins/perl/perl.c	Wed Aug 20 09:33:56 2003 +0000
+++ b/plugins/perl/perl.c	Wed Aug 20 10:25:58 2003 +0000
@@ -161,130 +161,24 @@
 	perl_run(my_perl);
 }
 
-/*
-  2003/02/06: execute_perl modified by Mark Doliner <mark@kingant.net>
-		Pass parameters by pushing them onto the stack rather than
-		passing an array of strings.  This way, perl scripts can
-		modify the parameters and we can get the changed values
-		and then shoot ourselves.  I mean, uh, use them.
-
-  2001/06/14: execute_perl replaced by Martin Persson <mep@passagen.se>
-		previous use of perl_eval leaked memory, replaced with
-		a version that uses perl_call instead
-
-  30/11/2002: execute_perl modified by Eric Timme <timothy@voidnet.com>
-		args changed to char** so that we can have preparsed
-  		arguments again, and many headaches ensued! This essentially
-		means we replaced one hacked method with a messier hacked
-		method out of perceived necessity. Formerly execute_perl
-		required a single char_ptr, and it would insert it into an
-		array of character pointers and NULL terminate the new array.
-		Now we have to pass in pre-terminated character pointer arrays
-		to accomodate functions that want to pass in multiple arguments.
-
-		Previously arguments were preparsed because an argument list
-		was constructed in the form 'arg one','arg two' and was
-		executed via a call like &funcname(arglist) (see .59.x), so
-		the arglist was magically pre-parsed because of the method.
-		With Martin Persson's change to perl_call we now need to
-		use a null terminated list of character pointers for arguments
-		if we wish them to be parsed. Lacking a better way to allow
-		for both single arguments and many I created a NULL terminated
-		array in every function that called execute_perl and passed
-		that list into the function.  In the former version a single
-		character pointer was passed in, and was placed into an array
-		of character pointers with two elements, with a NULL element
-		tacked onto the back, but this method no longer seemed prudent.
-
-		Enhancements in the future might be to get rid of pre-declaring
-		the array sizes?  I am not comfortable enough with this
-		subject to attempt it myself and hope it to stand the test
-		of time.
-*/
-
-static int
-execute_perl(const char *function, int argc, char **args)
-{
-	int count = 0, i, ret_value = 1;
-	SV *sv_args[argc];
-	STRLEN na;
-
-	/*
-	 * Set up the perl environment, push arguments onto the
-	 * perl stack, then call the given function
-	 */
-	dSP;
-	ENTER;
-	SAVETMPS;
-	PUSHMARK(sp);
-
-	for (i = 0; i < argc; i++) {
-		if (args[i]) {
-			sv_args[i] = sv_2mortal(newSVpv(args[i], 0));
-			XPUSHs(sv_args[i]);
-		}
-	}
-
-	PUTBACK;
-	count = call_pv(function, G_EVAL | G_SCALAR);
-	SPAGAIN;
-
-	/*
-	 * Check for "die," make sure we have 1 argument, and set our
-	 * return value.
-	 */
-	if (SvTRUE(ERRSV)) {
-		gaim_debug(GAIM_DEBUG_ERROR, "perl",
-				   "Perl function %s exited abnormally: %s\n",
-				   function, SvPV(ERRSV, na));
-		POPs;
-	}
-	else if (count != 1) {
-		/*
-		 * This should NEVER happen.  G_SCALAR ensures that we WILL
-		 * have 1 parameter.
-		 */
-		gaim_debug(GAIM_DEBUG_ERROR, "perl",
-				   "Perl error from %s: expected 1 return value, "
-				   "but got %d\n", function, count);
-	}
-	else
-		ret_value = POPi;
-
-	/* Check for changed arguments */
-	for (i = 0; i < argc; i++) {
-		if (args[i] && strcmp(args[i], SvPVX(sv_args[i]))) {
-			/*
-			 * Shizzel.  So the perl script changed one of the parameters,
-			 * and we want this change to affect the original parameters.
-			 * args[i] is just a tempory little list of pointers.  We don't
-			 * want to free args[i] here because the new parameter doesn't
-			 * overwrite the data that args[i] points to.  That is done by
-			 * the function that called execute_perl.  I'm not explaining this
-			 * very well.  See, it's aggregate...  Oh, but if 2 perl scripts
-			 * both modify the data, _that's_ a memleak.  This is really kind
-			 * of hackish.  I should fix it.  Look how long this comment is.
-			 * Holy crap.
-			 */
-			args[i] = g_strdup(SvPV(sv_args[i], na));
-		}
-	}
-
-	PUTBACK;
-	FREETMPS;
-	LEAVE;
-
-	return ret_value;
-}
-
 static void
 perl_end(void)
 {
-	if (my_perl != NULL) {
-		perl_destruct(my_perl);
-		perl_free(my_perl);
-		my_perl = NULL;
-	}
+	if (my_perl == NULL)
+		return;
+
+	perl_eval_pv(
+		"foreach my $lib (@DynaLoader::dl_modules) {"
+		  "if ($lib =~ /^Gaim\\b/) {"
+		    "$lib .= '::deinit();';"
+		    "eval $lib;"
+		  "}"
+		"}",
+		TRUE);
+
+	perl_destruct(my_perl);
+	perl_free(my_perl);
+	my_perl = NULL;
 }
 
 void