ShiftSplice Defines shift et al in terms of splice method
Would be nice to have
- pack "(stuff)*", "(stuff)4", ...
+ pack "(stuff)*", "(stuff)?", "(stuff)+", "(stuff)4", ...
contiguous bitfields in pack/unpack
lexperl
- bundled perl preprocessor
+ bundled perl preprocessor/macro facility
+ this would solve many of the syntactic nice-to-haves
use posix calls internally where possible
gettimeofday (possibly best left for a module?)
format BOTTOM
support in perlmain to rerun debugger
regression tests using __DIE__ hook
lexically scoped functions: my sub foo { ... }
- lvalue functions
- wantlvalue? more generalized want()/caller()?
+ wantlvalue? more generalized want()/caller()?
named prototypes: sub foo ($foo, @bar) { ... } ?
regression/sanity tests for suidperl
iterators/lazy evaluation/continuations/first/
first_defined/short-circuiting grep/??
This is a very thorny and hotly debated subject,
tread carefully and do your homework first
- full 64 bit support (i.e. "long long"). Things to consider:
- how to store/retrieve 32+ integers into/from Perl scalars?
- 32+ constants in Perl code? (non-portable!)
- 32+ arguments/return values to/from system calls? (seek et al)
- 32+ bit ops (&|^~, currently explicitly disabled)
generalise Errno way of extracting cpp symbols and use that in
- Errno and Fcntl (ExtUtils::CppSymbol?)
+ Errno, Fcntl, POSIX (ExtUtils::CppSymbol?)
the _r-problem: for all the {set,get,end}*() system database
calls (and a couple more: readdir, *rand*, crypt, *time,
tmpnam) there are in many systems the _r versions
to be used in re-entrant (=multithreaded) code
Icky things: the _r API is not standardized and
the _r-forms require per-thread data to store their state
- memory profiler: turn malloc.c:Perl_dump_mstats() into
+ memory profiler: turn malloc.c:Perl_get_mstats() into
an extension (Devel::MProf?) that would return the malloc
stats in a nice Perl datastructure (also a simple interface
to return just the grand total would be good)
- Unicode: [=bar=], combining characters equivalence
- (U+4001 + U+0308 should be equal to U+00C4, in other words
- A+diaereres should equal Ä), Unicode collation
+ a pragma to make << and >> to shit bitvectors instead of numbers
Possible pragmas
debugger
constant function cache
switch structures
foreach(reverse...)
- optimize away constant split at compile time (a la qw[f o o])
cache eval tree (unless lexical outer scope used (mark in &compiling?))
rcatmaybe
shrink opcode tables via multiple implementations selected in peep
cache hash value? (Not a win, according to Guido)
optimize away @_ where possible
+ tail recursion removal
"one pass" global destruction
rewrite regexp parser for better integrated optimization
LRU cache of regexp: foreach $pat (@pats) { foo() if /$pat/ }
Long doubles
figure out where the PV->NV->PV conversion gets it wrong at least
in AIX and Tru64 (V5.0 and onwards) when using long doubles: see the
- regexp tricks we had to insert to t/comp/use.t and t/lib/bigfltpm.t.
+ regexp tricks we had to insert to t/comp/use.t and t/lib/bigfltpm.t,
+ (?:9|8999\d+) and the like.
+
+64-bit support
+ Configure probe for quad_t, uquad_t, and (argh) u_quad_t, they might
+ be in some systems the only thing working as quadtype and uquadtype.
Locales
deprecate traditional/legacy locales?
floating point handling: nans, infinities, fp exception masks, etc.
at least the following interfaces exist: fp_classify(), fp_class(),
class(), isnan(), isinf(), isfinite(), finite(), isnormal(),
- fp_setmask(), fp_getmask(), fp_setround(), fp_getround(),
- ieeefp.h, fp_class.h. There are metaconfig units for all of these.
+ ordered(), fp_setmask(), fp_getmask(), fp_setround(), fp_getround(),
+ ieeefp.h, fp_class.h. There are metaconfig units for most of these.
+ Search for ifdef __osf__ in pp.c to find a temporary fix that
+ needs to be done right.
fix the basic arithmetics (+ - * / %) to preserve IVness/UVness if
both arguments are IVs/UVs
replace pod2html with new PodtoHtml? (requires other modules from CPAN)
turn Cwd into an XS module? (Configure already probes for getcwd())
mmap for speeding up input? (Configure already probes for the mmap family)
sendmsg, recvmsg? (Configure doesn't probe for these but the units exist)
- setitimer, getitimer? (the units exist)
+ setitimer, getitimer? (the metaconfig units exist)
Ongoing
keep filenames 8.3 friendly, where feasible
NOTE: The Configure flags -Duselonglong and -Duse64bits have been
deprecated. Use -Duse64bitint instead.
-Any platform that has 64-bit integers either (a) natively as longs or
-ints (b) via special compiler flags, or (c) using long long are able to
-use "quads" (64-bit integers) as follows:
+Any platform that has 64-bit integers either
+
+ (1) natively as longs or ints
+ (2) via special compiler flags
+ (3) using long long or int64_t
+
+are able to use "quads" (64-bit integers) as follows:
=over 4
There are actually two modes of 64-bitness: the first one is achieved
using Configure -Duse64bitint and the second one using Configure
-Duse64bitall. The difference is that the first one is minimal and
-the second one maximal. The first one does only as much as is
-required to get 64-bit integers into Perl (this may mean, for example,
-using "long longs") while your memory may still be limited to 2
-gigabytes (because your pointers are still allowed to be 32-bit); the
-second one goes all the way by attempting to switch also longs (and
-pointers) to being 64-bit. This may create an even more binary
-incompatible Perl than -Duse64bitint: the resulting executable may not
-run at all in a 32-bit box, or you may have to reboot/reconfigure/rebuild
-your operating system to be 64-bit aware.
+the second one maximal.
+
+The C<use64bitint> does only as much as is required to get 64-bit
+integers into Perl (this may mean, for example, using "long longs")
+while your memory may still be limited to 2 gigabytes (because your
+pointers could still be 32-bit). Note that the name C<64bitint> does
+not imply that your C compiler will be using 64-bit C<int>s (it might,
+but it doesn't have to): the C<use64bitint> means that you will be
+able to have 64 bits wide scalar values.
+
+The C<use64bitall> goes all the way by attempting to switch also
+integers (if it can), longs (and pointers) to being 64-bit. This may
+create an even more binary incompatible Perl than -Duse64bitint: the
+resulting executable may not run at all in a 32-bit box, or you may
+have to reboot/reconfigure/rebuild your operating system to be 64-bit
+aware.
Natively 64-bit systems like Alpha and Cray need neither -Duse64bitint
nor -Duse64bitall.
If you have filesystems that support "large files" (files larger than
2 gigabytes), you may now also be able to create and access them from
-Perl. You have to use Configure -Duselargefiles. Turning on the
-large file support also turns on 64-bit support on many platforms.
-Beware that unless your filesystem also supports "sparse files" seeking
-to umpteen petabytes may be unadvisable.
+Perl. NOTE: the default action is to use the large file support, if
+available on the platform.
+
+If the large file support is on, and you have a Fcntl constant
+O_LARGEFILE, the O_LARGEFILE is automatically added to the flags
+of sysopen().
+
+Beware: unless your filesystem also supports "sparse files" seeking to
+umpteen petabytes may be unadvisable.
Note that in addition to requiring a proper file system to do large
files you may also need to adjust your per-process (or your
=item Fcntl
More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for
-large file (more than 4GB) access Note that the O_LARGEFILE is
-automatically/transparently added to sysopen() flags if large file
-support has been configured), Free/Net/OpenBSD locking behaviour flags
-F_FLOCK, F_POSIX, Linux F_SHLCK, and O_ACCMODE: the combined mask of
-O_RDONLY, O_WRONLY, and O_RDWR. The seek()/sysseek() constants
-SEEK_SET, SEEK_CUR, and SEEK_END are available via the C<:seek> tag.
-The chmod()/stat() S_IF* constants and S_IS* functions are available
-via the C<:mode> tag.
-
+large file (more than 4GB) access (NOTE: the O_LARGEFILE is
+automatically added to sysopen() flags if large file support has been
+configured, as is the default), Free/Net/OpenBSD locking behaviour
+flags F_FLOCK, F_POSIX, Linux F_SHLCK, and O_ACCMODE: the combined
+mask of O_RDONLY, O_WRONLY, and O_RDWR. The seek()/sysseek()
+constants SEEK_SET, SEEK_CUR, and SEEK_END are available via the
+C<:seek> tag. The chmod()/stat() S_IF* constants and S_IS* functions
+are available via the C<:mode> tag.
=item File::Compare