diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/color/Col2RGB.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/color/Col2RGB.java index 3afaee6ca7f692e6b86148c1165ee05d18b886c1..09f92a36fd485e1cb5a0d73873a393f98a9f98af 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/color/Col2RGB.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/color/Col2RGB.java @@ -5,7 +5,7 @@ * * Copyright (c) 1997-2014, The R Core Team * Copyright (c) 2003, The R Foundation - * Copyright (c) 2017, Oracle and/or its affiliates + * Copyright (c) 2017, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -27,7 +27,7 @@ import com.oracle.truffle.r.library.fastrGrid.GridColorUtils; import com.oracle.truffle.r.library.fastrGrid.GridContext; import com.oracle.truffle.r.library.fastrGrid.GridState.GridPalette; import com.oracle.truffle.r.library.fastrGrid.device.GridColor; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode; import com.oracle.truffle.r.nodes.function.opt.ShareObjectNode; import com.oracle.truffle.r.runtime.RError.Message; @@ -59,7 +59,7 @@ public abstract class Col2RGB extends RExternalBuiltinNode.Arg2 { @Specialization @TruffleBoundary Object execute(RAbstractVector col, boolean alpha, - @Cached("create()") GetNamesAttributeNode getNames) { + @Cached("create()") ExtractNamesAttributeNode extractNames) { int length = col.getLength(); int columns = alpha ? 4 : 3; int[] result = new int[length * columns]; @@ -108,7 +108,7 @@ public abstract class Col2RGB extends RExternalBuiltinNode.Arg2 { Arrays.fill(result, RRuntime.INT_NA); } - RStringVector names = getNames.getNames(col); + RStringVector names = extractNames.execute(col); RList dimNames = RDataFactory.createList(new Object[]{alpha ? NAMES_ALPHA : NAMES, names == null ? RNull.instance : names}); return RDataFactory.createIntVector(result, false, new int[]{columns, length}, null, dimNames); } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Covcor.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Covcor.java index ad560f471c1f8e794e525b770770c2932c34fbe6..d503a383abb3361671aec1bb5aaacf94d36d3425 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Covcor.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Covcor.java @@ -5,7 +5,7 @@ * * Copyright (c) 1995-2012, The R Core Team * Copyright (c) 2003, The R Foundation - * Copyright (c) 2013, 2017, Oracle and/or its affiliates + * Copyright (c) 2013, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -33,6 +33,7 @@ import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RDoubleVector; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RNull; +import com.oracle.truffle.r.runtime.data.RShareable; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.nodes.GetReadonlyData; import com.oracle.truffle.r.runtime.nmath.RMath; @@ -795,6 +796,9 @@ public abstract class Covcor extends RExternalBuiltinNode.Arg4 { if (dimNames != null) { Object names = dimNames.getDataAt(1); if (names != RNull.instance) { + if (names instanceof RShareable && !((RShareable) names).isShared()) { + ((RShareable) names).incRefCount(); + } newDimNames = RDataFactory.createList(new Object[]{names, names}); } } @@ -804,6 +808,12 @@ public abstract class Covcor extends RExternalBuiltinNode.Arg4 { Object namesX = dimNamesX.getLength() >= 2 ? dimNamesX.getDataAt(1) : RNull.instance; Object namesY = dimNamesY.getLength() >= 2 ? dimNamesY.getDataAt(1) : RNull.instance; if (namesX != RNull.instance || namesY != RNull.instance) { + if (namesX instanceof RShareable && !((RShareable) namesX).isShared()) { + ((RShareable) namesX).incRefCount(); + } + if (namesY instanceof RShareable && !((RShareable) namesY).isShared()) { + ((RShareable) namesY).incRefCount(); + } newDimNames = RDataFactory.createList(new Object[]{namesX, namesY}); } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsCall.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsCall.java index 2bf26e03612ee11a3c3458c7f959dc8a0e4622bf..7139930df041522007009b725c638afec6a756a6 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsCall.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsCall.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -72,12 +72,12 @@ public abstract class AsCall extends RBuiltinNode.Arg1 { private ArgumentsSignature createSignature(RAbstractContainer x) { int length = x.getLength() - 1; - if (nullNamesProfile.profile(getNamesNode.getNames(x) == null)) { + RStringVector ns = getNamesNode.getNames(x); + if (nullNamesProfile.profile(ns == null)) { return ArgumentsSignature.empty(length); } else { String[] names = new String[length]; // extract names, converting "" to null - RStringVector ns = getNamesNode.getNames(x); for (int i = 0; i < length; i++) { String name = ns.getDataAt(i + 1); if (name != null && !name.isEmpty()) { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java index 33364751766bc9dd9cd61da732615d77464bd0bb..165ad928eaa36e1efebf1232f3bd27e18f9670b2 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -39,7 +39,7 @@ import com.oracle.truffle.r.nodes.RASTUtils; import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetDimAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetDimNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; @@ -154,7 +154,7 @@ public abstract class Bind extends RBaseNode { } private Object bindInternal(int deparseLevel, Object[] args, RArgsValuesAndNames promiseArgs, CastNode castNode, boolean needsVectorCast, SetDimAttributeNode setDimNode, - GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) { + GetDimNamesAttributeNode getDimNamesNode, ExtractNamesAttributeNode extractNamesNode) { ArgumentsSignature signature = promiseArgs.getSignature(); String[] vecNames = nullNamesProfile.profile(signature.getNonNullCount() == 0) ? null : new String[signature.getLength()]; RAbstractVector[] vectors = new RAbstractVector[args.length]; @@ -205,10 +205,10 @@ public abstract class Bind extends RBaseNode { if (type == BindType.cbind) { return genericCBind(promiseArgs, vectors, resultVec, resultDimensions, bindDims, rowsAndColumnsNotEqual, allEmpty, vecNames, deparseLevel, setDimNode, getDimNamesNode, - getNamesNode); + extractNamesNode); } else { return genericRBind(promiseArgs, vectors, resultVec, resultDimensions, bindDims, rowsAndColumnsNotEqual, allEmpty, vecNames, deparseLevel, setDimNode, getDimNamesNode, - getNamesNode); + extractNamesNode); } } @@ -236,8 +236,8 @@ public abstract class Bind extends RBaseNode { @Cached("create()") CastLogicalNode cast, @Cached("create()") SetDimAttributeNode setDimNode, @Cached("create()") GetDimNamesAttributeNode getDimNamesNode, - @Cached("create()") GetNamesAttributeNode getNamesNode) { - return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, getNamesNode); + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { + return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, extractNamesNode); } @Specialization(guards = {"precedence == INT_PRECEDENCE", "args.length > 1"}) @@ -245,8 +245,8 @@ public abstract class Bind extends RBaseNode { @Cached("create()") CastIntegerNode cast, @Cached("create()") SetDimAttributeNode setDimNode, @Cached("create()") GetDimNamesAttributeNode getDimNamesNode, - @Cached("create()") GetNamesAttributeNode getNamesNode) { - return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, getNamesNode); + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { + return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, extractNamesNode); } @Specialization(guards = {"precedence == DOUBLE_PRECEDENCE", "args.length > 1"}) @@ -254,8 +254,8 @@ public abstract class Bind extends RBaseNode { @Cached("create()") CastDoubleNode cast, @Cached("create()") SetDimAttributeNode setDimNode, @Cached("create()") GetDimNamesAttributeNode getDimNamesNode, - @Cached("create()") GetNamesAttributeNode getNamesNode) { - return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, getNamesNode); + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { + return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, extractNamesNode); } @Specialization(guards = {"precedence == STRING_PRECEDENCE", "args.length> 1"}) @@ -263,8 +263,8 @@ public abstract class Bind extends RBaseNode { @Cached("create()") CastStringNode cast, @Cached("create()") SetDimAttributeNode setDimNode, @Cached("create()") GetDimNamesAttributeNode getDimNamesNode, - @Cached("create()") GetNamesAttributeNode getNamesNode) { - return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, getNamesNode); + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { + return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, extractNamesNode); } @Specialization(guards = {"precedence == COMPLEX_PRECEDENCE", "args.length > 1"}) @@ -272,8 +272,8 @@ public abstract class Bind extends RBaseNode { @Cached("create()") CastComplexNode cast, @Cached("create()") SetDimAttributeNode setDimNode, @Cached("create()") GetDimNamesAttributeNode getDimNamesNode, - @Cached("create()") GetNamesAttributeNode getNamesNode) { - return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, getNamesNode); + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { + return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, extractNamesNode); } @Specialization(guards = {"precedence == LIST_PRECEDENCE", "args.length > 1"}) @@ -281,15 +281,15 @@ public abstract class Bind extends RBaseNode { @Cached("create()") CastListNode cast, @Cached("create()") SetDimAttributeNode setDimNode, @Cached("create()") GetDimNamesAttributeNode getDimNamesNode, - @Cached("create()") GetNamesAttributeNode getNamesNode) { - return bindInternal(deparseLevel, args, promiseArgs, cast, false, setDimNode, getDimNamesNode, getNamesNode); + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { + return bindInternal(deparseLevel, args, promiseArgs, cast, false, setDimNode, getDimNamesNode, extractNamesNode); } /** * Compute dimnames for rows (cbind) or columns (rbind) from names of elements of combined * vectors. */ - protected Object getDimResultNamesFromElements(RAbstractVector vec, int dimLength, int dimInd, GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) { + protected Object getDimResultNamesFromElements(RAbstractVector vec, int dimLength, int dimInd, GetDimNamesAttributeNode getDimNamesNode, ExtractNamesAttributeNode extractNamesNode) { Object firstDimResultNames = RNull.instance; Object firstDimNames = RNull.instance; int[] dim = getVectorDimensions(vec); @@ -300,7 +300,7 @@ public abstract class Bind extends RBaseNode { } } else { if (!GetDimAttributeNode.isArray(dim) || dim.length == 1) { - RStringVector names = getNamesNode.getNames(vec); + RStringVector names = extractNamesNode.execute(vec); firstDimNames = names == null ? RNull.instance : names; } else { RInternalError.unimplemented("binding multi-dimensional arrays is not supported"); @@ -436,7 +436,7 @@ public abstract class Bind extends RBaseNode { @Specialization(guards = {"precedence != NO_PRECEDENCE", "args.length == 1"}) protected Object allOneElem(int deparseLevel, Object[] args, RArgsValuesAndNames promiseArgs, @SuppressWarnings("unused") int precedence, - @Cached("create()") GetNamesAttributeNode getNamesNode) { + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { RAbstractVector vec = vectorProfile.profile(castVector(args[0])); int[] rawDimensions = null; @@ -447,7 +447,7 @@ public abstract class Bind extends RBaseNode { // for cbind dimNamesA is names for the 1st dim and dimNamesB is names for 2nd dim; for // rbind the other way around - Object dimNamesA = getNamesNode.getNames(vec); + Object dimNamesA = extractNamesNode.execute(vec); if (dimNamesA == null) { dimNamesA = RNull.instance; } @@ -480,7 +480,7 @@ public abstract class Bind extends RBaseNode { public RVector<?> genericCBind(RArgsValuesAndNames promiseArgs, RAbstractVector[] vectors, RVector<?> result, int[] resultDimensions, int[] secondDims, boolean rowsAndColumnsNotEqual, boolean allEmpty, String[] vecNames, int deparseLevel, SetDimAttributeNode setDimNode, - GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) { + GetDimNamesAttributeNode getDimNamesNode, ExtractNamesAttributeNode extractNamesNode) { int ind = 0; Object rowDimResultNames = RNull.instance; @@ -491,7 +491,7 @@ public abstract class Bind extends RBaseNode { RAbstractVector vec = vectorProfile.profile(vectors[i]); if (rowDimResultNames == RNull.instance) { // get the first valid names value - rowDimResultNames = getDimResultNamesFromElements(vec, resultDimensions[0], 0, getDimNamesNode, getNamesNode); + rowDimResultNames = getDimResultNamesFromElements(vec, resultDimensions[0], 0, getDimNamesNode, extractNamesNode); } // compute dimnames for the second dimension @@ -662,7 +662,7 @@ public abstract class Bind extends RBaseNode { public RVector<?> genericRBind(RArgsValuesAndNames promiseArgs, RAbstractVector[] vectors, RVector<?> result, int[] resultDimensions, int[] firstDims, boolean rowsAndColumnsNotEqual, boolean allEmpty, String[] vecNames, int deparseLevel, SetDimAttributeNode setDimNode, - GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) { + GetDimNamesAttributeNode getDimNamesNode, ExtractNamesAttributeNode extractNamesNode) { Object colDimResultNames = RNull.instance; String[] rowDimNamesArray = new String[resultDimensions[0]]; @@ -673,7 +673,7 @@ public abstract class Bind extends RBaseNode { RAbstractVector vec = vectorProfile.profile(vectors[i]); if (colDimResultNames == RNull.instance) { // get the first valid names value - colDimResultNames = getDimResultNamesFromElements(vec, resultDimensions[1], 1, getDimNamesNode, getNamesNode); + colDimResultNames = getDimResultNamesFromElements(vec, resultDimensions[1], 1, getDimNamesNode, extractNamesNode); } // compute dimnames for the second dimension diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Combine.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Combine.java index deb22fedc6ec8eb660b1ac3195d127d86619fe9c..874f8e320fef45f3adb59da7f008c49b2a4d5e44 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Combine.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Combine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, 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 @@ -49,7 +49,8 @@ import com.oracle.truffle.api.nodes.NodeCost; import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.api.profiles.ValueProfile; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.nodes.unary.CastComplexNodeGen; @@ -479,8 +480,8 @@ public abstract class Combine extends RBuiltinNode.Arg2 { protected static final class CombineInputCast extends Node { - @Child private GetDimNamesAttributeNode getDimNamesNode; - @Child private GetNamesAttributeNode getNamesNode; + @Child private ExtractDimNamesAttributeNode extractDimNamesNode; + @Child private ExtractNamesAttributeNode extractNamesNode; private final ValueProfile valueProfile = ValueProfile.createClassProfile(); private final ValueProfile inputValueProfile = ValueProfile.createClassProfile(); @@ -493,29 +494,29 @@ public abstract class Combine extends RBuiltinNode.Arg2 { if (profiled instanceof RVector<?>) { RVector<?> vector = (RVector<?>) profiled; if (vector.getAttributes() != null) { - if (getNamesNode == null) { + if (extractNamesNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - getNamesNode = insert(GetNamesAttributeNode.create()); + extractNamesNode = insert(ExtractNamesAttributeNode.create()); } if (hasNamesProfile == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); hasNamesProfile = ConditionProfile.createBinaryProfile(); } - RStringVector vecNames = getNamesNode.getNames(vector); + RStringVector vecNames = extractNamesNode.execute(vector); if (hasNamesProfile.profile(vecNames != null)) { RVector<?> result = vector.copyDropAttributes(); result.initAttributes(RAttributesLayout.createNames(vecNames)); return result; } else { - if (getDimNamesNode == null) { + if (extractDimNamesNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - getDimNamesNode = insert(GetDimNamesAttributeNode.create()); + extractDimNamesNode = insert(ExtractDimNamesAttributeNode.create()); } if (hasDimNamesProfile == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); hasDimNamesProfile = ConditionProfile.createBinaryProfile(); } - RList dimNames = getDimNamesNode.getDimNames(vector); + RList dimNames = extractDimNamesNode.execute(vector); if (hasDimNamesProfile.profile(dimNames != null)) { RVector<?> result = vector.copyDropAttributes(); result.initAttributes(RAttributesLayout.createDimNames(dimNames)); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMax.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMax.java index b21e15c0bcfccc12fd6186f06637d87390850e3c..37f7e4ef581c20c6d95e0b220ecc7bc914b7d392 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMax.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMax.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2017, Oracle and/or its affiliates + * Copyright (c) 2014, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -25,7 +25,7 @@ import java.util.Arrays; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.profiles.ConditionProfile; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; @@ -44,7 +44,7 @@ import com.oracle.truffle.r.runtime.ops.na.NACheck; public abstract class CumMax extends RBuiltinNode.Arg1 { private final NACheck na = NACheck.create(); - @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create(); + @Child private ExtractNamesAttributeNode extractNamesNode = ExtractNamesAttributeNode.create(); static { Casts casts = new Casts(CumMax.class); @@ -110,7 +110,7 @@ public abstract class CumMax extends RBuiltinNode.Arg1 { } cmaxV[i] = max; } - return RDataFactory.createDoubleVector(cmaxV, na.neverSeenNA(), getNamesNode.getNames(v)); + return RDataFactory.createDoubleVector(cmaxV, na.neverSeenNA(), extractNamesNode.execute(v)); } @Specialization(replaces = "cummaxIntSequence") @@ -131,6 +131,6 @@ public abstract class CumMax extends RBuiltinNode.Arg1 { } cmaxV[i] = max; } - return RDataFactory.createIntVector(cmaxV, na.neverSeenNA(), getNamesNode.getNames(v)); + return RDataFactory.createIntVector(cmaxV, na.neverSeenNA(), extractNamesNode.execute(v)); } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMin.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMin.java index c558b2df55593104dfa129c01f52fedb1118e3a6..8f3f91ee46b8c53d41f44164ccd4d814b8039a2d 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMin.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMin.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2017, Oracle and/or its affiliates + * Copyright (c) 2014, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -25,7 +25,7 @@ import java.util.Arrays; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.profiles.ConditionProfile; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; @@ -44,7 +44,7 @@ import com.oracle.truffle.r.runtime.ops.na.NACheck; public abstract class CumMin extends RBuiltinNode.Arg1 { private final NACheck na = NACheck.create(); - @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create(); + @Child private ExtractNamesAttributeNode extractNamesNode = ExtractNamesAttributeNode.create(); static { Casts casts = new Casts(CumMin.class); @@ -110,7 +110,7 @@ public abstract class CumMin extends RBuiltinNode.Arg1 { } cminV[i] = min; } - return RDataFactory.createDoubleVector(cminV, na.neverSeenNA(), getNamesNode.getNames(v)); + return RDataFactory.createDoubleVector(cminV, na.neverSeenNA(), extractNamesNode.execute(v)); } @Specialization(replaces = "cumminIntSequence") @@ -131,6 +131,6 @@ public abstract class CumMin extends RBuiltinNode.Arg1 { } cminV[i] = min; } - return RDataFactory.createIntVector(cminV, na.neverSeenNA(), getNamesNode.getNames(v)); + return RDataFactory.createIntVector(cminV, na.neverSeenNA(), extractNamesNode.execute(v)); } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumProd.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumProd.java index c89d7c817a7af2462be489289b92eece6e822f67..a54fc11fc16cca93fd804c4f7786395fdfb300bf 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumProd.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumProd.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2017, Oracle and/or its affiliates + * Copyright (c) 2014, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -21,7 +21,7 @@ import java.util.Arrays; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; @@ -31,6 +31,8 @@ import com.oracle.truffle.r.runtime.data.RComplexVector; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RDoubleVector; import com.oracle.truffle.r.runtime.data.RNull; +import com.oracle.truffle.r.runtime.data.RShareable; +import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.nodes.VectorAccess; @@ -40,12 +42,12 @@ import com.oracle.truffle.r.runtime.ops.BinaryArithmetic; @RBuiltin(name = "cumprod", kind = PRIMITIVE, parameterNames = {"x"}, dispatch = MATH_GROUP_GENERIC, behavior = PURE) public abstract class CumProd extends RBuiltinNode.Arg1 { - @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create(); + @Child private ExtractNamesAttributeNode extractNamesNode = ExtractNamesAttributeNode.create(); @Child private BinaryArithmetic mul = BinaryArithmetic.MULTIPLY.createOperation(); static { Casts casts = new Casts(CumProd.class); - casts.arg("x").allowNull().mustBe(missingValue().not(), RError.Message.ARGUMENT_EMPTY, 0, "cumsum", 1).mapIf(complexValue().not(), asDoubleVector(true, false, false)); + casts.arg("x").allowNull().mustBe(missingValue().not(), RError.Message.ARGUMENT_EMPTY, 0, "cumprod", 1).mapIf(complexValue().not(), asDoubleVector(true, false, false)); } @Specialization @@ -78,7 +80,7 @@ public abstract class CumProd extends RBuiltinNode.Arg1 { assert !RRuntime.isNA(prev) : "double multiplication should not introduce NAs"; array[iter.getIndex()] = prev; } - return RDataFactory.createDoubleVector(array, xAccess.na.neverSeenNA(), getNamesNode.getNames(x)); + return RDataFactory.createDoubleVector(array, xAccess.na.neverSeenNA(), extractNamesNode.execute(x)); } } @@ -105,7 +107,7 @@ public abstract class CumProd extends RBuiltinNode.Arg1 { array[iter.getIndex() * 2] = prev.getRealPart(); array[iter.getIndex() * 2 + 1] = prev.getImaginaryPart(); } - return RDataFactory.createComplexVector(array, xAccess.na.neverSeenNA(), getNamesNode.getNames(x)); + return RDataFactory.createComplexVector(array, xAccess.na.neverSeenNA(), extractNamesNode.execute(x)); } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumSum.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumSum.java index a84d226b6aa3e719e9a0865df57368ac10a44e67..649244b6678a969e8a25d511ec4e97c5531d95e5 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumSum.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumSum.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, 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 @@ -38,7 +38,7 @@ import java.util.Arrays; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; @@ -49,6 +49,8 @@ import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RDoubleVector; import com.oracle.truffle.r.runtime.data.RIntVector; import com.oracle.truffle.r.runtime.data.RNull; +import com.oracle.truffle.r.runtime.data.RShareable; +import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; @@ -60,7 +62,7 @@ import com.oracle.truffle.r.runtime.ops.BinaryArithmetic; @RBuiltin(name = "cumsum", kind = PRIMITIVE, parameterNames = {"x"}, dispatch = MATH_GROUP_GENERIC, behavior = PURE) public abstract class CumSum extends RBuiltinNode.Arg1 { - @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create(); + @Child private ExtractNamesAttributeNode extractNamesNode = ExtractNamesAttributeNode.create(); @Child private BinaryArithmetic add = BinaryArithmetic.ADD.createOperation(); static { @@ -86,17 +88,17 @@ public abstract class CumSum extends RBuiltinNode.Arg1 { @Specialization(guards = "x.getLength()==0") protected RAbstractVector cumEmpty(RAbstractComplexVector x) { - return RDataFactory.createComplexVector(new double[0], true, getNamesNode.getNames(x)); + return RDataFactory.createComplexVector(new double[0], true, extractNamesNode.execute(x)); } @Specialization(guards = "x.getLength()==0") protected RAbstractVector cumEmpty(RAbstractDoubleVector x) { - return RDataFactory.createDoubleVector(new double[0], true, getNamesNode.getNames(x)); + return RDataFactory.createDoubleVector(new double[0], true, extractNamesNode.execute(x)); } @Specialization(guards = "x.getLength()==0") protected RAbstractVector cumEmpty(RAbstractIntVector x) { - return RDataFactory.createIntVector(new int[0], true, getNamesNode.getNames(x)); + return RDataFactory.createIntVector(new int[0], true, extractNamesNode.execute(x)); } @Specialization(guards = "xAccess.supports(x)") @@ -119,7 +121,7 @@ public abstract class CumSum extends RBuiltinNode.Arg1 { } array[iter.getIndex()] = prev; } - return RDataFactory.createIntVector(array, xAccess.na.neverSeenNA() && !add.introducesNA(), getNamesNode.getNames(x)); + return RDataFactory.createIntVector(array, xAccess.na.neverSeenNA() && !add.introducesNA(), extractNamesNode.execute(x)); } } @@ -148,7 +150,7 @@ public abstract class CumSum extends RBuiltinNode.Arg1 { assert !RRuntime.isNA(prev) : "double addition should not introduce NAs"; array[iter.getIndex()] = prev; } - return RDataFactory.createDoubleVector(array, xAccess.na.neverSeenNA(), getNamesNode.getNames(x)); + return RDataFactory.createDoubleVector(array, xAccess.na.neverSeenNA(), extractNamesNode.execute(x)); } } @@ -175,7 +177,7 @@ public abstract class CumSum extends RBuiltinNode.Arg1 { array[iter.getIndex() * 2] = prev.getRealPart(); array[iter.getIndex() * 2 + 1] = prev.getImaginaryPart(); } - return RDataFactory.createComplexVector(array, xAccess.na.neverSeenNA(), getNamesNode.getNames(x)); + return RDataFactory.createComplexVector(array, xAccess.na.neverSeenNA(), extractNamesNode.execute(x)); } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsNA.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsNA.java index 37d8da2fa8707921e44f38ef3b1093974fe2838c..0f70cd2f0de9e97467f409bfaff47d53d1389d2d 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsNA.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsNA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, 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 @@ -33,8 +33,8 @@ import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RError; @@ -59,8 +59,8 @@ public abstract class IsNA extends RBuiltinNode.Arg1 { @Child private VectorFactory factory = VectorFactory.create(); @Child private GetDimAttributeNode getDimsNode = GetDimAttributeNode.create(); - @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create(); - @Child private GetDimNamesAttributeNode getDimNamesNode = GetDimNamesAttributeNode.create(); + @Child private ExtractNamesAttributeNode extractNamesNode = ExtractNamesAttributeNode.create(); + @Child private ExtractDimNamesAttributeNode extractDimNamesNode = ExtractDimNamesAttributeNode.create(); static { Casts.noCasts(IsNA.class); @@ -143,7 +143,7 @@ public abstract class IsNA extends RBuiltinNode.Arg1 { } data[iter.getIndex()] = RRuntime.asLogical(isNA); } - return factory.createLogicalVector(data, RDataFactory.COMPLETE_VECTOR, getDimsNode.getDimensions(vector), getNamesNode.getNames(vector), getDimNamesNode.getDimNames(vector)); + return factory.createLogicalVector(data, RDataFactory.COMPLETE_VECTOR, getDimsNode.getDimensions(vector), extractNamesNode.execute(vector), extractDimNamesNode.execute(vector)); } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.java index 6c7d0b0488098623f3dbabf3e319dc1b7368bb0c..d13b44e5c9c3c93526c95a9cc2a1eaffe2b81e77 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2017, Oracle and/or its affiliates + * Copyright (c) 2014, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -32,7 +32,7 @@ import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode; 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.ExtractVectorNodeGen; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.nodes.builtin.base.LapplyNodeGen.LapplyInternalNodeGen; import com.oracle.truffle.r.nodes.control.RLengthNode; @@ -84,10 +84,10 @@ public abstract class Lapply extends RBuiltinNode.Arg2 { @Specialization protected Object lapply(VirtualFrame frame, RAbstractVector vec, RFunction fun, - @Cached("create()") GetNamesAttributeNode getNamesNode) { + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { Object[] result = lapply.execute(frame, vec, fun); // set here else it gets overridden by the iterator evaluation - return RDataFactory.createList(result, getNamesNode.getNames(vec)); + return RDataFactory.createList(result, extractNamesNode.execute(vec)); } @Specialization diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/MatMult.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/MatMult.java index 286ed49c6b59006cfbce45ef2992eb83e971dd03..7046d59e62a772f6534c0513b0ff6287260fbb19 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/MatMult.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/MatMult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, 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 @@ -53,6 +53,7 @@ import com.oracle.truffle.r.runtime.data.RDoubleVector; import com.oracle.truffle.r.runtime.data.RIntVector; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RNull; +import com.oracle.truffle.r.runtime.data.RShareable; import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector; import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; @@ -237,10 +238,16 @@ public abstract class MatMult extends RBuiltinNode.Arg2 { Object dimName1 = RNull.instance; if (aDimNames != null && aDimNames.getLength() > 0) { dimName1 = aDimNames.getDataAt(0); + if (dimName1 instanceof RShareable && !((RShareable) dimName1).isShared()) { + ((RShareable) dimName1).incRefCount(); + } } Object dimName2 = RNull.instance; if (bDimNames != null && bDimNames.getLength() > 1) { dimName2 = bDimNames.getDataAt(1); + if (dimName2 instanceof RShareable && !((RShareable) dimName2).isShared()) { + ((RShareable) dimName2).incRefCount(); + } } setDimNamesNode.setDimNames(resultVec, RDataFactory.createList(new Object[]{dimName1, dimName2})); return resultVec; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java index a9b767a2be16d0c3bfe87321b1dedbf798b052bf..05f0fff0a9cb34a3aeb3dbc64532ac3d6c12b35e 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, 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 @@ -35,8 +35,8 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.api.profiles.LoopConditionProfile; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetDimNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RError.Message; @@ -76,8 +76,8 @@ public abstract class NChar extends RBuiltinNode.Arg4 { @Cached("createBinaryProfile()") ConditionProfile keepNAProfile, @Cached("create()") GetDimAttributeNode getDimNode, @Cached("create()") SetDimNamesAttributeNode setDimNamesNode, - @Cached("create()") GetDimNamesAttributeNode getDimNamesNode, - @Cached("create()") GetNamesAttributeNode getNamesNode) { + @Cached("create()") ExtractDimNamesAttributeNode extractDimNamesNode, + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { convertType(type); boolean keepNA = keepNAProfile.profile(keepNAIn); int len = vector.getLength(); @@ -93,8 +93,8 @@ public abstract class NChar extends RBuiltinNode.Arg4 { result[i] = (int) (Math.log10(x) + 1); // not the fastest one } } - RIntVector resultVector = RDataFactory.createIntVector(result, isComplete, getDimNode.getDimensions(vector), getNamesNode.getNames(vector)); - RList dimNames = getDimNamesNode.getDimNames(vector); + RIntVector resultVector = RDataFactory.createIntVector(result, isComplete, getDimNode.getDimensions(vector), extractNamesNode.execute(vector)); + RList dimNames = extractDimNamesNode.execute(vector); if (nullDimNamesProfile.profile(dimNames != null)) { setDimNamesNode.setDimNames(resultVector, dimNames); } @@ -109,8 +109,8 @@ public abstract class NChar extends RBuiltinNode.Arg4 { @Cached("createBinaryProfile()") ConditionProfile keepNAProfile, @Cached("create()") GetDimAttributeNode getDimNode, @Cached("create()") SetDimNamesAttributeNode setDimNamesNode, - @Cached("create()") GetDimNamesAttributeNode getDimNamesNode, - @Cached("create()") GetNamesAttributeNode getNamesNode) { + @Cached("create()") ExtractDimNamesAttributeNode extractDimNamesNode, + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { convertType(type); boolean keepNA = keepNAProfile.profile(keepNAIn); int len = vector.getLength(); @@ -126,8 +126,8 @@ public abstract class NChar extends RBuiltinNode.Arg4 { result[i] = item.length(); } } - RIntVector resultVector = RDataFactory.createIntVector(result, isComplete, getDimNode.getDimensions(vector), getNamesNode.getNames(vector)); - RList dimNames = getDimNamesNode.getDimNames(vector); + RIntVector resultVector = RDataFactory.createIntVector(result, isComplete, getDimNode.getDimensions(vector), extractNamesNode.execute(vector)); + RList dimNames = extractDimNamesNode.execute(vector); if (nullDimNamesProfile.profile(dimNames != null)) { setDimNamesNode.setDimNames(resultVector, dimNames); } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Scan.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Scan.java index d0b58d9b2f95e060ff3699ad2b2a08deef9f89b7..0cbba8600c47507e83e6e659b4620b82e98f2548 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Scan.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Scan.java @@ -5,7 +5,7 @@ * * Copyright (c) 1995, 1996, Robert Gentleman and Ross Ihaka * Copyright (c) 1998-2013, The R Core Team - * Copyright (c) 2014, 2017, Oracle and/or its affiliates + * Copyright (c) 2014, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -34,7 +34,7 @@ import java.util.HashMap; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.nodes.unary.CastToVectorNode; import com.oracle.truffle.r.nodes.unary.CastToVectorNodeGen; @@ -64,7 +64,7 @@ public abstract class Scan extends RBuiltinNode.Arg19 { private static final int NO_COMCHAR = 100000; /* won't occur even in Unicode */ private final NACheck naCheck = NACheck.create(); - @Child private GetNamesAttributeNode getNames = GetNamesAttributeNode.create(); + @Child private ExtractNamesAttributeNode extractNames = ExtractNamesAttributeNode.create(); @Child private CastToVectorNode castVector; @@ -315,7 +315,7 @@ public abstract class Scan extends RBuiltinNode.Arg19 { list.updateDataAt(i, vec.createEmptySameType(blockSize, RDataFactory.COMPLETE_VECTOR), null); } } - list.setNames(getNames.getNames(what)); + list.setNames(extractNames.execute(what)); naCheck.enable(true); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java index 9d9e87d1c0e3cc7a032311959d65dec6d46c54e4..3658cf4856dd0b53191a21110105b48e4ea5523c 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, 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 @@ -29,10 +29,12 @@ import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.profiles.BranchProfile; +import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.api.profiles.IntValueProfile; import com.oracle.truffle.api.profiles.ValueProfile; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetRowNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; +import com.oracle.truffle.r.nodes.function.opt.UpdateShareableChildValueNode; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.builtins.RBuiltin; @@ -46,8 +48,10 @@ public abstract class ShortRowNames extends RBuiltinNode.Arg2 { private final BranchProfile naValueMet = BranchProfile.create(); private final ValueProfile operandTypeProfile = ValueProfile.createClassProfile(); + private final ConditionProfile nonNullValue = ConditionProfile.createBinaryProfile(); @Child private GetRowNamesAttributeNode getRowNamesNode = GetRowNamesAttributeNode.create(); + @Child private UpdateShareableChildValueNode updateRefCount = UpdateShareableChildValueNode.create(); static { Casts casts = new Casts(ShortRowNames.class); @@ -73,6 +77,10 @@ public abstract class ShortRowNames extends RBuiltinNode.Arg2 { if (type >= 1) { int n = calculateN(rowNames); rowNames = type == 1 ? n : Math.abs(n); + } else { + if (nonNullValue.profile(rowNames != null)) { + updateRefCount.updateState(operand, rowNames); + } } if (rowNames == null) { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLowerOrUpper.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLowerOrUpper.java index 7078e5bb37dc2d44cc13d2f0b43f9c34110d81e9..9c5686314c4c9935d6627395193aa7f205573c25 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLowerOrUpper.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLowerOrUpper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, 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 @@ -34,7 +34,7 @@ import com.oracle.truffle.api.profiles.LoopConditionProfile; import com.oracle.truffle.r.nodes.attributes.CopyOfRegAttributesNode; import com.oracle.truffle.r.nodes.attributes.CopyOfRegAttributesNodeGen; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.nodes.profile.VectorLengthProfile; import com.oracle.truffle.r.runtime.RRuntime; @@ -52,7 +52,7 @@ public abstract class ToLowerOrUpper { private final VectorLengthProfile lengthProfile = VectorLengthProfile.create(); private final LoopConditionProfile loopProfile = LoopConditionProfile.createCountingProfile(); private final NACheck na = NACheck.create(); - @Child private GetNamesAttributeNode getNames = GetNamesAttributeNode.create(); + @Child private ExtractNamesAttributeNode extractNames = ExtractNamesAttributeNode.create(); @Child private CopyOfRegAttributesNode copyAttributes = CopyOfRegAttributesNodeGen.create(); @Child private GetDimAttributeNode getDimNode = GetDimAttributeNode.create(); @@ -83,7 +83,7 @@ public abstract class ToLowerOrUpper { String value = vector.getDataAt(i); stringVector[i] = elementFunction(value, i, function); } - RStringVector result = RDataFactory.createStringVector(stringVector, vector.isComplete(), getDimNode.getDimensions(vector), getNames.getNames(vector)); + RStringVector result = RDataFactory.createStringVector(stringVector, vector.isComplete(), getDimNode.getDimensions(vector), extractNames.execute(vector)); copyAttributes.execute(vector, result); return result; } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java index e48d76d60b510b783cc077266c62cd66f2114f8d..6ee0bd71c9059fa8f27e81e34a64ce30e5612cbb 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java @@ -6,7 +6,7 @@ * Copyright (c) 1995, 1996, 1997 Robert Gentleman and Ross Ihaka * Copyright (c) 1995-2014, The R Core Team * Copyright (c) 2002-2008, The R Foundation - * Copyright (c) 2015, 2017, Oracle and/or its affiliates + * Copyright (c) 2015, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -26,7 +26,7 @@ import com.oracle.truffle.r.nodes.attributes.InitAttributesNode; import com.oracle.truffle.r.nodes.attributes.SetFixedAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.nodes.function.opt.ReuseNonSharedNode; import com.oracle.truffle.r.nodes.profile.VectorLengthProfile; @@ -58,7 +58,7 @@ public abstract class Transpose extends RBuiltinNode.Arg1 { @Child private SetFixedAttributeNode putDimensions = SetFixedAttributeNode.createDim(); @Child private SetFixedAttributeNode putDimNames = SetFixedAttributeNode.createDimNames(); @Child private GetDimNamesAttributeNode getDimNamesNode = GetDimNamesAttributeNode.create(); - @Child private GetNamesAttributeNode getAxisNamesNode = GetNamesAttributeNode.create(); + @Child private ExtractNamesAttributeNode extractAxisNamesNode = ExtractNamesAttributeNode.create(); @Child private GetDimAttributeNode getDimNode = GetDimAttributeNode.create(); @Child private ReuseNonSharedNode reuseNonShared = ReuseNonSharedNode.create(); @@ -224,7 +224,7 @@ public abstract class Transpose extends RBuiltinNode.Arg1 { if (dimNames != null) { hasDimNamesProfile.enter(); assert dimNames.getLength() == 2; - RStringVector axisNames = getAxisNamesNode.getNames(dimNames); + RStringVector axisNames = extractAxisNamesNode.execute(dimNames); RStringVector transAxisNames = axisNames == null ? null : RDataFactory.createStringVector(new String[]{axisNames.getDataAt(1), axisNames.getDataAt(0)}, true); RList newDimNames = RDataFactory.createList(new Object[]{dimNames.getDataAt(1), dimNames.getDataAt(0)}, transAxisNames); putDimNames.execute(dest.getAttributes(), newDimNames); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/VApply.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/VApply.java index c4ef69e257b504728928dec2d04497c9b409c195..cd1813dd6fa3375eea5bc6dcb880c2f3ae689654 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/VApply.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/VApply.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -34,7 +34,7 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.profiles.ConditionProfile; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetDimAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetDimNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetNamesAttributeNode; @@ -96,8 +96,8 @@ public abstract class VApply extends RBuiltinNode.Arg4 { @Child private CastLogicalNode castLogical; @Child private CastStringNode castString; @Child private SetDimAttributeNode setDimNode; - @Child private GetNamesAttributeNode getColNamesNode = GetNamesAttributeNode.create(); - @Child private GetNamesAttributeNode getRowNamesNode = GetNamesAttributeNode.create(); + @Child private ExtractNamesAttributeNode extractColNamesNode = ExtractNamesAttributeNode.create(); + @Child private ExtractNamesAttributeNode extractRowNamesNode = ExtractNamesAttributeNode.create(); @Child private SetDimNamesAttributeNode setDimNamesNode = SetDimNamesAttributeNode.create(); @Child private SetNamesAttributeNode setNamesNode = SetNamesAttributeNode.create(); @@ -210,7 +210,7 @@ public abstract class VApply extends RBuiltinNode.Arg4 { if (useNamesProfile.profile(useNames)) { // the names from the input vector are used as the column names in the result - RStringVector names = getColNamesNode.getNames(vecMat); + RStringVector names = extractColNamesNode.execute(vecMat); RStringVector colNames = null; if (names != null) { colNames = names; @@ -222,7 +222,7 @@ public abstract class VApply extends RBuiltinNode.Arg4 { // take the names from the first input vector and use it as the row names in the // result Object firstVec = applyResult[0]; - Object rn = getRowNamesNode.getNames(firstVec); + Object rn = extractRowNamesNode.execute(firstVec); rowNames = rn == null ? RNull.instance : rn; } if (colNames != null) { @@ -230,7 +230,7 @@ public abstract class VApply extends RBuiltinNode.Arg4 { } } } else if (useNamesProfile.profile(useNames)) { - RStringVector names = getColNamesNode.getNames(vecMat); + RStringVector names = extractColNamesNode.execute(vecMat); RStringVector newNames = null; if (names != null) { newNames = names; diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java index d11144c8c2e8a2439546f6f3d208b9bcc756a160..e30bc965b2099203e4140436e17dea1c5ad8691a 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -26,7 +26,7 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.r.nodes.access.vector.PositionsCheckNode.PositionProfile; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RError.Message; import com.oracle.truffle.r.runtime.RRuntime; @@ -60,7 +60,7 @@ abstract class PositionCheckSubscriptNode extends PositionCheckNode { @Specialization protected RAbstractVector doLogical(PositionProfile statistics, int dimSize, RAbstractLogicalVector position, int positionLength, - @Cached("create()") GetNamesAttributeNode getNamesNode) { + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { positionNACheck.enable(position); byte value = position.getDataAt(0); if (positionLength != 1) { @@ -76,12 +76,12 @@ abstract class PositionCheckSubscriptNode extends PositionCheckNode { } } - return doIntegerImpl(statistics, dimSize, positionNACheck.convertLogicalToInt(value), position, getNamesNode); + return doIntegerImpl(statistics, dimSize, positionNACheck.convertLogicalToInt(value), position, extractNamesNode); } @Specialization protected RAbstractVector doInteger(PositionProfile profile, int dimSize, RAbstractIntVector position, int positionLength, - @Cached("create()") GetNamesAttributeNode getNamesNode) { + @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { if (positionLength != 1) { error.enter(); Message message; @@ -99,10 +99,10 @@ abstract class PositionCheckSubscriptNode extends PositionCheckNode { } assert positionLength == 1; positionNACheck.enable(position); - return doIntegerImpl(profile, dimSize, position.getDataAt(0), position, getNamesNode); + return doIntegerImpl(profile, dimSize, position.getDataAt(0), position, extractNamesNode); } - private RAbstractVector doIntegerImpl(PositionProfile profile, int dimSize, int value, RAbstractVector originalVector, GetNamesAttributeNode getNamesNode) { + private RAbstractVector doIntegerImpl(PositionProfile profile, int dimSize, int value, RAbstractVector originalVector, ExtractNamesAttributeNode extractNamesNode) { int result; if (greaterZero.profile(value > 0)) { // fast path @@ -119,7 +119,7 @@ abstract class PositionCheckSubscriptNode extends PositionCheckNode { } profile.selectedPositionsCount = 1; - RStringVector names = getNamesNode.getNames(originalVector); + RStringVector names = extractNamesNode.execute(originalVector); if (names != null) { return RDataFactory.createIntVector(new int[]{result}, !profile.containsNA, names); } else { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/CopyAttributesNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/CopyAttributesNode.java index 312e5a7de419c353ac5b8a5446d7e8eac69f192e..aad0f72b6b7ef6e2ea83e31af1300e2d506c1518 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/CopyAttributesNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/CopyAttributesNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -28,6 +28,7 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.object.DynamicObject; import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.api.profiles.ConditionProfile; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; @@ -52,6 +53,7 @@ public abstract class CopyAttributesNode extends RBaseNode { @Child protected HasFixedAttributeNode hasDimNode = HasFixedAttributeNode.createDim(); @Child protected GetDimNamesAttributeNode getDimNamesNode = GetDimNamesAttributeNode.create(); + @Child protected ExtractDimNamesAttributeNode extractDimNamesNode = ExtractDimNamesAttributeNode.create(); @Child protected GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create(); protected CopyAttributesNode(boolean copyAllAttributes) { @@ -181,7 +183,7 @@ public abstract class CopyAttributesNode extends RBaseNode { putDim.execute(initAttributes.execute(result), RDataFactory.createIntVector(newDimensions, RDataFactory.COMPLETE_VECTOR)); if (result != left) { - RList newDimNames = getDimNamesNode.getDimNames(left); + RList newDimNames = extractDimNamesNode.execute(left); if (hasDimNames.profile(newDimNames != null)) { putDimNames.execute(result.getAttributes(), newDimNames); @@ -189,7 +191,7 @@ public abstract class CopyAttributesNode extends RBaseNode { return result; } if (result != right) { - newDimNames = getDimNamesNode.getDimNames(right); + newDimNames = extractDimNamesNode.execute(right); if (hasDimNames.profile(newDimNames != null)) { setDimNamesNode.setDimNames(result, newDimNames); } @@ -247,7 +249,7 @@ public abstract class CopyAttributesNode extends RBaseNode { RVector.verifyDimensions(result.getLength(), newDimensions, this); putDim.execute(initAttributes.execute(result), RDataFactory.createIntVector(newDimensions, RDataFactory.COMPLETE_VECTOR)); if (rightNotResult) { - RList newDimNames = getDimNamesNode.getDimNames(right); + RList newDimNames = extractDimNamesNode.execute(right); if (hasDimNames.profile(newDimNames != null)) { setDimNamesNode.setDimNames(result, newDimNames); } @@ -297,7 +299,7 @@ public abstract class CopyAttributesNode extends RBaseNode { } putDim.execute(initAttributes.execute(result), RDataFactory.createIntVector(newDimensions, RDataFactory.COMPLETE_VECTOR)); if (left != result) { - RList newDimNames = getDimNamesNode.getDimNames(left); + RList newDimNames = extractDimNamesNode.execute(left); if (hasDimNames.profile(newDimNames != null)) { setDimNamesNode.setDimNames(result, newDimNames); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java index 9065b89e74f397e6f32b6da70e6924e22a20495a..bbf2c3212f896341f230fc57e5380797c2c54d57 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, 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 @@ -34,6 +34,7 @@ import com.oracle.truffle.api.profiles.ValueProfile; import com.oracle.truffle.r.nodes.access.vector.ExtractListElement; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctionsFactory.GetDimAttributeNodeGen; import com.oracle.truffle.r.nodes.function.opt.ShareObjectNode; +import com.oracle.truffle.r.nodes.function.opt.UpdateShareableChildValueNode; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RRuntime; @@ -466,6 +467,30 @@ public final class SpecialAttributesFunctions { } } + public abstract static class ExtractNamesAttributeNode extends RBaseNode { + + @Child private GetNamesAttributeNode getNames = GetNamesAttributeNode.create(); + @Child private UpdateShareableChildValueNode updateRefCount = UpdateShareableChildValueNode.create(); + + private final ConditionProfile nonNullValue = ConditionProfile.createBinaryProfile(); + + public static ExtractNamesAttributeNode create() { + return SpecialAttributesFunctionsFactory.ExtractNamesAttributeNodeGen.create(); + } + + public abstract RStringVector execute(Object x); + + @Specialization + protected RStringVector extractNames(Object x) { + RStringVector names = getNames.getNames(x); + if (nonNullValue.profile(names != null)) { + updateRefCount.updateState(x, names); + } + return names; + } + + } + public abstract static class SetDimAttributeNode extends SetSpecialAttributeNode { private final ConditionProfile nullDimProfile = ConditionProfile.createBinaryProfile(); @@ -903,13 +928,37 @@ public final class SpecialAttributesFunctions { } } + public abstract static class ExtractDimNamesAttributeNode extends RBaseNode { + + @Child private GetDimNamesAttributeNode getDimNames = GetDimNamesAttributeNode.create(); + @Child private UpdateShareableChildValueNode updateRefCount = UpdateShareableChildValueNode.create(); + + private final ConditionProfile nonNullValue = ConditionProfile.createBinaryProfile(); + + public static ExtractDimNamesAttributeNode create() { + return SpecialAttributesFunctionsFactory.ExtractDimNamesAttributeNodeGen.create(); + } + + public abstract RList execute(Object x); + + @Specialization + protected RList extractDimNames(Object x) { + RList dimNames = getDimNames.getDimNames(x); + if (nonNullValue.profile(dimNames != null)) { + updateRefCount.updateState(x, dimNames); + } + return dimNames; + } + + } + public abstract static class InitDimsNamesDimNamesNode extends RBaseNode { private final ConditionProfile doAnythingProfile = ConditionProfile.createBinaryProfile(); @Child private GetDimAttributeNode getDimNode; - @Child private GetNamesAttributeNode getNamesNode; - @Child private GetDimNamesAttributeNode getDimNamesNode; + @Child private ExtractNamesAttributeNode extractNamesNode; + @Child private ExtractDimNamesAttributeNode extractDimNamesNode; protected InitDimsNamesDimNamesNode() { } @@ -929,15 +978,15 @@ public final class SpecialAttributesFunctions { CompilerDirectives.transferToInterpreterAndInvalidate(); getDimNode = insert(GetDimAttributeNode.create()); } - if (getNamesNode == null) { + if (extractNamesNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - getNamesNode = insert(GetNamesAttributeNode.create()); + extractNamesNode = insert(ExtractNamesAttributeNode.create()); } - if (getDimNamesNode == null) { + if (extractDimNamesNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - getDimNamesNode = insert(GetDimNamesAttributeNode.create()); + extractDimNamesNode = insert(ExtractDimNamesAttributeNode.create()); } - this.initAttributes(x, getDimNode.getDimensions(source), getNamesNode.getNames(source), getDimNamesNode.getDimNames(source)); + this.initAttributes(x, getDimNode.getDimensions(source), extractNamesNode.execute(source), extractDimNamesNode.execute(source)); } public abstract void execute(RAbstractContainer x, int[] dimensions, RStringVector names, RList dimNames); @@ -1247,4 +1296,29 @@ public final class SpecialAttributesFunctions { return getClassAttr(x) != null ? true : false; } } + + public abstract static class ExtractClassAttributeNode extends RBaseNode { + + @Child private GetClassAttributeNode getClassAttr = GetClassAttributeNode.create(); + @Child private UpdateShareableChildValueNode updateRefCount = UpdateShareableChildValueNode.create(); + + private final ConditionProfile nonNullValue = ConditionProfile.createBinaryProfile(); + + public static ExtractClassAttributeNode create() { + return SpecialAttributesFunctionsFactory.ExtractClassAttributeNodeGen.create(); + } + + public abstract RStringVector execute(Object x); + + @Specialization + protected RStringVector extractClassAttr(Object x) { + RStringVector classAttr = getClassAttr.getClassAttr(x); + if (nonNullValue.profile(classAttr != null)) { + updateRefCount.updateState(x, classAttr); + } + return classAttr; + } + + } + } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/UnaryCopyAttributesNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/UnaryCopyAttributesNode.java index 3452bef34398d5ec2e810c7f78b2d0ed1a543fdf..7d3c0b125a4507dbb285911c9df407c4ab6b9158 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/UnaryCopyAttributesNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/UnaryCopyAttributesNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -26,6 +26,7 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.object.DynamicObject; import com.oracle.truffle.api.profiles.ConditionProfile; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; @@ -52,6 +53,7 @@ public abstract class UnaryCopyAttributesNode extends RBaseNode { protected final boolean copyAllAttributes; @Child protected HasFixedAttributeNode hasDimNode = HasFixedAttributeNode.createDim(); + @Child protected ExtractDimNamesAttributeNode extractDimNamesNode = ExtractDimNamesAttributeNode.create(); @Child protected GetDimNamesAttributeNode getDimNamesNode = GetDimNamesAttributeNode.create(); @Child protected GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create(); @@ -122,7 +124,7 @@ public abstract class UnaryCopyAttributesNode extends RBaseNode { putDim.execute(initAttributes.execute(result), RDataFactory.createIntVector(newDimensions, RDataFactory.COMPLETE_VECTOR)); - RList newDimNames = getDimNamesNode.getDimNames(source); + RList newDimNames = extractDimNamesNode.execute(source); if (hasDimNames.profile(newDimNames != null)) { updateRefCountNode.execute(updateChildRefCountNode.updateState(source, newDimNames)); putDimNames.execute(result.getAttributes(), newDimNames); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java index 1ee0499aa4ace76f7fa3e2b83eadb38ac6d32d38..02783204a1feec72503aee2c11b83b5acd909c23 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, 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 @@ -34,9 +34,9 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.Message; import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode; +import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode; -import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; @@ -61,8 +61,8 @@ public abstract class UnaryNotNode extends RBuiltinNode.Arg1 { private final NAProfile naProfile = NAProfile.create(); @Child private GetDimAttributeNode getDims = GetDimAttributeNode.create(); - @Child private GetNamesAttributeNode getNames = GetNamesAttributeNode.create(); - @Child private GetDimNamesAttributeNode getDimNames = GetDimNamesAttributeNode.create(); + @Child private ExtractNamesAttributeNode extractNames = ExtractNamesAttributeNode.create(); + @Child private ExtractDimNamesAttributeNode extractDimNames = ExtractDimNamesAttributeNode.create(); static { Casts.noCasts(UnaryNotNode.class); @@ -171,7 +171,7 @@ public abstract class UnaryNotNode extends RBuiltinNode.Arg1 { if (vectorAccess.getType() == RType.Logical) { ((RVector<?>) result).copyAttributesFrom(vector); } else { - factory.reinitializeAttributes((RVector<?>) result, getDims.getDimensions(vector), getNames.getNames(vector), getDimNames.getDimNames(vector)); + factory.reinitializeAttributes((RVector<?>) result, getDims.getDimensions(vector), extractNames.execute(vector), extractDimNames.execute(vector)); } break; } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index f1573834db43b803314f84bbb2b0bf2a351c7d46..b0318c4c27d6ba2ddbcd4b62b91ddc77ece88df1 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -16720,6 +16720,11 @@ C 50 122 194 [2,] 6.208008e+00 -25013.757 [3,] 1.665335e-16 8362.723 +##com.oracle.truffle.r.test.builtins.TestBuiltin_cummax.testCumulativeMax# +#a <- structure(1:3, names=c('a1','a2','a3')); b<-cummax(a); names(b)[1]<-'x'; a; +a1 a2 a3 + 1 2 3 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_cummax.testCumulativeMax# #values <- c(1,2,NA,1, NaN); cummax(values); cummax(as.integer(values)) [1] 1 2 NA NA NA @@ -16810,6 +16815,11 @@ numeric(0) #argv <- list(structure(numeric(0), .Dim = c(0L, 0L)));cummax(argv[[1]]); numeric(0) +##com.oracle.truffle.r.test.builtins.TestBuiltin_cummin.testCumulativeMin# +#a <- structure(1:3, names=c('a1','a2','a3')); b<-cummin(a); names(b)[1]<-'x'; a; +a1 a2 a3 + 1 2 3 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_cummin.testCumulativeMin# #values <- c(1,2,NA,1, NaN); cummin(values); cummin(as.integer(values)) [1] 1 1 NA NA NA @@ -16900,6 +16910,11 @@ numeric(0) #argv <- list(FALSE);cummin(argv[[1]]); [1] 0 +##com.oracle.truffle.r.test.builtins.TestBuiltin_cumprod.testCumProd# +#a <- structure(c(1,2,3), names=c('a1','a2','a3')); b<-cumprod(a); names(b)[1]<-'x'; a; +a1 a2 a3 + 1 2 3 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_cumprod.testCumProd# #values <- c(1,2,NA,1, NaN); cumprod(values); cumprod(as.integer(values)) [1] 1 2 NA NA NA @@ -16971,6 +16986,11 @@ numeric(0) #argv <- list(character(0));cumprod(argv[[1]]); numeric(0) +##com.oracle.truffle.r.test.builtins.TestBuiltin_cumsum.testCumulativeSum# +#a <- structure(c(1,2,3), names=c('a1','a2','a3')); b<-cumsum(a); names(b)[1]<-'x'; a; +a1 a2 a3 + 1 2 3 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_cumsum.testCumulativeSum# #values <- c(1,2,NA,1, NaN); cumsum(values); cumsum(as.integer(values)) [1] 1 3 NA NA NA @@ -74466,6 +74486,11 @@ y ~ 0 + x Time differences in mins [1] 6.666667 1366.500000 +##com.oracle.truffle.r.test.builtins.TestBuiltin_tolower.testCharUtils# +#a <- structure(c('X', 'Y'), names=c('a1','a2')); b<-toupper(a); names(b)[1]<-'bb'; a; + a1 a2 +"X" "Y" + ##com.oracle.truffle.r.test.builtins.TestBuiltin_tolower.testCharUtils# #tolower(NA_integer_) [1] NA @@ -74598,6 +74623,11 @@ character(0) #argv <- structure(list(x = c('NA', NA, 'BANANA')), .Names = 'x');do.call('tolower', argv) [1] "na" NA "banana" +##com.oracle.truffle.r.test.builtins.TestBuiltin_toupper.testCharUtils# +#a <- structure(c('x', 'y'), names=c('a1','a2')); b<-toupper(a); names(b)[1]<-'bb'; a; + a1 a2 +"x" "y" + ##com.oracle.truffle.r.test.builtins.TestBuiltin_toupper.testCharUtils# #{ m <- matrix("hi") ; toupper(m) } [,1] @@ -77642,6 +77672,11 @@ Error in vapply(quote(a), function(x) quote(b), quote(a)) : #{ a <- vapply(list(a=1:20,b=1:20), function (x) x, FUN.VALUE=1:20); attributes(a); a[1:5] } [1] 1 2 3 4 5 +##com.oracle.truffle.r.test.builtins.TestBuiltin_vapply.testVapplyNames# +#{ a<-structure(1:2, names=c('a1','a2')); b<-vapply(a, function(v) v + 3, 0); names(b)[1]<-'x'; a } +a1 a2 + 1 2 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_vapply.testVapplyNames# #{ b <- list(a=structure(c(1:3), names=c('x','y')),b=structure(c(1:3), names=c('x2','y2','z2'))); a <- vapply(b, function (x) x, FUN.VALUE=1:3); attributes(a); a[1:5] } [1] 1 2 3 1 2 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummax.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummax.java index 79f0191cc5ed936e7602b81288318bbc4c49e21d..0cb95f712430c9af6b5ac262fe9a263edb6a3d2d 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummax.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummax.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2017, Oracle and/or its affiliates + * Copyright (c) 2013, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -72,5 +72,7 @@ public class TestBuiltin_cummax extends TestBase { assertEval("values <- c(1,2,NaN,1, NA); cummax(values); cummax(as.integer(values))"); assertEval("values <- c(1,2,NA,1, NaN); cummax(values); cummax(as.integer(values))"); + + assertEval("a <- structure(1:3, names=c('a1','a2','a3')); b<-cummax(a); names(b)[1]<-'x'; a; "); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummin.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummin.java index d6a462e391d8f69bda7a900a845598efbec4a165..fd3c8004bd1f11be744d9a84dae97d8ac8327fc0 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummin.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummin.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2017, Oracle and/or its affiliates + * Copyright (c) 2013, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -71,5 +71,7 @@ public class TestBuiltin_cummin extends TestBase { assertEval("values <- c(1,2,NaN,1, NA); cummin(values); cummin(as.integer(values))"); assertEval("values <- c(1,2,NA,1, NaN); cummin(values); cummin(as.integer(values))"); + + assertEval("a <- structure(1:3, names=c('a1','a2','a3')); b<-cummin(a); names(b)[1]<-'x'; a; "); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumprod.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumprod.java index 4a3dd190b5ae4ade5904660e8cecd9f983a90816..d002c089983c108ec4543cebbd33de63b0fa0df8 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumprod.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumprod.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2017, Oracle and/or its affiliates + * Copyright (c) 2014, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -71,5 +71,7 @@ public class TestBuiltin_cumprod extends TestBase { public void testCumProd() { assertEval("values <- c(1,2,NaN,1, NA); cumprod(values); cumprod(as.integer(values))"); assertEval("values <- c(1,2,NA,1, NaN); cumprod(values); cumprod(as.integer(values))"); + + assertEval("a <- structure(c(1,2,3), names=c('a1','a2','a3')); b<-cumprod(a); names(b)[1]<-'x'; a; "); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumsum.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumsum.java index cee940d99ed89219bd8ec43a0c114b25be6d8ad6..ccd1bb25699060fd9c0e919e599a76ff648ed24c 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumsum.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumsum.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2017, Oracle and/or its affiliates + * Copyright (c) 2013, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -117,5 +117,7 @@ public class TestBuiltin_cumsum extends TestBase { assertEval("values <- c(1,2,NaN,1, NA); cumsum(values); cumsum(as.integer(values))"); assertEval("values <- c(1,2,NA,1, NaN); cumsum(values); cumsum(as.integer(values))"); + + assertEval("a <- structure(c(1,2,3), names=c('a1','a2','a3')); b<-cumsum(a); names(b)[1]<-'x'; a; "); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tolower.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tolower.java index 7128a9526223d8293b3fee9d16a167918f2a8e1b..2cfea5cb98d1c6d90c98de898c0289d7f9fe7e91 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tolower.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tolower.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2016, Oracle and/or its affiliates + * Copyright (c) 2013, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -64,5 +64,6 @@ public class TestBuiltin_tolower extends TestBase { assertEval("tolower(c('NA', 'na'))"); assertEval("tolower(NA_integer_)"); assertEval("tolower(NA_real_)"); + assertEval("a <- structure(c('X', 'Y'), names=c('a1','a2')); b<-toupper(a); names(b)[1]<-'bb'; a; "); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_toupper.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_toupper.java index fe8582dd9dbe41b8ac5bf513a9ccc690285fce6e..056c61bb1f11eae7a71f33684e27ad08f9fd0f94 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_toupper.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_toupper.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2016, Oracle and/or its affiliates + * Copyright (c) 2013, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -51,5 +51,6 @@ public class TestBuiltin_toupper extends TestBase { assertEval("{ toupper(1E100) }"); assertEval("{ m <- matrix(\"hi\") ; toupper(m) }"); assertEval("{ toupper(c(a=\"hi\", \"hello\")) }"); + assertEval("a <- structure(c('x', 'y'), names=c('a1','a2')); b<-toupper(a); names(b)[1]<-'bb'; a; "); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_vapply.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_vapply.java index 69b4df6cae9b6e07aea08cb05c4a8b3944c89ec5..279ae37c652f8cb2e1040f81d845fbc33e25203e 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_vapply.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_vapply.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2017, Oracle and/or its affiliates + * Copyright (c) 2013, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -62,5 +62,6 @@ public class TestBuiltin_vapply extends TestBase { public void testVapplyNames() { assertEval("{ a <- vapply(list(a=1:20,b=1:20), function (x) x, FUN.VALUE=1:20); attributes(a); a[1:5] }"); assertEval("{ b <- list(a=structure(c(1:3), names=c('x','y')),b=structure(c(1:3), names=c('x2','y2','z2'))); a <- vapply(b, function (x) x, FUN.VALUE=1:3); attributes(a); a[1:5] }"); + assertEval("{ a<-structure(1:2, names=c('a1','a2')); b<-vapply(a, function(v) v + 3, 0); names(b)[1]<-'x'; a }"); } }