Not working yet - split problems ...
[p5sagit/p5-mst-13.2.git] / pp.c
diff --git a/pp.c b/pp.c
index 3d02b09..e7305d8 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -2460,8 +2460,10 @@ PP(pp_splice)
     if (SvRMAGICAL(ary) && (mg = mg_find((SV*)ary,'P'))) {
        *MARK-- = mg->mg_obj;
        PUSHMARK(MARK);
-       PUTBACK;
+       PUTBACK;       
+       ENTER;
        perl_call_method("SPLICE",GIMME_V);
+       LEAVE;
        SPAGAIN;
        RETURN;
     }
@@ -2658,17 +2660,19 @@ PP(pp_push)
        *MARK-- = mg->mg_obj;
        PUSHMARK(MARK);
        PUTBACK;
-       perl_call_method("PUSH",GIMME_V);
+       ENTER;
+       perl_call_method("PUSH",G_SCALAR|G_DISCARD);
+       LEAVE;
        SPAGAIN;
-       RETURN;
     }
-
-    /* Why no pre-extend of ary here ? */
-    for (++MARK; MARK <= SP; MARK++) {
-       sv = NEWSV(51, 0);
-       if (*MARK)
-           sv_setsv(sv, *MARK);
-       av_push(ary, sv);
+    else {
+       /* Why no pre-extend of ary here ? */
+       for (++MARK; MARK <= SP; MARK++) {
+           sv = NEWSV(51, 0);
+           if (*MARK)
+               sv_setsv(sv, *MARK);
+           av_push(ary, sv);
+       }
     }
     SP = ORIGMARK;
     PUSHi( AvFILL(ary) + 1 );
@@ -2708,20 +2712,23 @@ PP(pp_unshift)
     register I32 i = 0;
     MAGIC *mg;
 
-    if (SvRMAGICAL(ary) && (mg = mg_find((SV*)ary,'P'))) {
+    if (SvRMAGICAL(ary) && (mg = mg_find((SV*)ary,'P'))) {            
+
+
        *MARK-- = mg->mg_obj;
-       PUSHMARK(MARK);
        PUTBACK;
-       perl_call_method("UNSHIFT",GIMME_V);
+       ENTER;
+       perl_call_method("UNSHIFT",G_SCALAR|G_DISCARD);
+       LEAVE;
        SPAGAIN;
-       RETURN;
     }
-    
-    av_unshift(ary, SP - MARK);
-    while (MARK < SP) {
-       sv = NEWSV(27, 0);
-       sv_setsv(sv, *++MARK);
-       (void)av_store(ary, i++, sv);
+    else {
+       av_unshift(ary, SP - MARK);
+       while (MARK < SP) {
+           sv = NEWSV(27, 0);
+           sv_setsv(sv, *++MARK);
+           (void)av_store(ary, i++, sv);
+       }
     }
     SP = ORIGMARK;
     PUSHi( AvFILL(ary) + 1 );
@@ -4081,7 +4088,8 @@ PP(pp_split)
     I32 base;
     AV *oldstack = curstack;
     I32 gimme = GIMME_V;
-    I32 oldsave = savestack_ix;
+    I32 oldsave = savestack_ix; 
+    I32 stacks_switched = 0;
 
 #ifdef DEBUGGING
     Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
@@ -4107,15 +4115,18 @@ PP(pp_split)
        ary = Nullav;
     if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
        realarray = 1;
-       if (!AvREAL(ary)) {
-           AvREAL_on(ary);
-           for (i = AvFILLp(ary); i >= 0; i--)
-               AvARRAY(ary)[i] = &sv_undef;    /* don't free mere refs */
-       }
        av_extend(ary,0);
-       av_clear(ary);
-       /* temporarily switch stacks */
-       SWITCHSTACK(curstack, ary);
+       av_clear(ary);                 
+       if (!SvRMAGICAL(ary) || !mg_find((SV *) ary, 'P')) {
+           if (!AvREAL(ary)) {
+               AvREAL_on(ary);
+               for (i = AvFILLp(ary); i >= 0; i--)
+                   AvARRAY(ary)[i] = &sv_undef;        /* don't free mere refs */
+           }
+           /* temporarily switch stacks */
+           SWITCHSTACK(curstack, ary);
+           stacks_switched = 1;
+       }
     }
     base = SP - stack_base;
     orig = s;
@@ -4266,17 +4277,44 @@ PP(pp_split)
            iters--, SP--;
     }
     if (realarray) {
-       SWITCHSTACK(ary, oldstack);
-       if (SvSMAGICAL(ary)) {
-           PUTBACK;
-           mg_set((SV*)ary);
-           SPAGAIN;
-       }
-       if (gimme == G_ARRAY) {
-           EXTEND(SP, iters);
-           Copy(AvARRAY(ary), SP + 1, iters, SV*);
-           SP += iters;
-           RETURN;
+       if (stacks_switched) {
+           SWITCHSTACK(ary, oldstack);
+           if (SvSMAGICAL(ary)) {
+               PUTBACK;
+               mg_set((SV*)ary);
+               SPAGAIN;
+           }
+           if (gimme == G_ARRAY) {
+               EXTEND(SP, iters);
+               Copy(AvARRAY(ary), SP + 1, iters, SV*);
+               SP += iters;
+               RETURN;
+           }
+       } 
+       else {
+           av_extend(ary, iters -1); 
+           for (i= 0; i < iters; i++) {
+               dstr = SP[i+1-iters];           
+               PUTBACK;
+               fprintf(stderr,"%d:%p %d '%s'\n",i,dstr,SvREFCNT(dstr), SvPV(dstr,na));
+               av_store(ary, i, dstr);
+               SPAGAIN;
+           }
+           if (SvSMAGICAL(ary)) {
+               PUTBACK;
+               mg_set((SV*)ary);
+               SPAGAIN;
+           }
+           for (i= 0; i < iters; i++) {
+               dstr = *av_fetch(ary,i,FALSE);
+               if (SvGMAGICAL(dstr))
+                   mg_get(dstr);
+               fprintf(stderr,"%d:%p '%s'\n",i,dstr,SvPV(dstr,na));
+           }
+           if (gimme != G_ARRAY) {
+               SP -= iters;
+               RETURN;
+           }
        }
     }
     else {