From 85a25ab1b3bb210df9b506c149409c66f139fa86 Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Mon, 10 Nov 2014 20:25:20 -0800
Subject: [PATCH] fix WriteTable for RFactor

---
 .../r/nodes/builtin/utils/WriteTable.java     | 19 ++++++-------------
 1 file changed, 6 insertions(+), 13 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/utils/WriteTable.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/utils/WriteTable.java
index 362b9cb92c..b842fb3814 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/utils/WriteTable.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/utils/WriteTable.java
@@ -34,7 +34,7 @@ public class WriteTable {
             /* handle factors internally, check integrity */
             RStringVector[] levels = new RStringVector[nc];
             for (int j = 0; j < nc; j++) {
-                RAbstractVector xj = (RAbstractVector) x.getDataAtAsObject(j);
+                RAbstractContainer xj = (RAbstractContainer) x.getDataAtAsObject(j);
                 if (xj.getLength() != nr) {
                     throw new IllegalArgumentException("corrupt data frame -- length of column " + (j + 1) + " does not not match nrows");
                 }
@@ -51,23 +51,16 @@ public class WriteTable {
                     os.write(csep.getBytes());
                 }
                 for (int j = 0; j < nc; j++) {
-                    RAbstractVector xj = (RAbstractVector) x.getDataAtAsObject(j);
+                    RAbstractContainer xj = (RAbstractContainer) x.getDataAtAsObject(j);
                     if (j > 0)
                         os.write(csep.getBytes());
                     if (isna(xj, i)) {
                         tmp = cna;
                     } else {
                         if (levels[j] != null) {
-                            /*
-                             * We do not assume factors have integer levels, although they should.
-                             */
-                            if (xj instanceof RIntVector || xj instanceof RDoubleVector) {
-                                tmp = encodeElement2(levels[j], (int) xj.getDataAtAsObject(i) - 1, quoteCol[j], qmethod, cdec);
-                            } else {
-                                throw new IllegalArgumentException("column " + (j + 1) + " claims to be a factor but does not have numeric codes");
-                            }
+                            tmp = encodeElement2(levels[j], (int) xj.getDataAtAsObject(i) - 1, quoteCol[j], qmethod, cdec);
                         } else {
-                            tmp = encodeElement2(xj, i, quoteCol[j], qmethod, cdec);
+                            tmp = encodeElement2((RAbstractVector) xj, i, quoteCol[j], qmethod, cdec);
                         }
                         /* if(cdec) change_dec(tmp, cdec, TYPEOF(xj)); */
                     }
@@ -138,7 +131,7 @@ public class WriteTable {
         return encodeElement(x, indx, quote ? '"' : 0, cdec);
     }
 
-    private static boolean isna(RAbstractVector x, int indx) {
+    private static boolean isna(RAbstractContainer x, int indx) {
         if (x instanceof RLogicalVector) {
             return RRuntime.isNA(((RLogicalVector) x).getDataAt(indx));
         } else if (x instanceof RDoubleVector) {
@@ -161,7 +154,7 @@ public class WriteTable {
         throw RInternalError.unimplemented();
     }
 
-    private static boolean isFactor(RAbstractVector v) {
+    private static boolean isFactor(RAbstractContainer v) {
         for (int i = 0; i < v.getClassHierarchy().getLength(); i++) {
             if (v.getClassHierarchy().getDataAt(i).equals("factor")) {
                 return true;
-- 
GitLab