Integrate mainline
[p5sagit/p5-mst-13.2.git] / pp_sys.c
index 6ed8e0a..aa8fb77 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -3747,17 +3747,39 @@ PP(pp_open_dir)
     dSP;
     STRLEN n_a;
     char *dirname = POPpx;
-    GV *gv = (GV*)POPs;
-    register IO *io = GvIOn(gv);
+    char *dscp = NULL;
+    GV *gv;
+    register IO *io;
+    bool want_utf8 = FALSE;
+
+    if (MAXARG == 3)
+        dscp = POPpx;
+
+    gv = (GV*)POPs;
+    io = GvIOn(gv);
 
     if (!io)
        goto nope;
 
+    if (dscp) {
+        if (*dscp == ':') {
+             if (strnEQ(dscp + 1, "utf8", 4))
+                 want_utf8 = TRUE;
+             else
+                  Perl_croak(aTHX_ "Unknown discipline '%s'", dscp);
+        }
+        else
+             Perl_croak(aTHX_ "Unknown discipline '%s'", dscp);
+    }
+
     if (IoDIRP(io))
        PerlDir_close(IoDIRP(io));
     if (!(IoDIRP(io) = PerlDir_open(dirname)))
        goto nope;
 
+    if (want_utf8)
+        IoFLAGS(io) |= IOf_DIR_UTF8;
+
     RETPUSHYES;
 nope:
     if (!errno)
@@ -3795,6 +3817,8 @@ PP(pp_readdir)
            if (!(IoFLAGS(io) & IOf_UNTAINT))
                SvTAINTED_on(sv);
 #endif
+           if (IoFLAGS(io) & IOf_DIR_UTF8 && !IN_BYTES)
+               SvUTF8_on(sv);
            XPUSHs(sv_2mortal(sv));
        }
     }
@@ -3810,6 +3834,8 @@ PP(pp_readdir)
        if (!(IoFLAGS(io) & IOf_UNTAINT))
            SvTAINTED_on(sv);
 #endif
+       if (IoFLAGS(io) & IOf_DIR_UTF8)
+           sv_utf8_upgrade(sv);
        XPUSHs(sv_2mortal(sv));
     }
     RETURN;