diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ListBuiltin.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ListBuiltin.java index 8d1b5a741a0e99db4fe111dcd0f6d04f7ba2ea7a..60c315de8d989c40083c508b45e15e2977320df9 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ListBuiltin.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ListBuiltin.java @@ -53,7 +53,19 @@ public abstract class ListBuiltin extends RBuiltinNode { @CompilationFinal private RStringVector suppliedSignatureArgNames; - protected RStringVector argNameVector(ArgumentsSignature signature) { + /** + * Creates a shared permanent vector so that it can be re-used for every list(...) with the same + * arguments + */ + protected final RStringVector cachedArgNameVector(ArgumentsSignature signature) { + RStringVector result = argNameVector(signature); + if (result != null) { + result.makeSharedPermanent(); + } + return result; + } + + protected final RStringVector argNameVector(ArgumentsSignature signature) { if (namesNull.profile(signature.getNonNullCount() == 0)) { return null; } @@ -63,9 +75,6 @@ public abstract class ListBuiltin extends RBuiltinNode { names[i] = (orgName == null ? RRuntime.NAMES_ATTR_EMPTY_VALUE : orgName); } RStringVector result = RDataFactory.createStringVector(names, RDataFactory.COMPLETE_VECTOR); - // this is going to be a cached vector re-used for every list(...) with the same arguments, - // it has to be shared. - result.makeSharedPermanent(); return result; } @@ -81,7 +90,7 @@ public abstract class ListBuiltin extends RBuiltinNode { protected RList listCached(RArgsValuesAndNames args, // @Cached("args.getLength()") int cachedLength, // @SuppressWarnings("unused") @Cached("args.getSignature()") ArgumentsSignature cachedSignature, // - @Cached("argNameVector(cachedSignature)") RStringVector cachedArgNames) { + @Cached("cachedArgNameVector(cachedSignature)") RStringVector cachedArgNames) { Object[] argArray = args.getArguments(); for (int i = 0; i < cachedLength; i++) { getShareObjectNode(i).execute(argArray[i]); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quote.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quote.java index eb82f27253d7ef2a3a47f28e734de3583d9e76f6..7fb33e8a4929c47e8cac4dcc24539c59c435cedc 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quote.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quote.java @@ -44,19 +44,27 @@ public abstract class Quote extends RBuiltinNode { public abstract Object execute(RPromise expr); - protected final Object createLanguage(Closure closure) { - Object o = RASTUtils.createLanguageElement(closure.getExpr().asRSyntaxNode()); - if (shareableProfile.profile(o instanceof RShareable)) { - ((RShareable) o).makeSharedPermanent(); + /** + * Creates a shared permanent language so that it can be cached and repeatedly returned as the + * result. + */ + protected final Object cachedCreateLanguage(Closure closure) { + Object result = createLanguage(closure); + if (shareableProfile.profile(result instanceof RShareable)) { + ((RShareable) result).makeSharedPermanent(); } - return o; + return result; + } + + protected final Object createLanguage(Closure closure) { + return RASTUtils.createLanguageElement(closure.getExpr().asRSyntaxNode()); } @SuppressWarnings("unused") @Specialization(limit = "LIMIT", guards = "cachedClosure == expr.getClosure()") protected Object quoteCached(RPromise expr, @Cached("expr.getClosure()") Closure cachedClosure, - @Cached("createLanguage(cachedClosure)") Object language) { + @Cached("cachedCreateLanguage(cachedClosure)") Object language) { return language; } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/WriteIndexedVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/WriteIndexedVectorNode.java index a927fefac5dcb7e12f1b34bbab619f57fe965de6..c485fd53a36a59e8da3e3ff114995a837f8c886b 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/WriteIndexedVectorNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/WriteIndexedVectorNode.java @@ -473,7 +473,6 @@ abstract class WriteIndexedVectorNode extends Node { private final boolean setListElementAsObject; private final boolean isReplace; - private final ConditionProfile isShareable = ConditionProfile.createBinaryProfile(); @Child private UpdateStateOfListElement updateStateOfListElement; @Child private ShareObjectNode shareObjectNode; @@ -481,9 +480,9 @@ abstract class WriteIndexedVectorNode extends Node { this.setListElementAsObject = setListElementAsObject; this.isReplace = isReplace; if (!isReplace) { - updateStateOfListElement = insert(UpdateStateOfListElement.create()); + updateStateOfListElement = UpdateStateOfListElement.create(); } else { - shareObjectNode = insert(ShareObjectNode.create()); + shareObjectNode = ShareObjectNode.create(); } } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java index 90032b7255bad291481256af660a3b846342327e..18920ff210c3c128f1e4c2f2fd087ed81f678643 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java @@ -47,7 +47,8 @@ public abstract class RSharingAttributeStorage extends RAttributeStorage impleme @Override public final void decRefCount() { - assert refCount > 0; + assert refCount != SHARED_PERMANENT_VAL : "cannot decRefCount of shared permanent value"; + assert refCount > 0 : "cannot decRefCount when refCount <= 0"; refCount--; }