This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix int vs STRLEN issue
[perl5.git] / av.c
diff --git a/av.c b/av.c
index 5242ffc..3b0913a 100644 (file)
--- a/av.c
+++ b/av.c
@@ -1,6 +1,6 @@
 /*    av.c
  *
- *    Copyright (c) 1991-1997, Larry Wall
+ *    Copyright (c) 1991-1999, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
  */
 
 #include "EXTERN.h"
+#define PERL_IN_AV_C
 #include "perl.h"
 
 void
-av_reify(AV *av)
+Perl_av_reify(pTHX_ AV *av)
 {
     I32 key;
     SV* sv;
@@ -24,8 +25,8 @@ av_reify(AV *av)
     if (AvREAL(av))
        return;
 #ifdef DEBUGGING
-    if (SvRMAGICAL(av) && mg_find((SV*)av,'P'))
-       warn("av_reify called on tied array");
+    if (SvTIED_mg((SV*)av, 'P'))
+       Perl_warn(aTHX_ "av_reify called on tied array");
 #endif
     key = AvMAX(av) + 1;
     while (key > AvFILLp(av) + 1)
@@ -46,21 +47,21 @@ av_reify(AV *av)
 }
 
 void
-av_extend(AV *av, I32 key)
+Perl_av_extend(pTHX_ AV *av, I32 key)
 {
     dTHR;                      /* only necessary if we have to extend stack */
     MAGIC *mg;
-    if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) {
+    if (mg = SvTIED_mg((SV*)av, 'P')) {
        dSP;
        ENTER;
        SAVETMPS;
        PUSHSTACKi(PERLSI_MAGIC);
        PUSHMARK(SP);
        EXTEND(SP,2);
-       PUSHs(mg->mg_obj);
+       PUSHs(SvTIED_obj((SV*)av, mg));
        PUSHs(sv_2mortal(newSViv(key+1)));
         PUTBACK;
-       perl_call_method("EXTEND", G_SCALAR|G_DISCARD);
+       call_method("EXTEND", G_SCALAR|G_DISCARD);
        POPSTACK;
        FREETMPS;
        LEAVE;
@@ -149,7 +150,7 @@ av_extend(AV *av, I32 key)
 }
 
 SV**
-av_fetch(register AV *av, I32 key, I32 lval)
+Perl_av_fetch(pTHX_ register AV *av, I32 key, I32 lval)
 {
     SV *sv;
 
@@ -175,10 +176,7 @@ av_fetch(register AV *av, I32 key, I32 lval)
     if (key > AvFILLp(av)) {
        if (!lval)
            return 0;
-       if (AvREALISH(av))
-           sv = NEWSV(5,0);
-       else
-           sv = sv_newmortal();
+       sv = NEWSV(5,0);
        return av_store(av,key,sv);
     }
     if (AvARRAY(av)[key] == &PL_sv_undef) {
@@ -199,7 +197,7 @@ av_fetch(register AV *av, I32 key, I32 lval)
 }
 
 SV**
-av_store(register AV *av, I32 key, SV *val)
+Perl_av_store(pTHX_ register AV *av, I32 key, SV *val)
 {
     SV** ary;
     U32  fill;
@@ -217,7 +215,7 @@ av_store(register AV *av, I32 key, SV *val)
     }
 
     if (SvREADONLY(av) && key >= AvFILL(av))
-       croak(no_modify);
+       Perl_croak(aTHX_ PL_no_modify);
 
     if (SvRMAGICAL(av)) {
        if (mg_find((SV*)av,'P')) {
@@ -258,7 +256,7 @@ av_store(register AV *av, I32 key, SV *val)
 }
 
 AV *
-newAV(void)
+Perl_newAV(pTHX)
 {
     register AV *av;
 
@@ -272,7 +270,7 @@ newAV(void)
 }
 
 AV *
-av_make(register I32 size, register SV **strp)
+Perl_av_make(pTHX_ register I32 size, register SV **strp)
 {
     register AV *av;
     register I32 i;
@@ -298,7 +296,7 @@ av_make(register I32 size, register SV **strp)
 }
 
 AV *
-av_fake(register I32 size, register SV **strp)
+Perl_av_fake(pTHX_ register I32 size, register SV **strp)
 {
     register AV *av;
     register SV** ary;
@@ -321,14 +319,14 @@ av_fake(register I32 size, register SV **strp)
 }
 
 void
-av_clear(register AV *av)
+Perl_av_clear(pTHX_ register AV *av)
 {
     register I32 key;
     SV** ary;
 
 #ifdef DEBUGGING
     if (SvREFCNT(av) <= 0) {
-       warn("Attempt to clear deleted array");
+       Perl_warn(aTHX_ "Attempt to clear deleted array");
     }
 #endif
     if (!av)
@@ -336,7 +334,7 @@ av_clear(register AV *av)
     /*SUPPRESS 560*/
 
     if (SvREADONLY(av))
-       croak(no_modify);
+       Perl_croak(aTHX_ PL_no_modify);
 
     /* Give any tie a chance to cleanup first */
     if (SvRMAGICAL(av))
@@ -362,7 +360,7 @@ av_clear(register AV *av)
 }
 
 void
-av_undef(register AV *av)
+Perl_av_undef(pTHX_ register AV *av)
 {
     register I32 key;
 
@@ -371,7 +369,7 @@ av_undef(register AV *av)
     /*SUPPRESS 560*/
 
     /* Give any tie a chance to cleanup first */
-    if (SvRMAGICAL(av) && mg_find((SV*)av,'P')) 
+    if (SvTIED_mg((SV*)av, 'P')) 
        av_fill(av, -1);   /* mg_clear() ? */
 
     if (AvREAL(av)) {
@@ -390,24 +388,24 @@ av_undef(register AV *av)
 }
 
 void
-av_push(register AV *av, SV *val)
+Perl_av_push(pTHX_ register AV *av, SV *val)
 {             
     MAGIC *mg;
     if (!av)
        return;
     if (SvREADONLY(av))
-       croak(no_modify);
+       Perl_croak(aTHX_ PL_no_modify);
 
-    if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) {
+    if (mg = SvTIED_mg((SV*)av, 'P')) {
        dSP;
        PUSHSTACKi(PERLSI_MAGIC);
        PUSHMARK(SP);
        EXTEND(SP,2);
-       PUSHs(mg->mg_obj);
+       PUSHs(SvTIED_obj((SV*)av, mg));
        PUSHs(val);
        PUTBACK;
        ENTER;
-       perl_call_method("PUSH", G_SCALAR|G_DISCARD);
+       call_method("PUSH", G_SCALAR|G_DISCARD);
        LEAVE;
        POPSTACK;
        return;
@@ -416,7 +414,7 @@ av_push(register AV *av, SV *val)
 }
 
 SV *
-av_pop(register AV *av)
+Perl_av_pop(pTHX_ register AV *av)
 {
     SV *retval;
     MAGIC* mg;
@@ -424,15 +422,15 @@ av_pop(register AV *av)
     if (!av || AvFILL(av) < 0)
        return &PL_sv_undef;
     if (SvREADONLY(av))
-       croak(no_modify);
-    if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) {
+       Perl_croak(aTHX_ PL_no_modify);
+    if (mg = SvTIED_mg((SV*)av, 'P')) {
        dSP;    
        PUSHSTACKi(PERLSI_MAGIC);
        PUSHMARK(SP);
-       XPUSHs(mg->mg_obj);
+       XPUSHs(SvTIED_obj((SV*)av, mg));
        PUTBACK;
        ENTER;
-       if (perl_call_method("POP", G_SCALAR)) {
+       if (call_method("POP", G_SCALAR)) {
            retval = newSVsv(*PL_stack_sp--);    
        } else {    
            retval = &PL_sv_undef;
@@ -449,7 +447,7 @@ av_pop(register AV *av)
 }
 
 void
-av_unshift(register AV *av, register I32 num)
+Perl_av_unshift(pTHX_ register AV *av, register I32 num)
 {
     register I32 i;
     register SV **ary;
@@ -458,20 +456,20 @@ av_unshift(register AV *av, register I32 num)
     if (!av || num <= 0)
        return;
     if (SvREADONLY(av))
-       croak(no_modify);
+       Perl_croak(aTHX_ PL_no_modify);
 
-    if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) {
+    if (mg = SvTIED_mg((SV*)av, 'P')) {
        dSP;
        PUSHSTACKi(PERLSI_MAGIC);
        PUSHMARK(SP);
        EXTEND(SP,1+num);
-       PUSHs(mg->mg_obj);
+       PUSHs(SvTIED_obj((SV*)av, mg));
        while (num-- > 0) {
            PUSHs(&PL_sv_undef);
        }
        PUTBACK;
        ENTER;
-       perl_call_method("UNSHIFT", G_SCALAR|G_DISCARD);
+       call_method("UNSHIFT", G_SCALAR|G_DISCARD);
        LEAVE;
        POPSTACK;
        return;
@@ -502,7 +500,7 @@ av_unshift(register AV *av, register I32 num)
 }
 
 SV *
-av_shift(register AV *av)
+Perl_av_shift(pTHX_ register AV *av)
 {
     SV *retval;
     MAGIC* mg;
@@ -510,15 +508,15 @@ av_shift(register AV *av)
     if (!av || AvFILL(av) < 0)
        return &PL_sv_undef;
     if (SvREADONLY(av))
-       croak(no_modify);
-    if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) {
+       Perl_croak(aTHX_ PL_no_modify);
+    if (mg = SvTIED_mg((SV*)av, 'P')) {
        dSP;
        PUSHSTACKi(PERLSI_MAGIC);
        PUSHMARK(SP);
-       XPUSHs(mg->mg_obj);
+       XPUSHs(SvTIED_obj((SV*)av, mg));
        PUTBACK;
        ENTER;
-       if (perl_call_method("SHIFT", G_SCALAR)) {
+       if (call_method("SHIFT", G_SCALAR)) {
            retval = newSVsv(*PL_stack_sp--);            
        } else {    
            retval = &PL_sv_undef;
@@ -539,30 +537,30 @@ av_shift(register AV *av)
 }
 
 I32
-av_len(register AV *av)
+Perl_av_len(pTHX_ register AV *av)
 {
     return AvFILL(av);
 }
 
 void
-av_fill(register AV *av, I32 fill)
+Perl_av_fill(pTHX_ register AV *av, I32 fill)
 {
     MAGIC *mg;
     if (!av)
-       croak("panic: null array");
+       Perl_croak(aTHX_ "panic: null array");
     if (fill < 0)
        fill = -1;
-    if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) {
+    if (mg = SvTIED_mg((SV*)av, 'P')) {
        dSP;            
        ENTER;
        SAVETMPS;
        PUSHSTACKi(PERLSI_MAGIC);
        PUSHMARK(SP);
        EXTEND(SP,2);
-       PUSHs(mg->mg_obj);
+       PUSHs(SvTIED_obj((SV*)av, mg));
        PUSHs(sv_2mortal(newSViv(fill+1)));
        PUTBACK;
-       perl_call_method("STORESIZE", G_SCALAR|G_DISCARD);
+       call_method("STORESIZE", G_SCALAR|G_DISCARD);
        POPSTACK;
        FREETMPS;
        LEAVE;
@@ -598,16 +596,16 @@ av_fill(register AV *av, I32 fill)
  */
 
 STATIC I32
-avhv_index_sv(SV* sv)
+S_avhv_index_sv(pTHX_ SV* sv)
 {
     I32 index = SvIV(sv);
     if (index < 1)
-       croak("Bad index while coercing array into hash");
+       Perl_croak(aTHX_ "Bad index while coercing array into hash");
     return index;    
 }
 
 HV*
-avhv_keys(AV *av)
+Perl_avhv_keys(pTHX_ AV *av)
 {
     SV **keysp = av_fetch(av, 0, FALSE);
     if (keysp) {
@@ -620,12 +618,12 @@ avhv_keys(AV *av)
                return (HV*)sv;
        }
     }
-    croak("Can't coerce array into hash");
+    Perl_croak(aTHX_ "Can't coerce array into hash");
     return Nullhv;
 }
 
 SV**
-avhv_fetch_ent(AV *av, SV *keysv, I32 lval, U32 hash)
+Perl_avhv_fetch_ent(pTHX_ AV *av, SV *keysv, I32 lval, U32 hash)
 {
     SV **indsvp;
     HV *keys = avhv_keys(av);
@@ -633,26 +631,26 @@ avhv_fetch_ent(AV *av, SV *keysv, I32 lval, U32 hash)
     
     he = hv_fetch_ent(keys, keysv, FALSE, hash);
     if (!he)
-        croak("No such array field");
+        Perl_croak(aTHX_ "No such array field");
     return av_fetch(av, avhv_index_sv(HeVAL(he)), lval);
 }
 
 bool
-avhv_exists_ent(AV *av, SV *keysv, U32 hash)
+Perl_avhv_exists_ent(pTHX_ AV *av, SV *keysv, U32 hash)
 {
     HV *keys = avhv_keys(av);
     return hv_exists_ent(keys, keysv, hash);
 }
 
 HE *
-avhv_iternext(AV *av)
+Perl_avhv_iternext(pTHX_ AV *av)
 {
     HV *keys = avhv_keys(av);
     return hv_iternext(keys);
 }
 
 SV *
-avhv_iterval(AV *av, register HE *entry)
+Perl_avhv_iterval(pTHX_ AV *av, register HE *entry)
 {
     SV *sv = hv_iterval(avhv_keys(av), entry);
     return *av_fetch(av, avhv_index_sv(sv), TRUE);