Skip to content

Commit 4214232

Browse files
[GR-22739] [GR-22669] [GR-22740] [GR-22670] [GR-22742] Backport to 20.1.0: properly close context, S3 bugfix, better error message in LLVM mode, fix LoopConditionProfile usages.
PullRequest: fastr/2438
2 parents a109064 + bafddcb commit 4214232

File tree

61 files changed

+1099
-518
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1099
-518
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ New features:
2525

2626
Bug fixes:
2727

28+
* S3 dispatch with missing arguments, e.g., `as_tibble()` (reported by Michael Hall on Slack)
2829
* `dyn.load` did not work with relative paths
2930
* missing warnings on integer overflow #136
3031
* the f2c script fixed to handle extra dotted file extensions #143

com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_DLL.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.oracle.truffle.api.nodes.Node;
3737
import com.oracle.truffle.api.source.Source;
3838
import com.oracle.truffle.r.runtime.DSLConfig;
39+
import com.oracle.truffle.r.runtime.REnvVars;
3940
import com.oracle.truffle.r.runtime.RError;
4041
import com.oracle.truffle.r.runtime.RError.Message;
4142
import com.oracle.truffle.r.runtime.RInternalError;
@@ -96,6 +97,13 @@ static LibHandle dlOpen(RContext context, String path) {
9697
} catch (UnknownIdentifierException e) {
9798
CompilerDirectives.transferToInterpreter();
9899
throw RError.error(RError.NO_CALLER, Message.GENERIC, "Could not find function 'Rdynload_setSymbol' in libR on path: " + path);
100+
} catch (Throwable e) {
101+
RError.warning(RError.NO_CALLER, Message.GENERIC, String.format(
102+
"Loading of '%s' in LLVM mode failed. " +
103+
"You may load this package via the native mode by adding it to %s/etc/native-packages " +
104+
"or by running FastR with option --R.BackEndNative=packageName.",
105+
path, REnvVars.rHome(RContext.getInstance())));
106+
throw e;
99107
} finally {
100108
if (!isInitialization) {
101109
stateRFFI.afterDowncall(before, Type.LLVM);

com.oracle.truffle.r.launcher/src/com/oracle/truffle/r/launcher/RMain.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,12 @@ protected void launch(Builder contextBuilderIn) {
186186

187187
this.consoleHandler.setContext(context);
188188
if (launcherMode) {
189+
int exitCode = 0;
189190
try {
190-
System.exit(execute(context));
191+
exitCode = execute(context);
191192
} finally {
192193
context.close();
194+
System.exit(exitCode);
193195
}
194196
}
195197
}

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AnyNA.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ protected byte anyNACached(RAbstractAtomicVector x, @SuppressWarnings("unused")
123123
// shortcut when we know there's no NAs
124124
if (!xDataLib.isComplete(xData)) {
125125
SeqIterator iter = xDataLib.iterator(xData);
126-
while (xDataLib.next(xData, iter)) {
126+
while (xDataLib.nextLoopCondition(xData, iter)) {
127127
if (xDataLib.isNextNA(xData, iter)) {
128128
return RRuntime.LOGICAL_TRUE;
129129
}
@@ -134,15 +134,15 @@ protected byte anyNACached(RAbstractAtomicVector x, @SuppressWarnings("unused")
134134
return RRuntime.LOGICAL_FALSE;
135135
case Double:
136136
SeqIterator iterDouble = xDataLib.iterator(xData);
137-
while (xDataLib.next(xData, iterDouble)) {
137+
while (xDataLib.nextLoopCondition(xData, iterDouble)) {
138138
if (nanCheck.checkNAorNaN(xDataLib.getNextDouble(xData, iterDouble))) {
139139
return RRuntime.LOGICAL_TRUE;
140140
}
141141
}
142142
break;
143143
case Complex:
144144
SeqIterator iterCmplx = xDataLib.iterator(xData);
145-
while (xDataLib.next(xData, iterCmplx)) {
145+
while (xDataLib.nextLoopCondition(xData, iterCmplx)) {
146146
RComplex val = xDataLib.getNextComplex(xData, iterCmplx);
147147
if (nanCheck.checkNAorNaN(val.getRealPart()) || nanCheck.checkNAorNaN(val.getImaginaryPart())) {
148148
return RRuntime.LOGICAL_TRUE;

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ColMeans.java

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,17 @@
2424
import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
2525

2626
import com.oracle.truffle.api.dsl.Specialization;
27+
import com.oracle.truffle.api.library.CachedLibrary;
2728
import com.oracle.truffle.r.runtime.RRuntime;
2829
import com.oracle.truffle.r.runtime.builtins.RBuiltin;
2930
import com.oracle.truffle.r.runtime.data.RDataFactory;
3031
import com.oracle.truffle.r.runtime.data.RDoubleVector;
3132
import com.oracle.truffle.r.runtime.data.RIntVector;
3233
import com.oracle.truffle.r.runtime.data.RLogicalVector;
34+
import com.oracle.truffle.r.runtime.data.VectorDataLibrary;
35+
import com.oracle.truffle.r.runtime.data.VectorDataLibrary.RandomAccessIterator;
3336
import com.oracle.truffle.r.runtime.ops.BinaryArithmetic;
37+
import com.oracle.truffle.r.runtime.ops.na.NACheck;
3438

3539
//Implements .colMeans
3640
@RBuiltin(name = "colMeans", kind = INTERNAL, parameterNames = {"X", "m", "n", "na.rm"}, behavior = PURE)
@@ -42,17 +46,20 @@ public abstract class ColMeans extends ColSumsBase {
4246
createCasts(ColMeans.class);
4347
}
4448

45-
@Specialization(guards = "!naRm")
46-
protected RDoubleVector colMeansNaRmFalse(RDoubleVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm) {
47-
checkVectorLength(x, rowNum, colNum);
49+
@Specialization(guards = "!naRm", limit = "getTypedVectorDataLibraryCacheSize()")
50+
protected RDoubleVector colMeansNaRmFalse(RDoubleVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm,
51+
@CachedLibrary("x.getData()") VectorDataLibrary dataLib) {
52+
checkVectorLength(dataLib, x, rowNum, colNum);
4853

4954
double[] result = new double[colNum];
5055
boolean isComplete = true;
51-
na.enable(x);
56+
Object xData = x.getData();
57+
RandomAccessIterator it = dataLib.randomAccessIterator(xData);
58+
NACheck na = dataLib.getNACheck(xData);
5259
nextCol: for (int c = 0; c < colNum; c++) {
5360
double sum = 0;
5461
for (int i = 0; i < rowNum; i++) {
55-
double el = x.getDataAt(c * rowNum + i);
62+
double el = dataLib.getDouble(xData, it, c * rowNum + i);
5663
if (na.check(el)) {
5764
result[c] = RRuntime.DOUBLE_NA;
5865
continue nextCol;
@@ -69,18 +76,21 @@ protected RDoubleVector colMeansNaRmFalse(RDoubleVector x, int rowNum, int colNu
6976
return RDataFactory.createDoubleVector(result, na.neverSeenNA() && isComplete);
7077
}
7178

72-
@Specialization(guards = "naRm")
73-
protected RDoubleVector colMeansNaRmTrue(RDoubleVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm) {
74-
checkVectorLength(x, rowNum, colNum);
79+
@Specialization(guards = "naRm", limit = "getTypedVectorDataLibraryCacheSize()")
80+
protected RDoubleVector colMeansNaRmTrue(RDoubleVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm,
81+
@CachedLibrary("x.getData()") VectorDataLibrary dataLib) {
82+
checkVectorLength(dataLib, x, rowNum, colNum);
7583

7684
double[] result = new double[colNum];
7785
boolean isComplete = true;
78-
na.enable(x);
86+
Object xData = x.getData();
87+
RandomAccessIterator it = dataLib.randomAccessIterator(xData);
88+
NACheck na = dataLib.getNACheck(xData);
7989
for (int c = 0; c < colNum; c++) {
8090
double sum = 0;
8191
int nonNaNumCount = 0;
8292
for (int i = 0; i < rowNum; i++) {
83-
double el = x.getDataAt(c * rowNum + i);
93+
double el = dataLib.getDouble(xData, it, c * rowNum + i);
8494
if (!na.check(el) && !Double.isNaN(el)) {
8595
sum = add.op(sum, el);
8696
nonNaNumCount++;
@@ -96,16 +106,19 @@ protected RDoubleVector colMeansNaRmTrue(RDoubleVector x, int rowNum, int colNum
96106
return RDataFactory.createDoubleVector(result, isComplete);
97107
}
98108

99-
@Specialization(guards = "!naRm")
100-
protected RDoubleVector colMeansNaRmFalse(RLogicalVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm) {
101-
checkVectorLength(x, rowNum, colNum);
109+
@Specialization(guards = "!naRm", limit = "getTypedVectorDataLibraryCacheSize()")
110+
protected RDoubleVector colMeansNaRmFalse(RLogicalVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm,
111+
@CachedLibrary("x.getData()") VectorDataLibrary dataLib) {
112+
checkVectorLength(dataLib, x, rowNum, colNum);
102113

103114
double[] result = new double[colNum];
104-
na.enable(x);
115+
Object xData = x.getData();
116+
RandomAccessIterator it = dataLib.randomAccessIterator(xData);
117+
NACheck na = dataLib.getNACheck(xData);
105118
nextCol: for (int c = 0; c < colNum; c++) {
106119
double sum = 0;
107120
for (int i = 0; i < rowNum; i++) {
108-
byte el = x.getDataAt(c * rowNum + i);
121+
byte el = dataLib.getLogical(xData, it, c * rowNum + i);
109122
if (na.check(el)) {
110123
result[c] = RRuntime.DOUBLE_NA;
111124
continue nextCol;
@@ -117,18 +130,21 @@ protected RDoubleVector colMeansNaRmFalse(RLogicalVector x, int rowNum, int colN
117130
return RDataFactory.createDoubleVector(result, na.neverSeenNA());
118131
}
119132

120-
@Specialization(guards = "naRm")
121-
protected RDoubleVector colMeansNaRmTrue(RLogicalVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm) {
122-
checkVectorLength(x, rowNum, colNum);
133+
@Specialization(guards = "naRm", limit = "getTypedVectorDataLibraryCacheSize()")
134+
protected RDoubleVector colMeansNaRmTrue(RLogicalVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm,
135+
@CachedLibrary("x.getData()") VectorDataLibrary dataLib) {
136+
checkVectorLength(dataLib, x, rowNum, colNum);
123137

124138
double[] result = new double[colNum];
125139
boolean isComplete = true;
126-
na.enable(x);
140+
Object xData = x.getData();
141+
RandomAccessIterator it = dataLib.randomAccessIterator(xData);
142+
NACheck na = dataLib.getNACheck(xData);
127143
for (int c = 0; c < colNum; c++) {
128144
double sum = 0;
129145
int nonNaNumCount = 0;
130146
for (int i = 0; i < rowNum; i++) {
131-
byte el = x.getDataAt(c * rowNum + i);
147+
byte el = dataLib.getLogical(xData, it, c * rowNum + i);
132148
if (!na.check(el)) {
133149
sum = add.op(sum, el);
134150
nonNaNumCount++;
@@ -144,16 +160,19 @@ protected RDoubleVector colMeansNaRmTrue(RLogicalVector x, int rowNum, int colNu
144160
return RDataFactory.createDoubleVector(result, isComplete);
145161
}
146162

147-
@Specialization(guards = "!naRm")
148-
protected RDoubleVector colMeansNaRmFalse(RIntVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm) {
149-
checkVectorLength(x, rowNum, colNum);
163+
@Specialization(guards = "!naRm", limit = "getTypedVectorDataLibraryCacheSize()")
164+
protected RDoubleVector colMeansNaRmFalse(RIntVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm,
165+
@CachedLibrary("x.getData()") VectorDataLibrary dataLib) {
166+
checkVectorLength(dataLib, x, rowNum, colNum);
150167

151168
double[] result = new double[colNum];
152-
na.enable(x);
169+
Object xData = x.getData();
170+
RandomAccessIterator it = dataLib.randomAccessIterator(xData);
171+
NACheck na = dataLib.getNACheck(xData);
153172
nextCol: for (int c = 0; c < colNum; c++) {
154173
double sum = 0;
155174
for (int i = 0; i < rowNum; i++) {
156-
int el = x.getDataAt(c * rowNum + i);
175+
int el = dataLib.getInt(xData, it, c * rowNum + i);
157176
if (na.check(el)) {
158177
result[c] = RRuntime.DOUBLE_NA;
159178
continue nextCol;
@@ -165,18 +184,21 @@ protected RDoubleVector colMeansNaRmFalse(RIntVector x, int rowNum, int colNum,
165184
return RDataFactory.createDoubleVector(result, na.neverSeenNA());
166185
}
167186

168-
@Specialization(guards = "naRm")
169-
protected RDoubleVector colMeansNaRmTrue(RIntVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm) {
170-
checkVectorLength(x, rowNum, colNum);
187+
@Specialization(guards = "naRm", limit = "getTypedVectorDataLibraryCacheSize()")
188+
protected RDoubleVector colMeansNaRmTrue(RIntVector x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm,
189+
@CachedLibrary("x.getData()") VectorDataLibrary dataLib) {
190+
checkVectorLength(dataLib, x, rowNum, colNum);
171191

172192
double[] result = new double[colNum];
173193
boolean isComplete = true;
174-
na.enable(x);
194+
Object xData = x.getData();
195+
RandomAccessIterator it = dataLib.randomAccessIterator(xData);
196+
NACheck na = dataLib.getNACheck(xData);
175197
for (int c = 0; c < colNum; c++) {
176198
double sum = 0;
177199
int nonNaNumCount = 0;
178200
for (int i = 0; i < rowNum; i++) {
179-
int el = x.getDataAt(c * rowNum + i);
201+
int el = dataLib.getInt(xData, it, c * rowNum + i);
180202
if (!na.check(el)) {
181203
sum = add.op(sum, el);
182204
nonNaNumCount++;

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ColSums.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ protected RDoubleVector colSums(RIntVector x, int rowNum, int colNum, boolean rn
134134
final boolean rna = removeNA.profile(rnaParam);
135135
double[] result = new double[colNum];
136136
boolean isComplete = true;
137-
na.enable(x);
138137
int pos = 0;
139138
Object xData = x.getData();
140139
RandomAccessIterator xIt = xDataLib.randomAccessIterator(xData);

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ColSumsBase.java

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.toBoolean;
2727
import static com.oracle.truffle.r.runtime.RError.Message.INVALID_ARGUMENT;
2828

29+
import com.oracle.truffle.api.dsl.Cached;
2930
import com.oracle.truffle.api.dsl.Specialization;
31+
import com.oracle.truffle.api.profiles.BranchProfile;
3032
import com.oracle.truffle.api.profiles.ConditionProfile;
3133
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
3234
import com.oracle.truffle.r.runtime.RError;
@@ -35,7 +37,6 @@
3537
import com.oracle.truffle.r.runtime.data.RDoubleVector;
3638
import com.oracle.truffle.r.runtime.data.VectorDataLibrary;
3739
import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
38-
import com.oracle.truffle.r.runtime.ops.na.NACheck;
3940

4041
/**
4142
* Base class that provides arguments handling and validation helper methods and trivial cases
@@ -44,7 +45,6 @@
4445
*/
4546
public abstract class ColSumsBase extends RBuiltinNode.Arg4 {
4647

47-
protected final NACheck na = NACheck.create();
4848
private final ConditionProfile vectorLengthProfile = ConditionProfile.createBinaryProfile();
4949

5050
protected static Casts createCasts(Class<? extends ColSumsBase> extCls) {
@@ -79,56 +79,61 @@ protected final RDoubleVector doScalarNaRmFalse(double x, int rowNum, int colNum
7979
}
8080

8181
@Specialization(guards = "naRm")
82-
protected final RDoubleVector doScalarNaRmTrue(double x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm) {
82+
protected final RDoubleVector doScalarNaRmTrue(double x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm,
83+
@Cached BranchProfile naProfile) {
8384
checkLengthOne(rowNum, colNum);
84-
na.enable(x);
85-
if (!na.check(x) && !Double.isNaN(x)) {
85+
if (!RRuntime.isNA(x) && !Double.isNaN(x)) {
8686
return RDataFactory.createDoubleVectorFromScalar(x);
8787
} else {
88+
naProfile.enter();
8889
return RDataFactory.createDoubleVectorFromScalar(Double.NaN);
8990
}
9091
}
9192

9293
@Specialization(guards = "!naRm")
93-
protected final RDoubleVector doScalarNaRmFalse(int x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm) {
94+
protected final RDoubleVector doScalarNaRmFalse(int x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm,
95+
@Cached BranchProfile naProfile) {
9496
checkLengthOne(rowNum, colNum);
95-
na.enable(x);
96-
if (!na.check(x)) {
97+
if (!RRuntime.isNA(x)) {
9798
return RDataFactory.createDoubleVectorFromScalar(x);
9899
} else {
100+
naProfile.enter();
99101
return RDataFactory.createDoubleVectorFromScalar(RRuntime.DOUBLE_NA);
100102
}
101103
}
102104

103105
@Specialization(guards = "naRm")
104-
protected final RDoubleVector doScalarNaRmTrue(int x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm) {
106+
protected final RDoubleVector doScalarNaRmTrue(int x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm,
107+
@Cached BranchProfile naProfile) {
105108
checkLengthOne(rowNum, colNum);
106-
na.enable(x);
107-
if (!na.check(x)) {
109+
if (!RRuntime.isNA(x)) {
108110
return RDataFactory.createDoubleVectorFromScalar(x);
109111
} else {
112+
naProfile.enter();
110113
return RDataFactory.createDoubleVectorFromScalar(Double.NaN);
111114
}
112115
}
113116

114117
@Specialization(guards = "!naRm")
115-
protected final RDoubleVector doScalarNaRmFalse(byte x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm) {
118+
protected final RDoubleVector doScalarNaRmFalse(byte x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm,
119+
@Cached BranchProfile naProfile) {
116120
checkLengthOne(rowNum, colNum);
117-
na.enable(x);
118-
if (!na.check(x)) {
121+
if (!RRuntime.isNA(x)) {
119122
return RDataFactory.createDoubleVectorFromScalar(x);
120123
} else {
124+
naProfile.enter();
121125
return RDataFactory.createDoubleVectorFromScalar(RRuntime.DOUBLE_NA);
122126
}
123127
}
124128

125129
@Specialization(guards = "naRm")
126-
protected final RDoubleVector doScalarNaRmTrue(byte x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm) {
130+
protected final RDoubleVector doScalarNaRmTrue(byte x, int rowNum, int colNum, @SuppressWarnings("unused") boolean naRm,
131+
@Cached BranchProfile naProfile) {
127132
checkLengthOne(rowNum, colNum);
128-
na.enable(x);
129-
if (!na.check(x)) {
133+
if (!RRuntime.isNA(x)) {
130134
return RDataFactory.createDoubleVectorFromScalar(x);
131135
} else {
136+
naProfile.enter();
132137
return RDataFactory.createDoubleVectorFromScalar(Double.NaN);
133138
}
134139
}

0 commit comments

Comments
 (0)