Skip to content

Commit 62debd8

Browse files
author
Pavel Marek
committed
Fix AssertionError in Sprintf.
Also refactor a guard.
1 parent 10266f0 commit 62debd8

File tree

1 file changed

+22
-15
lines changed
  • com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base

1 file changed

+22
-15
lines changed

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

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -202,16 +202,11 @@ private static int maxLengthAndConvertToScalar(Object[] values) {
202202
for (int i = 0; i < values.length; i++) {
203203
if (values[i] instanceof RAbstractVector) {
204204
int vecLength = ((RAbstractVector) values[i]).getLength();
205-
if (vecLength == 0) {
206-
// result will be empty character vector in this case, as in:
207-
// sprintf("%d %d", as.integer(c(7,42)), integer())
208-
return 0;
209-
} else {
210-
if (vecLength == 1) {
211-
values[i] = ((RAbstractVector) values[i]).getDataAtAsObject(0);
212-
}
213-
length = Math.max(vecLength, length);
205+
assert vecLength != 0;
206+
if (vecLength == 1) {
207+
values[i] = ((RAbstractVector) values[i]).getDataAtAsObject(0);
214208
}
209+
length = Math.max(vecLength, length);
215210
} else {
216211
length = Math.max(1, length);
217212
}
@@ -231,12 +226,12 @@ private static Object[] createSprintfArgs(Object[] values, int index, int maxLen
231226
return sprintfArgs;
232227
}
233228

234-
@Specialization(guards = {"!oneElement(args)", "hasNull(args)"})
229+
@Specialization(guards = {"!oneElement(args)", "hasNullOrEmptyVec(args)"})
235230
protected RStringVector sprintf(@SuppressWarnings("unused") Object fmt, @SuppressWarnings("unused") RArgsValuesAndNames args) {
236231
return RDataFactory.createEmptyStringVector();
237232
}
238233

239-
@Specialization(guards = {"!oneElement(args)", "!hasNull(args)"})
234+
@Specialization(guards = {"!oneElement(args)", "!hasNullOrEmptyVec(args)"})
240235
@TruffleBoundary
241236
protected RStringVector sprintf(String fmt, RArgsValuesAndNames args) {
242237
Object[] values = args.getArguments();
@@ -267,7 +262,7 @@ protected Object sprintfOneElement(String fmt, RArgsValuesAndNames args) {
267262
return sprintfRecursive.executeObject(fmt, args.getArgument(0));
268263
}
269264

270-
@Specialization(guards = {"!oneElement(args)", "!hasNull(args)"})
265+
@Specialization(guards = {"!oneElement(args)", "!hasNullOrEmptyVec(args)"})
271266
@TruffleBoundary
272267
protected RStringVector sprintf(RStringVector fmt, RArgsValuesAndNames args) {
273268
if (fmt.getLength() == 0) {
@@ -276,8 +271,15 @@ protected RStringVector sprintf(RStringVector fmt, RArgsValuesAndNames args) {
276271
String[] data = new String[fmt.getLength()];
277272
for (int i = 0; i < data.length; i++) {
278273
RStringVector formatted = sprintf(fmt.getDataAt(i), args);
279-
assert formatted.getLength() > 0;
280-
data[i] = formatted.getDataAt(args.getLength() == 0 ? 0 : i % Math.min(args.getLength(), formatted.getLength()));
274+
if (args.getLength() == 0) {
275+
if (formatted.getLength() == 0) {
276+
data[i] = null;
277+
} else {
278+
data[i] = formatted.getDataAt(0);
279+
}
280+
} else {
281+
data[i] = formatted.getDataAt(i % Math.min(args.getLength(), formatted.getLength()));
282+
}
281283
}
282284
return RDataFactory.createStringVector(data, RDataFactory.COMPLETE_VECTOR);
283285
}
@@ -739,10 +741,15 @@ protected boolean oneElement(RArgsValuesAndNames args) {
739741
return args.getLength() == 1;
740742
}
741743

742-
protected boolean hasNull(RArgsValuesAndNames args) {
744+
protected boolean hasNullOrEmptyVec(RArgsValuesAndNames args) {
743745
for (int i = 0; i < args.getLength(); i++) {
744746
if (args.getArgument(i) == RNull.instance) {
745747
return true;
748+
} else if (args.getArgument(i) instanceof RAbstractVector) {
749+
RAbstractVector vector = (RAbstractVector) args.getArgument(i);
750+
if (vector.getLength() == 0) {
751+
return true;
752+
}
746753
}
747754
}
748755

0 commit comments

Comments
 (0)