[Git][ghc/ghc][master] 2 commits: rts/RtsFlags: Refactor size parsing
Marge Bot (@marge-bot)
gitlab at gitlab.haskell.org
Sat Nov 16 21:21:14 UTC 2024
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
142d8afa by Ben Gamari at 2024-11-16T16:20:47-05:00
rts/RtsFlags: Refactor size parsing
This makes a number of improvements mentioned in #20201:
* fail if the argument cannot be parsed as a number (`-Mturtles`)
* fail if an unrecognized unit is given (e.g. `-M1x`)
- - - - -
b7a146e5 by Ben Gamari at 2024-11-16T16:20:47-05:00
testsuite: Add tests for RTS flag parsing error handling
See #20201.
- - - - -
6 changed files:
- rts/RtsFlags.c
- + testsuite/tests/rts/T20201a.hs
- + testsuite/tests/rts/T20201a.stderr
- + testsuite/tests/rts/T20201b.hs
- + testsuite/tests/rts/T20201b.stderr
- testsuite/tests/rts/all.T
Changes:
=====================================
rts/RtsFlags.c
=====================================
@@ -2148,7 +2148,6 @@ static void initStatsFile (FILE *f)
static StgWord64
decodeSize(const char *flag, uint32_t offset, StgWord64 min, StgWord64 max)
{
- char c;
const char *s;
StgDouble m;
StgWord64 val;
@@ -2161,19 +2160,47 @@ decodeSize(const char *flag, uint32_t offset, StgWord64 min, StgWord64 max)
}
else
{
- m = atof(s);
- c = s[strlen(s)-1];
-
- if (c == 't' || c == 'T')
- m *= (StgWord64)1024*1024*1024*1024;
- else if (c == 'g' || c == 'G')
- m *= 1024*1024*1024;
- else if (c == 'm' || c == 'M')
- m *= 1024*1024;
- else if (c == 'k' || c == 'K')
- m *= 1024;
- else if (c == 'w' || c == 'W')
- m *= sizeof(W_);
+ char *end;
+ m = strtod(s, &end);
+
+ if (end == s) {
+ errorBelch("error in RTS option %s: unable to parse number '%s'", flag, s);
+ stg_exit(EXIT_FAILURE);
+ }
+
+ StgWord64 unit;
+ switch (*end) {
+ case 't':
+ case 'T':
+ unit = (StgWord64)1024*1024*1024*1024;
+ break;
+ case 'g':
+ case 'G':
+ unit = 1024*1024*1024;
+ break;
+ case 'm':
+ case 'M':
+ unit = 1024*1024;
+ break;
+ case 'k':
+ case 'K':
+ unit = 1024;
+ break;
+ case 'w':
+ case 'W':
+ unit = sizeof(W_);
+ break;
+ case 'b':
+ case 'B':
+ case '\0':
+ unit = 1;
+ break;
+ default:
+ errorBelch("error in RTS option %s: unknown unit suffix '%c'", flag, *end);
+ stg_exit(EXIT_FAILURE);
+ }
+
+ m *= unit;
}
val = (StgWord64)m;
=====================================
testsuite/tests/rts/T20201a.hs
=====================================
@@ -0,0 +1 @@
+main = putStrLn "hi"
=====================================
testsuite/tests/rts/T20201a.stderr
=====================================
@@ -0,0 +1 @@
+T20201a: error in RTS option -AturtlesM: unable to parse number 'turtlesM'
=====================================
testsuite/tests/rts/T20201b.hs
=====================================
@@ -0,0 +1,2 @@
+main = putStrLn "hi"
+
=====================================
testsuite/tests/rts/T20201b.stderr
=====================================
@@ -0,0 +1 @@
+T20201b: error in RTS option -A64z: unknown unit suffix 'z'
=====================================
testsuite/tests/rts/all.T
=====================================
@@ -587,6 +587,10 @@ test('decodeMyStack_emptyListForMissingFlag',
, js_broken(22261) # cloneMyStack# not yet implemented
], compile_and_run, [''])
+# Tests RTS flag parsing. Skipped on JS as it uses a distinct RTS.
+test('T20201a', [js_skip, exit_code(1)], compile_and_run, ['-with-rtsopts -AturtlesM'])
+test('T20201b', [js_skip, exit_code(1)], compile_and_run, ['-with-rtsopts -A64z'])
+
test('T22012', [js_skip, extra_ways(['ghci'])], compile_and_run, ['T22012_c.c'])
# Skip for JS platform as the JS RTS is always single threaded
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/a0fa4941903272c48b050d24e93eec819eff51bd...b7a146e5744bd6d2bc5bed707ec15175368e5bfa
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/a0fa4941903272c48b050d24e93eec819eff51bd...b7a146e5744bd6d2bc5bed707ec15175368e5bfa
You're receiving this email because of your account on gitlab.haskell.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20241116/6a8d998b/attachment-0001.html>
More information about the ghc-commits
mailing list