diff --git a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c index 4de365306695b4327d7deab5d35287942063148e..b2fe0c289a40aea1203244bf285887efcbc14264 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c +++ b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c @@ -81,8 +81,9 @@ static jmethodID Rf_PairToVectorListMethodID; static jmethodID gnuRCodeForObjectMethodID; static jmethodID NAMED_MethodID; static jmethodID TYPEOF_MethodID; +static jmethodID OBJECT_MethodID; static jmethodID DUPLICATE_ATTRIB_MethodID; -static jmethodID iS4ObjectMethodID; +static jmethodID isS4ObjectMethodID; static jmethodID logObject_MethodID; static jclass RExternalPtrClass; @@ -157,8 +158,9 @@ void init_internals(JNIEnv *env) { Rf_PairToVectorListMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_PairToVectorList", "(Ljava/lang/Object;)Ljava/lang/Object;", 1); NAMED_MethodID = checkGetMethodID(env, CallRFFIHelperClass, "NAMED", "(Ljava/lang/Object;)I", 1); TYPEOF_MethodID = checkGetMethodID(env, CallRFFIHelperClass, "TYPEOF", "(Ljava/lang/Object;)I", 1); + OBJECT_MethodID = checkGetMethodID(env, CallRFFIHelperClass, "OBJECT", "(Ljava/lang/Object;)I", 1); DUPLICATE_ATTRIB_MethodID = checkGetMethodID(env, CallRFFIHelperClass, "DUPLICATE_ATTRIB", "(Ljava/lang/Object;Ljava/lang/Object;)V", 1); - iS4ObjectMethodID = checkGetMethodID(env, CallRFFIHelperClass, "isS4Object", "(Ljava/lang/Object;)I", 1); + isS4ObjectMethodID = checkGetMethodID(env, CallRFFIHelperClass, "isS4Object", "(Ljava/lang/Object;)I", 1); logObject_MethodID = checkGetMethodID(env, CallRFFIHelperClass, "logObject", "(Ljava/lang/Object;)V", 1); RExternalPtrClass = checkFindClass(env, "com/oracle/truffle/r/runtime/data/RExternalPtr"); @@ -1171,8 +1173,8 @@ SEXP ATTRIB(SEXP x){ } int OBJECT(SEXP x){ - unimplemented("OBJECT"); - return 0; + JNIEnv *env = getEnv(); + return (*env)->CallStaticIntMethod(env, CallRFFIHelperClass, OBJECT_MethodID, x); } int MARK(SEXP x){ @@ -1251,7 +1253,7 @@ R_len_t R_BadLongVector(SEXP x, const char *y, int z) { int IS_S4_OBJECT(SEXP x) { JNIEnv *env = getEnv(); - return (*env)->CallStaticIntMethod(env, CallRFFIHelperClass, iS4ObjectMethodID, x); + return (*env)->CallStaticIntMethod(env, CallRFFIHelperClass, isS4ObjectMethodID, x); } void SET_S4_OBJECT(SEXP x) { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanNode.java index 70123f839c15e0b154621bf3daeafa56d7accca9..19c7b12cbb295cc31af46f47477e359350c09acd 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanNode.java @@ -52,7 +52,6 @@ import com.oracle.truffle.r.runtime.ops.BooleanOperationFactory; /** * Represents a binary or unary operation from the 'logical' subset of Ops R group. The concrete * operation is implemented by factory object given as a constructor parameter, e.g. - * {@link com.oracle.truffle.r.runtime.ops.BinaryCompare.Equal} or * {@link com.oracle.truffle.r.runtime.ops.BinaryLogic.And}. */ public abstract class BinaryBooleanNode extends BinaryNodeBase { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/helpers/RFactorNodes.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/helpers/RFactorNodes.java index b05d17ea20f260ae2c35def3d0212bf3bb216958..3573d38864dd81f79000f0226f7e2f13c7de6fc6 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/helpers/RFactorNodes.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/helpers/RFactorNodes.java @@ -40,7 +40,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; /** * Contains helper nodes related to factors, special R class of {@link RAbstractIntVector}. Note: - * there is also {@see IsFactorNode}, which implements a built-in, for checking factor class. + * there is also {@code IsFactorNode}, which implements a built-in, for checking factor class. */ public final class RFactorNodes { diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java index 72defec846a50ae449017d572d95353bb1494f9c..a3fce16a371db2d0b0cd9e14e07377b988827154 100644 --- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java +++ b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java @@ -54,9 +54,11 @@ import com.oracle.truffle.r.runtime.data.RPromise; import com.oracle.truffle.r.runtime.data.RRaw; import com.oracle.truffle.r.runtime.data.RRawVector; import com.oracle.truffle.r.runtime.data.RS4Object; +import com.oracle.truffle.r.runtime.data.RScalar; import com.oracle.truffle.r.runtime.data.RShareable; 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.RAbstractContainer; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; @@ -538,6 +540,15 @@ public class CallRFFIHelper { } } + public static int OBJECT(Object x) { + if (x instanceof RTypedValue && !(x instanceof RScalar)) { + return ((RTypedValue) x).getIsObject(); + } else { + // TODO: should we throw an error or simply return false for scalars + throw RInternalError.unimplemented(); + } + } + public static Object Rf_duplicate(Object x) { guaranteeInstanceOf(x, RAbstractVector.class); return ((RAbstractVector) x).copy(); diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java index a45378ddf386a42d0d0b7b6b21a4e2a5de927450..e8ea46f80d38dd1ee8b90445017530ade08304a8 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java @@ -368,6 +368,7 @@ public class RSerialize { protected Object readItem(int flags) throws IOException { int levs = flags >>> 12; + int isObj = (flags & Flags.IS_OBJECT_BIT_MASK) == 0 ? 0 : 1; Object result = null; SEXPTYPE type = SEXPTYPE.mapInt(Flags.ptype(flags)); @@ -604,6 +605,7 @@ public class RSerialize { if (!(result instanceof RScalar)) { ((RTypedValue) result).setGPBits(levs); + ((RTypedValue) result).setIsObject(isObj); } else { // for now we only record S4-ness here, and in this case it shoud be 0 assert (levs == 0); @@ -774,7 +776,6 @@ public class RSerialize { default: throw RInternalError.unimplemented(); } - // TODO SETLEVELS if (type == SEXPTYPE.CHARSXP) { /* * With the CHARSXP cache maintained through the ATTRIB field that field has already @@ -786,6 +787,10 @@ public class RSerialize { readItem(); } } else { + // TODO: CHARSXP currently cannot be an object - this is not the case in GNU R + if (!(result instanceof RScalar)) { + ((RTypedValue) result).setIsObject(isObj); + } if (Flags.hasAttr(flags)) { Object attr = readItem(); result = setAttributes(result, attr); diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RBaseObject.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RBaseObject.java index 7d28b31916c625660275257f563f621cd9dbe895..d292a67ba3d34572f0fb3ff69aed312c674de3f4 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RBaseObject.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RBaseObject.java @@ -24,13 +24,13 @@ package com.oracle.truffle.r.runtime.data; abstract class RBaseObject { - protected int gpbits; + protected int typedValueInfo; - public int getGPBits() { - return gpbits; + public int getTypedValueInfo() { + return typedValueInfo; } - public void setGPBits(int value) { - gpbits = value; + public void setTypedValueInfo(int value) { + typedValueInfo = value; } } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java index a365680d20d128c48ab93657ad3970982033a771..5de2ec03861db52c9595ae8527a25792dce353f3 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java @@ -233,12 +233,12 @@ public class RExpression implements RShareable, RAbstractContainer { } @Override - public int getGPBits() { - return data.getGPBits(); + public int getTypedValueInfo() { + return data.getTypedValueInfo(); } @Override - public void setGPBits(int value) { - data.setGPBits(value); + public void setTypedValueInfo(int value) { + data.setTypedValueInfo(value); } } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RFunction.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RFunction.java index c377084e34bb23d370ff602e1c4a7d319ae47d8f..1776974d65fbed194610457acfc2a496d3990ce4 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RFunction.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RFunction.java @@ -144,7 +144,7 @@ public final class RFunction extends RSharingAttributeStorage implements RTypedV } newFunction.initAttributes(newAttributes); } - newFunction.gpbits = gpbits; + newFunction.typedValueInfo = typedValueInfo; return newFunction; } } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RGPBits.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RGPBits.java deleted file mode 100644 index 88f02cb4a5c9014eb60acc80adb054f898381c60..0000000000000000000000000000000000000000 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RGPBits.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.truffle.r.runtime.data; - -/** - * This corresponds to the "general purpose" bits in a GnuR SEXP. It is now rarely used within GnuR - * and many of those uses do not apply to FastR; however, condition handling is one important use. - * We define it as an interface so that only specific types need implement it, {@link RList} in the - * case of condition handling. - * - */ -public interface RGPBits { - int getGPBits(); - - void setGPBits(int value); -} diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java index a053031e4e044207e4ceed3c5c538314a280e247..1ce58cc151dc56f91c4f7372878586fd32aa5282 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java @@ -198,7 +198,7 @@ public class RLanguage extends RSharingAttributeStorage implements RAbstractCont if (this.attributes != null) { l.attributes = attributes.copy(); } - l.gpbits = gpbits; + l.typedValueInfo = typedValueInfo; return l; } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java index b4b18d7de41321683bcec333e2a853a379beb582..dd197d84b085c22e433267f05d54fc2308afd41a 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java @@ -29,7 +29,7 @@ import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.context.RContext; -public final class RList extends RListBase implements RGPBits, TruffleObject { +public final class RList extends RListBase implements TruffleObject { private static final RStringVector implicitClassHeader = RDataFactory.createStringVectorFromScalar(RType.List.getClazz()); 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 e956c0faec14e3357cfe3b4e692b7e480a48ac40..dce983013195da94e1266aa8495c123baa96a6aa 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 @@ -487,12 +487,12 @@ public class RPromise implements RTypedValue { } @Override - public int getGPBits() { + public int getTypedValueInfo() { return 0; } @Override - public void setGPBits(int value) { + public void setTypedValueInfo(int value) { // This gets called from RSerialize, just ignore (for now) } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RS4Object.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RS4Object.java index 017c036641292185cbf88247444e60e0a2c8a68b..4c2c87f3561321c799c0777fb6164f478371988b 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RS4Object.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RS4Object.java @@ -56,7 +56,7 @@ public class RS4Object extends RSharingAttributeStorage { newAttributes.put(attr.getName(), attr.getValue()); } } - resultS4.gpbits = gpbits; + resultS4.typedValueInfo = typedValueInfo; return resultS4; } } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalar.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalar.java index 402b8b2d417d00093f0a41b709fb69b97f300065..332ab5cf0270a00698282e6decd09e3889a79cfb 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalar.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalar.java @@ -29,12 +29,12 @@ import com.oracle.truffle.r.runtime.RInternalError; public abstract class RScalar implements RTypedValue { @Override - public int getGPBits() { + public int getTypedValueInfo() { throw RInternalError.shouldNotReachHere(); } @Override - public void setGPBits(int value) { + public void setTypedValueInfo(int value) { throw RInternalError.shouldNotReachHere(); } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java index bac78060ac764a9f604c3357e0031fedff2729f5..c109a3a19cf98a19fd391c50167d0d883a7e1837 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java @@ -189,12 +189,12 @@ public abstract class RSequence implements RAbstractVector { } @Override - public int getGPBits() { + public int getTypedValueInfo() { return 0; } @Override - public void setGPBits(int value) { + public void setTypedValueInfo(int value) { throw RInternalError.shouldNotReachHere(); } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RTypedValue.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RTypedValue.java index 91aa4dac85d953b1f097f8b7360d9c5a44dea08e..234a6878594186acf6d35192747b1cf2747e9360 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RTypedValue.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RTypedValue.java @@ -22,13 +22,34 @@ import com.oracle.truffle.r.runtime.RType; public interface RTypedValue { // mask values are the same as in GNU R + // as is the layout of data (but it's never exposed so it does not matter for correctness) int S4_MASK = 1 << 4; + int IS_OBJECT_MASK_SHIFT = 5; + int IS_OBJECT_BITS_MASK = 1 << IS_OBJECT_MASK_SHIFT; + int GP_BITS_MASK_SHIFT = 8; + int GP_BITS_MASK = 0xFFFF << GP_BITS_MASK_SHIFT; RType getRType(); - int getGPBits(); + int getTypedValueInfo(); - void setGPBits(int value); + void setTypedValueInfo(int value); + + default int getIsObject() { + return (getTypedValueInfo() & IS_OBJECT_BITS_MASK) >>> IS_OBJECT_MASK_SHIFT; + } + + default void setIsObject(int gpbits) { + setTypedValueInfo((getTypedValueInfo() & ~IS_OBJECT_BITS_MASK) | (gpbits << IS_OBJECT_MASK_SHIFT)); + } + + default int getGPBits() { + return (getTypedValueInfo() & GP_BITS_MASK) >>> GP_BITS_MASK_SHIFT; + } + + default void setGPBits(int gpbits) { + setTypedValueInfo((getTypedValueInfo() & ~GP_BITS_MASK) | (gpbits << GP_BITS_MASK_SHIFT)); + } default boolean isS4() { return (getGPBits() & S4_MASK) == S4_MASK; diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java index 9292adf55f7794dcdcb8e2696eff364b578e5890..a1197ae6546a5f626d0204d437fa15dbbccb7c78 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java @@ -554,7 +554,7 @@ public abstract class RVector extends RSharingAttributeStorage implements RShare RVector result = internalCopy(); setAttributes(result); incCopyCount(); - result.gpbits = gpbits; + result.typedValueInfo = typedValueInfo; return result; } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java index 21952499cc71457ff6317756bc8985a0387ee086..981ba1bc3ee687e7092a83f4caa180dd8c223ec3 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java @@ -184,13 +184,13 @@ abstract class RToVectorClosure implements RAbstractVector { } @Override - public int getGPBits() { - return vector.getGPBits(); + public int getTypedValueInfo() { + return vector.getTypedValueInfo(); } @Override - public void setGPBits(int value) { - vector.setGPBits(value); + public void setTypedValueInfo(int value) { + vector.setTypedValueInfo(value); } @Override