From 365d2ee915001b38fe955bf3920f1cb393557a2c Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Tue, 11 Oct 2016 10:17:48 +0200
Subject: [PATCH] do not allow bultins to return "null"

---
 .../com/oracle/truffle/r/nodes/builtin/base/CacheClass.java   | 2 +-
 .../oracle/truffle/r/nodes/builtin/base/PrintFunctions.java   | 2 +-
 .../oracle/truffle/r/nodes/builtin/base/ShortRowNames.java    | 4 ++++
 .../src/com/oracle/truffle/r/nodes/function/RCallNode.java    | 1 +
 4 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CacheClass.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CacheClass.java
index 2d78a5d73a..9c0d5bd0f0 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CacheClass.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CacheClass.java
@@ -42,6 +42,6 @@ public abstract class CacheClass extends RBuiltinNode {
     @Specialization
     protected RAbstractStringVector getClass(String cl, RAbstractStringVector ext) {
         RContext.getInstance().putS4Extends(cl, ext.materialize());
-        return null;
+        return ext;
     }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrintFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrintFunctions.java
index e998608271..40de6fe166 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrintFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrintFunctions.java
@@ -98,7 +98,7 @@ public class PrintFunctions {
             } else {
                 printDefault(frame, showFunction, digits, quote, naPrint, printGap, right, max, useSource, noOpt);
             }
-            return null;
+            return o;
         }
 
         protected boolean isS4(Object o) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java
index b057268ae0..e318c352f9 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java
@@ -76,6 +76,10 @@ public abstract class ShortRowNames extends RBuiltinNode {
             rowNames = type == 1 ? n : Math.abs(n);
         }
 
+        if (rowNames == null) {
+            return RNull.instance;
+        }
+
         return rowNames;
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
index de186c6978..2d93bf54c8 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
@@ -986,6 +986,7 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
         @Override
         public Object execute(VirtualFrame frame, RFunction currentFunction, RArgsValuesAndNames orderedArguments, S3Args s3Args) {
             Object result = builtin.executeBuiltin(frame, castArguments(frame, orderedArguments.getArguments()));
+            assert result != null : "builtins cannot return 'null': " + builtinDescriptor.getName();
             visibility.execute(frame, builtinDescriptor.getVisibility());
             return result;
         }
-- 
GitLab