Change 29919 by [EMAIL PROTECTED] on 2007/01/22 18:47:36

        Integrate:
        [ 27608]
        Add S_space_join_names_mortal() which joins a char** array with " "s,
        replacing 5 instances of the same code.
        
        [ 27612]
        Replace all sv_mortalcopy(&PL_sv_no); sv_set*(...) with
        sv2mortal(newSV*(...)) to avoid needless upgrades to PVNV and needless
        allocation of a copy of "".

Affected files ...

... //depot/maint-5.8/perl/embed.fnc#177 integrate
... //depot/maint-5.8/perl/embed.h#132 integrate
... //depot/maint-5.8/perl/pp_sys.c#124 integrate
... //depot/maint-5.8/perl/proto.h#166 integrate

Differences ...

==== //depot/maint-5.8/perl/embed.fnc#177 (text) ====
Index: perl/embed.fnc
--- perl/embed.fnc#176~29916~   2007-01-22 08:26:58.000000000 -0800
+++ perl/embed.fnc      2007-01-22 10:47:36.000000000 -0800
@@ -1218,6 +1218,7 @@
 #  if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
 sR     |int    |dooneliner     |NN const char *cmd|NN const char *filename
 #  endif
+s      |SV *   |space_join_names_mortal|NN char *const *array
 #endif
 
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)

==== //depot/maint-5.8/perl/embed.h#132 (text+w) ====
Index: perl/embed.h
--- perl/embed.h#131~29916~     2007-01-22 08:26:58.000000000 -0800
+++ perl/embed.h        2007-01-22 10:47:36.000000000 -0800
@@ -1244,6 +1244,9 @@
 #define dooneliner             S_dooneliner
 #endif
 #  endif
+#ifdef PERL_CORE
+#define space_join_names_mortal        S_space_join_names_mortal
+#endif
 #endif
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
 #if defined(PERL_CORE) || defined(PERL_EXT)
@@ -3319,6 +3322,9 @@
 #define dooneliner(a,b)                S_dooneliner(aTHX_ a,b)
 #endif
 #  endif
+#ifdef PERL_CORE
+#define space_join_names_mortal(a)     S_space_join_names_mortal(aTHX_ a)
+#endif
 #endif
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
 #if defined(PERL_CORE) || defined(PERL_EXT)

==== //depot/maint-5.8/perl/pp_sys.c#124 (text) ====
Index: perl/pp_sys.c
--- perl/pp_sys.c#123~29859~    2007-01-17 14:07:40.000000000 -0800
+++ perl/pp_sys.c       2007-01-22 10:47:36.000000000 -0800
@@ -929,9 +929,7 @@
     GV *gv;
 
     HV * const hv = (HV*)POPs;
-    SV * const sv = sv_mortalcopy(&PL_sv_no);
-
-    sv_setpv(sv, "AnyDBM_File");
+    SV * const sv = sv_2mortal(newSVpvs("AnyDBM_File"));
     stash = gv_stashsv(sv, FALSE);
     if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
        PUTBACK;
@@ -1132,8 +1130,7 @@
     if (GIMME == G_ARRAY && tbuf) {
        value = (NV)(timebuf.tv_sec) +
                (NV)(timebuf.tv_usec) / 1000000.0;
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setnv(sv, value);
+       PUSHs(sv_2mortal(newSVnv(value)));
     }
     RETURN;
 #else
@@ -4506,6 +4503,27 @@
 #endif
 }
 
+/* I can't const this further without getting warnings about the types of
+   various arrays passed in from structures.  */
+static SV *
+S_space_join_names_mortal(pTHX_ char *const *array)
+{
+    SV *target;
+
+    if (array && *array) {
+       target = sv_2mortal(newSVpvs(""));
+       while (1) {
+           sv_catpv(target, *array);
+           if (!*++array)
+               break;
+           sv_catpvs(target, " ");
+       }
+    } else {
+       target = sv_mortalcopy(&PL_sv_no);
+    }
+    return target;
+}
+
 /* Get system info. */
 
 PP(pp_ghostent)
@@ -4576,28 +4594,20 @@
     }
 
     if (hent) {
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setpv(sv, (char*)hent->h_name);
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       for (elem = hent->h_aliases; elem && *elem; elem++) {
-           sv_catpv(sv, *elem);
-           if (elem[1])
-               sv_catpvs(sv, " ");
-       }
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setiv(sv, (IV)hent->h_addrtype);
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
+       PUSHs(sv_2mortal(newSVpv((char*)hent->h_name, 0)));
+       PUSHs(S_space_join_names_mortal(aTHX_ hent->h_aliases));
+       PUSHs(sv_2mortal(newSViv((IV)hent->h_addrtype)));
        len = hent->h_length;
-       sv_setiv(sv, (IV)len);
+       PUSHs(sv_2mortal(newSViv((IV)len)));
 #ifdef h_addr
        for (elem = hent->h_addr_list; elem && *elem; elem++) {
-           XPUSHs(sv = sv_mortalcopy(&PL_sv_no));
-           sv_setpvn(sv, *elem, len);
+           XPUSHs(sv_2mortal(newSVpvn(*elem, len)));
        }
 #else
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        if (hent->h_addr)
-           sv_setpvn(sv, hent->h_addr, len);
+           PUSHs(newSVpvn(hent->h_addr, len));
+       else
+           PUSHs(sv_mortalcopy(&PL_sv_no));
 #endif /* h_addr */
     }
     RETURN;
