Skip to content

Commit 0951269

Browse files
committed
Get thread-local multi-value stack from the WasmLanguage directly.
1 parent 950b8f3 commit 0951269

File tree

5 files changed

+45
-53
lines changed

5 files changed

+45
-53
lines changed

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/WasmContext.java

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -222,29 +222,4 @@ public WasmContextOptions getContextOptions() {
222222
public static WasmContext get(Node node) {
223223
return REFERENCE.get(node);
224224
}
225-
226-
/**
227-
* @return The current primitive multi-value stack or null if it has never been resized.
228-
*/
229-
public long[] primitiveMultiValueStack() {
230-
return language.multiValueStack().primitiveStack();
231-
}
232-
233-
/**
234-
* @return the current reference multi-value stack or null if it has never been resized.
235-
*/
236-
public Object[] referenceMultiValueStack() {
237-
return language.multiValueStack().referenceStack();
238-
}
239-
240-
/**
241-
* Updates the size of the multi-value stack if needed. In case of a resize, the values are not
242-
* copied. Therefore, resizing should occur before any call to a function that uses the
243-
* multi-value stack.
244-
*
245-
* @param expectedSize The minimum expected size.
246-
*/
247-
public void resizeMultiValueStack(int expectedSize) {
248-
language.multiValueStack().resize(expectedSize);
249-
}
250225
}

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/WasmFunctionInstance.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -143,28 +143,29 @@ Object execute(Object[] arguments,
143143
// At this point the multi-value stack has already been populated, therefore, we don't
144144
// have to check the size of the multi-value stack.
145145
if (result == WasmConstant.MULTI_VALUE) {
146-
return multiValueStackAsArray();
146+
return multiValueStackAsArray(WasmLanguage.get(self));
147147
}
148148
return result;
149149
} finally {
150150
c.leave(self, prev);
151151
}
152152
}
153153

