Skip to content
Snippets Groups Projects
Commit ba3a4eb7 authored by Lukas Stadler's avatar Lukas Stadler
Browse files

convert raw conversion in RFFI and Rf_copyMatrix to VectorAccess

parent 7c302c6d
No related branches found
No related tags found
No related merge requests found
......@@ -90,16 +90,12 @@ import com.oracle.truffle.r.runtime.data.RStringVector;
import com.oracle.truffle.r.runtime.data.RSymbol;
import com.oracle.truffle.r.runtime.data.RTypedValue;
import com.oracle.truffle.r.runtime.data.RUnboundValue;
import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractListBaseVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.RandomIterator;
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.SequentialIterator;
import com.oracle.truffle.r.runtime.env.REnvironment;
import com.oracle.truffle.r.runtime.env.REnvironment.PutException;
import com.oracle.truffle.r.runtime.ffi.DLL;
......@@ -860,138 +856,37 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
@Override
@TruffleBoundary
public void Rf_copyMatrix(Object t, Object s, int byRow) {
int tRows = RRuntime.nrows(t);
int tCols = RRuntime.ncols(t);
final Object sav = RRuntime.asAbstractVector(s);
ContainerItemCopier c;
if (sav instanceof RAbstractContainer) {
int sLen = ((RAbstractContainer) sav).getLength();
if (sav instanceof RAbstractIntVector) {
c = new ContainerItemCopier() {
private final RAbstractIntVector sv = (RAbstractIntVector) sav;
private final RAbstractIntVector tv = (RAbstractIntVector) t;
private final Object tvStore = tv.getInternalStore();
@Override
public void copy(int sIdx, int tIdx) {
tv.setDataAt(tvStore, tIdx, sv.getDataAt(sIdx));
}
};
} else if (sav instanceof RAbstractDoubleVector) {
c = new ContainerItemCopier() {
private final RAbstractDoubleVector sv = (RAbstractDoubleVector) sav;
private final RAbstractDoubleVector tv = (RAbstractDoubleVector) t;
private final Object tvStore = tv.getInternalStore();
@Override
public void copy(int sIdx, int tIdx) {
tv.setDataAt(tvStore, tIdx, sv.getDataAt(sIdx));
}
};
} else if (sav instanceof RAbstractLogicalVector) {
c = new ContainerItemCopier() {
private final RAbstractLogicalVector sv = (RAbstractLogicalVector) sav;
private final RAbstractLogicalVector tv = (RAbstractLogicalVector) t;
private final Object tvStore = tv.getInternalStore();
@Override
public void copy(int sIdx, int tIdx) {
tv.setDataAt(tvStore, tIdx, sv.getDataAt(sIdx));
}
};
} else if (sav instanceof RAbstractComplexVector) {
c = new ContainerItemCopier() {
private final RAbstractComplexVector sv = (RAbstractComplexVector) sav;
private final RAbstractComplexVector tv = (RAbstractComplexVector) t;
private final Object tvStore = tv.getInternalStore();
@Override
public void copy(int sIdx, int tIdx) {
tv.setDataAt(tvStore, tIdx, sv.getDataAt(sIdx));
}
};
} else if (sav instanceof RAbstractStringVector) {
c = new ContainerItemCopier() {
private final RAbstractStringVector sv = (RAbstractStringVector) sav;
private final RAbstractStringVector tv = (RAbstractStringVector) t;
private final Object tvStore = tv.getInternalStore();
@Override
public void copy(int sIdx, int tIdx) {
tv.setDataAt(tvStore, tIdx, sv.getDataAt(sIdx));
}
};
} else if (sav instanceof RAbstractRawVector) {
c = new ContainerItemCopier() {
private final RAbstractRawVector sv = (RAbstractRawVector) sav;
private final RAbstractRawVector tv = (RAbstractRawVector) t;
private final Object tvStore = tv.getInternalStore();
@Override
public void copy(int sIdx, int tIdx) {
tv.setRawDataAt(tvStore, tIdx, sv.getRawDataAt(sIdx));
}
};
} else if (sav instanceof RAbstractListBaseVector) {
c = new ContainerItemCopier() {
private final RAbstractListBaseVector sv = (RAbstractListBaseVector) sav;
private final RAbstractListBaseVector tv = (RAbstractListBaseVector) t;
private final Object tvStore = tv.getInternalStore();
@Override
public void copy(int sIdx, int tIdx) {
tv.setDataAt(tvStore, tIdx, sv.getDataAt(sIdx));
}
};
} else {
throw unimplemented();
}
if (byRow != 0) {
int sIdx = 0;
for (int i = 0; i < tRows; i++) {
int tIdx = i;
for (int j = 0; j < tCols; j++) {
c.copy(sIdx, tIdx);
sIdx++;
if (sIdx >= sLen) {
sIdx -= sLen;
RAbstractVector target = guaranteeInstanceOf(t, RAbstractVector.class);
RAbstractVector source = guaranteeInstanceOf(RRuntime.asAbstractVector(s), RAbstractVector.class);
VectorAccess targetAccess = target.slowPathAccess();
VectorAccess sourceAccess = source.slowPathAccess();
try (SequentialIterator sourceIter = sourceAccess.access(source)) {
if (byRow != 0) { // copy by row
int tRows = RRuntime.nrows(target);
int tCols = RRuntime.ncols(target);
try (RandomIterator targetIter = targetAccess.randomAccess(target)) {
for (int i = 0; i < tRows; i++) {
int tIdx = i;
for (int j = 0; j < tCols; j++) {
sourceAccess.nextWithWrap(sourceIter);
targetAccess.setFromSameType(targetIter, tIdx, sourceAccess, sourceIter);
tIdx += tRows;
}
tIdx += tRows;
}
}
} else { // Copy by column
int tLen = ((RAbstractContainer) t).getLength();
if (sLen >= tLen) {
for (int i = 0; i < tLen; i++) {
c.copy(i, i);
}
} else { // Recycle needed
int sIdx = 0;
for (int i = 0; i < tLen; i++) {
c.copy(sIdx, i);
sIdx++;
if (sIdx >= sLen) {
sIdx -= sLen;
}
} else { // copy by column
try (SequentialIterator targetIter = targetAccess.access(target)) {
while (targetAccess.next(targetIter)) {
sourceAccess.nextWithWrap(sourceIter);
targetAccess.setFromSameType(targetIter, sourceAccess, sourceIter);
}
}
}
} else { // source is non-RAbstractContainer
throw unimplemented();
}
}
/**
* Helper interface for {@link #Rf_copyMatrix(java.lang.Object, java.lang.Object, int)} that
* copies from source index in an (internally held) source container into target index in a
* target container.
*/
interface ContainerItemCopier {
void copy(int sIdx, int tIdx);
}
@Override
@TruffleBoundary
public Object R_tryEval(Object expr, Object env, int silent) {
......
......@@ -56,6 +56,8 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.SequentialIterator;
import com.oracle.truffle.r.runtime.nodes.RBaseNode;
import sun.misc.Unsafe;
......@@ -390,12 +392,15 @@ final class RawWrapper extends TemporaryWrapper {
@TruffleBoundary
public long allocate() {
RAbstractRawVector v = (RAbstractRawVector) vector;
int length = v.getLength();
long memory = UnsafeAdapter.UNSAFE.allocateMemory(length * Unsafe.ARRAY_BYTE_INDEX_SCALE);
for (int i = 0; i < length; i++) {
UnsafeAdapter.UNSAFE.putByte(memory + (i * Unsafe.ARRAY_BYTE_INDEX_SCALE), v.getRawDataAt(i));
VectorAccess access = v.slowPathAccess();
try (SequentialIterator iter = access.access(v)) {
int length = access.getLength(iter);
long memory = UnsafeAdapter.UNSAFE.allocateMemory(length * Unsafe.ARRAY_BYTE_INDEX_SCALE);
while (access.next(iter)) {
UnsafeAdapter.UNSAFE.putByte(memory + (iter.getIndex() * Unsafe.ARRAY_BYTE_INDEX_SCALE), access.getRaw(iter));
}
return memory;
}
return memory;
}
@Override
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment