]> git.vpit.fr Git - perl/modules/Scope-Upper.git/commitdiff
Rewrite the origin initialization loop in su_init()
authorVincent Pit <vince@profvince.com>
Wed, 22 Jul 2015 14:24:48 +0000 (11:24 -0300)
committerVincent Pit <vince@profvince.com>
Wed, 22 Jul 2015 14:24:48 +0000 (11:24 -0300)
It used to iterate downward, and then the indices used were of the form
a - i and b - i.

Upper.xs

index c23b6c05ed0f0dc08dab476d966819a7b593552e..728cfecd663bfca78f00c7cd3161f51f8a758673 100644 (file)
--- a/Upper.xs
+++ b/Upper.xs
@@ -1056,7 +1056,7 @@ static void su_pop(pTHX_ void *ud) {
 
 static I32 su_init(pTHX_ void *ud, I32 cxix, I32 size) {
 #define su_init(U, C, S) su_init(aTHX_ (U), (C), (S))
- I32 i, depth = 1, pad, offset, *origin;
+ I32 i, depth = 1, pad, offset, base, *origin;
 
  SU_D(PerlIO_printf(Perl_debug_log, "%p: ### init for cx %d\n", ud, cxix));
 
@@ -1096,11 +1096,12 @@ static I32 su_init(pTHX_ void *ud, I32 cxix, I32 size) {
  SU_D(PerlIO_printf(Perl_debug_log, "%p: going down to depth %d\n", ud, depth));
 
  Newx(origin, depth + 1, I32);
- origin[0] = PL_scopestack[PL_scopestack_ix - depth];
- PL_scopestack[PL_scopestack_ix - depth] += size;
- for (i = depth - 1; i >= 1; --i) {
-  I32 j = PL_scopestack_ix - i;
-  origin[depth - i] = PL_scopestack[j];
+ base = PL_scopestack_ix - depth;
+ origin[0] = PL_scopestack[base];
+ PL_scopestack[base] += size;
+ for (i = 1; i < depth; ++i) {
+  I32 j = i + base;
+  origin[i] = PL_scopestack[j];
   PL_scopestack[j] += offset;
  }
  origin[depth] = PL_savestack_ix;