154-
private Object multiValueStackAsArray() {
155-
final long[] multiValueStack = context().primitiveMultiValueStack();
156-
final Object[] referenceMultiValueStack = context().referenceMultiValueStack();
154+
private Object multiValueStackAsArray(WasmLanguage language) {
155+
final var multiValueStack = language.multiValueStack();
156+
final long[] primitiveMultiValueStack = multiValueStack.primitiveStack();
157+
final Object[] referenceMultiValueStack = multiValueStack.referenceStack();
157158
final int resultCount = function.resultCount();
158-
assert multiValueStack.length >= resultCount;
159+
assert primitiveMultiValueStack.length >= resultCount;
159160
assert referenceMultiValueStack.length >= resultCount;
160161
final Object[] values = new Object[resultCount];
161162
for (int i = 0; i < resultCount; i++) {
162163
byte resultType = function.resultTypeAt(i);
163164
values[i] = switch (resultType) {
164-
case WasmType.I32_TYPE -> (int) multiValueStack[i];
165-
case WasmType.I64_TYPE -> multiValueStack[i];
166-
case WasmType.F32_TYPE -> Float.intBitsToFloat((int) multiValueStack[i]);
167-
case WasmType.F64_TYPE -> Double.longBitsToDouble(multiValueStack[i]);
165+
case WasmType.I32_TYPE -> (int) primitiveMultiValueStack[i];
166+
case WasmType.I64_TYPE -> primitiveMultiValueStack[i];
167+
case WasmType.F32_TYPE -> Float.intBitsToFloat((int) primitiveMultiValueStack[i]);
168+
case WasmType.F64_TYPE -> Double.longBitsToDouble(primitiveMultiValueStack[i]);
168169
case WasmType.FUNCREF_TYPE, WasmType.EXTERNREF_TYPE -> referenceMultiValueStack[i];
169170
default -> throw WasmException.create(Failure.UNSPECIFIED_INTERNAL);
170171
};

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/WasmLanguage.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,20 +211,33 @@ public MultiValueStack multiValueStack() {
211211
return multiValueStackThreadLocal.get();
212212
}
213213

214-
static final class MultiValueStack {
214+
public static final class MultiValueStack {
215215
private long[] primitiveStack;
216216
private Object[] referenceStack;
217217
// Initialize size to 1, so we only create the stack for more than 1 result value.
218218
private int size = 1;
219219

220+
/**
221+
* @return The current primitive multi-value stack or null if it has never been resized.
222+
*/
220223
public long[] primitiveStack() {
221224
return primitiveStack;
222225
}
223226

227+
/**
228+
* @return the current reference multi-value stack or null if it has never been resized.
229+
*/
224230
public Object[] referenceStack() {
225231
return referenceStack;
226232
}
227233

234+
/**
235+
* Updates the size of the multi-value stack if needed. In case of a resize, the values are
236+
* not copied. Therefore, resizing should occur before any call to a function that uses the
237+
* multi-value stack.
238+
*
239+
* @param expectedSize The minimum expected size.
240+
*/
228241
public void resize(int expectedSize) {
229242
if (expectedSize > size) {
230243
primitiveStack = new long[expectedSize];

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/nodes/WasmFunctionNode.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import org.graalvm.wasm.WasmFunction;
7171
import org.graalvm.wasm.WasmFunctionInstance;
7272
import org.graalvm.wasm.WasmInstance;
73+
import org.graalvm.wasm.WasmLanguage;
7374
import org.graalvm.wasm.WasmMath;
7475
import org.graalvm.wasm.WasmModule;
7576
import org.graalvm.wasm.WasmTable;
@@ -546,7 +547,7 @@ public Object executeBodyFromOffset(WasmContext context, WasmInstance instance,
546547
}
547548
break;
548549
} else {
549-
extractMultiValueResult(context, frame, stackPointer, result, resultCount, function.typeIndex());
550+
extractMultiValueResult(frame, stackPointer, result, resultCount, function.typeIndex());
550551
stackPointer += resultCount;
551552
break;
552553
}
@@ -691,7 +692,7 @@ public Object executeBodyFromOffset(WasmContext context, WasmInstance instance,
691692
}
692693
break;
693694
} else {
694-
extractMultiValueResult(context, frame, stackPointer, result, resultCount, expectedFunctionTypeIndex);
695+
extractMultiValueResult(frame, stackPointer, result, resultCount, expectedFunctionTypeIndex);
695696
stackPointer += resultCount;
696697
break;
697698
}
@@ -4085,26 +4086,27 @@ private static boolean profileBranchTable(byte[] data, final int counterOffset,
40854086
* @param functionTypeIndex The function type index of the called function.
40864087
*/
40874088
@ExplodeLoop
4088-
private void extractMultiValueResult(WasmContext context, VirtualFrame frame, int stackPointer, Object result, int resultCount, int functionTypeIndex) {
4089+
private void extractMultiValueResult(VirtualFrame frame, int stackPointer, Object result, int resultCount, int functionTypeIndex) {
40894090
CompilerAsserts.partialEvaluationConstant(resultCount);
40904091
if (result == WasmConstant.MULTI_VALUE) {
4091-
final long[] multiValueStack = context.primitiveMultiValueStack();
4092-
final Object[] referenceMultiValueStack = context.referenceMultiValueStack();
4092+
final var multiValueStack = WasmLanguage.get(this).multiValueStack();
4093+
final long[] primitiveMultiValueStack = multiValueStack.primitiveStack();
4094+
final Object[] referenceMultiValueStack = multiValueStack.referenceStack();
40934095
for (int i = 0; i < resultCount; i++) {
40944096
final byte resultType = module.symbolTable().functionTypeResultTypeAt(functionTypeIndex, i);
40954097
CompilerAsserts.partialEvaluationConstant(resultType);
40964098
switch (resultType) {
40974099
case WasmType.I32_TYPE:
4098-
pushInt(frame, stackPointer + i, (int) multiValueStack[i]);
4100+
pushInt(frame, stackPointer + i, (int) primitiveMultiValueStack[i]);
40994101
break;
41004102
case WasmType.I64_TYPE:
4101-
pushLong(frame, stackPointer + i, multiValueStack[i]);
4103+
pushLong(frame, stackPointer + i, primitiveMultiValueStack[i]);
41024104
break;
41034105
case WasmType.F32_TYPE:
4104-
pushFloat(frame, stackPointer + i, Float.intBitsToFloat((int) multiValueStack[i]));
4106+
pushFloat(frame, stackPointer + i, Float.intBitsToFloat((int) primitiveMultiValueStack[i]));
41054107
break;
41064108
case WasmType.F64_TYPE:
4107-
pushDouble(frame, stackPointer + i, Double.longBitsToDouble(multiValueStack[i]));
4109+
pushDouble(frame, stackPointer + i, Double.longBitsToDouble(primitiveMultiValueStack[i]));
41084110
break;
41094111
case WasmType.FUNCREF_TYPE:
41104112
case WasmType.EXTERNREF_TYPE:

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/nodes/WasmRootNode.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public Object executeWithContext(VirtualFrame frame, WasmContext context, WasmIn
167167
final int resultCount = functionNode.resultCount();
168168
CompilerAsserts.partialEvaluationConstant(resultCount);
169169
if (resultCount > 1) {
170-
context.resizeMultiValueStack(resultCount);
170+
WasmLanguage.get(this).multiValueStack().resize(resultCount);
171171
}
172172

173173
try {
@@ -199,31 +199,32 @@ public Object executeWithContext(VirtualFrame frame, WasmContext context, WasmIn
199199
throw WasmException.format(Failure.UNSPECIFIED_INTERNAL, this, "Unknown result type: %d", resultType);
200200
}
201201
} else {
202-
moveResultValuesToMultiValueStack(frame, context, resultCount, localCount);
202+
moveResultValuesToMultiValueStack(frame, resultCount, localCount);
203203
return WasmConstant.MULTI_VALUE;
204204
}
205205
}
206206

207207
@ExplodeLoop
208-
private void moveResultValuesToMultiValueStack(VirtualFrame frame, WasmContext context, int resultCount, int localCount) {
208+
private void moveResultValuesToMultiValueStack(VirtualFrame frame, int resultCount, int localCount) {
209209
CompilerAsserts.partialEvaluationConstant(resultCount);
210-
final long[] multiValueStack = context.primitiveMultiValueStack();
211-
final Object[] referenceMultiValueStack = context.referenceMultiValueStack();
210+
final var multiValueStack = WasmLanguage.get(this).multiValueStack();
211+
final long[] primitiveMultiValueStack = multiValueStack.primitiveStack();
212+
final Object[] referenceMultiValueStack = multiValueStack.referenceStack();
212213
for (int i = 0; i < resultCount; i++) {
213214
final int resultType = functionNode.resultType(i);
214215
CompilerAsserts.partialEvaluationConstant(resultType);
215216
switch (resultType) {
216217
case WasmType.I32_TYPE:
217-
multiValueStack[i] = popInt(frame, localCount + i);
218+
primitiveMultiValueStack[i] = popInt(frame, localCount + i);
218219
break;
219220
case WasmType.I64_TYPE:
220-
multiValueStack[i] = popLong(frame, localCount + i);
221+
primitiveMultiValueStack[i] = popLong(frame, localCount + i);
221222
break;
222223
case WasmType.F32_TYPE:
223-
multiValueStack[i] = Float.floatToRawIntBits(popFloat(frame, localCount + i));
224+
primitiveMultiValueStack[i] = Float.floatToRawIntBits(popFloat(frame, localCount + i));
224225
break;
225226
case WasmType.F64_TYPE:
226-
multiValueStack[i] = Double.doubleToRawLongBits(popDouble(frame, localCount + i));
227+
primitiveMultiValueStack[i] = Double.doubleToRawLongBits(popDouble(frame, localCount + i));
227228
break;
228229
case WasmType.FUNCREF_TYPE:
229230
case WasmType.EXTERNREF_TYPE:

0 commit comments

Comments
 (0)