Skip to content
Snippets Groups Projects
Commit 014cc32a authored by stepan's avatar stepan
Browse files

Fix: as.pairlist for pairlist returns copy of the argument

parent f6705816
Branches
No related tags found
No related merge requests found
......@@ -66,6 +66,7 @@ import com.oracle.truffle.r.runtime.builtins.RBuiltin;
import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.data.RLanguage;
import com.oracle.truffle.r.runtime.data.RNull;
import com.oracle.truffle.r.runtime.data.RPairList;
import com.oracle.truffle.r.runtime.data.RSharingAttributeStorage;
import com.oracle.truffle.r.runtime.data.RStringVector;
import com.oracle.truffle.r.runtime.data.RSymbol;
......@@ -260,6 +261,12 @@ public abstract class AsVector extends RBuiltinNode.Arg2 {
return RNull.instance;
}
@Specialization
@TruffleBoundary
protected Object doPairList(RPairList list) {
return list.copy();
}
@Fallback
protected Object castPairlist(Object x) {
throw RInternalError.unimplemented("non-list casts to pairlist for " + x.getClass().getSimpleName());
......
......@@ -31,6 +31,7 @@ import com.oracle.truffle.r.runtime.RInternalError;
import com.oracle.truffle.r.runtime.RRuntime;
import com.oracle.truffle.r.runtime.RType;
import com.oracle.truffle.r.runtime.Utils;
import com.oracle.truffle.r.runtime.data.RDataFactory.BaseVectorFactory;
import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
import com.oracle.truffle.r.runtime.data.nodes.FastPathVectorAccess.FastPathFromListAccess;
......@@ -270,16 +271,22 @@ public final class RPairList extends RSharingAttributeStorage implements RAbstra
}
@Override
public RSharingAttributeStorage copy() {
RPairList result = new RPairList();
public RPairList copy() {
BaseVectorFactory dataFactory = RDataFactory.getInstance();
RPairList curr = dataFactory.createPairList();
RPairList result = curr;
Object original = this;
while (!isNull(original)) {
while (true) {
RPairList origList = (RPairList) original;
result.car = origList.car;
result.tag = origList.tag;
result.cdr = new RPairList();
result = (RPairList) result.cdr;
curr.car = origList.car;
curr.tag = origList.tag;
original = origList.cdr;
if (isNull(original)) {
curr.cdr = RNull.instance;
break;
}
curr.cdr = dataFactory.createPairList();
curr = (RPairList) curr.cdr;
}
if (getAttributes() != null) {
result.initAttributes(RAttributesLayout.copy(getAttributes()));
......
......@@ -444,6 +444,7 @@ public class TestBuiltin_asvector extends TestBase {
assertEval("as.vector(NULL, mode='pairlist')");
assertEval("{ as.vector.cls <- function(x, mode) 42; as.vector(structure(c(1,2), class='cls')); }");
assertEval("as.pairlist(as.pairlist(c(1,2,3)))");
}
@Test
......
......@@ -24,6 +24,7 @@ package com.oracle.truffle.r.test.runtime.data;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import java.util.Iterator;
......@@ -33,6 +34,7 @@ import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.data.RList;
import com.oracle.truffle.r.runtime.data.RNull;
import com.oracle.truffle.r.runtime.data.RPairList;
import com.oracle.truffle.r.runtime.data.RSharingAttributeStorage;
public class RPairListTests {
@Test
......@@ -52,4 +54,16 @@ public class RPairListTests {
assertArrayEquals(new String[]{"name1", "name2"}, result.getNames().getReadonlyData());
assertArrayEquals(new Object[]{1, 2}, result.getDataWithoutCopying());
}
@Test
public void testCopy() {
RPairList pairList = RDataFactory.createPairList(1, RDataFactory.createPairList(2, RNull.instance, "name2"), "name1");
RPairList copy = pairList.copy();
assertEquals(2, copy.getLength());
assertEquals("name1", copy.getTag());
assertEquals(1, copy.car());
assertEquals("name2", ((RPairList) copy.cdr()).getTag());
assertEquals(2, ((RPairList) copy.cdr()).car());
assertSame(RNull.instance, ((RPairList) copy.cdr()).cdr());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment