Skip to content

Commit 796805e

Browse files
committed
deparse closures without forcing coercion
1 parent 825fe3f commit 796805e

File tree

8 files changed

+707
-457
lines changed

8 files changed

+707
-457
lines changed

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RDeparse.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@
5858
import com.oracle.truffle.r.runtime.data.RS4Object;
5959
import com.oracle.truffle.r.runtime.data.RStringVector;
6060
import com.oracle.truffle.r.runtime.data.RSymbol;
61+
import com.oracle.truffle.r.runtime.data.closures.RClosure;
62+
import com.oracle.truffle.r.runtime.data.closures.RToComplexVectorClosure;
63+
import com.oracle.truffle.r.runtime.data.closures.RToDoubleVectorClosure;
64+
import com.oracle.truffle.r.runtime.data.closures.RToIntVectorClosure;
65+
import com.oracle.truffle.r.runtime.data.closures.RToStringVectorClosure;
6166
import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector;
6267
import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
6368
import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
@@ -1001,8 +1006,12 @@ private void appendVector(RAbstractAtomicVector vec) {
10011006
if (sequence != null) {
10021007
append(RRuntime.intToStringNoCheck(sequence.getStart())).append(':').append(RRuntime.intToStringNoCheck(sequence.getEnd()));
10031008
} else {
1009+
if (vec instanceof RClosure) {
1010+
append(closureToCoercionFunction((RClosure) vec));
1011+
}
10041012
// TODO COMPAT?
10051013
append("c(");
1014+
10061015
for (int i = 0; i < len; i++) {
10071016
RStringVector names = vec.getNames();
10081017
if (names != null) {
@@ -1017,19 +1026,41 @@ private void appendVector(RAbstractAtomicVector vec) {
10171026
append(" = ");
10181027
}
10191028
}
1020-
vecElement2buff(vec.getDataAtAsObject(i), false);
1029+
Object elem;
1030+
if (vec instanceof RClosure) {
1031+
elem = ((RClosure) vec).getDelegateDataAt(i);
1032+
} else {
1033+
elem = vec.getDataAtAsObject(i);
1034+
}
1035+
vecElement2buff(elem, false);
10211036
if (i < (len - 1)) {
10221037
append(", ");
10231038
}
10241039
lbreak = listLinebreak(lbreak);
10251040
}
10261041
append(')');
1042+
if (vec instanceof RClosure) {
1043+
append(")");
1044+
}
10271045
}
10281046
}
10291047
}
10301048

