Skip to content

Commit e3aa848

Browse files
committed
Replace RToListVectorClosure with storage strategy for RList
1 parent a083f9b commit e3aa848

File tree

4 files changed

+72
-209
lines changed

4 files changed

+72
-209
lines changed

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.oracle.truffle.api.library.ExportMessage.Ignore;
3434
import com.oracle.truffle.r.runtime.RRuntime;
3535
import com.oracle.truffle.r.runtime.RType;
36+
import com.oracle.truffle.r.runtime.data.closures.RClosures;
3637
import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
3738
import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
3839
import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
@@ -75,6 +76,16 @@ public static RList createForeignWrapper(TruffleObject obj, int size) {
7576
return new RList(new RListForeignObjData(obj), size);
7677
}
7778

79+
public static RList createClosure(RAbstractVector delegate, boolean keepAttrs) {
80+
RList result = new RList(VectorDataClosure.fromVector(delegate, RType.List), delegate.getLength());
81+
if (keepAttrs) {
82+
result.initAttributes(delegate.getAttributes());
83+
} else {
84+
RClosures.initRegAttributes(result, delegate);
85+
}
86+
return result;
87+
}
88+
7889
private void setData(Object data, int newLen) {
7990
this.data = data;
8091
if (data instanceof VectorDataWithOwner) {

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/VectorDataClosure.java

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ private static Object create(RAbstractVector delegate, Object data, RType target
8585
return new RawClosure(delegate, data, targetType);
8686
case Character:
8787
return new StringClosure(delegate, data, targetType);
88+
case List:
89+
return new ListClosure(delegate, data, targetType);
8890
default:
8991
throw RInternalError.shouldNotReachHere();
9092
}
@@ -146,10 +148,11 @@ public RandomAccessIterator randomAccessIterator(@CachedLibrary("this.data") Vec
146148
@ExportMessage
147149
public NACheck getNACheck() {
148150
// the contract is that the check is enabled if the vector may contain NA values,
149-
// we cannot say that upfront, because NAs can occur as the result of type conversions
151+
// we cannot say upfront that it does not, because NAs can occur as the result of type
152+
// conversions
150153
// NOTE: this method and "isComplete" can be improved for type conversions that are known to
151154
// never introduce NA values (e.g., int -> double)
152-
return NACheck.getDisabled();
155+
return NACheck.getEnabled();
153156
}
154157

155158
// Integer
@@ -340,6 +343,37 @@ public String getString(RandomAccessIterator it, int index,
340343
return dataLib.getString(data, it, index);
341344
}
342345

346+
// List
347+
348+
@ExportMessage
349+
public Object[] getListDataCopy(@CachedLibrary("this.data") VectorDataLibrary dataLib) {
350+
assert getTargetType() == RType.List;
351+
Object[] result = new Object[getLength(dataLib)];
352+
SeqIterator it = dataLib.iterator(data);
353+
while (dataLib.next(data, it)) {
354+
result[it.getIndex()] = dataLib.getNextElement(data, it);
355+
}
356+
return result;
357+
}
358+
359+
@ExportMessage
360+
public Object getElementAt(int index,
361+
@CachedLibrary("this.data") VectorDataLibrary dataLib) {
362+
return dataLib.getElementAt(data, index);
363+
}
364+
365+
@ExportMessage
366+
public Object getNextElement(SeqIterator it,
367+
@CachedLibrary("this.data") VectorDataLibrary dataLib) {
368+
return dataLib.getNextElement(data, it);
369+
}
370+
371+
@ExportMessage
372+
public Object getElement(RandomAccessIterator it, int index,
373+
@CachedLibrary("this.data") VectorDataLibrary dataLib) {
374+
return dataLib.getElement(data, it, index);
375+
}
376+
343377
// Support of the RClosure interface
344378

345379
@Override
@@ -376,7 +410,7 @@ protected VectorDataClosure copyDataClosure() {
376410
}
377411

378412
@ExportLibrary(VectorDataLibrary.class)
379-
static class DoubleClosure extends VectorDataClosure {
413+
static final class DoubleClosure extends VectorDataClosure {
380414
DoubleClosure(RAbstractVector delegate, Object data, RType targetType) {
381415
super(delegate, data, targetType);
382416
}
@@ -393,7 +427,7 @@ protected VectorDataClosure copyDataClosure() {
393427
}
394428

395429
@ExportLibrary(VectorDataLibrary.class)
396-
static class LogicalClosure extends VectorDataClosure {
430+
static final class LogicalClosure extends VectorDataClosure {
397431
LogicalClosure(RAbstractVector delegate, Object data, RType targetType) {
398432
super(delegate, data, targetType);
399433
}
@@ -410,7 +444,7 @@ protected VectorDataClosure copyDataClosure() {
410444
}
411445

412446
@ExportLibrary(VectorDataLibrary.class)
413-
static class RawClosure extends VectorDataClosure {
447+
static final class RawClosure extends VectorDataClosure {
414448
RawClosure(RAbstractVector delegate, Object data, RType targetType) {
415449
super(delegate, data, targetType);
416450
}
@@ -427,7 +461,7 @@ protected VectorDataClosure copyDataClosure() {
427461
}
428462

429463
@ExportLibrary(VectorDataLibrary.class)
430-
static class ComplexClosure extends VectorDataClosure {
464+
static final class ComplexClosure extends VectorDataClosure {
431465
ComplexClosure(RAbstractVector delegate, Object data, RType targetType) {
432466
super(delegate, data, targetType);
433467
}
@@ -444,7 +478,7 @@ protected VectorDataClosure copyDataClosure() {
444478
}
445479

446480
@ExportLibrary(VectorDataLibrary.class)
447-
static class StringClosure extends VectorDataClosure {
481+
static final class StringClosure extends VectorDataClosure {
448482
StringClosure(RAbstractVector delegate, Object data, RType targetType) {
449483
super(delegate, data, targetType);
450484
}
@@ -459,4 +493,21 @@ protected VectorDataClosure copyDataClosure() {
459493
return new StringClosure(delegate, data, RType.Character);
460494
}
461495
}
496+
497+
@ExportLibrary(VectorDataLibrary.class)
498+
static final class ListClosure extends VectorDataClosure {
499+
ListClosure(RAbstractVector delegate, Object data, RType targetType) {
500+
super(delegate, data, targetType);
501+
}
502+
503+
@Override
504+
protected RType getTargetType() {
505+
return RType.List;
506+
}
507+
508+
@Override
509+
protected VectorDataClosure copyDataClosure() {
510+
return new ListClosure(delegate, data, RType.Integer);
511+
}
512+
}
462513
}

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

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,11 @@
2525
import com.oracle.truffle.r.runtime.RError;
2626
import com.oracle.truffle.r.runtime.RError.Message;
2727
import com.oracle.truffle.r.runtime.data.RDoubleVector;
28+
import com.oracle.truffle.r.runtime.data.RList;
2829
import com.oracle.truffle.r.runtime.data.RNull;
2930
import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
3031
import com.oracle.truffle.r.runtime.data.RIntVector;
3132
import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
32-
import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
33-
import com.oracle.truffle.r.runtime.data.RRawVector;
3433
import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
3534
import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
3635

@@ -68,28 +67,8 @@ public static RAbstractVector createFactorToVector(RIntVector factor, boolean wi
6867

6968
// ... To List
7069

71-
public static RAbstractListVector createToListVector(RAbstractLogicalVector vector, boolean keepAttributes) {
72-
return new RLogicalToListVectorClosure(vector, keepAttributes);
73-
}
74-
75-
public static RAbstractListVector createToListVector(RIntVector vector, boolean keepAttributes) {
76-
return new RIntToListVectorClosure(vector, keepAttributes);
77-
}
78-
79-
public static RAbstractListVector createToListVector(RDoubleVector vector, boolean keepAttributes) {
80-
return new RDoubleToListVectorClosure(vector, keepAttributes);
81-
}
82-
83-
public static RAbstractListVector createToListVector(RRawVector vector, boolean keepAttributes) {
84-
return new RRawToListVectorClosure(vector, keepAttributes);
85-
}
86-
87-
public static RAbstractListVector createToListVector(RAbstractComplexVector vector, boolean keepAttributes) {
88-
return new RComplexToListVectorClosure(vector, keepAttributes);
89-
}
90-
91-
public static RAbstractListVector createToListVector(RAbstractStringVector vector, boolean keepAttributes) {
92-
return new RStringToListVectorClosure(vector, keepAttributes);
70+
public static RAbstractListVector createToListVector(RAbstractVector vector, boolean keepAttributes) {
71+
return RList.createClosure(vector, keepAttributes);
9372
}
9473

9574
/**

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

Lines changed: 0 additions & 178 deletions
This file was deleted.

0 commit comments

Comments
 (0)