]> git.vpit.fr Git - perl/modules/Variable-Magic.git/commitdiff
Fix an offset of 1 with len magic on scalars
authorVincent Pit <vince@profvince.com>
Sat, 27 Dec 2008 11:22:07 +0000 (12:22 +0100)
committerVincent Pit <vince@profvince.com>
Sat, 27 Dec 2008 11:22:07 +0000 (12:22 +0100)
Magic.xs
t/22-len.t

index 1b63117385baadf79db86a09695025d9616a717f..38b27dbee18890849f5da63dbe8c02eee4daba76 100644 (file)
--- a/Magic.xs
+++ b/Magic.xs
@@ -512,12 +512,14 @@ STATIC int vmg_svt_set(pTHX_ SV *sv, MAGIC *mg) {
 
 STATIC U32 vmg_svt_len(pTHX_ SV *sv, MAGIC *mg) {
  SV *svr;
- I32 len;
+ I32 len, has_array;
  U32 ret;
 
  dSP;
  int count;
 
+ has_array = SvTYPE(sv) == SVt_PVAV;
+
  ENTER;
  SAVETMPS;
 
@@ -525,11 +527,11 @@ STATIC U32 vmg_svt_len(pTHX_ SV *sv, MAGIC *mg) {
  EXTEND(SP, 3);
  PUSHs(sv_2mortal(newRV_inc(sv)));
  PUSHs(mg->mg_obj ? mg->mg_obj : &PL_sv_undef);
- if (SvTYPE(sv) == SVt_PVAV) {
+ if (has_array) {
   len = av_len((AV *) sv) + 1;
   mPUSHi(len);
  } else {
-  len = 1;
+  len = 0;
   PUSHs(&PL_sv_undef);
  }
  PUTBACK;
@@ -547,7 +549,7 @@ STATIC U32 vmg_svt_len(pTHX_ SV *sv, MAGIC *mg) {
  FREETMPS;
  LEAVE;
 
- return ret - 1;
+ return has_array ? ret - 1 : ret;
 }
 
 STATIC int vmg_svt_clear(pTHX_ SV *sv, MAGIC *mg) {
index 8ea332c5fc8603ff3405370699604bcd62aba468..ec74580a488a7bb4592bf49414f6b847b25f2f99 100644 (file)
@@ -3,12 +3,12 @@
 use strict;
 use warnings;
 
-use Test::More tests => 11;
+use Test::More tests => 13;
 
 use Variable::Magic qw/wizard cast VMG_COMPAT_SCALAR_LENGTH_NOLEN/;
 
 my $c = 0;
-my $n = int rand 1000;
+my $n = 1 + int rand 1000;
 my $wiz = wizard len => sub { ++$c; return $n };
 is($c, 0, 'len : create wizard');
 
@@ -30,21 +30,26 @@ $b = scalar @a;
 is($c, 3, 'len : get array length 0');
 is($b, 0, 'len : get array length 0 correctly');
 
-$c = 0;
-$n = int rand 1000;
-# length magic on scalars needs also get magic to be triggered.
-$wiz = wizard get => sub { return 56478 },
-              len => sub { ++$c; return $n };
+SKIP: {
+ skip 'length() no longer calls mg_len magic' => 5 if VMG_COMPAT_SCALAR_LENGTH_NOLEN;
 
-my $x = int rand 1000;
+ $c = 0;
+ $n = 1 + int rand 1000;
+ # length magic on scalars needs also get magic to be triggered.
+ $wiz = wizard get => sub { return 56478 },
+               len => sub { ++$c; return $n };
 
-SKIP: {
- skip 'length() no longer calls mg_len magic', 3 if VMG_COMPAT_SCALAR_LENGTH_NOLEN;
+ my $x = int rand 1000;
 
  cast $x, $wiz;
  is($c, 0, 'len : cast on scalar');
 
  $b = length $x;
- is($c, 1,      'len : get scalar length');
- is($b, $n - 1, 'len : get scalar length correctly');
+ is($c, 1,  'len : get scalar length');
+ is($b, $n, 'len : get scalar length correctly');
+
+ $n = 0;
+ $b = length $x;
+ is($c, 2,  'len : get scalar length 0');
+ is($b, $n, 'len : get scalar length 0 correctly');
 }