From cdd931db2d12e7977216e4d8d98a731db8a9c39c Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Mon, 20 Apr 2015 17:06:58 -0700
Subject: [PATCH] cleanup after fix for serializing scalar strings

---
 .../truffle/r/nodes/access/ConstantNode.java  | 12 ++--------
 .../oracle/truffle/r/runtime/RDeparse.java    |  4 +---
 .../oracle/truffle/r/runtime/RSerialize.java  | 14 +++++------
 .../truffle/r/runtime/gnur/SEXPTYPE.java      | 24 ++++++-------------
 4 files changed, 17 insertions(+), 37 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ConstantNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ConstantNode.java
index ab19c1bd11..f320dab988 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ConstantNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ConstantNode.java
@@ -44,11 +44,7 @@ public abstract class ConstantNode extends RNode implements VisibilityController
     @TruffleBoundary
     public void deparse(RDeparse.State state) {
         if (!(this instanceof ConstantMissingNode)) {
-            Object val = getValue();
-            if (this instanceof ConstantStringScalarNode) {
-                val = new SEXPTYPE.FastRString((String) val);
-            }
-            RDeparse.deparse2buff(state, val);
+            RDeparse.deparse2buff(state, getValue());
         }
     }
 
@@ -62,11 +58,7 @@ public abstract class ConstantNode extends RNode implements VisibilityController
         if (this instanceof ConstantMissingNode) {
             state.setCar(RMissing.instance);
         } else {
-            Object val = getValue();
-            if (this instanceof ConstantStringScalarNode) {
-                val = new SEXPTYPE.FastRString((String) val);
-            }
-            state.setCar(val);
+            state.setCar(getValue());
         }
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RDeparse.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RDeparse.java
index 9b25f060d6..bc8a6d2ff2 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RDeparse.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RDeparse.java
@@ -742,7 +742,6 @@ public class RDeparse {
             case FASTR_DOUBLE:
             case FASTR_INT:
             case FASTR_BYTE:
-            case FASTR_STRING:
                 vecElement2buff(state, SEXPTYPE.convertFastRScalarType(type), obj);
                 break;
 
@@ -974,11 +973,10 @@ public class RDeparse {
 
     private static State vecElement2buff(State state, SEXPTYPE type, Object element) {
         switch (type) {
-            case FASTR_STRING:
             case STRSXP:
                 // TODO encoding
                 state.append('"');
-                String s = type == SEXPTYPE.STRSXP ? (String) element : ((SEXPTYPE.FastRString) element).value;
+                String s = (String) element;
                 for (int i = 0; i < s.length(); i++) {
                     char ch = s.charAt(i);
                     int charInt = ch;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java
index 5fcc530c9a..d87c1b8fe0 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java
@@ -22,7 +22,6 @@ import com.oracle.truffle.r.runtime.data.*;
 import com.oracle.truffle.r.runtime.data.RAttributes.RAttribute;
 import com.oracle.truffle.r.runtime.env.*;
 import com.oracle.truffle.r.runtime.gnur.*;
-import com.oracle.truffle.r.runtime.gnur.SEXPTYPE.FastRString;
 
 // Code loosely transcribed from GnuR serialize.c.
 
@@ -1021,13 +1020,13 @@ public class RSerialize {
                     return SEXPTYPE.INTSXP;
                 case FASTR_DOUBLE:
                     return SEXPTYPE.REALSXP;
-                case FASTR_STRING:
-                    return SEXPTYPE.STRSXP;
                 case FASTR_BYTE:
                     return SEXPTYPE.LGLSXP;
+                case FASTR_COMPLEX:
+                    return SEXPTYPE.CPLXSXP;
                 case FASTR_DATAFRAME:
+                case FASTR_FACTOR:
                     return SEXPTYPE.VECSXP;
-
                 default:
                     return type;
             }
@@ -1208,10 +1207,11 @@ public class RSerialize {
                         break;
                     }
 
-                    case FASTR_STRING: {
-                        String value = ((FastRString) obj).value;
+                    case FASTR_COMPLEX: {
+                        RComplex value = (RComplex) obj;
                         stream.writeInt(1);
-                        writeItem(value);
+                        stream.writeDouble(value.getRealPart());
+                        stream.writeDouble(value.getImaginaryPart());
                         break;
                     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/gnur/SEXPTYPE.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/gnur/SEXPTYPE.java
index 7c4c7e3af1..99349adc40 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/gnur/SEXPTYPE.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/gnur/SEXPTYPE.java
@@ -69,14 +69,18 @@ public enum SEXPTYPE {
     ATTRLANGSXP(240),
     ATTRLISTSXP(239),
 
-    // FastR scalar variants of GnuR vector types
-    // TODO remove these
+    /*
+     * FastR scalar variants of GnuR vector types (other than String) These could be removed in a
+     * similar way to String, but there is no pressing need.
+     */
     FASTR_DOUBLE(300, Double.class),
     FASTR_INT(301, Integer.class),
     FASTR_BYTE(302, Byte.class),
-    FASTR_STRING(303, FastRString.class),
+    FASTR_COMPLEX(303, RComplex.class),
+    // FastR special "vector" types
     FASTR_DATAFRAME(304, RDataFrame.class),
     FASTR_FACTOR(305, RFactor.class),
+    // very special case
     FASTR_SOURCESECTION(306, SourceSection.class);
 
     public final int code;
@@ -125,18 +129,6 @@ public enum SEXPTYPE {
         throw RInternalError.shouldNotReachHere(fastRClass.getName());
     }
 
-    /**
-     * A wrapper class that allows {@link RDeparse} to distinguish {@link SEXPTYPE#CHARSXP} and
-     * {@link SEXPTYPE#FASTR_STRING}.
-     */
-    public static class FastRString {
-        public final String value;
-
-        public FastRString(String value) {
-            this.value = value;
-        }
-    }
-
     public static SEXPTYPE convertFastRScalarType(SEXPTYPE type) {
         switch (type) {
             case FASTR_DOUBLE:
@@ -145,8 +137,6 @@ public enum SEXPTYPE {
                 return SEXPTYPE.INTSXP;
             case FASTR_BYTE:
                 return SEXPTYPE.LGLSXP;
-            case FASTR_STRING:
-                return type;
             default:
                 assert false;
                 return null;
-- 
GitLab