Skip to content

Commit 69bd7c1

Browse files
committed
Remove support for wrapped arrays in panama backend, ensure post-call nodes are called in case of an exception
1 parent c591b22 commit 69bd7c1

File tree

5 files changed

+16
-43
lines changed

5 files changed

+16
-43
lines changed

truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/ArgumentNode.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -262,22 +262,7 @@ abstract static class ToArrayNode extends ArgumentNode {
262262
getArrayElementLayoutNode = GetArrayElementLayoutNode.create(type.type);
263263
}
264264

265-
final boolean isHostObject(Object value) {
266-
return PanamaNFIContext.get(this).env.isHostObject(value);
267-
}
268-
269-
final Object asHostObject(Object value) {
270-
return PanamaNFIContext.get(this).env.asHostObject(value);
271-
}
272-
273-
@Specialization(guards = {"isHostObject(value)", "elementLayout != null"})
274-
MemorySegment doHostObject(Arena arena, @SuppressWarnings("unused") Object value,
275-
@Bind("asHostObject(value)") Object hostObject,
276-
@Bind("getArrayElementLayoutNode.execute(hostObject)") ValueLayout elementLayout) {
277-
return doCopy(arena, hostObject, elementLayout);
278-
}
279-
280-
@Specialization(guards = {"!isHostObject(value)", "elementLayout != null"})
265+
@Specialization(guards = "elementLayout != null")
281266
MemorySegment doArray(Arena arena, Object value,
282267
@Bind("getArrayElementLayoutNode.execute(value)") ValueLayout elementLayout) {
283268
return doCopy(arena, value, elementLayout);

truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/FunctionExecuteNode.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,6 @@ static Object genericExecute(long receiver, PanamaSignature signature, Object[]
106106

107107
abstract static class SignatureExecuteNode extends RootNode {
108108

109-
private static final PostCallArgumentNode[] EMPTY_POST_CALL_NODE_ARRAY = new PostCallArgumentNode[0];
110-
111109
final CachedSignatureInfo signatureInfo;
112110
@Children ArgumentNode[] argNodes;
113111
@Children PostCallArgumentNode[] postCallArgNodes;
@@ -132,8 +130,6 @@ abstract static class SignatureExecuteNode extends RootNode {
132130
for (int i = 0; i < argNodes.length; i++) {
133131
postCallArgNodes[i] = argTypes[i].createPostCallArgumentNode();
134132
}
135-
} else {
136-
this.postCallArgNodes = EMPTY_POST_CALL_NODE_ARRAY;
137133
}
138134
}
139135

@@ -176,14 +172,18 @@ public Object doGeneric(VirtualFrame frame) {
176172
} catch (UnsupportedTypeException ex) {
177173
throw silenceException(RuntimeException.class, ex);
178174
}
179-
180-
Object result = signatureInfo.execute(signature, convertedArgs, address, this);
181-
for (int i = 0; i < postCallArgNodes.length; i++) {
182-
if (postCallArgNodes[i] != null) {
183-
postCallArgNodes[i].execute(args[i], convertedArgs[i]);
175+
try {
176+
return signatureInfo.execute(signature, convertedArgs, address, this);
177+
} finally {
178+
if (postCallArgNodes != null) {
179+
for (int i = 0; i < postCallArgNodes.length; i++) {
180+
if (postCallArgNodes[i] != null) {
181+
postCallArgNodes[i].execute(args[i], convertedArgs[i]);
182+
}
183+
}
184184
}
185185
}
186-
return result;
186+
187187
} finally {
188188
if (needsArena) {
189189
arena.close();

truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public boolean needsPostCallProcessing() {
101101
}
102102

103103
public boolean needsArena() {
104-
return isArray | type == NativeSimpleType.STRING;
104+
return isArray || type == NativeSimpleType.STRING;
105105
}
106106

107107
public ArgumentNode createArgumentNode() {

truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PostCallArgumentNode.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,7 @@ abstract static class CopyBackArrayNode extends PostCallArgumentNode {
6868
getArrayElementLayoutNode = GetArrayElementLayoutNode.create(type.type);
6969
}
7070

71-
final boolean isHostObject(Object value) {
72-
return PanamaNFIContext.get(this).env.isHostObject(value);
73-
}
74-
75-
final Object asHostObject(Object value) {
76-
return PanamaNFIContext.get(this).env.asHostObject(value);
77-
}
78-
79-
@Specialization(guards = {"isHostObject(originalValue)", "elementLayout != null"})
80-
void doHostObject(@SuppressWarnings("unused") Object originalValue, MemorySegment convertedValue,
81-
@Bind("asHostObject(originalValue)") Object hostObject,
82-
@Bind("getArrayElementLayoutNode.execute(hostObject)") ValueLayout elementLayout) {
83-
doCopy(hostObject, convertedValue, elementLayout);
84-
}
85-
86-
@Specialization(guards = {"!isHostObject(originalValue)", "elementLayout != null"})
71+
@Specialization(guards = "elementLayout != null")
8772
void doArray(Object originalValue, MemorySegment convertedValue,
8873
@Bind("getArrayElementLayoutNode.execute(originalValue)") ValueLayout elementLayout) {
8974
doCopy(originalValue, convertedValue, elementLayout);

truffle/src/com.oracle.truffle.nfi.test/src/com/oracle/truffle/nfi/test/ArrayNFITest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949

5050
import org.hamcrest.MatcherAssert;
5151
import org.junit.Assert;
52+
import org.junit.Assume;
5253
import org.junit.Test;
5354
import org.junit.runner.RunWith;
5455
import org.junit.runners.Parameterized;
@@ -178,6 +179,8 @@ public void testSumArrayDirect(@Inject(CreateAndSumArray.class) CallTarget callT
178179

179180
@Test
180181
public void testSumArrayWrapped(@Inject(CreateAndSumArray.class) CallTarget callTarget) {
182+
// Panama backend does not support wrapped arrays
183+
Assume.assumeFalse("panama".equals(TEST_BACKEND));
181184
Object array = Array.newInstance(javaType, 5);
182185
Object wrappedArray = runWithPolyglot.getTruffleTestEnv().asGuestValue(array);
183186
testSumArray(callTarget, array, wrappedArray);

0 commit comments

Comments
 (0)