[asterisk-commits] tilghman: branch 1.6.1 r222282 - in /branches/1.6.1: ./ res/ael/pval.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Oct 6 14:20:23 CDT 2009
Author: tilghman
Date: Tue Oct 6 14:20:22 2009
New Revision: 222282
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=222282
Log:
Merged revisions 222273 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
........
r222273 | tilghman | 2009-10-06 14:17:11 -0500 (Tue, 06 Oct 2009) | 5 lines
When we call a gosub routine, the variables should be scoped to avoid contaminating the caller.
This affected the ~~EXTEN~~ hack, where a subroutine might have changed the
value before it was used in the caller.
Patch by myself, tested by ebroad on #asterisk
........
Modified:
branches/1.6.1/ (props changed)
branches/1.6.1/res/ael/pval.c
Propchange: branches/1.6.1/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.
Modified: branches/1.6.1/res/ael/pval.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.1/res/ael/pval.c?view=diff&rev=222282&r1=222281&r2=222282
==============================================================================
--- branches/1.6.1/res/ael/pval.c (original)
+++ branches/1.6.1/res/ael/pval.c Tue Oct 6 14:20:22 2009
@@ -3361,38 +3361,60 @@
if (contains_switch(statement)) { /* only run contains_switch if you haven't checked before */
if (mother_exten) {
if (!mother_exten->has_switch) {
- switch_set = new_prio();
- switch_set->type = AEL_APPCALL;
- if (!ast_compat_app_set) {
- switch_set->app = strdup("MSet");
- } else {
- switch_set->app = strdup("Set");
- }
- switch_set->appargs = strdup("~~EXTEN~~=${EXTEN}");
- linkprio(exten, switch_set, mother_exten);
- mother_exten->has_switch = 1;
- mother_exten->checked_switch = 1;
- if (exten) {
- exten->has_switch = 1;
- exten->checked_switch = 1;
+ for (first = 1; first >= 0; first--) {
+ switch_set = new_prio();
+ switch_set->type = AEL_APPCALL;
+ if (!ast_compat_app_set) {
+ switch_set->app = strdup("MSet");
+ } else {
+ switch_set->app = strdup("Set");
+ }
+ /* Are we likely inside a gosub subroutine? */
+ if (!strcmp(mother_exten->name, "s") && first) {
+ /* If we're not actually within a gosub, this will fail, but the
+ * second time through, it will get set. If we are within gosub,
+ * the second time through is redundant, but acceptable. */
+ switch_set->appargs = strdup("LOCAL(~~EXTEN~~)=${EXTEN}");
+ } else {
+ switch_set->appargs = strdup("~~EXTEN~~=${EXTEN}");
+ first = 0;
+ }
+ linkprio(exten, switch_set, mother_exten);
+ mother_exten->has_switch = 1;
+ mother_exten->checked_switch = 1;
+ if (exten) {
+ exten->has_switch = 1;
+ exten->checked_switch = 1;
+ }
}
}
} else if (exten) {
if (!exten->has_switch) {
- switch_set = new_prio();
- switch_set->type = AEL_APPCALL;
- if (!ast_compat_app_set) {
- switch_set->app = strdup("MSet");
- } else {
- switch_set->app = strdup("Set");
- }
- switch_set->appargs = strdup("~~EXTEN~~=${EXTEN}");
- linkprio(exten, switch_set, mother_exten);
- exten->has_switch = 1;
- exten->checked_switch = 1;
- if (mother_exten) {
- mother_exten->has_switch = 1;
- mother_exten->checked_switch = 1;
+ for (first = 1; first >= 0; first--) {
+ switch_set = new_prio();
+ switch_set->type = AEL_APPCALL;
+ if (!ast_compat_app_set) {
+ switch_set->app = strdup("MSet");
+ } else {
+ switch_set->app = strdup("Set");
+ }
+ /* Are we likely inside a gosub subroutine? */
+ if (!strcmp(exten->name, "s")) {
+ /* If we're not actually within a gosub, this will fail, but the
+ * second time through, it will get set. If we are within gosub,
+ * the second time through is redundant, but acceptable. */
+ switch_set->appargs = strdup("LOCAL(~~EXTEN~~)=${EXTEN}");
+ } else {
+ switch_set->appargs = strdup("~~EXTEN~~=${EXTEN}");
+ first = 0;
+ }
+ linkprio(exten, switch_set, mother_exten);
+ exten->has_switch = 1;
+ exten->checked_switch = 1;
+ if (mother_exten) {
+ mother_exten->has_switch = 1;
+ mother_exten->checked_switch = 1;
+ }
}
}
}
More information about the asterisk-commits
mailing list