Commit 7a36ea3
authored
[1/15] Fix repeated side effects in floor/ceiling and runif bounds, reject na.rm= in reductions, and three small crash/diagnostic fixes (#137)
* Evaluate floor()/ceiling() arguments exactly once
floor() and ceiling() splice their argument into the emitted Fortran
expression three times (once for aint(), twice for the sign adjustment),
so an impure argument such as runif(1) was evaluated three times: the
result mixed different random draws and the RNG state diverged from R.
Extract the hoist-to-temporary pattern already used by matrix() into a
shared helper, hoist_unless_name(), and use it in floor()/ceiling() to
evaluate non-trivial arguments once. Bare variable names are passed
through unchanged, so existing translations without side effects are
unaffected. matrix() now uses the shared helper.
* Reject named arguments in max/min/sum/prod
The reductions handler never inspected argument names, so
`sum(x, na.rm = TRUE)` translated `na.rm = TRUE` as an extra data
argument, emitting `(sum(x) + .true.)`. Reject named arguments with a
clear compile-time error, matching the existing any()/all() guard.
* Error cleanly when assigning a value-less expression
Binding a new variable to an expression that produces no value (e.g.
`y <- if (x) 1 else 2`, where `if` lowers to a statement) crashed with
"no applicable method for `@` applied to an object of class NULL".
Diagnose it at the assignment site instead, naming the offending
expression.
* Fix r2size() crash on deferred-mode variables
`var@mode != "integer"` fails with "argument is of length zero" when
@mode is NULL (a binding whose mode is still being inferred, as in the
deferred-mode path in r2f-assign.R). Use !identical() so the intended
"size is not an integer" warning path is reached instead.
* Make Variable@dims <- NULL reset to scalar
The dims setter early-returned on empty input, so resetting a variable
to scalar (NULL dims, per the class's own convention) silently kept the
stale dims. r2f-assign.R's deferred-mode path assigns
`var@dims <- value@value@dims` with a legitimately-NULL RHS and relied
on this working. Assign the attribute directly (the same S7 workaround
already used by the `r` property) to avoid recursing through the setter.
* Evaluate runif() bounds exactly once
Same defect class as the floor()/ceiling() fix: `min` is spliced twice
into the emitted expression, and for array results the implied-do
re-evaluates spliced bounds once per element, so an impure bound such
as `runif(2L, runif(1L), 10)` drew a fresh `min` value repeatedly where
R evaluates it once. Hoist non-trivial bounds via hoist_unless_name();
bare names and literal bounds are unaffected.
* Format with air1 parent 16aa2c5 commit 7a36ea3
21 files changed
Lines changed: 334 additions & 32 deletions
File tree
- R
- tests/testthat
- _snaps
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
240 | 240 | | |
241 | 241 | | |
242 | 242 | | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
243 | 246 | | |
244 | 247 | | |
245 | 248 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
74 | 94 | | |
75 | 95 | | |
76 | 96 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
175 | 175 | | |
176 | 176 | | |
177 | 177 | | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
178 | 186 | | |
179 | 187 | | |
180 | 188 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
157 | 157 | | |
158 | 158 | | |
159 | 159 | | |
160 | | - | |
161 | 160 | | |
162 | 161 | | |
163 | | - | |
164 | | - | |
165 | | - | |
166 | | - | |
167 | | - | |
168 | | - | |
169 | | - | |
170 | | - | |
171 | | - | |
172 | | - | |
173 | | - | |
174 | | - | |
175 | | - | |
176 | | - | |
177 | | - | |
| 162 | + | |
| 163 | + | |
178 | 164 | | |
179 | 165 | | |
180 | 166 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
42 | 42 | | |
43 | 43 | | |
44 | 44 | | |
45 | | - | |
| 45 | + | |
46 | 46 | | |
47 | | - | |
| 47 | + | |
48 | 48 | | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
49 | 52 | | |
50 | 53 | | |
51 | 54 | | |
| |||
63 | 66 | | |
64 | 67 | | |
65 | 68 | | |
66 | | - | |
| 69 | + | |
67 | 70 | | |
68 | | - | |
| 71 | + | |
69 | 72 | | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
70 | 76 | | |
71 | 77 | | |
72 | 78 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
17 | 25 | | |
18 | 26 | | |
19 | 27 | | |
20 | | - | |
| 28 | + | |
21 | 29 | | |
22 | 30 | | |
23 | | - | |
24 | | - | |
| 31 | + | |
| 32 | + | |
25 | 33 | | |
26 | 34 | | |
27 | 35 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
16 | 26 | | |
17 | 27 | | |
18 | 28 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
168 | 168 | | |
169 | 169 | | |
170 | 170 | | |
171 | | - | |
| 171 | + | |
| 172 | + | |
172 | 173 | | |
173 | 174 | | |
174 | 175 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
0 commit comments