@@ -4611,7 +4621,6 @@
 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || 
defined(HAS_GETNETENT)
     dSP;
     I32 which = PL_op->op_type;
-    register char **elem;
     register SV *sv;
 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
     struct netent *getnetbyaddr(Netdb_net_t, int);
@@ -4668,18 +4677,10 @@
     }
 
     if (nent) {
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setpv(sv, nent->n_name);
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       for (elem = nent->n_aliases; elem && *elem; elem++) {
-           sv_catpv(sv, *elem);
-           if (elem[1])
-               sv_catpvs(sv, " ");
-       }
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setiv(sv, (IV)nent->n_addrtype);
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setiv(sv, (IV)nent->n_net);
+       PUSHs(sv_2mortal(newSVpv(nent->n_name, 0)));
+       PUSHs(S_space_join_names_mortal(aTHX_ nent->n_aliases));
+       PUSHs(sv_2mortal(newSViv((IV)nent->n_addrtype)));
+       PUSHs(sv_2mortal(newSViv((IV)nent->n_net)));
     }
 
     RETURN;
@@ -4693,7 +4694,6 @@
 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || 
defined(HAS_GETPROTOENT)
     dSP;
     I32 which = PL_op->op_type;
-    register char **elem;
     register SV *sv;
 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
     struct protoent *getprotobyname(Netdb_name_t);
@@ -4738,16 +4738,9 @@
     }
 
     if (pent) {
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setpv(sv, pent->p_name);
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       for (elem = pent->p_aliases; elem && *elem; elem++) {
-           sv_catpv(sv, *elem);
-           if (elem[1])
-               sv_catpvs(sv, " ");
-       }
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setiv(sv, (IV)pent->p_proto);
+       PUSHs(sv_2mortal(newSVpv(pent->p_name, 0)));
+       PUSHs(S_space_join_names_mortal(aTHX_ pent->p_aliases));
+       PUSHs(sv_2mortal(newSViv((IV)pent->p_proto)));
     }
 
     RETURN;
@@ -4761,7 +4754,6 @@
 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || 
defined(HAS_GETSERVENT)
     dSP;
     I32 which = PL_op->op_type;
-    register char **elem;
     register SV *sv;
 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
     struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
@@ -4816,22 +4808,14 @@
     }
 
     if (sent) {
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setpv(sv, sent->s_name);
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       for (elem = sent->s_aliases; elem && *elem; elem++) {
-           sv_catpv(sv, *elem);
-           if (elem[1])
-               sv_catpvs(sv, " ");
-       }
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
+       PUSHs(sv_2mortal(newSVpv(sent->s_name, 0)));
+       PUSHs(S_space_join_names_mortal(aTHX_ sent->s_aliases));
 #ifdef HAS_NTOHS
-       sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
+       PUSHs(sv_2mortal(newSViv((IV)PerlSock_ntohs(sent->s_port))));
 #else
-       sv_setiv(sv, (IV)(sent->s_port));
+       PUSHs(sv_2mortal(newSViv((IV)(sent->s_port))));
 #endif
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setpv(sv, sent->s_proto);
+       PUSHs(sv_2mortal(newSVpv(sent->s_proto, 0)));
     }
 
     RETURN;
