diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ActiveBindingMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ActiveBindingMR.java index 94532825ba6d359254f320a8ad0c778b62d1da8c..6dc535b57028cafd75e031a8fd4e04ca66109265 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ActiveBindingMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ActiveBindingMR.java @@ -27,6 +27,7 @@ import com.oracle.truffle.api.interop.MessageResolution; import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.env.frame.ActiveBinding; @MessageResolution(receiverType = ActiveBinding.class) @@ -53,6 +54,20 @@ public class ActiveBindingMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class ActiveBindingCheck extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java index 92276371262cf8d572b35f2feb6458d10590b8c8..0a753d19f9a50841ed17702d326c28cbb8ac7a5a 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java @@ -45,6 +45,8 @@ import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode; import com.oracle.truffle.r.nodes.access.vector.ReplaceVectorNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; import com.oracle.truffle.r.nodes.control.RLengthNode; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; +import com.oracle.truffle.r.runtime.data.RExpression; import com.oracle.truffle.r.runtime.data.RFunction; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RLogical; @@ -122,6 +124,20 @@ public class ListMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RListCheck extends Node { @@ -131,6 +147,104 @@ public class ListMR { } } + @MessageResolution(receiverType = RExpression.class) + public static class RExpressionMR extends ListMR { + @Resolve(message = "IS_BOXED") + public abstract static class RExpressionIsBoxedNode extends Node { + protected Object access(RExpression receiver) { + return isBoxed(receiver); + } + } + + @Resolve(message = "HAS_SIZE") + public abstract static class RExpressionHasSizeNode extends Node { + protected Object access(RExpression receiver) { + return hasSize(receiver); + } + } + + @Resolve(message = "GET_SIZE") + public abstract static class RExpressionGetSizeNode extends Node { + @Child private RLengthNode lengthNode = RLengthNode.create(); + + protected Object access(RExpression receiver) { + return getSize(receiver, lengthNode); + } + } + + @Resolve(message = "IS_NULL") + public abstract static class RExpressionIsNullNode extends Node { + protected Object access(RExpression receiver) { + return isNull(receiver); + } + } + + @Resolve(message = "READ") + public abstract static class RExpressionReadNode extends Node { + @Child private ListReadImplNode read = ListReadImplNodeGen.create(); + + protected Object access(VirtualFrame frame, RExpression receiver, Object identifier) { + return read.execute(frame, receiver, identifier); + } + } + + @Resolve(message = "WRITE") + public abstract static class RExpressionWriteNode extends Node { + @Child private ListWriteImplNode writeNode = ListWriteImplNodeGen.create(); + + protected Object access(RExpression receiver, Object identifier, Object valueObj) { + return writeNode.execute(receiver, identifier, valueObj); + } + } + + @Resolve(message = "KEYS") + public abstract static class RExpressionKeysNode extends Node { + @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create(); + + protected Object access(RExpression receiver) { + return listKeys(receiver, getNamesNode); + } + } + + @Resolve(message = "KEY_INFO") + public abstract static class RExpressionKeyInfoNode extends Node { + @Child private ListKeyInfoImplNode keyInfoNode = ListKeyInfoImplNodeGen.create(); + + protected Object access(TruffleObject receiver, Object idx) { + return keyInfoNode.execute(receiver, idx); + } + } + + @Resolve(message = "TO_NATIVE") + public abstract static class RExpressionToNativeNode extends Node { + protected Object access(RTruffleObject receiver) { + return toNativePointer(receiver); + } + } + + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + + @CanResolve + public abstract static class RExpressionCheck extends Node { + + protected static boolean test(TruffleObject receiver) { + return receiver instanceof RExpression; + } + } + } + @MessageResolution(receiverType = RPairList.class) public static class RPairListMR { @@ -200,6 +314,20 @@ public class ListMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RPairListCheck extends Node { protected static boolean test(TruffleObject receiver) { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java index 2ee572ca4c6ee226ad4f84b4165a4976ce428747..2ab541ec036edce1652f1d7c2067815f9e87e364 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java @@ -36,6 +36,7 @@ import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.r.engine.interop.RArgsValuesAndNamesMRFactory.RArgsValuesAndNamesKeyInfoImplNodeGen; import com.oracle.truffle.r.engine.interop.RArgsValuesAndNamesMRFactory.RArgsValuesAndNamesReadImplNodeGen; import com.oracle.truffle.r.runtime.ArgumentsSignature; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RFunction; @@ -89,6 +90,20 @@ public class RArgsValuesAndNamesMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RArgsValuesAndNamesCheck extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RConnectionMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RConnectionMR.java index 273c19ac19309adaafef5501531d4199f0426aeb..2ca10db203dce63e46e28bbe25857f3bd20ca699 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RConnectionMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RConnectionMR.java @@ -28,6 +28,7 @@ import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.r.runtime.conn.RConnection; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; @MessageResolution(receiverType = RConnection.class) public class RConnectionMR { @@ -39,6 +40,20 @@ public class RConnectionMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RConnection extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REmptyMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REmptyMR.java index 462d98e4c6aaccd9d4393568435d0766219e8ef4..fe15844891309997f59a01e3a607982ea142cdc6 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REmptyMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REmptyMR.java @@ -27,6 +27,7 @@ import com.oracle.truffle.api.interop.MessageResolution; import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.REmpty; @MessageResolution(receiverType = REmpty.class) @@ -39,6 +40,20 @@ public class REmptyMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class REmptyCheck extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java index b18d134b3bffc9232b05c213cac2fdd11f600141..71fe7cdf9b9fb8c3b8c987ff6d7145c877eda25f 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java @@ -45,6 +45,7 @@ import com.oracle.truffle.r.ffi.impl.interop.NativePointer; import com.oracle.truffle.r.nodes.access.vector.ElementAccessMode; import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode; import com.oracle.truffle.r.nodes.access.vector.ReplaceVectorNode; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RFunction; import com.oracle.truffle.r.runtime.env.REnvironment; import com.oracle.truffle.r.runtime.interop.Foreign2R; @@ -97,6 +98,20 @@ public class REnvironmentMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class REnvironmentCheck extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RExternalPtrMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RExternalPtrMR.java index bb333c5502fd6dbec9b5522babfcd46fc94257f5..255ce94646377d4743b0021422598368853903d4 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RExternalPtrMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RExternalPtrMR.java @@ -27,6 +27,7 @@ import com.oracle.truffle.api.interop.MessageResolution; import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RExternalPtr; @MessageResolution(receiverType = RExternalPtr.class) @@ -39,6 +40,20 @@ public class RExternalPtrMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RExternalPtrCheck extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java index 3fd10f6ef50db12c670ffa5c10e750ecd2d7ffd8..7df762b0be5048cb03dbdde884295d98e72b0b55 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java @@ -33,6 +33,7 @@ import com.oracle.truffle.r.runtime.context.RForeignAccessFactory; import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RDouble; import com.oracle.truffle.r.runtime.data.REmpty; +import com.oracle.truffle.r.runtime.data.RExpression; import com.oracle.truffle.r.runtime.data.RExternalPtr; import com.oracle.truffle.r.runtime.data.RFunction; import com.oracle.truffle.r.runtime.data.RInteger; @@ -73,6 +74,8 @@ public final class RForeignAccessFactoryImpl implements RForeignAccessFactory { return RNullMRForeign.ACCESS; } else if (obj instanceof RList) { return RListMRForeign.ACCESS; + } else if (obj instanceof RExpression) { + return RExpressionMRForeign.ACCESS; } else if (obj instanceof REnvironment) { return REnvironmentMRForeign.ACCESS; } else if (obj instanceof RPairList) { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RFunctionMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RFunctionMR.java index 19af21fca055a0f36aa5c97327ce9a224614827b..790c817810d3ae72898fcb8aaf4816048293a018 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RFunctionMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RFunctionMR.java @@ -37,6 +37,7 @@ import com.oracle.truffle.r.nodes.function.RCallBaseNode; import com.oracle.truffle.r.nodes.function.RCallNode; import com.oracle.truffle.r.runtime.ArgumentsSignature; import com.oracle.truffle.r.runtime.RArguments; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RFunction; import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor; @@ -104,6 +105,20 @@ public class RFunctionMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RFunctionCheck extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java index 699bf254017fcbe4830059d21a9651109cfde27f..8b1c680448b02c965f53da984fd2538fbb6373ed 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java @@ -38,6 +38,7 @@ import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.r.ffi.impl.interop.NativePointer; import com.oracle.truffle.r.nodes.access.vector.ElementAccessMode; import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RLanguage; import com.oracle.truffle.r.runtime.data.RLogical; import com.oracle.truffle.r.runtime.data.RNull; @@ -86,6 +87,20 @@ public class RLanguageMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RLanguageCheck extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RMissingMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RMissingMR.java index 9c6abcf27b4b49c284248918ac15327e5a8bfe38..53e246cf04c5ee0fee2c7e842285ecc90601b974 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RMissingMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RMissingMR.java @@ -27,6 +27,7 @@ import com.oracle.truffle.api.interop.MessageResolution; import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RMissing; @MessageResolution(receiverType = RMissing.class) @@ -39,6 +40,20 @@ public class RMissingMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RMissingCheck extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RNullMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RNullMR.java index 270f160dde7635edebde476f2cffbc82ffb51141..dde35783c552f7b2eaa1781a600005dc87d6062d 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RNullMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RNullMR.java @@ -28,6 +28,7 @@ import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.r.ffi.impl.interop.NativePointer; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RNull; @MessageResolution(receiverType = RNull.class) @@ -58,6 +59,20 @@ public class RNullMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RNullCheck extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java index f531beac95dcddda545333c19445b074ea67fc50..ab3db61d67cfd0241e8eafec2122a91c0d66b381 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java @@ -39,6 +39,7 @@ import com.oracle.truffle.r.engine.interop.RPromiseMRFactory.RPromiseWriteImplNo import com.oracle.truffle.r.ffi.impl.interop.NativePointer; import com.oracle.truffle.r.nodes.function.PromiseHelperNode; import com.oracle.truffle.r.runtime.RRuntime; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RPromise; @@ -93,6 +94,20 @@ public class RPromiseMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RPromiseCheck extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java index 65a9cd84ba36ed4a52c624bcadfd77a9e1574081..0e944adbbeb407684ccb4ea567b980d7e5518c7b 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java @@ -44,6 +44,7 @@ import com.oracle.truffle.r.nodes.attributes.ArrayAttributeNode; import com.oracle.truffle.r.nodes.attributes.GetAttributeNode; import com.oracle.truffle.r.nodes.attributes.SetAttributeNode; import com.oracle.truffle.r.runtime.data.RAttributesLayout.RAttribute; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RFunction; import com.oracle.truffle.r.runtime.data.RNull; @@ -102,6 +103,20 @@ public class RS4ObjectMR { return RDataFactory.createStringVector(data, RDataFactory.COMPLETE_VECTOR); } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RS4ObjectCheck extends Node { protected static boolean test(TruffleObject receiver) { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RSymbolMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RSymbolMR.java index d506157e6f72ff6ec0d09e76e792b5217b7b4396..f55d81fdefb9e952d1ce4dd18310b1bb4be6530d 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RSymbolMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RSymbolMR.java @@ -28,6 +28,7 @@ import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.r.ffi.impl.interop.NativePointer; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RSymbol; @MessageResolution(receiverType = RSymbol.class) @@ -47,6 +48,20 @@ public class RSymbolMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RSymbolCheck extends Node { diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RUnboundValueMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RUnboundValueMR.java index 6810239ab9eda9b452af44aa14f75b0045e13aad..c20ef87dfe3eb3e2fe795ab0362e9adcf0d7c50f 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RUnboundValueMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RUnboundValueMR.java @@ -27,6 +27,7 @@ import com.oracle.truffle.api.interop.MessageResolution; import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RUnboundValue; @MessageResolution(receiverType = RUnboundValue.class) @@ -39,6 +40,20 @@ public class RUnboundValueMR { } } + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class RUnboundValueCheck extends Node { diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/CharSXPWrapperMR.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/CharSXPWrapperMR.java index 70f024e443059ff9902a8ae317dffb7ab6b546b2..40ac2f5564469d7a6d81c5a642865b957547fa48 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/CharSXPWrapperMR.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/CharSXPWrapperMR.java @@ -24,12 +24,29 @@ package com.oracle.truffle.r.ffi.impl.interop; import com.oracle.truffle.api.interop.CanResolve; import com.oracle.truffle.api.interop.MessageResolution; +import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.ffi.CharSXPWrapper; @MessageResolution(receiverType = CharSXPWrapper.class) public class CharSXPWrapperMR { + + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } + @CanResolve public abstract static class CharSXPWrapperCheck extends Node { diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLDotSymbolMR.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLDotSymbolMR.java index 6c29f5f5058dcac5a7632a1865c7232b97223a87..b82d56a67e86e96dae6e9967c30f5e32421be068 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLDotSymbolMR.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLDotSymbolMR.java @@ -24,17 +24,32 @@ package com.oracle.truffle.r.ffi.impl.interop; import com.oracle.truffle.api.interop.CanResolve; import com.oracle.truffle.api.interop.MessageResolution; +import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.ffi.DLL; @MessageResolution(receiverType = DLL.DotSymbol.class) public class DLLDotSymbolMR { @CanResolve public abstract static class DotSymbolCheck extends Node { - protected static boolean test(TruffleObject receiver) { return receiver instanceof DLL.DotSymbol; } } + + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } } diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLInfoMR.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLInfoMR.java index 60657d6cd23d5f9fb3b29ac914f007094b41fdc5..7027783e7e2167c4d46e012ac3fd790bd85cccf1 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLInfoMR.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLInfoMR.java @@ -24,8 +24,10 @@ package com.oracle.truffle.r.ffi.impl.interop; import com.oracle.truffle.api.interop.CanResolve; import com.oracle.truffle.api.interop.MessageResolution; +import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.ffi.DLL; @MessageResolution(receiverType = DLL.DLLInfo.class) @@ -37,4 +39,18 @@ public class DLLInfoMR { return receiver instanceof DLL.DLLInfo; } } + + @Resolve(message = "IS_POINTER") + public abstract static class IsPointerNode extends Node { + protected boolean access(Object receiver) { + return NativeDataAccess.isPointer(receiver); + } + } + + @Resolve(message = "AS_POINTER") + public abstract static class AsPointerNode extends Node { + protected long access(Object receiver) { + return NativeDataAccess.asPointer(receiver); + } + } } diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/NativeFunction.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/NativeFunction.java index 9c7d3506683a27c3bf45f4833c13e6c69c86ed55..d475068ea492290b10c38e640bd6afd8e336738e 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/NativeFunction.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/NativeFunction.java @@ -115,7 +115,6 @@ public enum NativeFunction { if (function == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); function = lookup.apply(callName, signature); - System.out.println("lookup " + callName); } return function; } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java index 8cfbfa11a8232d2e9f4bf9c2fb80ae2bc22c3bfc..50b92a236f95b5ea132d1b95f65f775e6d7c5598 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java @@ -51,6 +51,7 @@ import com.oracle.truffle.r.runtime.data.RAttributesLayout; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RExternalPtr; import com.oracle.truffle.r.runtime.data.RNull; +import com.oracle.truffle.r.runtime.data.RObject; import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; @@ -520,7 +521,7 @@ public class ConnectionSupport { * it subsequently will throw an error. The latter will open/close the connection (internally) * and this can be repeated indefinitely. */ - public abstract static class BaseRConnection implements RConnection { + public abstract static class BaseRConnection extends RObject implements RConnection { /** * {@code true} is the connection has been opened successfully. N.B. This supports lazy diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java index fec907242f0fc9d30cb9e084d97b8384a3fa941e..851519c9ca49d7f9927a5ab9195e76ce8675e66b 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java @@ -44,6 +44,7 @@ import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.conn.ConnectionSupport.BaseRConnection; import com.oracle.truffle.r.runtime.data.RDataFactory; +import com.oracle.truffle.r.runtime.data.RObject; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; /** @@ -53,7 +54,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; * operations. * </p> */ -abstract class DelegateRConnection implements RConnection, ByteChannel { +abstract class DelegateRConnection extends RObject implements RConnection, ByteChannel { public static final int DEFAULT_CACHE_SIZE = 16 * 1024; protected final BaseRConnection base; private final ByteBuffer cache; diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java index a05f4130f9d15ae01193f0fcb4f5d7a487dc1dc6..995384701823cda42dede1c343b5d1b342be39bf 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java @@ -88,6 +88,7 @@ public final class NativeDataAccess { protected void finalize() throws Throwable { super.finalize(); nativeMirrors.remove(id); + // System.out.println(String.format("gc'ing %16x", id)); if (dataAddress != 0) { UnsafeAdapter.UNSAFE.freeMemory(dataAddress); assert (dataAddress = 0xbadbad) != 0; @@ -102,31 +103,45 @@ public final class NativeDataAccess { return Truffle.getRuntime().createCallTarget(new InteropRootNode() { @Override public Object execute(VirtualFrame frame) { - return ForeignAccess.getReceiver(frame) instanceof RObject; + return isPointer(ForeignAccess.getReceiver(frame)); } }); } + public static boolean isPointer(Object obj) { + return obj instanceof RObject; + } + public static CallTarget createAsPointer() { return Truffle.getRuntime().createCallTarget(new InteropRootNode() { @Override public Object execute(VirtualFrame frame) { - Object arg = ForeignAccess.getReceiver(frame); - if (arg instanceof RObject) { - RObject obj = (RObject) arg; - NativeMirror mirror = (NativeMirror) obj.getNativeMirror(); - if (mirror == null) { - obj.setNativeMirror(mirror = new NativeMirror()); - } - return mirror.id; - } - throw UnsupportedMessageException.raise(Message.AS_POINTER); + return asPointer(ForeignAccess.getReceiver(frame)); } }); } + public static long asPointer(Object arg) { + if (arg instanceof RObject) { + RObject obj = (RObject) arg; + NativeMirror mirror = (NativeMirror) obj.getNativeMirror(); + if (mirror == null) { + obj.setNativeMirror(mirror = new NativeMirror()); + // System.out.println(String.format("adding %16x = %s", mirror.id, obj)); + nativeMirrors.put(mirror.id, new WeakReference<>(obj)); + } + return mirror.id; + } + throw UnsupportedMessageException.raise(Message.AS_POINTER); + } + public static Object lookup(long address) { - Object result = nativeMirrors.get(address); + WeakReference<RObject> reference = nativeMirrors.get(address); + if (reference == null) { + CompilerDirectives.transferToInterpreter(); + throw RInternalError.shouldNotReachHere("unknown/stale native reference"); + } + RObject result = reference.get(); if (result == null) { CompilerDirectives.transferToInterpreter(); throw RInternalError.shouldNotReachHere("unknown/stale native reference"); diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java index 132f153d20779c4fae436c2d095926e573206952..fee0ee0e9f4f3d1ec84ad3b192ca03f0bdf94f8d 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java @@ -24,7 +24,7 @@ package com.oracle.truffle.r.runtime.data; import java.util.Arrays; -import com.oracle.truffle.r.runtime.Arguments; +import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.r.runtime.ArgumentsSignature; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RType; @@ -33,7 +33,18 @@ import com.oracle.truffle.r.runtime.gnur.SEXPTYPE; /** * A simple wrapper class for passing the ... argument through RArguments */ -public final class RArgsValuesAndNames extends Arguments<Object> implements RTypedValue { +public final class RArgsValuesAndNames extends RObject implements RTypedValue { + + /** + * Array of arguments; semantics have to be specified by child classes. + */ + @CompilationFinal(dimensions = 1) private final Object[] values; + + /** + * Array of arguments; semantics have to be specified by child classes. + */ + private final ArgumentsSignature signature; + /** * Default instance for empty "..." ("..." that resolve to contain no expression at runtime). * The {@link RMissing#instance} for "...". @@ -41,7 +52,8 @@ public final class RArgsValuesAndNames extends Arguments<Object> implements RTyp public static final RArgsValuesAndNames EMPTY = new RArgsValuesAndNames(new Object[0], ArgumentsSignature.empty(0)); public RArgsValuesAndNames(Object[] values, ArgumentsSignature signature) { - super(values, signature); + this.values = values; + this.signature = signature; assert signature != null && signature.getLength() == values.length : Arrays.toString(values) + " " + signature; } @@ -62,9 +74,37 @@ public final class RArgsValuesAndNames extends Arguments<Object> implements RTyp throw RInternalError.shouldNotReachHere(); } + public ArgumentsSignature getSignature() { + return signature; + } + + public int getLength() { + return signature.getLength(); + } + + public Object[] getArguments() { + return values; + } + + public Object getArgument(int index) { + return values[index]; + } + + public boolean isEmpty() { + return signature.isEmpty(); + } + + @Override + public String toString() { + StringBuilder str = new StringBuilder().append(getClass().getSimpleName()).append(": "); + for (int i = 0; i < values.length; i++) { + str.append(i == 0 ? "" : ", ").append(signature.getName(i)).append(" = ").append(values[i]); + } + return str.toString(); + } + public RPairList toPairlist() { RPairList head = null; - ArgumentsSignature signature = getSignature(); assert signature.getLength() == getLength(); for (int i = 0; i < getLength(); i++) { String name = signature.getName(i); diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java index d00b8e455b51a5c1f9798159a6c029ea78f64191..40d136a0a76ec2af58870ffec1a884d1d71a0265 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java @@ -49,7 +49,7 @@ import com.oracle.truffle.r.runtime.nodes.RSyntaxLookup; * Denotes an R {@code promise}. */ @ValueType -public class RPromise implements RTypedValue { +public class RPromise extends RObject implements RTypedValue { private static final int DEFAULT_BIT = 0x1; private static final int FULL_PROMISE_BIT = 0x2; diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java index f38eb295560a8a1183eab91b43479a9c3580de1e..35b3f1ec87c75f89563972b3406c20e2fe0dc068 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java @@ -38,6 +38,7 @@ import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RExternalPtr; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RNull; +import com.oracle.truffle.r.runtime.data.RObject; import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.RSymbol; import com.oracle.truffle.r.runtime.data.RTruffleObject; @@ -141,7 +142,7 @@ public class DLL { * Denotes info in registered native routines. GnuR has "subclasses" for C/Fortran, which is TBD * for FastR. */ - public static class DotSymbol implements RTruffleObject { + public static class DotSymbol extends RObject implements RTruffleObject { public final String name; public final SymbolHandle fun; public final int numArgs; @@ -151,6 +152,7 @@ public class DLL { this.fun = fun; this.numArgs = numArgs; } + } public static class RegisteredNativeSymbol { @@ -173,7 +175,7 @@ public class DLL { } } - public static final class DLLInfo implements RTruffleObject { + public static final class DLLInfo extends RObject implements RTruffleObject { private static final RStringVector NAMES = RDataFactory.createStringVector(new String[]{"name", "path", "dynamicLookup", "handle", "info"}, RDataFactory.COMPLETE_VECTOR); public static final String DLL_INFO_REFERENCE = "DLLInfoReference"; private static final RStringVector INFO_REFERENCE_CLASS = RDataFactory.createStringVectorFromScalar(DLL_INFO_REFERENCE);