Front page | perl.perl6.porters |
Postings from June 2000
perl5 in C++ (was Re: Creature Freep)
From:
John Tobey
Date:
June 25, 2000 12:16
Subject:
perl5 in C++ (was Re: Creature Freep)
Message ID:
m136I0l-000FOJC@feynman.localnet
On Sat, 24 Oct 1998, "Felix S. Gallo" <fsg@ultranet.com> wrote:
> Chip writes:
> >According to Felix S. Gallo:
> >> 1. Describe the goal. I don't believe Perl can be usefully rewritten in
> >> C++ [*] before the next Perl conference in any case [...]
> >
> >Yes, that's the target.
> >> [*] as if
> >We shall see. (Were I a betting man I'd clean up. :-))
>
> Never bet against a British pedant -- I can always win by redefining
> usefully. For my current claim, I think 'usefully' means that it's written
> in C++ style; Perl is right now written in C++ if you make a few
> minor changes.
Below are those minor changes (with gratuitous Linux dependencies),
for anyone wishing to play around.
I'm interested in Joel Spolsky's article,
<URL:http://joel.editthispage.com/stories/storyReader$47>, on not
rewriting big programs from scratch.
Apologies for straying from the path. :-)
-John
This is not a proper patch and requires care and feeding. Here is how
I apply it, more or less:
cd perl-5.6.0
chmod u+w hints/linux.sh
echo timetype=time_t >> hints/linux.sh
./Configure -ds
!patch -p0 < patchfile
make all test
Then do stuff like this until it's Perl 6:
inline NV& sv::NVX () { return ((XPVNV*)sv_any)->xnv_nv; }
#define SvNVX(sv) ((sv)->NVX())
--- gv.h~ Sun Feb 6 14:32:59 2000
+++ gv.h Sun Jun 25 11:17:29 2000
@@ -19,7 +19,7 @@
U32 gp_cvgen; /* generational validity of cached gv_cv */
U32 gp_flags; /* XXX unused */
line_t gp_line; /* line first declared at (for -w) */
- char * gp_file; /* file first declared in (for -w) */
+ const char *gp_file; /* file first declared in (for -w) */
};
#if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
--- gv.c~ Tue Mar 21 00:28:10 2000
+++ gv.c Sun Jun 25 01:22:20 2000
@@ -982,7 +982,7 @@
gv_check(hv); /* nested package */
}
else if (isALPHA(*HeKEY(entry))) {
- char *file;
+ const char *file;
gv = (GV*)HeVAL(entry);
if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
continue;
--- mg.c~ Fri Mar 17 20:24:04 2000
+++ mg.c Sun Jun 25 11:54:19 2000
@@ -21,6 +21,10 @@
# include <unistd.h>
#endif
+#ifdef I_GRP
+# include <grp.h>
+#endif
+
#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
# ifndef NGROUPS
# define NGROUPS 32
@@ -688,9 +692,7 @@
break;
case '~':
s = IoFMT_NAME(GvIOp(PL_defoutgv));
- if (!s)
- s = GvENAME(PL_defoutgv);
- sv_setpv(sv,s);
+ sv_setpv(sv,s ? s : GvENAME(PL_defoutgv));
break;
#ifndef lint
case '=':
--- pp_hot.c~ Fri Mar 17 22:11:42 2000
+++ pp_hot.c Sun Jun 25 10:10:29 2000
@@ -836,60 +836,52 @@
}
if (PL_delaymagic & ~DM_DELAY) {
if (PL_delaymagic & DM_UID) {
-#ifdef HAS_SETRESUID
- (void)setresuid(PL_uid,PL_euid,(Uid_t)-1);
-#else
-# ifdef HAS_SETREUID
+#ifdef HAS_SETREUID
(void)setreuid(PL_uid,PL_euid);
-# else
-# ifdef HAS_SETRUID
+#else
+# ifdef HAS_SETRUID
if ((PL_delaymagic & DM_UID) == DM_RUID) {
(void)setruid(PL_uid);
PL_delaymagic &= ~DM_RUID;
}
-# endif /* HAS_SETRUID */
-# ifdef HAS_SETEUID
+# endif /* HAS_SETRUID */
+# ifdef HAS_SETEUID
if ((PL_delaymagic & DM_UID) == DM_EUID) {
(void)seteuid(PL_uid);
PL_delaymagic &= ~DM_EUID;
}
-# endif /* HAS_SETEUID */
+# endif /* HAS_SETEUID */
if (PL_delaymagic & DM_UID) {
if (PL_uid != PL_euid)
DIE(aTHX_ "No setreuid available");
(void)PerlProc_setuid(PL_uid);
}
-# endif /* HAS_SETREUID */
-#endif /* HAS_SETRESUID */
+#endif /* HAS_SETREUID */
PL_uid = PerlProc_getuid();
PL_euid = PerlProc_geteuid();
}
if (PL_delaymagic & DM_GID) {
-#ifdef HAS_SETRESGID
- (void)setresgid(PL_gid,PL_egid,(Gid_t)-1);
-#else
-# ifdef HAS_SETREGID
+#ifdef HAS_SETREGID
(void)setregid(PL_gid,PL_egid);
-# else
-# ifdef HAS_SETRGID
+#else
+# ifdef HAS_SETRGID
if ((PL_delaymagic & DM_GID) == DM_RGID) {
(void)setrgid(PL_gid);
PL_delaymagic &= ~DM_RGID;
}
-# endif /* HAS_SETRGID */
-# ifdef HAS_SETEGID
+# endif /* HAS_SETRGID */
+# ifdef HAS_SETEGID
if ((PL_delaymagic & DM_GID) == DM_EGID) {
(void)setegid(PL_gid);
PL_delaymagic &= ~DM_EGID;
}
-# endif /* HAS_SETEGID */
+# endif /* HAS_SETEGID */
if (PL_delaymagic & DM_GID) {
if (PL_gid != PL_egid)
DIE(aTHX_ "No setregid available");
(void)PerlProc_setgid(PL_gid);
}
-# endif /* HAS_SETREGID */
-#endif /* HAS_SETRESGID */
+#endif /* HAS_SETREGID */
PL_gid = PerlProc_getgid();
PL_egid = PerlProc_getegid();
}
--- sv.c~ Wed Mar 22 21:44:37 2000
+++ sv.c Sun Jun 25 11:55:29 2000
@@ -15,6 +15,11 @@
#define PERL_IN_SV_C
#include "perl.h"
+/* XXX If this causes problems, set i_unistd=undef in the hint file. */
+#ifdef I_UNISTD
+#include <unistd.h>
+#endif
+
#define FCALL *f
#define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_force_normal(sv)
@@ -2540,7 +2545,7 @@
if (dtype <= SVt_PVGV) {
glob_assign:
if (dtype != SVt_PVGV) {
- char *name = GvNAME(sstr);
+ const char *name = GvNAME(sstr);
STRLEN len = GvNAMELEN(sstr);
sv_upgrade(dstr, SVt_PVGV);
sv_magic(dstr, dstr, '*', name, len);
--- pp_sys.c~ Sun Mar 19 02:18:10 2000
+++ pp_sys.c Sun Jun 25 12:53:08 2000
@@ -36,10 +36,16 @@
#endif
#ifdef HAS_SYSCALL
-#ifdef __cplusplus
+#ifdef __cplusplus
+#ifndef __GLIBC__
+/* XXX Who put this here? Is someone compiling Perl with a C++ compiler
+ on a system that has syscall and doesn't declare it in a header file?
+ Really?? This breaks g++ on Linux because syscall returns long.
+ Hence my GNU Libc exclusion. -jtobey */
extern "C" int syscall(unsigned long,...);
#endif
#endif
+#endif
#ifdef I_SYS_WAIT
# include <sys/wait.h>
@@ -3971,7 +3977,13 @@
#ifdef HAS_GETPRIORITY
who = POPi;
which = TOPi;
+#if defined(__GLIBC__) && defined(__cplusplus)
+ /* XXX GNU Libc documents `which' as int but declares it as enum
+ __priority_which in <sys/resource.h>, so let's not take chances. */
+ SETi( ((int (*)(int, int))getpriority)(which, who) );
+#else
SETi( getpriority(which, who) );
+#endif
RETURN;
#else
DIE(aTHX_ PL_no_func, "getpriority()");
@@ -3989,7 +4001,13 @@
who = POPi;
which = TOPi;
TAINT_PROPER("setpriority");
+#if defined(__GLIBC__) && defined(__cplusplus)
+ /* XXX GNU Libc documents `which' as int but declares it as enum
+ __priority_which in <sys/resource.h>, so let's not take chances. */
+ SETi( ((int (*)(int, int, int))setpriority)(which, who, niceval) >= 0 );
+#else
SETi( setpriority(which, who, niceval) >= 0 );
+#endif
RETURN;
#else
DIE(aTHX_ PL_no_func, "setpriority()");
--- sv.h~ Thu Mar 9 12:40:40 2000
+++ sv.h Sun Jun 25 11:49:08 2000
@@ -290,7 +290,7 @@
HV* xmg_stash; /* class package */
GP* xgv_gp;
- char* xgv_name;
+ const char* xgv_name;
STRLEN xgv_namelen;
HV* xgv_stash;
U8 xgv_flags;
--- op.c~ Tue Mar 21 00:06:34 2000
+++ op.c Sun Jun 25 11:51:36 2000
@@ -5498,7 +5498,7 @@
/* is this op a FH constructor? */
if (is_handle_constructor(o,numargs)) {
- char *name = Nullch;
+ const char *name = Nullch;
STRLEN len;
flags = 0;
--- ext/DB_File/DB_File.xs~ Tue Feb 15 00:42:40 2000
+++ ext/DB_File/DB_File.xs Sun Jun 25 12:38:45 2000
@@ -140,6 +140,10 @@
#include <fcntl.h>
+#ifdef __cplusplus
+extern "C" void __getBerkeleyDBInfo();
+#endif
+
/* #define TRACE */
#define DBM_FILTERING
@@ -380,7 +384,7 @@
#endif /* DBM_FILTERING */
-#define my_sv_setpvn(sv, d, s) sv_setpvn(sv, (s ? d : (void*)""), s)
+#define my_sv_setpvn(sv, d, s) sv_setpvn(sv, (s ? (const char*)d : ""), s)
#define OutputValue(arg, name) \
{ if (RETVAL == 0) { \
@@ -507,8 +511,8 @@
PUSHMARK(SP) ;
EXTEND(SP,2) ;
- PUSHs(sv_2mortal(newSVpvn(data1,key1->size)));
- PUSHs(sv_2mortal(newSVpvn(data2,key2->size)));
+ PUSHs(sv_2mortal(newSVpvn((const char *)data1,key1->size)));
+ PUSHs(sv_2mortal(newSVpvn((const char *)data2,key2->size)));
PUTBACK ;
count = perl_call_sv(CurrentDB->compare, G_SCALAR);
@@ -563,8 +567,8 @@
PUSHMARK(SP) ;
EXTEND(SP,2) ;
- PUSHs(sv_2mortal(newSVpvn(data1,key1->size)));
- PUSHs(sv_2mortal(newSVpvn(data2,key2->size)));
+ PUSHs(sv_2mortal(newSVpvn((const char *)data1,key1->size)));
+ PUSHs(sv_2mortal(newSVpvn((const char *)data2,key2->size)));
PUTBACK ;
count = perl_call_sv(CurrentDB->prefix, G_SCALAR);
@@ -768,7 +772,6 @@
SV ** svp;
HV * action ;
DB_File RETVAL = (DB_File)safemalloc(sizeof(DB_File_type)) ;
- void * openinfo = NULL ;
INFO * info = &RETVAL->info ;
STRLEN n_a;
@@ -808,7 +811,6 @@
croak("DB_File can only tie an associative array to a DB_HASH database") ;
RETVAL->type = DB_HASH ;
- openinfo = (void*)info ;
svp = hv_fetch(action, "hash", 4, FALSE);
@@ -843,7 +845,6 @@
croak("DB_File can only tie an associative array to a DB_BTREE database");
RETVAL->type = DB_BTREE ;
- openinfo = (void*)info ;
svp = hv_fetch(action, "compare", 7, FALSE);
if (svp && SvOK(*svp))
@@ -892,7 +893,6 @@
croak("DB_File can only tie an array to a DB_RECNO database");
RETVAL->type = DB_RECNO ;
- openinfo = (void *)info ;
info->db_RE_flags = 0 ;
@@ -1011,7 +1011,7 @@
Flags |= DB_TRUNCATE ;
#endif
- status = db_open(name, RETVAL->type, Flags, mode, NULL, openinfo, &RETVAL->dbp) ;
+ status = db_open(name, RETVAL->type, Flags, mode, NULL, info, &RETVAL->dbp) ;
if (status == 0)
#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6
status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor) ;
@@ -1027,9 +1027,9 @@
#else
#if defined(DB_LIBRARY_COMPATIBILITY_API) && DB_VERSION_MAJOR > 2
- RETVAL->dbp = __db185_open(name, flags, mode, RETVAL->type, openinfo) ;
+ RETVAL->dbp = __db185_open(name, flags, mode, RETVAL->type, info) ;
#else
- RETVAL->dbp = dbopen(name, flags, mode, RETVAL->type, openinfo) ;
+ RETVAL->dbp = dbopen(name, flags, mode, RETVAL->type, info) ;
#endif /* DB_LIBRARY_COMPATIBILITY_API */
#endif
--- ext/DB_File/version.c~ Sun Jan 23 08:15:45 2000
+++ ext/DB_File/version.c Sun Jun 25 12:34:01 2000
@@ -25,7 +25,7 @@
#include <db.h>
-void
+EXTERN_C void
__getBerkeleyDBInfo()
{
SV * version_sv = perl_get_sv("DB_File::db_version", GV_ADD|GV_ADDMULTI) ;
--- ext/B/B.xs~ Thu Feb 24 20:49:18 2000
+++ ext/B/B.xs Sun Jun 25 11:23:20 2000
@@ -1054,7 +1054,7 @@
GvLINE(gv)
B::GV gv
-char *
+const char *
GvFILE(gv)
B::GV gv
--- ext/B/typemap~ Thu Oct 28 17:35:07 1999
+++ ext/B/typemap Sun Jun 25 11:18:38 2000
@@ -31,6 +31,7 @@
SSize_t T_IV
STRLEN T_IV
PADOFFSET T_UV
+const char * T_PV
INPUT
T_OP_OBJ
--- config.sh.orig Sun Jun 25 13:43:19 2000
+++ config.sh Sun Jun 25 13:49:12 2000
@@ -52,7 +52,7 @@
c=''
castflags='0'
cat='cat'
-cc='cc'
+cc='g++'
cccdlflags='-fpic'
ccdlflags='-rdynamic'
ccflags='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
@@ -76,8 +76,8 @@
cppflags='-fno-strict-aliasing -I/usr/local/include'
cpplast='-'
cppminus='-'
-cpprun='cc -E'
-cppstdin='cc -E'
+cpprun='g++ -E'
+cppstdin='g++ -E'
cppsymbols='_FILE_OFFSET_BITS=64 __GNUC_MINOR__=95 _LARGEFILE_SOURCE=1 _POSIX_C_SOURCE=199506 _POSIX_SOURCE=1 __STDC__=1 __i386=1 __i386__=1 __linux=1 __linux__=1 __unix=1 __unix__=1'
crosscompile='undef'
cryptlib=''
@@ -383,7 +383,7 @@
dlsrc='dl_dlopen.xs'
doublesize='8'
drand01='drand48()'
-dynamic_ext='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Fcntl File/Glob GDBM_File IO IPC/SysV ODBM_File Opcode POSIX SDBM_File Socket Sys/Hostname Sys/Syslog attrs re'
+dynamic_ext='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Fcntl File/Glob GDBM_File IO IPC/SysV Opcode POSIX SDBM_File Socket Sys/Hostname Sys/Syslog attrs re'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
@@ -392,7 +392,7 @@
eunicefix=':'
exe_ext=''
expr='expr'
-extensions='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Fcntl File/Glob GDBM_File IO IPC/SysV ODBM_File Opcode POSIX SDBM_File Socket Sys/Hostname Sys/Syslog attrs re Errno'
+extensions='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Fcntl File/Glob GDBM_File IO IPC/SysV Opcode POSIX SDBM_File Socket Sys/Hostname Sys/Syslog attrs re Errno'
fflushNULL='define'
fflushall='undef'
find=''
@@ -532,7 +532,7 @@
known_extensions='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Fcntl File/Glob GDBM_File IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Sys/Hostname Sys/Syslog Thread attrs re'
ksh=''
large=''
-ld='cc'
+ld='g++'
lddlflags='-shared -L/usr/local/lib'
ldflags=' -L/usr/local/lib'
ldlibpthname='LD_LIBRARY_PATH'
--- ext/Devel/DProf/DProf.xs~ Fri Feb 4 11:43:02 2000
+++ ext/Devel/DProf/DProf.xs Sun Jun 25 11:59:02 2000
@@ -3,6 +3,11 @@
#include "perl.h"
#include "XSUB.h"
+/* XXX If this causes problems, set i_unistd=undef in the hint file. */
+#ifdef I_UNISTD
+#include <unistd.h>
+#endif
+
/* For older Perls */
#ifndef dTHR
# define dTHR int dummy_thr
@@ -60,7 +65,7 @@
clock_t tms_utime; /* cpu time spent in user space */
clock_t tms_stime; /* cpu time spent in system */
clock_t realtime; /* elapsed real time, in ticks */
- char *name;
+ const char *name;
U32 id;
opcode ptype;
};
@@ -210,7 +215,7 @@
}
static void
-prof_dumps(pTHX_ U32 id, char *pname, char *gname)
+prof_dumps(pTHX_ U32 id, const char *pname, const char *gname)
{
PerlIO_printf(g_fp,"& %"UVxf" %s %s\n", (UV)id, pname, gname);
}
@@ -241,8 +246,8 @@
}
else if (ptype == OP_GV) {
U32 id = g_profstack[base++].id;
- char *pname = g_profstack[base++].name;
- char *gname = g_profstack[base++].name;
+ const char *pname = g_profstack[base++].name;
+ const char *gname = g_profstack[base++].name;
prof_dumps(aTHX_ id, pname, gname);
}
@@ -318,7 +323,8 @@
{
SV **svp;
- char *gname, *pname;
+ const char *gname;
+ const char *pname;
CV *cv;
cv = INT2PTR(CV*,SvIVX(Sub));
--- ext/File/Glob/bsd_glob.c~ Thu Mar 2 12:53:17 2000
+++ ext/File/Glob/bsd_glob.c Sun Jun 25 12:08:02 2000
@@ -63,6 +63,11 @@
#include <perl.h>
#include <XSUB.h>
+/* XXX If this causes problems, set i_unistd=undef in the hint file. */
+#ifdef I_UNISTD
+#include <unistd.h>
+#endif
+
#include "bsd_glob.h"
#ifdef I_PWD
# include <pwd.h>
@@ -637,6 +642,12 @@
/* NOTREACHED */
}
+#ifdef __cplusplus
+typedef Direntry_t *(*readdirfunc_t)(DIR*);
+#else
+typedef Direntry_t *(*readdirfunc_t)();
+#endif
+
static int
glob3(Char *pathbuf, Char *pathend, Char *pattern,
Char *restpattern, glob_t *pglob)
@@ -646,14 +657,7 @@
int err;
int nocase;
char buf[MAXPATHLEN];
-
- /*
- * The readdirfunc declaration can't be prototyped, because it is
- * assigned, below, to two functions which are prototyped in glob.h
- * and dirent.h as taking pointers to differently typed opaque
- * structures.
- */
- Direntry_t *(*readdirfunc)();
+ readdirfunc_t readdirfunc;
*pathend = BG_EOS;
errno = 0;
@@ -689,9 +693,9 @@
/* Search directory for matching names. */
if (pglob->gl_flags & GLOB_ALTDIRFUNC)
- readdirfunc = pglob->gl_readdir;
+ readdirfunc = (readdirfunc_t)pglob->gl_readdir;
else
- readdirfunc = my_readdir;
+ readdirfunc = (readdirfunc_t)my_readdir;
while ((dp = (*readdirfunc)(dirp))) {
register U8 *sc;
register Char *dc;
@@ -859,7 +863,7 @@
g_Ctoc(str, buf);
if (pglob->gl_flags & GLOB_ALTDIRFUNC)
- return((*pglob->gl_opendir)(buf));
+ return((DIR*)(*pglob->gl_opendir)(buf));
else
return(PerlDir_open(buf));
}
--
John Tobey, late nite hacker <jtobey@john-edwin-tobey.org>
\\\ ///
]]] With enough bugs, all eyes are shallow. [[[
/// \\\
-
perl5 in C++ (was Re: Creature Freep)
by John Tobey