Skip to content

Commit 3833717

Browse files
committed
Adding a context option for Atomics.waitAsync.
1 parent b193224 commit 3833717

File tree

3 files changed

+46
-8
lines changed

3 files changed

+46
-8
lines changed

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/AtomicsBuiltins.java

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
public final class AtomicsBuiltins extends JSBuiltinsContainer.SwitchEnum<AtomicsBuiltins.Atomics> {
126126

127127
public static final JSBuiltinsContainer BUILTINS = new AtomicsBuiltins();
128+
public static final JSBuiltinsContainer WAIT_ASYNC_BUILTINS = new WaitAsyncBuiltins();
128129

129130
protected AtomicsBuiltins() {
130131
super(JSRealm.ATOMICS_CLASS_NAME, Atomics.class);
@@ -143,10 +144,7 @@ public enum Atomics implements BuiltinEnum<Atomics> {
143144
wait(4),
144145
isLockFree(1),
145146

146-
notify(3), // ES2019
147-
148-
// Stage 3
149-
waitAsync(4);
147+
notify(3);
150148

151149
private final int length;
152150

@@ -163,8 +161,6 @@ public int getLength() {
163161
public int getECMAScriptVersion() {
164162
if (this.equals(notify)) {
165163
return JSConfig.ECMAScript2019;
166-
} else if (this.equals(waitAsync)) {
167-
return JSConfig.StagingECMAScriptVersion;
168164
}
169165
return JSConfig.ECMAScript2017;
170166
}
@@ -198,12 +194,41 @@ protected Object createNode(JSContext context, JSBuiltin builtin, boolean constr
198194
return AtomicsWaitNodeGen.create(context, builtin, args().fixedArgs(4).createArgumentNodes(context));
199195
case isLockFree:
200196
return AtomicsIsLockFreeNodeGen.create(context, builtin, args().fixedArgs(1).createArgumentNodes(context));
201-
case waitAsync:
202-
return AtomicsWaitAsyncNodeGen.create(context, builtin, args().fixedArgs(4).createArgumentNodes(context));
203197
}
204198
return null;
205199
}
206200

201+
public static final class WaitAsyncBuiltins extends JSBuiltinsContainer.SwitchEnum<WaitAsyncBuiltins.WaitAsync> {
202+
203+
protected WaitAsyncBuiltins() {
204+
super(WaitAsync.class);
205+
}
206+
207+
public enum WaitAsync implements BuiltinEnum<WaitAsync> {
208+
waitAsync(4);
209+
210+
private final int length;
211+
212+
WaitAsync(int length) {
213+
this.length = length;
214+
}
215+
216+
@Override
217+
public int getLength() {
218+
return length;
219+
}
220+
}
221+
222+
@Override
223+
protected Object createNode(JSContext context, JSBuiltin builtin, boolean construct, boolean newTarget, WaitAsync builtinEnum) {
224+
return switch (builtinEnum) {
225+
case waitAsync -> AtomicsWaitAsyncNodeGen.create(context, builtin, args().fixedArgs(4).createArgumentNodes(context));
226+
default -> null;
227+
};
228+
}
229+
230+
}
231+
207232
@ImportStatic(JSArrayBufferView.class)
208233
public abstract static class AtomicsOperationNode extends JSBuiltinNode {
209234

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/runtime/JSContextOptions.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,11 @@ public Map<String, String> apply(String value) {
549549
public static final OptionKey<Boolean> NEW_SET_METHODS = new OptionKey<>(false);
550550
@CompilationFinal private boolean newSetMethods;
551551

552+
public static final String ATOMICS_WAIT_ASYNC_NAME = JS_OPTION_PREFIX + "atomics-wait-async";
553+
@Option(name = ATOMICS_WAIT_ASYNC_NAME, category = OptionCategory.EXPERT, help = "Enable Atomics.waitAsync.") //
554+
public static final OptionKey<Boolean> ATOMICS_WAIT_ASYNC = new OptionKey<>(false);
555+
@CompilationFinal private boolean atomicsWaitAsync;
556+
552557
public static final String TEMPORAL_NAME = JS_OPTION_PREFIX + "temporal";
553558
@Option(name = TEMPORAL_NAME, category = OptionCategory.EXPERT, help = "Enable JavaScript Temporal API.") //
554559
public static final OptionKey<Boolean> TEMPORAL = new OptionKey<>(false);
@@ -746,6 +751,7 @@ private void cacheOptions(SandboxPolicy sandboxPolicy) {
746751
this.webAssembly = readBooleanOption(WEBASSEMBLY);
747752
this.unhandledRejectionsMode = readUnhandledRejectionsMode();
748753
this.newSetMethods = readBooleanOption(NEW_SET_METHODS);
754+
this.atomicsWaitAsync = ATOMICS_WAIT_ASYNC.hasBeenSet(optionValues) ? readBooleanOption(ATOMICS_WAIT_ASYNC) : getEcmaScriptVersion() >= JSConfig.ECMAScript2024;
749755
this.asyncIteratorHelpers = getEcmaScriptVersion() >= JSConfig.ECMAScript2018 && readBooleanOption(ASYNC_ITERATOR_HELPERS);
750756
this.iteratorHelpers = getEcmaScriptVersion() >= JSConfig.ECMAScript2018 && (this.asyncIteratorHelpers || readBooleanOption(ITERATOR_HELPERS));
751757
this.shadowRealm = getEcmaScriptVersion() >= JSConfig.ECMAScript2015 && readBooleanOption(SHADOW_REALM);
@@ -1139,6 +1145,10 @@ public boolean isNewSetMethods() {
11391145
return newSetMethods;
11401146
}
11411147

1148+
public boolean isAtomicsWaitAsync() {
1149+
return atomicsWaitAsync;
1150+
}
1151+
11421152
public boolean isIteratorHelpers() {
11431153
return iteratorHelpers;
11441154
}

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/runtime/JSRealm.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2402,6 +2402,9 @@ private JSDynamicObject createAtomics() {
24022402
JSObject obj = JSObjectUtil.createOrdinaryPrototypeObject(this, this.getObjectPrototype());
24032403
JSObjectUtil.putToStringTag(obj, ATOMICS_CLASS_NAME);
24042404
JSObjectUtil.putFunctionsFromContainer(this, obj, AtomicsBuiltins.BUILTINS);
2405+
if (getContextOptions().isAtomicsWaitAsync()) {
2406+
JSObjectUtil.putFunctionsFromContainer(this, obj, AtomicsBuiltins.WAIT_ASYNC_BUILTINS);
2407+
}
24052408
return obj;
24062409
}
24072410

0 commit comments

Comments
 (0)