Skip to content

Commit e9b839c

Browse files
committed
Merge remote-tracking branch 'origin/master' into release/graal-vm/1.0
2 parents a19724d + 9880d66 commit e9b839c

File tree

137 files changed

+5144
-2117
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

137 files changed

+5144
-2117
lines changed

.travis.yml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@ install:
1515
- wget http://ftp.halifax.rwth-aachen.de/eclipse//eclipse/downloads/drops4/R-4.5.1-201509040015/ecj-4.5.1.jar
1616
- mv ecj-4.5.1.jar mx/ecj.jar
1717
- export JDT=mx/ecj.jar
18-
- wget https://lafo.ssw.uni-linz.ac.at/slavefiles/gate/eclipse-jdk8-linux-x86_64.tar.gz
19-
- tar -xvzf eclipse-jdk8-linux-x86_64.tar.gz
18+
- export ECLIPSE_TAR=$TRAVIS_BUILD_DIR/../eclipse.tar.gz
19+
- http://archive.eclipse.org/eclipse/downloads/drops4/R-4.5.2-201602121500/eclipse-SDK-4.5.2-linux-gtk-x86_64.tar.gz -O $ECLIPSE_TAR
20+
- tar -xvzf $ECLIPSE_TAR
2021
- export ECLIPSE_EXE=eclipse/eclipse
2122
- export DEFAULT_VM=server
2223
script:
2324
- $TEST_COMMAND
2425
env:
2526
- TEST_COMMAND='mx/mx --src-suitemodel nested gate'
2627
after_failure:
27-
- cat ./com.oracle.truffle.r.native/gnur/R-3.1.3/gnur_configure.log
28-
- cat ./com.oracle.truffle.r.native/gnur/R-3.1.3/gnur_make.log
28+
- cat ./libdownloads/R-*/gnur_configure.log
29+
- cat ./libdownloads/R-*/gnur_make.log
30+
- cat ./libdownloads/R-*/config.log
31+
- cat ./libdownloads/R-*/Makeconf

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,17 @@
11

2+
# 1.0 RC 5
3+
4+
Updates in interop:
5+
6+
* R code evaluated via interop never returns a Java primitive type, but always a vector
7+
* Vectors of size 1 that do not contain NA can be unboxed
8+
* Sending the READ message to an atomic R vector (array subscript in most languages) gives
9+
* Java primitive type as long as the value is not `NA`
10+
* a special value that responds to `IS_NULL` with `true`. If this value is passed back to R it behaves as `NA` again
11+
* Note that sending the READ message to a list, environment, or other heterogenous data structure never gives atomic Java type but a primitive R vector
12+
13+
# 1.0 RC 4
14+
215
# 1.0 RC 3
316

417
Added missing R builtins and C API

ci.hocon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ include "ci_common/common.hocon"
88
# The standard set of gate builds. N.B. the style/builtin checks are only run on Linux as they are not OS-dependent.
99

1010
# in case you want to enforce specific overlay commit, uncomment:
11-
overlay = "ca898f99ff18a41ad8bb7a698b28a4f987dd076f"
11+
overlay = "1823c758582f31386f8ba4d89157265a23cebd04"
1212
builds = [
1313
${gateTestLinux} {capabilities : [linux, amd64, fast], targets : [gate], name: "gate-test-linux-amd64"}
1414
${gateTestNoSpecialsLinux} {capabilities : [linux, amd64, fast], targets : [gate], name: "gate-test-linux-amd64-nospecials"}

ci_common/common.hocon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# java 7 is needed by Truffle (for now)
22
java7 : {name : oraclejdk, version : "7", platformspecific: true}
33
# java 8 must be a jvmci enabled variant
4-
java8 : {name : labsjdk, version : "8u171-jvmci-0.43", platformspecific: true}
4+
java8 : {name : labsjdk, version : "8u172-jvmci-0.46", platformspecific: true}
55
java9 : {name : oraclejdk, version : "9.0.4+11", platformspecific: true}
66

77
java8Downloads : {

com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/EngineRootNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class EngineRootNode extends RootNode {
5858
private final ContextReference<RContext> contextReference;
5959

6060
@Child private EngineBodyNode bodyNode;
61-
@Child private R2Foreign r2Foreign = R2ForeignNodeGen.create();
61+
@Child private R2Foreign r2Foreign = R2Foreign.create();
6262

6363
EngineRootNode(EngineBodyNode bodyNode, RContext context, SourceSection sourceSection, MaterializedFrame executionFrame) {
6464
super(context.getLanguage());

com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,19 @@
4343
import com.oracle.truffle.r.nodes.access.vector.ReplaceVectorNode;
4444
import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
4545
import com.oracle.truffle.r.nodes.control.RLengthNode;
46+
import com.oracle.truffle.r.runtime.data.NativeDataAccess;
4647
import com.oracle.truffle.r.runtime.data.RDataFactory;
4748
import com.oracle.truffle.r.runtime.data.RExpression;
4849
import com.oracle.truffle.r.runtime.data.RFunction;
4950
import com.oracle.truffle.r.runtime.data.RList;
5051
import com.oracle.truffle.r.runtime.data.RLogical;
5152
import com.oracle.truffle.r.runtime.data.RMissing;
52-
import com.oracle.truffle.r.runtime.data.RObject;
5353
import com.oracle.truffle.r.runtime.data.RPairList;
5454
import com.oracle.truffle.r.runtime.data.RStringVector;
5555
import com.oracle.truffle.r.runtime.interop.Foreign2R;
5656
import com.oracle.truffle.r.runtime.interop.Foreign2RNodeGen;
5757
import com.oracle.truffle.r.runtime.interop.R2Foreign;
5858
import com.oracle.truffle.r.runtime.interop.R2ForeignNodeGen;
59-
import com.oracle.truffle.r.runtime.interop.RObjectNativeWrapper;
6059

6160
public class ListMR {
6261

@@ -118,14 +117,21 @@ protected Object access(TruffleObject receiver, Object idx) {
118117
@Resolve(message = "IS_POINTER")
119118
public abstract static class IsPointerNode extends Node {
120119
protected boolean access(@SuppressWarnings("unused") Object receiver) {
121-
return false;
120+
return true;
121+
}
122+
}
123+
124+
@Resolve(message = "AS_POINTER")
125+
public abstract static class AsPointerNode extends Node {
126+
protected Object access(Object receiver) {
127+
return NativeDataAccess.asPointer(receiver);
122128
}
123129
}
124130

125131
@Resolve(message = "TO_NATIVE")
126132
public abstract static class ToNativeNode extends Node {
127-
protected Object access(RObject receiver) {
128-
return new RObjectNativeWrapper(receiver);
133+
protected Object access(Object receiver) {
134+
return receiver;
129135
}
130136
}
131137

@@ -209,14 +215,21 @@ protected Object access(TruffleObject receiver, Object idx) {
209215
@Resolve(message = "IS_POINTER")
210216
public abstract static class IsPointerNode extends Node {
211217
protected boolean access(@SuppressWarnings("unused") Object receiver) {
212-
return false;
218+
return true;
219+
}
220+
}
221+
222+
@Resolve(message = "AS_POINTER")
223+
public abstract static class AsPointerNode extends Node {
224+
protected Object access(Object receiver) {
225+
return NativeDataAccess.asPointer(receiver);
213226
}
214227
}
215228

216229
@Resolve(message = "TO_NATIVE")
217230
public abstract static class ToNativeNode extends Node {
218-
protected Object access(RObject receiver) {
219-
return new RObjectNativeWrapper(receiver);
231+
protected Object access(@SuppressWarnings("unused") Object receiver) {
232+
return this;
220233
}
221234
}
222235

@@ -294,14 +307,21 @@ protected Object access(TruffleObject receiver, Object idx) {
294307
@Resolve(message = "IS_POINTER")
295308
public abstract static class IsPointerNode extends Node {
296309
protected boolean access(@SuppressWarnings("unused") Object receiver) {
297-
return false;
310+
return true;
311+
}
312+
}
313+
314+
@Resolve(message = "AS_POINTER")
315+
public abstract static class AsPointerNode extends Node {
316+
protected Object access(Object receiver) {
317+
return NativeDataAccess.asPointer(receiver);
298318
}
299319
}
300320

301321
@Resolve(message = "TO_NATIVE")
302322
public abstract static class ToNativeNode extends Node {
303-
protected Object access(RObject receiver) {
304-
return new RObjectNativeWrapper(receiver);
323+
protected Object access(Object receiver) {
324+
return receiver;
305325
}
306326
}
307327

@@ -375,7 +395,7 @@ protected ListKeyInfoImplNode createKeyInfoNode() {
375395
private void initR2ForeignNode() {
376396
if (r2Foreign == null) {
377397
CompilerDirectives.transferToInterpreterAndInvalidate();
378-
r2Foreign = insert(R2ForeignNodeGen.create());
398+
r2Foreign = insert(R2Foreign.create());
379399
}
380400
}
381401

com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,14 @@
5151
import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode;
5252
import com.oracle.truffle.r.nodes.access.vector.ReplaceVectorNode;
5353
import com.oracle.truffle.r.nodes.access.vector.ReplaceVectorNodeGen;
54+
import com.oracle.truffle.r.nodes.builtin.base.IsNA;
55+
import com.oracle.truffle.r.nodes.builtin.base.IsNANodeGen;
5456
import com.oracle.truffle.r.nodes.control.RLengthNode;
5557
import com.oracle.truffle.r.runtime.RRuntime;
58+
import com.oracle.truffle.r.runtime.data.NativeDataAccess;
5659
import com.oracle.truffle.r.runtime.data.RLogical;
57-
import com.oracle.truffle.r.runtime.data.RObject;
5860
import com.oracle.truffle.r.runtime.data.RRaw;
5961
import com.oracle.truffle.r.runtime.data.RScalar;
60-
import com.oracle.truffle.r.runtime.data.RString;
6162
import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector;
6263
import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
6364
import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
@@ -66,7 +67,6 @@
6667
import com.oracle.truffle.r.runtime.interop.Foreign2RNodeGen;
6768
import com.oracle.truffle.r.runtime.interop.R2Foreign;
6869
import com.oracle.truffle.r.runtime.interop.R2ForeignNodeGen;
69-
import com.oracle.truffle.r.runtime.interop.RObjectNativeWrapper;
7070
import com.oracle.truffle.r.runtime.nodes.RSyntaxNode;
7171

7272
abstract class InteropRootNode extends RootNode {
@@ -80,6 +80,9 @@ public final SourceSection getSourceSection() {
8080
}
8181
}
8282

83+
/**
84+
* Implements interop messages for all {@link RAbstractAtomicVector} subclasses.
85+
*/
8386
public final class RAbstractVectorAccessFactory implements StandardFactory {
8487

8588
abstract static class VectorReadImplNode extends InteropRootNode {
@@ -128,7 +131,7 @@ private Object read(Object receiver, Object[] positions) {
128131
Object value = extract.apply(receiver, positions, RLogical.TRUE, RLogical.TRUE);
129132
if (r2Foreign == null) {
130133
CompilerDirectives.transferToInterpreterAndInvalidate();
131-
r2Foreign = insert(R2ForeignNodeGen.create());
134+
r2Foreign = insert(R2Foreign.createNoBox());
132135
}
133136
return r2Foreign.execute(value);
134137
}
@@ -325,26 +328,23 @@ public Object execute(VirtualFrame frame) {
325328
@Override
326329
public CallTarget accessIsBoxed() {
327330
return Truffle.getRuntime().createCallTarget(new InteropRootNode() {
331+
@Child IsNA isNANode = IsNANodeGen.create();
332+
private final ConditionProfile isEmpty = ConditionProfile.createBinaryProfile();
333+
328334
@Override
329335
public Object execute(VirtualFrame frame) {
330336
RAbstractVector arg = (RAbstractVector) ForeignAccess.getReceiver(frame);
331-
return arg.getLength() == 1 && isUnBoxable(arg);
337+
if (isEmpty.profile(arg.getLength() == 0)) {
338+
return false;
339+
}
340+
Object o = arg.getDataAtAsObject(0);
341+
return arg.getLength() == 1 && !isNA(isNANode, o);
332342
}
333343
});
334344
}
335345

336-
private static boolean isUnBoxable(RAbstractVector vector) {
337-
Object o = vector.getDataAtAsObject(0);
338-
return isPrimitive(o);
339-
}
340-
341-
private static boolean isPrimitive(Object element) {
342-
if (element == null) {
343-
return false;
344-
}
345-
final Class<?> elementType = element.getClass();
346-
return elementType == String.class || elementType == Character.class || elementType == Boolean.class || elementType == Byte.class || elementType == Short.class ||
347-
elementType == Integer.class || elementType == Long.class || elementType == Float.class || elementType == Double.class;
346+
private static boolean isNA(IsNA isNANode, Object value) {
347+
return RRuntime.fromLogical((Byte) isNANode.execute(value));
348348
}
349349

350350
@Override
@@ -383,14 +383,21 @@ public Object execute(VirtualFrame frame) {
383383
@Override
384384
public CallTarget accessUnbox() {
385385
return Truffle.getRuntime().createCallTarget(new InteropRootNode() {
386+
@Child IsNA isNANode = IsNANodeGen.create();
387+
private final ConditionProfile isLogical = ConditionProfile.createBinaryProfile();
388+
386389
@Override
387390
public Object execute(VirtualFrame frame) {
388391
RAbstractVector arg = (RAbstractVector) ForeignAccess.getReceiver(frame);
389392
if (arg.getLength() == 1) {
390-
return arg.getDataAtAsObject(0);
391-
} else {
392-
throw UnsupportedMessageException.raise(Message.UNBOX);
393+
Object value = arg.getDataAtAsObject(0);
394+
if (isLogical.profile(arg instanceof RAbstractLogicalVector)) {
395+
return RLogicalMR.unboxLogical((Byte) value);
396+
} else if (!isNA(isNANode, value)) {
397+
return value;
398+
}
393399
}
400+
throw UnsupportedMessageException.raise(Message.UNBOX);
394401
}
395402
});
396403
}
@@ -440,7 +447,17 @@ public CallTarget accessIsPointer() {
440447
return Truffle.getRuntime().createCallTarget(new InteropRootNode() {
441448
@Override
442449
public Object execute(VirtualFrame frame) {
443-
return false;
450+
return true;
451+
}
452+
});
453+
}
454+
455+
@Override
456+
public CallTarget accessAsPointer() {
457+
return Truffle.getRuntime().createCallTarget(new InteropRootNode() {
458+
@Override
459+
public Object execute(VirtualFrame frame) {
460+
return NativeDataAccess.asPointer(ForeignAccess.getReceiver(frame));
444461
}
445462
});
446463
}
@@ -451,7 +468,7 @@ public CallTarget accessToNative() {
451468
@Override
452469
public Object execute(VirtualFrame frame) {
453470
RAbstractVector arg = (RAbstractVector) ForeignAccess.getReceiver(frame);
454-
return new RObjectNativeWrapper((RObject) arg);
471+
return arg;
455472
}
456473
});
457474
}

com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,12 @@
3636
import com.oracle.truffle.r.engine.interop.RArgsValuesAndNamesMRFactory.RArgsValuesAndNamesKeyInfoImplNodeGen;
3737
import com.oracle.truffle.r.engine.interop.RArgsValuesAndNamesMRFactory.RArgsValuesAndNamesReadImplNodeGen;
3838
import com.oracle.truffle.r.runtime.ArgumentsSignature;
39+
import com.oracle.truffle.r.runtime.data.NativeDataAccess;
3940
import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
4041
import com.oracle.truffle.r.runtime.data.RDataFactory;
4142
import com.oracle.truffle.r.runtime.data.RFunction;
42-
import com.oracle.truffle.r.runtime.data.RObject;
4343
import com.oracle.truffle.r.runtime.interop.R2Foreign;
4444
import com.oracle.truffle.r.runtime.interop.R2ForeignNodeGen;
45-
import com.oracle.truffle.r.runtime.interop.RObjectNativeWrapper;
4645

4746
@MessageResolution(receiverType = RArgsValuesAndNames.class)
4847
public class RArgsValuesAndNamesMR {
@@ -94,14 +93,21 @@ protected Object access(VirtualFrame frame, RArgsValuesAndNames receiver, Object
9493
@Resolve(message = "IS_POINTER")
9594
public abstract static class IsPointerNode extends Node {
9695
protected boolean access(@SuppressWarnings("unused") Object receiver) {
97-
return false;
96+
return true;
97+
}
98+
}
99+
100+
@Resolve(message = "AS_POINTER")
101+
public abstract static class AsPointerNode extends Node {
102+
protected Object access(Object receiver) {
103+
return NativeDataAccess.asPointer(receiver);
98104
}
99105
}
100106

101107
@Resolve(message = "TO_NATIVE")
102108
public abstract static class ToNativeNode extends Node {
103-
protected Object access(RObject receiver) {
104-
return new RObjectNativeWrapper(receiver);
109+
protected Object access(Object receiver) {
110+
return receiver;
105111
}
106112
}
107113

@@ -114,7 +120,7 @@ protected static boolean test(TruffleObject receiver) {
114120
}
115121

116122
abstract static class RArgsValuesAndNamesReadImplNode extends Node {
117-
@Child private R2Foreign r2Foreign = R2ForeignNodeGen.create();
123+
@Child private R2Foreign r2Foreign = R2Foreign.create();
118124

119125
private final ConditionProfile unknownIdentifier = ConditionProfile.createBinaryProfile();
120126

com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RConnectionMR.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@
2828
import com.oracle.truffle.api.interop.TruffleObject;
2929
import com.oracle.truffle.api.nodes.Node;
3030
import com.oracle.truffle.r.runtime.conn.RConnection;
31-
import com.oracle.truffle.r.runtime.data.RObject;
32-
import com.oracle.truffle.r.runtime.interop.RObjectNativeWrapper;
31+
import com.oracle.truffle.r.runtime.data.NativeDataAccess;
3332

3433
@MessageResolution(receiverType = RConnection.class)
3534
public class RConnectionMR {
@@ -44,14 +43,21 @@ protected Object access(@SuppressWarnings("unused") TruffleObject receiver, @Sup
4443
@Resolve(message = "IS_POINTER")
4544
public abstract static class IsPointerNode extends Node {
4645
protected boolean access(@SuppressWarnings("unused") Object receiver) {
47-
return false;
46+
return true;
47+
}
48+
}
49+
50+
@Resolve(message = "AS_POINTER")
51+
public abstract static class AsPointerNode extends Node {
52+
protected Object access(Object receiver) {
53+
return NativeDataAccess.asPointer(receiver);
4854
}
4955
}
5056

5157
@Resolve(message = "TO_NATIVE")
5258
public abstract static class ToNativeNode extends Node {
53-
protected Object access(RObject receiver) {
54-
return new RObjectNativeWrapper(receiver);
59+
protected Object access(Object receiver) {
60+
return receiver;
5561
}
5662
}
5763

0 commit comments

Comments
 (0)