1049+
private static String closureToCoercionFunction(RClosure vec) {
1050+
if (vec instanceof RToComplexVectorClosure) {
1051+
return "as.complex(";
1052+
} else if (vec instanceof RToDoubleVectorClosure) {
1053+
return "as.double(";
1054+
} else if (vec instanceof RToIntVectorClosure) {
1055+
return "as.integer(";
1056+
} else if (vec instanceof RToStringVectorClosure) {
1057+
return "as.character(";
1058+
}
1059+
throw RInternalError.shouldNotReachHere("unhandled closure type " + vec.getClass().getSimpleName());
1060+
}
1061+
10311062
private static RIntSequence asIntSequence(RAbstractVector vec) {
1032-
if (!(vec instanceof RAbstractIntVector)) {
1063+
if (!(vec instanceof RAbstractIntVector) || vec instanceof RToIntVectorClosure) {
10331064
return null;
10341065
}
10351066
RAbstractIntVector intVec = (RAbstractIntVector) vec;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 3 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 3 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 3 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*/
23+
package com.oracle.truffle.r.runtime.data.closures;
24+
25+
import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
26+
27+
public interface RClosure {
28+
Object getDelegateDataAt(int idx);
29+
30+
RAbstractVector getDelegate();
31+
}

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToComplexVectorClosure.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromComplexAccess;
3636
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
3737

38-
public class RToComplexVectorClosure extends RAbstractComplexVector {
38+
public class RToComplexVectorClosure extends RAbstractComplexVector implements RClosure {
3939

4040
protected final boolean keepAttributes;
4141
private final RAbstractVector vector;
@@ -72,6 +72,11 @@ public Object getInternalStore() {
7272
return vector.getInternalStore();
7373
}
7474

75+
@Override
76+
public RAbstractVector getDelegate() {
77+
return vector;
78+
}
79+
7580
@Override
7681
public int getLength() {
7782
return vector.getLength();
@@ -99,6 +104,11 @@ public RComplex getDataAt(int index) {
99104
return spa.getComplex(spa.randomAccess(v), index);
100105
}
101106

107+
@Override
108+
public Object getDelegateDataAt(int index) {
109+
return vector.getDataAtAsObject(index);
110+
}
111+
102112
@Override
103113
public VectorAccess access() {
104114
return new FastPathAccess(this, vector.access());

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToDoubleVectorClosure.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromDoubleAccess;
3434
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
3535

36-
public class RToDoubleVectorClosure extends RAbstractDoubleVector {
36+
public class RToDoubleVectorClosure extends RAbstractDoubleVector implements RClosure {
3737

3838
protected final boolean keepAttributes;
3939
private final RAbstractVector vector;
@@ -62,6 +62,11 @@ public Object getInternalStore() {
6262
return vector.getInternalStore();
6363
}
6464

65+
@Override
66+
public RAbstractVector getDelegate() {
67+
return vector;
68+
}
69+
6570
@Override
6671
public int getLength() {
6772
return vector.getLength();
@@ -88,6 +93,11 @@ public double getDataAt(int index) {
8893
return spa.getDouble(spa.randomAccess(vector), index);
8994
}
9095

96+
@Override
97+
public Object getDelegateDataAt(int index) {
98+
return vector.getDataAtAsObject(index);
99+
}
100+
91101
@CompilerDirectives.TruffleBoundary
92102
protected void copyAttributes(RIntVector materialized) {
93103
if (keepAttributes) {

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToIntVectorClosure.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromIntAccess;
3434
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
3535

36-
public class RToIntVectorClosure extends RAbstractIntVector {
36+
public class RToIntVectorClosure extends RAbstractIntVector implements RClosure {
3737

3838
protected final boolean keepAttributes;
3939
private final RAbstractVector vector;
@@ -70,6 +70,11 @@ public Object getInternalStore() {
7070
return vector.getInternalStore();
7171
}
7272

73+
@Override
74+
public RAbstractVector getDelegate() {
75+
return vector;
76+
}
77+
7378
@Override
7479
public int getLength() {
7580
return vector.getLength();
@@ -97,6 +102,11 @@ public int getDataAt(int index) {
97102
return spa.getInt(spa.randomAccess(v), index);
98103
}
99104

105+
@Override
106+
public Object getDelegateDataAt(int index) {
107+
return vector.getDataAtAsObject(index);
108+
}
109+
100110
@Override
101111
public VectorAccess access() {
102112
return new FastPathAccess(this, vector.access());

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToStringVectorClosure.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromStringAccess;
3939
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
4040

41-
public class RToStringVectorClosure extends RAbstractStringVector {
41+
public class RToStringVectorClosure extends RAbstractStringVector implements RClosure {
4242
protected final boolean keepAttributes;
4343
protected final RAbstractVector vector;
4444

@@ -73,6 +73,7 @@ public Object getInternalStore() {
7373
return vector.getInternalStore();
7474
}
7575

76+
@Override
7677
public RAbstractVector getDelegate() {
7778
return vector;
7879
}
@@ -103,6 +104,11 @@ public String getDataAt(int index) {
103104
return spa.getString(spa.randomAccess(vector), index);
104105
}
105106

107+
@Override
108+
public Object getDelegateDataAt(int index) {
109+
return vector.getDataAtAsObject(index);
110+
}
111+
106112
@Override
107113
public VectorAccess access() {
108114
return new FastPathAccess(this, vector.access());

0 commit comments

Comments
 (0)