@@ -5047,11 +5031,9 @@
     }
 
     if (pwent) {
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setpv(sv, pwent->pw_name);
+       PUSHs(sv_2mortal(newSVpv(pwent->pw_name, 0)));
 
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       SvPOK_off(sv);
+       PUSHs(sv = sv_2mortal(newSViv(0)));
        /* If we have getspnam(), we try to dig up the shadow
         * password.  If we are underprivileged, the shadow
         * interface will set the errno to EACCES or similar,
@@ -5094,70 +5076,70 @@
        SvTAINTED_on(sv);
 #   endif
 
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
 #   if Uid_t_sign <= 0
-       sv_setiv(sv, (IV)pwent->pw_uid);
+       PUSHs(sv_2mortal(newSViv((IV)pwent->pw_uid)));
 #   else
-       sv_setuv(sv, (UV)pwent->pw_uid);
+       PUSHs(sv_2mortal(newSVuv((UV)pwent->pw_uid)));
 #   endif
 
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
 #   if Uid_t_sign <= 0
-       sv_setiv(sv, (IV)pwent->pw_gid);
+       PUSHs(sv_2mortal(newSViv((IV)pwent->pw_gid)));
 #   else
-       sv_setuv(sv, (UV)pwent->pw_gid);
+       PUSHs(sv_2mortal(newSVuv((UV)pwent->pw_gid)));
 #   endif
        /* pw_change, pw_quota, and pw_age are mutually exclusive--
         * because of the poor interface of the Perl getpw*(),
         * not because there's some standard/convention saying so.
         * A better interface would have been to return a hash,
         * but we are accursed by our history, alas. --jhi.  */
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
 #   ifdef PWCHANGE
-       sv_setiv(sv, (IV)pwent->pw_change);
+       PUSHs(sv_2mortal(newSViv((IV)pwent->pw_change)));
 #   else
 #       ifdef PWQUOTA
-       sv_setiv(sv, (IV)pwent->pw_quota);
+       PUSHs(sv_2mortal(newSViv((IV)pwent->pw_quota)));
 #       else
 #           ifdef PWAGE
-       sv_setpv(sv, pwent->pw_age);
+       PUSHs(sv_2mortal(newSVpv(pwent->pw_age, 0)));
+#          else
+       /* I think that you can never get this compiled, but just in case.  */
+       PUSHs(sv_mortalcopy(&PL_sv_no));
 #           endif
 #       endif
 #   endif
 
        /* pw_class and pw_comment are mutually exclusive--.
         * see the above note for pw_change, pw_quota, and pw_age. */
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
 #   ifdef PWCLASS
-       sv_setpv(sv, pwent->pw_class);
+       PUSHs(sv_2mortal(newSVpv(pwent->pw_class, 0)));
 #   else
 #       ifdef PWCOMMENT
-       sv_setpv(sv, pwent->pw_comment);
+       PUSHs(sv_2mortal(newSVpv(pwent->pw_comment, 0)));
+#      else
+       /* I think that you can never get this compiled, but just in case.  */
+       PUSHs(sv_mortalcopy(&PL_sv_no));
 #       endif
 #   endif
 
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
 #   ifdef PWGECOS
-       sv_setpv(sv, pwent->pw_gecos);
+       PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
+#   else
+       PUSHs(sv_mortalcopy(&PL_sv_no));
 #   endif
 #   ifndef INCOMPLETE_TAINTS
        /* pw_gecos is tainted because user himself can diddle with it. */
        SvTAINTED_on(sv);
 #   endif
 
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setpv(sv, pwent->pw_dir);
+       PUSHs(sv_2mortal(newSVpv(pwent->pw_dir, 0)));
 
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setpv(sv, pwent->pw_shell);
+       PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
 #   ifndef INCOMPLETE_TAINTS
        /* pw_shell is tainted because user himself can diddle with it. */
        SvTAINTED_on(sv);
 #   endif
 
 #   ifdef PWEXPIRE
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setiv(sv, (IV)pwent->pw_expire);
+       PUSHs(sv_2mortal(newSViv((IV)pwent->pw_expire)));
 #   endif
     }
     RETURN;
@@ -5226,20 +5208,17 @@
 
     if (grent) {
        SV *sv;
-       char **elem;
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setpv(sv, grent->gr_name);
+       PUSHs(sv_2mortal(newSVpv(grent->gr_name, 0)));
 
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
 #ifdef GRPASSWD
-       sv_setpv(sv, grent->gr_passwd);
+       PUSHs(sv_2mortal(newSVpv(grent->gr_passwd, 0)));
+#else
+       PUSHs(sv_mortalcopy(&PL_sv_no));
 #endif
 
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
-       sv_setiv(sv, (IV)grent->gr_gid);
+       PUSHs(sv_2mortal(newSViv((IV)grent->gr_gid)));
 
 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
-       PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        /* In UNICOS/mk (_CRAYMPP) the multithreading
         * versions (getgrnam_r, getgrgid_r)
         * seem to return an illegal pointer
@@ -5248,11 +5227,7 @@
         * but the gr_mem is poisonous anyway.
         * So yes, you cannot get the list of group
         * members if building multithreaded in UNICOS/mk. */
-       for (elem = grent->gr_mem; elem && *elem; elem++) {
-           sv_catpv(sv, *elem);
-           if (elem[1])
-               sv_catpvs(sv, " ");
-       }
+       PUSHs(S_space_join_names_mortal(aTHX_ grent->gr_mem));
 #endif
     }
 

==== //depot/maint-5.8/perl/proto.h#166 (text+w) ====
Index: perl/proto.h
--- perl/proto.h#165~29916~     2007-01-22 08:26:58.000000000 -0800
+++ perl/proto.h        2007-01-22 10:47:36.000000000 -0800
@@ -1793,6 +1793,9 @@
                        __attribute__warn_unused_result__;
 
 #  endif
+STATIC SV *    S_space_join_names_mortal(pTHX_ char *const *array)
+                       __attribute__nonnull__(pTHX_1);
+
 #endif
 
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
End of Patch.

Reply via email to