Skip to content

Commit 882b22c

Browse files
author
Miloslav Metelka
committed
[GR-12605] Fix unhandled internal exceptions in survival tests.
PullRequest: fastr/1808
2 parents afcbd5a + 9fe42f4 commit 882b22c

File tree

17 files changed

+319
-176
lines changed

17 files changed

+319
-176
lines changed

com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,33 @@ public void Rf_gsetVar(Object symbol, Object value, Object rho) {
948948
}
949949
}
950950

951+
@Override
952+
@TruffleBoundary
953+
public void Rf_setVar(Object symbol, Object value, Object rho) {
954+
if (rho == RNull.instance) {
955+
throw RError.error(RError.SHOW_CALLER2, RError.Message.USE_NULL_ENV_DEFUNCT);
956+
}
957+
if (!(rho instanceof REnvironment)) {
958+
throw RError.error(RError.SHOW_CALLER2, RError.Message.ARG_NOT_AN_ENVIRONMENT, "setVar");
959+
}
960+
REnvironment env = (REnvironment) rho;
961+
String symName = ((RSymbol) symbol).getName();
962+
while (env != REnvironment.emptyEnv()) {
963+
if (env.get(symName) != null) {
964+
if (env.bindingIsLocked(symName)) {
965+
throw RError.error(RError.SHOW_CALLER2, Message.ENV_CHANGE_BINDING, symName);
966+
}
967+
try {
968+
env.put(symName, value);
969+
} catch (PutException ex) {
970+
throw RError.error(RError.SHOW_CALLER2, ex);
971+
}
972+
}
973+
env = env.getParent();
974+
}
975+
Rf_defineVar(symbol, value, REnvironment.globalEnv());
976+
}
977+
951978
@Override
952979
@TruffleBoundary
953980
public void DUPLICATE_ATTRIB(Object to, Object from) {

com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,8 @@ public interface StdUpCallsRFFI {
419419

420420
void Rf_gsetVar(Object symbol, Object value, Object rho);
421421

422+
void Rf_setVar(Object symbol, Object value, Object rho);
423+
422424
void DUPLICATE_ATTRIB(Object to, Object from);
423425

424426
int R_compute_identical(Object x, Object y, int flags);

com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h

Lines changed: 60 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -299,65 +299,66 @@
299299
#define Rf_rweibull_x 270
300300
#define Rf_rwilcox_x 271
301301
#define Rf_setAttrib_x 272
302-
#define Rf_sign_x 273
303-
#define Rf_sinpi_x 274
304-
#define Rf_str2type_x 275
305-
#define Rf_tanpi_x 276
306-
#define Rf_tetragamma_x 277
307-
#define Rf_trigamma_x 278
308-
#define Rf_unprotect_x 279
309-
#define Rf_unprotect_ptr_x 280
310-
#define Rf_warning_x 281
311-
#define Rf_warningcall_x 282
312-
#define Rprintf_x 283
313-
#define SETCAD4R_x 284
314-
#define SETCADDDR_x 285
315-
#define SETCADDR_x 286
316-
#define SETCADR_x 287
317-
#define SETCAR_x 288
318-
#define SETCDR_x 289
319-
#define SETLENGTH_x 290
320-
#define SETLEVELS_x 291
321-
#define SET_ATTRIB_x 292
322-
#define SET_BODY_x 293
323-
#define SET_CLOENV_x 294
324-
#define SET_ENCLOS_x 295
325-
#define SET_FORMALS_x 296
326-
#define SET_NAMED_FASTR_x 297
327-
#define SET_OBJECT_x 298
328-
#define SET_RDEBUG_x 299
329-
#define SET_RSTEP_x 300
330-
#define SET_S4_OBJECT_x 301
331-
#define SET_STRING_ELT_x 302
332-
#define SET_SYMVALUE_x 303
333-
#define SET_TAG_x 304
334-
#define SET_TRUELENGTH_x 305
335-
#define SET_TYPEOF_x 306
336-
#define SET_VECTOR_ELT_x 307
337-
#define STRING_ELT_x 308
338-
#define SYMVALUE_x 309
339-
#define TAG_x 310
340-
#define TRUELENGTH_x 311
341-
#define TYPEOF_x 312
342-
#define UNSET_S4_OBJECT_x 313
343-
#define VECTOR_ELT_x 314
344-
#define exp_rand_x 315
345-
#define forceSymbols_x 316
346-
#define getCCallable_x 317
347-
#define getConnectionClassString_x 318
348-
#define getEmbeddingDLLInfo_x 319
349-
#define getOpenModeString_x 320
350-
#define getSummaryDescription_x 321
351-
#define isSeekable_x 322
352-
#define norm_rand_x 323
353-
#define octsize_x 324
354-
#define registerCCallable_x 325
355-
#define registerRoutines_x 326
356-
#define restoreHandlerStacks_x 327
357-
#define setDotSymbolValues_x 328
358-
#define unif_rand_x 329
359-
#define useDynamicSymbols_x 330
302+
#define Rf_setVar_x 273
303+
#define Rf_sign_x 274
304+
#define Rf_sinpi_x 275
305+
#define Rf_str2type_x 276
306+
#define Rf_tanpi_x 277
307+
#define Rf_tetragamma_x 278
308+
#define Rf_trigamma_x 279
309+
#define Rf_unprotect_x 280
310+
#define Rf_unprotect_ptr_x 281
311+
#define Rf_warning_x 282
312+
#define Rf_warningcall_x 283
313+
#define Rprintf_x 284
314+
#define SETCAD4R_x 285
315+
#define SETCADDDR_x 286
316+
#define SETCADDR_x 287
317+
#define SETCADR_x 288
318+
#define SETCAR_x 289
319+
#define SETCDR_x 290
320+
#define SETLENGTH_x 291
321+
#define SETLEVELS_x 292
322+
#define SET_ATTRIB_x 293
323+
#define SET_BODY_x 294
324+
#define SET_CLOENV_x 295
325+
#define SET_ENCLOS_x 296
326+
#define SET_FORMALS_x 297
327+
#define SET_NAMED_FASTR_x 298
328+
#define SET_OBJECT_x 299
329+
#define SET_RDEBUG_x 300
330+
#define SET_RSTEP_x 301
331+
#define SET_S4_OBJECT_x 302
332+
#define SET_STRING_ELT_x 303
333+
#define SET_SYMVALUE_x 304
334+
#define SET_TAG_x 305
335+
#define SET_TRUELENGTH_x 306
336+
#define SET_TYPEOF_x 307
337+
#define SET_VECTOR_ELT_x 308
338+
#define STRING_ELT_x 309
339+
#define SYMVALUE_x 310
340+
#define TAG_x 311
341+
#define TRUELENGTH_x 312
342+
#define TYPEOF_x 313
343+
#define UNSET_S4_OBJECT_x 314
344+
#define VECTOR_ELT_x 315
345+
#define exp_rand_x 316
346+
#define forceSymbols_x 317
347+
#define getCCallable_x 318
348+
#define getConnectionClassString_x 319
349+
#define getEmbeddingDLLInfo_x 320
350+
#define getOpenModeString_x 321
351+
#define getSummaryDescription_x 322
352+
#define isSeekable_x 323
353+
#define norm_rand_x 324
354+
#define octsize_x 325
355+
#define registerCCallable_x 326
356+
#define registerRoutines_x 327
357+
#define restoreHandlerStacks_x 328
358+
#define setDotSymbolValues_x 329
359+
#define unif_rand_x 330
360+
#define useDynamicSymbols_x 331
360361

361-
#define UPCALLS_TABLE_SIZE 331
362+
#define UPCALLS_TABLE_SIZE 332
362363

363364
#endif // RFFI_UPCALLSINDEX_H

com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -384,9 +384,10 @@ void Rf_defineVar(SEXP symbol, SEXP value, SEXP rho) {
384384
checkExitCall();
385385
}
386386

387-
void Rf_setVar(SEXP x, SEXP y, SEXP z) {
388-
TRACE0();
389-
unimplemented("Rf_setVar");
387+
void Rf_setVar(SEXP symbol, SEXP value, SEXP rho) {
388+
TRACE3(symbol, value, rho);
389+
((call_Rf_setVar) callbacks[Rf_setVar_x])(symbol, value, rho);
390+
checkExitCall();
390391
}
391392

392393
SEXP Rf_dimgets(SEXP x, SEXP y) {

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

Lines changed: 58 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,15 @@ protected RList split(RAbstractVector x, RAbstractIntVector f,
8989
// perform split
9090
while (xAccess.next(xIter)) {
9191
fAccess.nextWithWrap(fIter);
92-
int resultIndex = fAccess.getInt(fIter) - 1; // a factor is a 1-based int
93-
// vector
94-
String[] collect = collectResults[resultIndex];
95-
if (collect.length == collectResultSize[resultIndex]) {
96-
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
92+
if (!fAccess.isNA(fIter)) {
93+
// a factor is a 1-based int vector
94+
int resultIndex = fAccess.getInt(fIter) - 1;
95+
String[] collect = collectResults[resultIndex];
96+
if (collect.length == collectResultSize[resultIndex]) {
97+
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
98+
}
99+
collect[collectResultSize[resultIndex]++] = xAccess.getString(xIter);
97100
}
98-
collect[collectResultSize[resultIndex]++] = xAccess.getString(xIter);
99101
}
100102

101103
RStringVector[] resultNames = getSplitNames.getNames(x, fAccess, fIter, nLevels, collectResultSize);
@@ -112,15 +114,17 @@ protected RList split(RAbstractVector x, RAbstractIntVector f,
112114
// perform split
113115
while (xAccess.next(xIter)) {
114116
fAccess.nextWithWrap(fIter);
115-
int resultIndex = fAccess.getInt(fIter) - 1; // a factor is a 1-based int
116-
// vector
117-
double[] collect = collectResults[resultIndex];
118-
if (collect.length == collectResultSize[resultIndex] * 2) {
119-
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
117+
if (!fAccess.isNA(fIter)) {
118+
// a factor is a 1-based int vector
119+
int resultIndex = fAccess.getInt(fIter) - 1;
120+
double[] collect = collectResults[resultIndex];
121+
if (collect.length == collectResultSize[resultIndex] * 2) {
122+
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
123+
}
124+
collect[collectResultSize[resultIndex] * 2] = xAccess.getComplexR(xIter);
125+
collect[collectResultSize[resultIndex] * 2 + 1] = xAccess.getComplexI(xIter);
126+
collectResultSize[resultIndex]++;
120127
}
121-
collect[collectResultSize[resultIndex] * 2] = xAccess.getComplexR(xIter);
122-
collect[collectResultSize[resultIndex] * 2 + 1] = xAccess.getComplexI(xIter);
123-
collectResultSize[resultIndex]++;
124128
}
125129

126130
RStringVector[] resultNames = getSplitNames.getNames(x, fAccess, fIter, nLevels, collectResultSize);
@@ -137,13 +141,15 @@ protected RList split(RAbstractVector x, RAbstractIntVector f,
137141
// perform split
138142
while (xAccess.next(xIter)) {
139143
fAccess.nextWithWrap(fIter);
140-
int resultIndex = fAccess.getInt(fIter) - 1; // a factor is a 1-based int
141-
// vector
142-
double[] collect = collectResults[resultIndex];
143-
if (collect.length == collectResultSize[resultIndex]) {
144-
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
144+
if (!fAccess.isNA(fIter)) {
145+
// a factor is a 1-based int vector
146+
int resultIndex = fAccess.getInt(fIter) - 1;
147+
double[] collect = collectResults[resultIndex];
148+
if (collect.length == collectResultSize[resultIndex]) {
149+
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
150+
}
151+
collect[collectResultSize[resultIndex]++] = xAccess.getDouble(xIter);
145152
}
146-
collect[collectResultSize[resultIndex]++] = xAccess.getDouble(xIter);
147153
}
148154

149155
RStringVector[] resultNames = getSplitNames.getNames(x, fAccess, fIter, nLevels, collectResultSize);
@@ -160,13 +166,15 @@ protected RList split(RAbstractVector x, RAbstractIntVector f,
160166
// perform split
161167
while (xAccess.next(xIter)) {
162168
fAccess.nextWithWrap(fIter);
163-
int resultIndex = fAccess.getInt(fIter) - 1; // a factor is a 1-based int
164-
// vector
165-
int[] collect = collectResults[resultIndex];
166-
if (collect.length == collectResultSize[resultIndex]) {
167-
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
169+
if (!fAccess.isNA(fIter)) {
170+
// a factor is a 1-based int vector
171+
int resultIndex = fAccess.getInt(fIter) - 1;
172+
int[] collect = collectResults[resultIndex];
173+
if (collect.length == collectResultSize[resultIndex]) {
174+
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
175+
}
176+
collect[collectResultSize[resultIndex]++] = xAccess.getInt(xIter);
168177
}
169-
collect[collectResultSize[resultIndex]++] = xAccess.getInt(xIter);
170178
}
171179

172180
RStringVector[] resultNames = getSplitNames.getNames(x, fAccess, fIter, nLevels, collectResultSize);
@@ -183,13 +191,15 @@ protected RList split(RAbstractVector x, RAbstractIntVector f,
183191
// perform split
184192
while (xAccess.next(xIter)) {
185193
fAccess.nextWithWrap(fIter);
186-
int resultIndex = fAccess.getInt(fIter) - 1; // a factor is a 1-based int
187-
// vector
188-
Object[] collect = collectResults[resultIndex];
189-
if (collect.length == collectResultSize[resultIndex]) {
190-
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
194+
if (!fAccess.isNA(fIter)) {
195+
// a factor is a 1-based int vector
196+
int resultIndex = fAccess.getInt(fIter) - 1;
197+
Object[] collect = collectResults[resultIndex];
198+
if (collect.length == collectResultSize[resultIndex]) {
199+
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
200+
}
201+
collect[collectResultSize[resultIndex]++] = xAccess.getListElement(xIter);
191202
}
192-
collect[collectResultSize[resultIndex]++] = xAccess.getListElement(xIter);
193203
}
194204

195205
RStringVector[] resultNames = getSplitNames.getNames(x, fAccess, fIter, nLevels, collectResultSize);
@@ -206,13 +216,15 @@ protected RList split(RAbstractVector x, RAbstractIntVector f,
206216
// perform split
207217
while (xAccess.next(xIter)) {
208218
fAccess.nextWithWrap(fIter);
209-
int resultIndex = fAccess.getInt(fIter) - 1; // a factor is a 1-based int
210-
// vector
211-
byte[] collect = collectResults[resultIndex];
212-
if (collect.length == collectResultSize[resultIndex]) {
213-
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
219+
if (!fAccess.isNA(fIter)) {
220+
// a factor is a 1-based int vector
221+
int resultIndex = fAccess.getInt(fIter) - 1;
222+
byte[] collect = collectResults[resultIndex];
223+
if (collect.length == collectResultSize[resultIndex]) {
224+
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
225+
}
226+
collect[collectResultSize[resultIndex]++] = xAccess.getLogical(xIter);
214227
}
215-
collect[collectResultSize[resultIndex]++] = xAccess.getLogical(xIter);
216228
}
217229

218230
RStringVector[] resultNames = getSplitNames.getNames(x, fAccess, fIter, nLevels, collectResultSize);
@@ -229,13 +241,15 @@ protected RList split(RAbstractVector x, RAbstractIntVector f,
229241
// perform split
230242
while (xAccess.next(xIter)) {
231243
fAccess.nextWithWrap(fIter);
232-
int resultIndex = fAccess.getInt(fIter) - 1; // a factor is a 1-based int
233-
// vector
234-
byte[] collect = collectResults[resultIndex];
235-
if (collect.length == collectResultSize[resultIndex]) {
236-
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
244+
if (!fAccess.isNA(fIter)) {
245+
// a factor is a 1-based int vector
246+
int resultIndex = fAccess.getInt(fIter) - 1;
247+
byte[] collect = collectResults[resultIndex];
248+
if (collect.length == collectResultSize[resultIndex]) {
249+
collectResults[resultIndex] = collect = Arrays.copyOf(collect, collect.length * SCALE_FACTOR);
250+
}
251+
collect[collectResultSize[resultIndex]++] = xAccess.getRaw(xIter);
237252
}
238-
collect[collectResultSize[resultIndex]++] = xAccess.getRaw(xIter);
239253
}
240254

241255
RStringVector[] resultNames = getSplitNames.getNames(x, fAccess, fIter, nLevels, collectResultSize);

0 commit comments

Comments
 (0)