diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/AttributesAccessNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/AttributesAccessNodes.java index 4cf867b273cbff92497b40304d4b10cc97edc13d..fbe1b12be9818a0a5eedbc6e7d48019ec23afc08 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/AttributesAccessNodes.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/AttributesAccessNodes.java @@ -101,7 +101,21 @@ public final class AttributesAccessNodes { CompilerDirectives.transferToInterpreterAndInvalidate(); getAttributesNode = GetAttributesNode.create(); } - return getAttributesNode.execute(obj); + Object resultObj = getAttributesNode.execute(obj); + if (resultObj == RNull.instance) { + return resultObj; + } + assert resultObj instanceof RList : "GetAttributesNode should return RList or RNull"; + RList list = (RList) resultObj; + Object result = RNull.instance; + RStringVector names = list.getNames(); + assert names.getLength() == list.getLength(); + for (int i = list.getLength() - 1; i >= 0; i--) { + Object item = list.getDataAt(i); + RSymbol symbol = RDataFactory.createSymbol(names.getDataAt(i)); + result = RDataFactory.createPairList(item, result, symbol); + } + return result; } @Fallback diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/tests/simpleTests.R b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/tests/simpleTests.R index 208c28dece6771be98aa7f1070825070689cf4e3..a620c50095081e73aa39f3274b87d5efb5ad2c5b 100644 --- a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/tests/simpleTests.R +++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/tests/simpleTests.R @@ -145,4 +145,7 @@ rffi.RfFunctions() setAttrTarget <- c(1,2,3) attr(setAttrTarget, 'myattr2') <- 'some value'; api.SET_ATTRIB(setAttrTarget, as.pairlist(list(myattr=42))) -setAttrTarget \ No newline at end of file +setAttrTarget + +typeof(api.ATTRIB(mtcars)) +api.ATTRIB(structure(c(1,2,3), myattr3 = 33))