diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java index 6151ad2bbaccb09068f29d7f2ff6148e3d298a7d..170a295e8fe911bb56f3c76686181890e86546ad 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java @@ -146,8 +146,12 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess { while (call.isPromise()) { call = call.getParent(); } - RSyntaxElement syntaxNode = call.getSyntaxNode(); - return RDataFactory.createLanguage(getOrCreateLanguageClosure(((RSyntaxNode) syntaxNode).asRNode())); + if (call.isValidCaller()) { + RSyntaxElement syntaxNode = call.getSyntaxNode(); + return RDataFactory.createLanguage(getOrCreateLanguageClosure(((RSyntaxNode) syntaxNode).asRNode())); + } else { + return null; + } } private static RBaseNode checkBuiltin(RBaseNode bn) { diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java index 560011c158ea0db24aa33c15d1d89c5896ee64a6..1f2e0458e85e733384e84da407c258a436dcdd47 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java @@ -2385,8 +2385,8 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { @Override public Object FASTR_DATAPTR(Object x) { - if (x instanceof RStringVector) { - return VectorRFFIWrapper.get((RStringVector) x); + if ((x instanceof RStringVector) || (x instanceof RList)) { + return VectorRFFIWrapper.get((TruffleObject) x); } CompilerDirectives.transferToInterpreter(); throw RError.error(RError.NO_CALLER, Message.GENERIC, "DATAPTR not implemented for type " + Utils.getTypeName(x)); diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/CoerceNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/CoerceNodes.java index a033907b132636a70b2c198b0c4e58fd46cce6fb..75fa5ac45b3a68a4b91a364e28bbac2f1b6f6b01 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/CoerceNodes.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/CoerceNodes.java @@ -45,6 +45,7 @@ import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RError.Message; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RRuntime; +import com.oracle.truffle.r.runtime.Utils; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RNull; @@ -93,7 +94,7 @@ public final class CoerceNodes { for (int i = v.getLength() - 1; i >= 0; i--) { Object element = v.getDataAtAsObject(i); adjustSharing(v, element); - current = RDataFactory.createPairList(element, current, names != null ? RDataFactory.createSymbol(names.getDataAt(i)) : RNull.instance, gnurType); + current = RDataFactory.createPairList(element, current, names != null ? RDataFactory.createSymbol(Utils.intern(names.getDataAt(i))) : RNull.instance, gnurType); } if (current != RNull.instance) { // also copy regular attributes diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java index 481fdadfeff83e376e5bf2d1c6cfd9686e32987a..86f1d018283918777bdbfd9172c0f913d6ed98ad 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java @@ -50,6 +50,7 @@ import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RPromise; import com.oracle.truffle.r.runtime.data.RSymbol; import com.oracle.truffle.r.runtime.env.REnvironment; +import com.oracle.truffle.r.runtime.env.frame.ActiveBinding; public abstract class RfEvalNode extends FFIUpCallNode.Arg2 { @@ -104,6 +105,9 @@ public abstract class RfEvalNode extends FFIUpCallNode.Arg2 { if (result == null) { throw RError.error(RError.NO_CALLER, UNKNOWN_OBJECT, expr.getName()); } + if (result instanceof ActiveBinding) { + result = ((ActiveBinding) result).readValue(); + } return result; } diff --git a/com.oracle.truffle.r.native/fficall/src/common/Makefile b/com.oracle.truffle.r.native/fficall/src/common/Makefile index ba07abcf7e62dd3cb1f5ad9ad183e14736e7a7a2..6de400872b56c57fa44b769a652664ef0b9fde28 100644 --- a/com.oracle.truffle.r.native/fficall/src/common/Makefile +++ b/com.oracle.truffle.r.native/fficall/src/common/Makefile @@ -37,7 +37,7 @@ GNUR_APPL_SRC = $(GNUR_HOME)/src/appl GNUR_APPL_F_FILES := $(notdir $(wildcard $(GNUR_APPL_SRC)/d*.f)) GNUR_APPL_C_FILES := $(notdir $(wildcard $(GNUR_APPL_SRC)/*.c)) -GNUR_MAIN_C_FILES = errors.c colors.c devices.c engine.c format.c graphics.c plot.c plot3d.c plotmath.c rlocale.c sort.c +GNUR_MAIN_C_FILES = errors.c colors.c devices.c engine.c format.c graphics.c plot.c plot3d.c plotmath.c rlocale.c sort.c duplicate.c GNUR_MAIN_SRC = $(GNUR_HOME)/src/main GNUR_UNIX_C_FILES = sys-std.c diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h index 1b03bf85389f81dd0c37edc48b76b8d5222559b7..1f70dcd5aa6ab6eb88c2d34ba697bde3c82aa46b 100644 --- a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h +++ b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h @@ -668,7 +668,7 @@ SEXP Rf_lengthgets(SEXP x, R_len_t y) { SEXP Rf_xlengthgets(SEXP x, R_xlen_t y) { TRACE1(x); - return unimplemented("Rf_xlengthgets"); + return Rf_lengthgets(x, y); } SEXP R_lsInternal(SEXP env, Rboolean all) { @@ -1139,8 +1139,7 @@ SEXP SET_VECTOR_ELT(SEXP x, R_xlen_t i, SEXP v) { SEXP *STRING_PTR(SEXP x) { TRACE0(); - unimplemented("STRING_PTR"); - return NULL; + return FASTR_DATAPTR(x); } SEXP * NORET VECTOR_PTR(SEXP x) { diff --git a/com.oracle.truffle.r.native/gnur/patch/src/main/duplicate.c b/com.oracle.truffle.r.native/gnur/patch/src/main/duplicate.c new file mode 100644 index 0000000000000000000000000000000000000000..9b82333708d6e74581feaf07d2ea1a12c0bd4d7f --- /dev/null +++ b/com.oracle.truffle.r.native/gnur/patch/src/main/duplicate.c @@ -0,0 +1,66 @@ +/* + * R : A Computer Language for Statistical Data Analysis + * Copyright (C) 1995, 1996 Robert Gentleman and Ross Ihaka + * (C) 2004 The R Foundation + * Copyright (C) 1998--2015 The R Core Team. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, a copy is available at + * https://www.R-project.org/Licenses/ + */ + + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "Defn.h" + +#include <R_ext/RS.h> /* S4 bit */ + +#include "duplicate.h" + +SEXP lazy_duplicate(SEXP s) { + switch (TYPEOF(s)) { + case NILSXP: + case SYMSXP: + case ENVSXP: + case SPECIALSXP: + case BUILTINSXP: + case EXTPTRSXP: + case BCODESXP: + case WEAKREFSXP: + case CHARSXP: + case PROMSXP: + break; + case CLOSXP: + case LISTSXP: + case LANGSXP: + case DOTSXP: + case EXPRSXP: + case VECSXP: + case LGLSXP: + case INTSXP: + case REALSXP: + case CPLXSXP: + case RAWSXP: + case STRSXP: + case S4SXP: + SET_NAMED(s, 2); + break; + default: + UNIMPLEMENTED_TYPE("lazy_duplicate", s); + } + return s; +} diff --git a/com.oracle.truffle.r.native/gnur/patch/src/main/duplicate.h b/com.oracle.truffle.r.native/gnur/patch/src/main/duplicate.h new file mode 100644 index 0000000000000000000000000000000000000000..b331474df26b23ed141537c5535cc8196bbce4ed --- /dev/null +++ b/com.oracle.truffle.r.native/gnur/patch/src/main/duplicate.h @@ -0,0 +1,24 @@ +/* + * R : A Computer Language for Statistical Data Analysis + * Copyright (C) 1995--2017 The R Core Team. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, a copy is available at + * https://www.R-project.org/Licenses/ + */ + +#ifndef R_DUPLICATE_H +#define R_DUPLICATE_H + +#endif /* R_DUPLICATE_H */ diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java index 9795ef2ae7f1678a9c19880b20c7efdb1a8c8ba2..e95336338fd909f2bba72b97d1121f8448ca1d6b 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java @@ -494,6 +494,7 @@ public class GrepFunctions { if (fixed) { if (gsub) { replacement = replacement.replace("$", "\\$"); + replacement = convertGroups(replacement, 0); value = Pattern.compile(pattern, Pattern.LITERAL).matcher(input).replaceAll(replacement); } else { int ix = input.indexOf(pattern); @@ -560,9 +561,9 @@ public class GrepFunctions { value = sb.toString(); } } else { - replacement = convertGroups(replacement); - Matcher matcher = Pattern.compile(pattern, Pattern.DOTALL).matcher(input); + replacement = convertGroups(replacement, matcher.groupCount()); + if (gsub) { value = matcher.replaceAll(replacement); } else { @@ -712,7 +713,7 @@ public class GrepFunctions { } @TruffleBoundary - private static String convertGroups(String value) { + private static String convertGroups(String value, int groupCount) { StringBuilder result = new StringBuilder(); int i = 0; while (i < value.length()) { @@ -723,12 +724,14 @@ public class GrepFunctions { result.append('\\'); } else { c = value.charAt(i); - if (c >= '0' && c <= '9') { - result.append('$'); + if (c >= '1' && c <= '9') { + int gi = c - '0'; + if (gi <= groupCount) { + result.append('$').append(c); + } } else { - result.append('\\'); + result.append('\\').append(c); } - result.append(c); } } else { result.append(c); diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntimeASTAccess.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntimeASTAccess.java index 6e36754bf6cb9bced1502fb885eb9417e2e5ee1d..130195cdbd88cb7fdec121bf4b56d94280992c1e 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntimeASTAccess.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntimeASTAccess.java @@ -46,7 +46,8 @@ public interface RRuntimeASTAccess { /** * Returns the real caller associated with {@code rl}, by locating the {@code RSyntaxNode} - * associated with the node stored with {@code rl}. + * associated with the node stored with {@code rl}. It may return {@code null} if there is no + * valid caller. */ RPairList getSyntaxCaller(RCaller rl); @@ -76,7 +77,8 @@ public interface RRuntimeASTAccess { * Convenience method for {@code getCallerSource(getSyntaxCaller(caller))}. */ default String getCallerSource(RCaller caller) { - return getCallerSource(getSyntaxCaller(caller)); + final RPairList syntaxCaller = getSyntaxCaller(caller); + return syntaxCaller == null ? "<invalid call>" : getCallerSource(syntaxCaller); } /** diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java index bde4fc9fc75a14d7497748642cf071429ccac7e3..05aa093963735b6c10da874432ea73ea7876bdd6 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java @@ -118,9 +118,9 @@ public final class NativeDataAccess { /** * The truly allocated length of the native data array. Expected to be either kept at zero * if not used, or to be a value >= length.<br> - * + * * Expected usage in native code: - * + * * <pre> * SEXP vector = allocVector(STRSXP, 1024); * SETLENGTH(newnames, 10); @@ -188,6 +188,18 @@ public final class NativeDataAccess { } } + @TruffleBoundary + void allocateNative(Object[] elements) { + long addr = dataAddress = allocateNativeMemory(elements.length * Long.BYTES); + for (int i = 0; i < elements.length; i++) { + Object element = elements[i]; + if (element instanceof RSequence) { + element = ((RSequence) element).createVector(); + } + UnsafeAdapter.UNSAFE.putLong(addr + i * Long.BYTES, asPointer(element)); + } + } + // TODO: turn this into reference queues @Override protected void finalize() throws Throwable { @@ -858,6 +870,17 @@ public final class NativeDataAccess { return mirror.dataAddress; } + static long allocateNativeContents(RList list, Object[] elements) { + NativeMirror mirror = (NativeMirror) list.getNativeMirror(); + assert mirror != null; + if (mirror.dataAddress == 0) { + // Note: shall the list become writeable and not only read-only, we should + // crate assumption like for other vector types + mirror.allocateNative(elements); + } + return mirror.dataAddress; + } + @TruffleBoundary public static long allocateNativeStringArray(String[] data) { // We allocate contiguous memory that we'll use to store both the array of pointers (char**) diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java index 510bf7d39c6864c9a9b404a51d3c7345efa28d51..6f57350cdf5e5a42b59f39e19251ede2519598be 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java @@ -241,12 +241,12 @@ public final class RComplexVector extends RVector<double[]> implements RAbstract @Override protected double getComplexRImpl(AccessIterator accessIter, int index) { - return hasStore ? ((double[]) accessIter.getStore())[index * 2] : NativeDataAccess.getDoubleNativeMirrorData(accessIter.getStore(), index * 2); + return hasStore ? ((double[]) accessIter.getStore())[index * 2] : NativeDataAccess.getComplexNativeMirrorDataR(accessIter.getStore(), index); } @Override protected double getComplexIImpl(AccessIterator accessIter, int index) { - return hasStore ? ((double[]) accessIter.getStore())[index * 2 + 1] : NativeDataAccess.getDoubleNativeMirrorData(accessIter.getStore(), index * 2 + 1); + return hasStore ? ((double[]) accessIter.getStore())[index * 2 + 1] : NativeDataAccess.getComplexNativeMirrorDataI(accessIter.getStore(), index); } @Override diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java index 25f8af5e9ddafe30173fbab2e2eb623d30d0b758..076c84132ecea6f79fd0e0e653588be534554173 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java @@ -93,6 +93,10 @@ public final class RList extends RListBase implements RAbstractListVector { return RDataFactory.createList(copyResizedData(size, fillNA), dimensions); } + public long allocateNativeContents() { + return NativeDataAccess.allocateNativeContents(this, data); + } + private static final class FastPathAccess extends FastPathFromListAccess { FastPathAccess(RAbstractContainer value) { diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/VectorRFFIWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/VectorRFFIWrapper.java index 2561d6b77ac747a31d762ff7e39723d9f74612b0..5d73e632f7bbd26c00b3c95a59e20bea011687a0 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/VectorRFFIWrapper.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/VectorRFFIWrapper.java @@ -48,6 +48,7 @@ import com.oracle.truffle.r.runtime.data.NativeDataAccess; import com.oracle.truffle.r.runtime.data.RComplexVector; 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.RLogicalVector; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RObject; @@ -122,6 +123,12 @@ public final class VectorRFFIWrapper implements TruffleObject { public abstract long execute(Object vector); + @Specialization + @TruffleBoundary + protected static long get(RList list) { + return list.allocateNativeContents(); + } + @Specialization @TruffleBoundary protected static long get(RIntVector vector) { diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gsub.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gsub.java index 32b0d231961fd5cc4c966282bb90facbc991bbf7..e338ca3a84c9530c1f667470b5639062ba10dc11 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gsub.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gsub.java @@ -231,5 +231,11 @@ public class TestBuiltin_gsub extends TestBase { // Test the dollar in the replacement is not treated as a group reference assertEval("{ gsub('x', '$', 'x') }"); + + // Test group reference handling + assertEval("gsub('_[bB]','\\\\0_m','b_b')"); + assertEval("gsub('_[bB]','\\\\1_m','b_b')"); + assertEval("gsub('(_[bB])','\\\\1_m','b_b')"); + assertEval("gsub('b','\\\\1m','Abb')"); } } diff --git a/mx.fastr/copyrights/gnu_r.language.oracle.star.regex b/mx.fastr/copyrights/gnu_r.language.oracle.star.regex index daa689665987cf2d159f3dacb232ac3dec730104..4cf4f9a67895de24117850288f25c39cbc1704e3 100644 --- a/mx.fastr/copyrights/gnu_r.language.oracle.star.regex +++ b/mx.fastr/copyrights/gnu_r.language.oracle.star.regex @@ -1 +1 @@ -\/\*\n \* R : A Computer Language for Statistical Data Analysis\n (\* Copyright \(C\) (?:[1-2][09][0-9][0-9], ?)?(:?[1-2][09])?[0-9]?[0-9] [ ]?Robert Gentleman and Ross Ihaka\n )?\* Copyright \(C\) (?:[1-2][09][0-9][0-9]--?)?(:?[1-2][09])?[0-9]?[0-9] [ ]?The [ ]?R Core Team\.?\n \* Copyright \(c\) (?:(20[0-9][0-9]), )?(20[0-9][0-9]), Oracle and/or its affiliates\n \*\n \* This program is free software; you can redistribute it and\/or modify\n \* it under the terms of the GNU General Public License as published by\n \* the Free Software Foundation; either version 2 of the License, or\n \* \(at your option\) any later version\.\n \*\n \* This program is distributed in the hope that it will be useful,\n \* but WITHOUT ANY WARRANTY; without even the implied warranty of\n \* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE\. See the\n \* GNU General Public License for more details.\n \*\n \* You should have received a copy of the GNU General Public License\n \* along with this program; if not, a copy is available at\n \* https:\/\/www\.R-project\.org\/Licenses.* \ No newline at end of file +\/\*\n \* R : A Computer Language for Statistical Data Analysis\n (\* Copyright \(C\) (?:[1-2][09][0-9][0-9], ?)?(:?[1-2][09])?[0-9]?[0-9] [ ]?Robert Gentleman and Ross Ihaka\n )?(\* \(C\) [1-2][09][0-9][0-9] The R Foundation\n )?\* Copyright \(C\) (?:[1-2][09][0-9][0-9]--?)?(:?[1-2][09])?[0-9]?[0-9] [ ]?The [ ]?R Core Team\.?\n \* Copyright \(c\) (?:(20[0-9][0-9]), )?(20[0-9][0-9]), Oracle and/or its affiliates\n \*\n \* This program is free software; you can redistribute it and\/or modify\n \* it under the terms of the GNU General Public License as published by\n \* the Free Software Foundation; either version 2 of the License, or\n \* \(at your option\) any later version\.\n \*\n \* This program is distributed in the hope that it will be useful,\n \* but WITHOUT ANY WARRANTY; without even the implied warranty of\n \* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE\. See the\n \* GNU General Public License for more details.\n \*\n \* You should have received a copy of the GNU General Public License\n \* along with this program; if not, a copy is available at\n \* https:\/\/www\.R-project\.org\/Licenses.* \ No newline at end of file diff --git a/mx.fastr/copyrights/overrides b/mx.fastr/copyrights/overrides index d22c9a9bc083b253c569624770c164a77733ebde..9947b5764b362bbb61bec1a121ca0181647b70bf 100644 --- a/mx.fastr/copyrights/overrides +++ b/mx.fastr/copyrights/overrides @@ -976,3 +976,5 @@ com.oracle.truffle.r.pkgs/rJava/src/java/RectangularArraySummary.java,no.copyrig com.oracle.truffle.r.native/fficall/src/truffle_common/Applic.c,gnu_r.language.oracle com.oracle.truffle.r.native/gnur/patch/src/main/errors.c,gnu_r.language.oracle com.oracle.truffle.r.native/gnur/patch/src/unix/sys-std.c,gnu_r.language.oracle +com.oracle.truffle.r.native/gnur/patch/src/main/duplicate.c,gnu_r.language.oracle +com.oracle.truffle.r.native/gnur/patch/src/main/duplicate.h,gnu_r.language.oracle