diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/R/fastrGraphics.R b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/R/fastrGraphics.R index f1d333aa7dfd2e9030bf4bc2c8136ee0b2e0992e..700bab02fd740f82684336292e5cb73a9f3c2006 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/R/fastrGraphics.R +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/R/fastrGraphics.R @@ -25,29 +25,29 @@ # prints a warning message instructing the user to use grid/lattice/ggplot2 instead eval(expression({ - if (.fastr.option('IgnoreGraphicsCalls')) { - # we force the arguments to be evaluated, but otherwise do nothing - graphicsWarning <- function(name) function(...) { list(...); invisible(NULL); } - } else { - graphicsWarning <- function(name) { - # lookup original function and fetch signature - fun <- tryCatch(get(name, environment()), error=function(x) NULL) - if(!is.null(fun)) { - sig <- formals(fun) - } else { - sig <- NULL - } + graphicsWarning <- function(name) { + # lookup original function and fetch signature + fun <- tryCatch(get(name, environment()), error=function(x) NULL) + if(!is.null(fun)) { + sig <- formals(fun) + } else { + sig <- NULL + } + if (.fastr.option('IgnoreGraphicsCalls')) { + # we evaluate the arguments to simulate the function effects + replacementFun <- function(...) { if (is.null(sig)) list(...) else get(names(sig)); invisible(NULL); } + } else { replacementFun <- function(...) { warning(paste0(name, " not supported.", " Note: FastR does not support graphics package and most of its functions. Please use grid package or grid based packages like lattice instead.")) NULL } + } - if(!is.null(sig)) { - formals(replacementFun) <- sig - } - return(replacementFun) + if(!is.null(sig)) { + formals(replacementFun) <- sig } + return(replacementFun) } plot.default <- function (x, y = NULL, type = "p", xlim = NULL, ylim = NULL, diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cdist.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cdist.java index 1d88093b56227120073c643e15d546084b029479..72f4dd44d64b5c665a62ba0acd643d825b031e13 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cdist.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cdist.java @@ -26,6 +26,7 @@ import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAt import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetClassAttributeNode; import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode; import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.RError.Message; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RDoubleVector; @@ -58,6 +59,10 @@ public abstract class Cdist extends RExternalBuiltinNode.Arg4 { @Cached("create()") SetAttributeNode setAttrNode, @Cached("create()") SetClassAttributeNode setClassAttrNode, @Cached("create()") GetDimAttributeNode getDimNode) { + if (!getDimNode.isMatrix(x)) { + // Note: otherwise array index out of bounds + throw error(Message.MUST_BE_SQUARE_MATRIX, "x"); + } int nr = getDimNode.nrows(x); int nc = getDimNode.ncols(x); int n = nr * (nr - 1) / 2; /* avoid int overflow for N ~ 50,000 */ diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cutree.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cutree.java index 8c0052139f253fd4233b127aeefe7f0cedaeb1df..2aaa7620ca0545411d051f3674c42dce572a4c46 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cutree.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cutree.java @@ -17,6 +17,7 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode; import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode; +import com.oracle.truffle.r.runtime.RError.Message; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; @@ -50,6 +51,11 @@ public abstract class Cutree extends RExternalBuiltinNode.Arg2 { boolean foundJ; int n = getDimNode.nrows(merge) + 1; + if (!getDimNode.isSquareMatrix(merge)) { + // Note: otherwise array index out of bounds + throw error(Message.MUST_BE_SQUARE_MATRIX, "x"); + } + /* * The C code uses 1-based indices for the next three arrays and so set the int * value * behind the actual start of the array. To keep the logic equivalent, we call adj(k) on the diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DoubleCentre.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DoubleCentre.java index 6a130dbfd843a22dff850fd08eb89f2a487ebc62..ae906e10a4f0103025a3da2aef20662aa5da1a77 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DoubleCentre.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DoubleCentre.java @@ -34,7 +34,7 @@ public abstract class DoubleCentre extends RExternalBuiltinNode.Arg1 { @Cached("createNonShared(a)") VectorReuse reuse, @Cached("create()") GetDimAttributeNode getDimNode) { int n = getDimNode.nrows(a); - if (!getDimNode.isMatrix(a) || n != a.getLength() / n) { + if (!getDimNode.isSquareMatrix(a)) { // Note: otherwise array index out of bounds throw error(Message.MUST_BE_SQUARE_MATRIX, "x"); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java index 2e6c5c264963c3b02f1eb8209d60905983f46399..bec22d65269c1232586d6a49194c628a18d0ba53 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java @@ -662,6 +662,14 @@ public final class SpecialAttributesFunctions { return nullDimsProfile.profile(dims == null) ? false : dims.getLength() == 2; } + public final boolean isSquareMatrix(RAbstractVector vector) { + RIntVector dims = (RIntVector) execute(vector); + if (nullDimsProfile.profile(dims == null) || dims.getLength() < 2) { + return false; + } + return dims.getDataAt(0) == dims.getDataAt(1); + } + @Specialization(insertBefore = "getAttrFromAttributable") protected Object getScalarVectorDims(@SuppressWarnings("unused") RScalarVector x) { return null;