diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java index 03064e98e07f76cd362a3c1d5cec958b576ace0d..18a0f13f97d07574a79d6e10bc9c150a2842e851 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java @@ -292,6 +292,16 @@ public class BasePackage extends RBuiltinPackage { add(Complex.class, ComplexNodeGen::create); add(CompileFunctions.CompilePKGS.class, CompileFunctionsFactory.CompilePKGSNodeGen::create); add(CompileFunctions.EnableJIT.class, CompileFunctionsFactory.EnableJITNodeGen::create); + add(CompileFunctions.MkCode.class, CompileFunctionsFactory.MkCodeNodeGen::create); + add(CompileFunctions.BcClose.class, CompileFunctionsFactory.BcCloseNodeGen::create); + add(CompileFunctions.IsBuiltinInternal.class, CompileFunctionsFactory.IsBuiltinInternalNodeGen::create); + add(CompileFunctions.Disassemble.class, CompileFunctionsFactory.DisassembleNodeGen::create); + add(CompileFunctions.BcVersion.class, CompileFunctionsFactory.BcVersionNodeGen::create); + add(CompileFunctions.LoadFromFile.class, CompileFunctionsFactory.LoadFromFileNodeGen::create); + add(CompileFunctions.SaveToFile.class, CompileFunctionsFactory.SaveToFileNodeGen::create); + add(CompileFunctions.Growconst.class, CompileFunctionsFactory.GrowconstNodeGen::create); + add(CompileFunctions.Putconst.class, CompileFunctionsFactory.PutconstNodeGen::create); + add(CompileFunctions.Getconst.class, CompileFunctionsFactory.GetconstNodeGen::create); add(ConditionFunctions.AddCondHands.class, ConditionFunctionsFactory.AddCondHandsNodeGen::create); add(ConditionFunctions.AddRestart.class, ConditionFunctionsFactory.AddRestartNodeGen::create); add(ConditionFunctions.DfltStop.class, ConditionFunctionsFactory.DfltStopNodeGen::create); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CompileFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CompileFunctions.java index 515a446f104eff8d27cd9562b20f4507c3a0e4ba..383554e3ac42e46081f99ee0ccdb061ce7a5d32a 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CompileFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CompileFunctions.java @@ -22,12 +22,18 @@ */ package com.oracle.truffle.r.nodes.builtin.base; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.toBoolean; import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; +import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.builtins.RBuiltin; +import com.oracle.truffle.r.runtime.data.RList; +import com.oracle.truffle.r.runtime.data.RNull; +import com.oracle.truffle.r.runtime.data.model.RAbstractVector; /** * FastR does not byte-compile, obviously, but these keep the package installation code happy. @@ -61,4 +67,179 @@ public class CompileFunctions { return 0; } } + + @RBuiltin(name = "mkCode", kind = INTERNAL, parameterNames = {"bytes", "consts"}, behavior = PURE) + public abstract static class MkCode extends RBuiltinNode.Arg2 { + + static { + Casts casts = new Casts(MkCode.class); + casts.arg("bytes"); // Looks like an int vector in R_registerBC + casts.arg("consts"); // precise type not found yet + } + + @Specialization + protected Object mkCode(Object bytes, Object consts) { + return RNull.instance; + // RIntVector code = RDataFactory.createEmptyIntVector(); + // return RDataFactory.createPairList(code, consts, RNull.instance, SEXPTYPE.BCODESXP); + } + } + + @RBuiltin(name = "bcClose", kind = INTERNAL, parameterNames = {"forms", "body", "env"}, behavior = PURE) + public abstract static class BcClose extends RBuiltinNode.Arg3 { + + static { + Casts casts = new Casts(BcClose.class); + casts.arg("forms"); + casts.arg("body"); + casts.arg("env"); + } + + @Specialization + protected Object bcClose(@SuppressWarnings("unused") Object forms, Object body, @SuppressWarnings("unused") Object env) { + return RNull.instance; // Body + } + } + + @RBuiltin(name = "is.builtin.internal", kind = INTERNAL, parameterNames = {"symbol"}, behavior = PURE) + public abstract static class IsBuiltinInternal extends RBuiltinNode.Arg1 { + + static { + Casts casts = new Casts(IsBuiltinInternal.class); + casts.arg("symbol").asStringVector().findFirst(); + } + + @Specialization + protected boolean isBuiltinInternal(@SuppressWarnings("unused") String symbol) { + return false; + } + } + + @RBuiltin(name = "disassemble", kind = INTERNAL, parameterNames = {"symbol"}, behavior = PURE) + public abstract static class Disassemble extends RBuiltinNode.Arg1 { + + static { + Casts casts = new Casts(Disassemble.class); + casts.arg("symbol").asStringVector().findFirst(); + } + + @Specialization + protected boolean disassemble(@SuppressWarnings("unused") String symbol) { + return false; + } + } + + @RBuiltin(name = "bcVersion", kind = INTERNAL, parameterNames = {}, behavior = PURE) + public abstract static class BcVersion extends RBuiltinNode.Arg0 { + + static { + Casts casts = new Casts(BcVersion.class); + } + + @Specialization + protected int bcVersion() { + return 10; // R_bcVersion in eval.c + } + } + + @RBuiltin(name = "load.from.file", kind = INTERNAL, parameterNames = {"file"}, behavior = PURE) + public abstract static class LoadFromFile extends RBuiltinNode.Arg1 { + + static { + Casts casts = new Casts(LoadFromFile.class); + casts.arg("file").asStringVector().findFirst(); + } + + @Specialization + protected Object loadFromFile(@SuppressWarnings("unused") String file) { + return RNull.instance; + } + } + + @RBuiltin(name = "save.to.file", kind = INTERNAL, parameterNames = {"content", "file", "ascii"}, behavior = PURE) + public abstract static class SaveToFile extends RBuiltinNode.Arg3 { + + static { + Casts casts = new Casts(SaveToFile.class); + // 'content' arg traced till "NewMakeLists" where it can be anything except WEAKREFSXP + casts.arg("content"); + casts.arg("file").asStringVector().findFirst(); + casts.arg("ascii").asLogicalVector().findFirst().map(toBoolean()); + } + + @Specialization + protected Object saveToFile(@SuppressWarnings("unused") Object content, @SuppressWarnings("unused") String file, @SuppressWarnings("unused") boolean ascii) { + return RNull.instance; + } + } + + @RBuiltin(name = "growconst", kind = INTERNAL, parameterNames = {"constBuf"}, behavior = PURE) + public abstract static class Growconst extends RBuiltinNode.Arg1 { + + static { + Casts casts = new Casts(Growconst.class); + // RList required in do_growconst() in eval.c + casts.arg("constBuf").mustNotBeMissing().mustNotBeNull().mustBe(RList.class); + } + + @Specialization + protected RList growconst(RList constBuf) { + int n = constBuf.getLength(); + RList ret = (RList) constBuf.copyResized(n << 1, true); + return ret; + } + } + + @RBuiltin(name = "putconst", kind = INTERNAL, parameterNames = {"constBuf", "constCount", "x"}, behavior = PURE) + public abstract static class Putconst extends RBuiltinNode.Arg3 { + + @Child Identical identical = Identical.create(); + + static { + Casts casts = new Casts(Putconst.class); + // RList required in do_putconst() in eval.c + casts.arg("constBuf").mustNotBeMissing().mustNotBeNull().mustBe(RList.class); + casts.arg("constCount").mustNotBeMissing().mustNotBeNull().asIntegerVector().findFirst(); + casts.arg("x"); + } + + @Specialization + protected int putconst(RList constBuf, int constCount, Object x) { + // constCount <= constBuf length + // if x is present in constBuf within <0,constCindexount) return its index otherwise set + // x as element of constBuf at constCount index and return constCount + if (constCount < 0 || constCount > constBuf.getLength()) { + throw RError.error(this, RError.Message.BAD_CONSTANT_COUNT); + } + for (int i = 0; i < constCount; i++) { + Object y = constBuf.getDataAt(i); + if (identical.executeByte(x, y, true, true, true, true, true, false) == RRuntime.LOGICAL_TRUE) { + return i; + } + } + constBuf.setDataAt(constCount, x); + return constCount; + } + } + + @RBuiltin(name = "getconst", kind = INTERNAL, parameterNames = {"constBuf", "n"}, behavior = PURE) + public abstract static class Getconst extends RBuiltinNode.Arg2 { + + static { + Casts casts = new Casts(Getconst.class); + casts.arg("constBuf").mustNotBeMissing().mustNotBeNull().mustBe(RList.class); + casts.arg("n").mustNotBeMissing().mustNotBeNull().asIntegerVector().findFirst(); + } + + @Specialization + protected RList getconst(RAbstractVector constBuf, int n) { + // Return new vector of size n with content copied from constBuf + if (n < 0 || n > constBuf.getLength()) { + throw RError.error(this, RError.Message.BAD_CONSTANT_COUNT); + } + RList ret = (RList) constBuf.copyResized(n, false); + return ret; + } + } + } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java index fdb7c6ef17ab8df7029d64ab24eb218d71d091c0..167eb0774866c35ff324a14ec2300ddafd85d471 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java @@ -349,8 +349,8 @@ public abstract class InternalNode extends OperatorNode { "rcauchy", "rf", "rgamma", "rlnorm", "rlogis", "rnbinom", "rnbinom_mu", "rnchisq", "rnorm", "runif", "rweibull", "rwilcox", "rhyper", "format.info", "grepRaw", "regexec", "adist", "aregexec", "chartr", "packBits", "strtrim", "eapply", "machine", "save", "dump", "prmatrix", "gcinfo", "gctorture", "gctorture2", "memory.profile", "sys.on.exit", "builtins", "bodyCode", "rapply", "inspect", - "mem.limits", "capabilitiesX11", "Cstack_info", "file.choose", "polyroot", "mkCode", "bcClose", "is.builtin.internal", "disassemble", "bcVersion", "load.from.file", "save.to.file", - "growconst", "putconst", "getconst", "setNumMathThreads", "setMaxNumMathThreads", "isatty", "isIncomplete", "pipe", "fifo", "unz", "truncate", "rawConnection", + "mem.limits", "capabilitiesX11", "Cstack_info", "file.choose", "polyroot", + "setNumMathThreads", "setMaxNumMathThreads", "isatty", "isIncomplete", "pipe", "fifo", "unz", "truncate", "rawConnection", "rawConnectionValue", "sockSelect", "gzcon", "memCompress", "memDecompress", "mkUnbound", "env.profile", "setSessionTimeLimit", "icuSetCollate", "findInterval", "rowsum_df", "La_qr_cmplx", "La_rs_cmplx", "La_rg_cmplx", "La_rs_cmplx", "La_dlange", "La_dgecon", "La_dtrcon", "La_zgecon", "La_ztrcon", "La_solve_cmplx", "La_chol2inv", "qr_qy_real", "qr_coef_cmplx", "qr_qy_cmpl", "La_svd", "La_svd_cmplx"); diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java index d34706d3fad9ee6c11f3b072dc8b8a9360388a7e..867137f043cb6ba8f26a624984e2e5d51f3bb838 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java @@ -908,7 +908,8 @@ public final class RError extends RuntimeException implements TruffleException { INVALID_TYPE("invalid type (%s) for '%s' (must be a %s)"), NOT_A_LIST_OF_SOCKETS("not a list of sockets"), NOT_A_SOCKET_CONNECTION("not a socket connection"), - UNEXPECTED_OBJ_IN_SIZE("Unexpected object type %s while calculating estimated object size."); + UNEXPECTED_OBJ_IN_SIZE("Unexpected object type %s while calculating estimated object size."), + BAD_CONSTANT_COUNT("bad constant count"); public final String message; final boolean hasArgs; diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index 6a51fbf92da9510b58391a9f04ddfddd074e79d9..cdac305db3f592864225726863456154b6487a20 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -10144,8 +10144,8 @@ character(0) #argv <- structure(list(path = 'myTst'), .Names = 'path');do.call('basename', argv) [1] "myTst" -##com.oracle.truffle.r.test.builtins.TestBuiltin_bcVersion.testbcVersion1#Ignored.Unimplemented# -# .Internal(bcVersion()) +##com.oracle.truffle.r.test.builtins.TestBuiltin_bcVersion.testbcVersion1# +#.Internal(bcVersion()) [1] 10 ##com.oracle.truffle.r.test.builtins.TestBuiltin_besselI.testbesselI1#Ignored.Unimplemented# @@ -27053,13 +27053,13 @@ NULL #argv <- list('FALSE', '', FALSE); .Internal(getSymbolInfo(argv[[1]], argv[[2]], argv[[3]])) NULL -##com.oracle.truffle.r.test.builtins.TestBuiltin_getconst.testgetconst1#Ignored.Unimplemented# +##com.oracle.truffle.r.test.builtins.TestBuiltin_getconst.testgetconst1# #argv <- list(list(list(), NULL), 1); .Internal(getconst(argv[[1]], argv[[2]])) [[1]] list() -##com.oracle.truffle.r.test.builtins.TestBuiltin_getconst.testgetconst2#Ignored.Unimplemented# +##com.oracle.truffle.r.test.builtins.TestBuiltin_getconst.testgetconst2# #argv <- list(list(FALSE), 1); .Internal(getconst(argv[[1]], argv[[2]])) [[1]] [1] FALSE @@ -27848,7 +27848,7 @@ logical(0) #argv <- list('\n', '\nqr(x, ...)\nqrR(qr, complete=FALSE, backPermute=TRUE)\n', FALSE, FALSE, FALSE, TRUE, FALSE, FALSE); .Internal(grepl(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]], argv[[8]])) [1] TRUE -##com.oracle.truffle.r.test.builtins.TestBuiltin_growconst.testgrowconst1#Ignored.Unimplemented# +##com.oracle.truffle.r.test.builtins.TestBuiltin_growconst.testgrowconst1# #argv <- list(list(list())); .Internal(growconst(argv[[1]])) [[1]] list() @@ -48367,11 +48367,11 @@ Error: only atomic vectors can be sorted #argv <- list(FALSE); .Internal(pushBackLength(argv[[1]])) [1] 0 -##com.oracle.truffle.r.test.builtins.TestBuiltin_putconst.testputconst1#Ignored.Unimplemented# +##com.oracle.truffle.r.test.builtins.TestBuiltin_putconst.testputconst1# #argv <- list(list(NULL), 0, NULL); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]])) [1] 0 -##com.oracle.truffle.r.test.builtins.TestBuiltin_putconst.testputconst2#Ignored.Unimplemented# +##com.oracle.truffle.r.test.builtins.TestBuiltin_putconst.testputconst2# #argv <- list(list(list(), NULL), 1, list()); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]])) [1] 0 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_bcVersion.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_bcVersion.java index a3953145225a1095d7734e6c9ccb5df39199c2bd..04480ef508d2724d65161009334285d61fcfe1a6 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_bcVersion.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_bcVersion.java @@ -19,7 +19,6 @@ public class TestBuiltin_bcVersion extends TestBase { @Test public void testbcVersion1() { - // FIXME RInternalError: not implemented: .Internal bcVersion - assertEval(Ignored.Unimplemented, " .Internal(bcVersion())"); + assertEval(".Internal(bcVersion())"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_getconst.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_getconst.java index 4592ad622fd9a31864d8874855b406142d7d568e..18a308c595efb50b940a64a7418ab617786d7545 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_getconst.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_getconst.java @@ -19,13 +19,11 @@ public class TestBuiltin_getconst extends TestBase { @Test public void testgetconst1() { - // FIXME not implemented: .Internal getconst - assertEval(Ignored.Unimplemented, "argv <- list(list(list(), NULL), 1); .Internal(getconst(argv[[1]], argv[[2]]))"); + assertEval("argv <- list(list(list(), NULL), 1); .Internal(getconst(argv[[1]], argv[[2]]))"); } @Test public void testgetconst2() { - // FIXME not implemented: .Internal getconst - assertEval(Ignored.Unimplemented, "argv <- list(list(FALSE), 1); .Internal(getconst(argv[[1]], argv[[2]]))"); + assertEval("argv <- list(list(FALSE), 1); .Internal(getconst(argv[[1]], argv[[2]]))"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_growconst.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_growconst.java index f2fae494fcdb53f6727283abf79547d00d35dfbe..0b89a68138bd79e8ba3fc1b5635ed1a4cc9df129 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_growconst.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_growconst.java @@ -19,7 +19,6 @@ public class TestBuiltin_growconst extends TestBase { @Test public void testgrowconst1() { - // FIXME RInternalError: not implemented: .Internal growconst - assertEval(Ignored.Unimplemented, "argv <- list(list(list())); .Internal(growconst(argv[[1]]))"); + assertEval("argv <- list(list(list())); .Internal(growconst(argv[[1]]))"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_putconst.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_putconst.java index c5167e42ce7b1a90ee62c8221a7d9eb1e8f8a028..26d619d3bad4a67ce950c39db5c53b9f86b87c0c 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_putconst.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_putconst.java @@ -19,13 +19,11 @@ public class TestBuiltin_putconst extends TestBase { @Test public void testputconst1() { - // FIXME RInternalError: not implemented: .Internal putconst - assertEval(Ignored.Unimplemented, "argv <- list(list(NULL), 0, NULL); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]]))"); + assertEval("argv <- list(list(NULL), 0, NULL); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]]))"); } @Test public void testputconst2() { - // FIXME RInternalError: not implemented: .Internal putconst - assertEval(Ignored.Unimplemented, "argv <- list(list(list(), NULL), 1, list()); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]]))"); + assertEval("argv <- list(list(list(), NULL), 1, list()); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]]))"); } }