summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mathoms.c20
-rw-r--r--opcode.h8
-rwxr-xr-xopcode.pl2
-rw-r--r--pp_sys.c81
4 files changed, 50 insertions, 61 deletions
diff --git a/mathoms.c b/mathoms.c
index 894fd93f42..18886dbf97 100644
--- a/mathoms.c
+++ b/mathoms.c
@@ -851,6 +851,26 @@ PP(pp_ggrgid)
return pp_ggrent();
}
+PP(pp_ftsize)
+{
+ return Perl_pp_ftis();
+}
+
+PP(pp_ftmtime)
+{
+ return Perl_pp_ftis();
+}
+
+PP(pp_ftatime)
+{
+ return Perl_pp_ftis();
+}
+
+PP(pp_ftctime)
+{
+ return Perl_pp_ftis();
+}
+
U8 *
Perl_uvuni_to_utf8(pTHX_ U8 *d, UV uv)
{
diff --git a/opcode.h b/opcode.h
index 3964c8d4b0..68c1cbd887 100644
--- a/opcode.h
+++ b/opcode.h
@@ -1012,10 +1012,10 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_fteowned */
MEMBER_TO_FPTR(Perl_pp_ftrowned),
MEMBER_TO_FPTR(Perl_pp_ftzero),
- MEMBER_TO_FPTR(Perl_pp_ftsize),
- MEMBER_TO_FPTR(Perl_pp_ftmtime),
- MEMBER_TO_FPTR(Perl_pp_ftatime),
- MEMBER_TO_FPTR(Perl_pp_ftctime),
+ MEMBER_TO_FPTR(Perl_pp_ftis), /* Perl_pp_ftsize */
+ MEMBER_TO_FPTR(Perl_pp_ftis), /* Perl_pp_ftmtime */
+ MEMBER_TO_FPTR(Perl_pp_ftis), /* Perl_pp_ftatime */
+ MEMBER_TO_FPTR(Perl_pp_ftis), /* Perl_pp_ftctime */
MEMBER_TO_FPTR(Perl_pp_ftsock),
MEMBER_TO_FPTR(Perl_pp_ftchr),
MEMBER_TO_FPTR(Perl_pp_ftblk),
diff --git a/opcode.pl b/opcode.pl
index 4a2aa5a896..e4cda78c0a 100755
--- a/opcode.pl
+++ b/opcode.pl
@@ -65,6 +65,8 @@ my @raw_alias = (
Perl_pp_gservent => [qw(gsbyname gsbyport)],
Perl_pp_gpwent => [qw(gpwnam gpwuid)],
Perl_pp_ggrent => [qw(ggrnam ggrgid)],
+
+ Perl_pp_ftis => [qw(ftsize ftmtime ftatime ftctime)],
);
while (my ($func, $names) = splice @raw_alias, 0, 2) {
diff --git a/pp_sys.c b/pp_sys.c
index 0bf34cb4d4..3f0a25ba35 100644
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -3052,7 +3052,30 @@ PP(pp_ftis)
SPAGAIN;
if (result < 0)
RETPUSHUNDEF;
- RETPUSHYES;
+ {
+ dTARGET;
+ switch (PL_op->op_type) {
+ case OP_FTIS:
+ RETPUSHYES;
+ case OP_FTSIZE:
+#if Off_t_size > IVSIZE
+ PUSHn(PL_statcache.st_size);
+#else
+ PUSHi(PL_statcache.st_size);
+#endif
+ break;
+ case OP_FTMTIME:
+ PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
+ break;
+ case OP_FTATIME:
+ PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
+ break;
+ case OP_FTCTIME:
+ PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
+ break;
+ }
+ }
+ RETURN;
}
PP(pp_ftrowned)
@@ -3084,62 +3107,6 @@ PP(pp_ftzero)
RETPUSHNO;
}
-PP(pp_ftsize)
-{
- I32 result;
- dSP; dTARGET;
- STACKED_FTEST_CHECK;
- result = my_stat();
- SPAGAIN;
- if (result < 0)
- RETPUSHUNDEF;
-#if Off_t_size > IVSIZE
- PUSHn(PL_statcache.st_size);
-#else
- PUSHi(PL_statcache.st_size);
-#endif
- RETURN;
-}
-
-PP(pp_ftmtime)
-{
- I32 result;
- dSP; dTARGET;
- STACKED_FTEST_CHECK;
- result = my_stat();
- SPAGAIN;
- if (result < 0)
- RETPUSHUNDEF;
- PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
- RETURN;
-}
-
-PP(pp_ftatime)
-{
- I32 result;
- dSP; dTARGET;
- STACKED_FTEST_CHECK;
- result = my_stat();
- SPAGAIN;
- if (result < 0)
- RETPUSHUNDEF;
- PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
- RETURN;
-}
-
-PP(pp_ftctime)
-{
- I32 result;
- dSP; dTARGET;
- STACKED_FTEST_CHECK;
- result = my_stat();
- SPAGAIN;
- if (result < 0)
- RETPUSHUNDEF;
- PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
- RETURN;
-}
-
PP(pp_ftsock)
{
I32 result;