-
Notifications
You must be signed in to change notification settings - Fork 558
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add hexfloat support to constant overloads #14791
Comments
From @rjbsCreated by @rjbsSaašha Metsärantala reports, as far as I can tell correctly, that you cannot This would probably be nice to have someday for someone. Perl Info
|
From @tonycozOn Sun Jul 05 18:56:18 2015, rjbs wrote:
Currently each type of constant overload uses a hints bit: #define HINT_NEW_INTEGER 0x00001000 which we're kind of short on. Maybe instead of allocating a bit to each type of overloading we should only use This would slow down compiling code that uses any overloaded constant type, but Or maybe it's time for PL_hints2/${^H2}. Tony |
The RT System itself - Status changed from 'new' to 'open' |
From @khwilliamsonOn 08/05/2015 12:30 AM, Tony Cook via RT wrote:
As the comments in the code say, the 2 locale bits could be combined to Concerning the constant overloading bits: Since these are compile-only,
|
From @rjbs* Tony Cook via RT <perlbug-followup@perl.org> [2015-08-05T02:30:07]
I also guess this is quite rare. That's a guess, mind you. I would further I don't really have an opinion on how to proceed, but lean toward agreement -- |
From @tonycozOn Wed, 05 Aug 2015 12:37:58 -0700, perl.p5p@rjbs.manxome.org wrote:
It turns out this old bug isn't really an issue: tony@mars:.../git/perl$ cat biggish.pm sub import { 1; 0.125 The usual float handler is called even for hex floating point constants. Tony |
From @pjacklamThis is indeed an issue with binary float constants: $ perl -Ilib -I. -Mbiggish -wle 'print 0b0.1p1' 0.125 This should return 1, not 0.125. Apparently, binary floating point constants are handled as if they Peter |
From @tonycozOn Tue, 10 Sep 2019 02:34:12 -0700, pjacklam@gmail.com wrote:
How about the attached? Tony |
From @tonycoz0001-perl-125557-correctly-handle-overload-for-bin-oct-fl.patchFrom ccd8684d61be4cc68d7a945ce24b981c8de447fa Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Wed, 11 Sep 2019 11:50:23 +1000
Subject: (perl #125557) correctly handle overload for bin/oct floats
The hexfp code doesn't check that the shift is 4, and so also
accepts binary and octal fp numbers.
Unfortunately the call to S_new_constant() always passed a prefix
of 0x, so overloading would be trying to parse the wrong number.
Another option is to simply allow only hex floats, though some work
was done in 131894 to improve oct/bin float support.
---
t/op/hexfp.t | 16 +++++++++++++++-
toke.c | 21 ++++++++++++++++-----
2 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/t/op/hexfp.t b/t/op/hexfp.t
index eeb2c9d364..b0c85cfdc6 100644
--- a/t/op/hexfp.t
+++ b/t/op/hexfp.t
@@ -10,7 +10,7 @@ use strict;
use Config;
-plan(tests => 123);
+plan(tests => 125);
# Test hexfloat literals.
@@ -277,6 +277,20 @@ is(0b1p0, 1);
is(0b10p0, 2);
is(0b1.1p0, 1.5);
+# previously these would pass "0x..." to the overload instead of the appropriate
+# "0b" or "0" prefix.
+fresh_perl_is(<<'CODE', "1", {}, "overload binary fp");
+use overload;
+BEGIN { overload::constant float => sub { return eval $_[0]; }; }
+print 0b0.1p1;
+CODE
+
+fresh_perl_is(<<'CODE', "1", {}, "overload octal fp");
+use overload;
+BEGIN { overload::constant float => sub { return eval $_[0]; }; }
+print 00.1p3;
+CODE
+
# sprintf %a/%A testing is done in sprintf2.t,
# trickier than necessary because of long doubles,
# and because looseness of the spec.
diff --git a/toke.c b/toke.c
index 26de580a24..4624107c45 100644
--- a/toke.c
+++ b/toke.c
@@ -10968,6 +10968,7 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
const char *lastub = NULL; /* position of last underbar */
static const char* const number_too_long = "Number too long";
bool warned_about_underscore = 0;
+ I32 shift; /* shift per digit for hex/oct/bin, hoisted here for fp */
#define WARN_ABOUT_UNDERSCORE() \
do { \
if (!warned_about_underscore) { \
@@ -11014,8 +11015,6 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
{
/* variables:
u holds the "number so far"
- shift the power of 2 of the base
- (hex == 4, octal == 3, binary == 1)
overflowed was the number more than we can hold?
Shift is used when we add a digit. It also serves as an "are
@@ -11024,7 +11023,6 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
*/
NV n = 0.0;
UV u = 0;
- I32 shift;
bool overflowed = FALSE;
bool just_zero = TRUE; /* just plain 0 or binary number? */
bool has_digs = FALSE;
@@ -11388,8 +11386,21 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
if (hexfp) {
floatit = TRUE;
*d++ = '0';
- *d++ = 'x';
- s = start + 2;
+ switch (shift) {
+ case 4:
+ *d++ = 'x';
+ s = start + 2;
+ break;
+ case 3:
+ s = start + 1;
+ break;
+ case 1:
+ *d++ = 'b';
+ s = start + 2;
+ break;
+ default:
+ NOT_REACHED; /* NOTREACHED */
+ }
}
/* read next group of digits and _ and copy into d */
--
2.11.0
|
From @pjacklamTony, I have tested the patch, and it looks good. Thanks for fixing this issue! Peter |
@tonycoz - Status changed from 'open' to 'pending release' |
Migrated from rt.perl.org#125557 (status was 'pending release')
Searchable as RT125557$
The text was updated successfully, but these errors were encountered: