Skip to content

Commit c13f7eb

Browse files
author
Adam Hrbac
committed
Implement Token
1 parent 7860c55 commit c13f7eb

File tree

7 files changed

+105
-6
lines changed

7 files changed

+105
-6
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@
219219
import com.oracle.graal.python.builtins.objects.complex.ComplexBuiltins;
220220
import com.oracle.graal.python.builtins.objects.contextvars.ContextBuiltins;
221221
import com.oracle.graal.python.builtins.objects.contextvars.ContextVarBuiltins;
222+
import com.oracle.graal.python.builtins.objects.contextvars.TokenBuiltins;
222223
import com.oracle.graal.python.builtins.objects.deque.DequeBuiltins;
223224
import com.oracle.graal.python.builtins.objects.deque.DequeIterBuiltins;
224225
import com.oracle.graal.python.builtins.objects.dict.DefaultDictBuiltins;
@@ -561,6 +562,7 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
561562
new WarningsModuleBuiltins(),
562563
new ContextVarBuiltins(),
563564
new ContextBuiltins(),
565+
new TokenBuiltins(),
564566
// exceptions
565567
new SystemExitBuiltins(),
566568
new ImportErrorBuiltins(),

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ContextvarsModuleBuiltins.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,14 @@
5151
import com.oracle.graal.python.builtins.objects.PNone;
5252
import com.oracle.graal.python.builtins.objects.contextvars.PContext;
5353
import com.oracle.graal.python.builtins.objects.contextvars.PContextVar;
54+
import com.oracle.graal.python.nodes.ErrorMessages;
55+
import com.oracle.graal.python.nodes.PRaiseNode;
5456
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5557
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
5658
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
5759
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
5860
import com.oracle.graal.python.runtime.PythonContext;
61+
import com.oracle.truffle.api.dsl.Cached;
5962
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
6063
import com.oracle.truffle.api.dsl.NodeFactory;
6164
import com.oracle.truffle.api.dsl.Specialization;
@@ -105,4 +108,12 @@ Object construct(VirtualFrame frame, Object cls) {
105108
}
106109
}
107110

111+
@Builtin(name = "Token", minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.ContextVarsToken)
112+
@GenerateNodeFactory
113+
public abstract static class TokenNode extends PythonUnaryBuiltinNode {
114+
@Specialization
115+
Object construct(VirtualFrame frame, Object cls, @Cached PRaiseNode raise) {
116+
throw raise.raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.TOKEN_ONLY_BY_CONTEXTVAR);
117+
}
118+
}
108119
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextVarBuiltins.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,23 @@
4141
package com.oracle.graal.python.builtins.objects.contextvars;
4242

4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.LookupError;
44+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
45+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
4446
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
4547

46-
import com.oracle.graal.python.builtins.Builtin;
4748
import java.util.List;
4849

50+
import com.oracle.graal.python.builtins.Builtin;
4951
import com.oracle.graal.python.builtins.CoreFunctions;
5052
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5153
import com.oracle.graal.python.builtins.PythonBuiltins;
5254
import com.oracle.graal.python.builtins.objects.PNone;
5355
import com.oracle.graal.python.nodes.ErrorMessages;
56+
import com.oracle.graal.python.nodes.PRaiseNode;
5457
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5558
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
5659
import com.oracle.graal.python.runtime.PythonContext;
60+
import com.oracle.truffle.api.dsl.Cached;
5761
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
5862
import com.oracle.truffle.api.dsl.NodeFactory;
5963
import com.oracle.truffle.api.dsl.Specialization;
@@ -101,19 +105,30 @@ public abstract static class SetNode extends PythonBinaryBuiltinNode {
101105
@Specialization
102106
Object set(VirtualFrame frame, PContextVar self, Object value) {
103107
PythonContext.PythonThreadState threadState = getContext().getThreadState(getLanguage());
108+
Object oldValue = self.getValue(threadState);
104109
self.setValue(threadState, value);
105-
return PNone.NONE;
110+
return factory().createContextVarsToken(self, oldValue);
106111
}
107112
}
108113

109114
@Builtin(name = "reset", minNumOfPositionalArgs = 2)
110115
@GenerateNodeFactory
111116
public abstract static class ResetNode extends PythonBinaryBuiltinNode {
112-
@SuppressWarnings("unused")
113117
@Specialization
114-
static Object reset(PContextVar self, Object token) {
118+
Object reset(PContextVar self, PToken token, @Cached PRaiseNode raise) {
119+
if (self == token.getVar()) {
120+
PythonContext.PythonThreadState threadState = getContext().getThreadState(getLanguage());
121+
self.setValue(threadState, token.getOldValue());
122+
} else {
123+
throw raise.raise(ValueError, ErrorMessages.TOKEN_FOR_DIFFERENT_CONTEXTVAR, token);
124+
}
115125
return PNone.NONE;
116126
}
127+
128+
@Specialization
129+
Object doError(PContextVar self, Object token, @Cached PRaiseNode raise) {
130+
throw raise.raise(TypeError, ErrorMessages.INSTANCE_OF_TOKEN_EXPECTED, token);
131+
}
117132
}
118133

119134
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.oracle.graal.python.builtins.objects.contextvars;
2+
3+
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
4+
import com.oracle.truffle.api.object.Shape;
5+
6+
public class PToken extends PythonBuiltinObject {
7+
public static final Object MISSING = new Object();
8+
private final PContextVar var;
9+
private final Object oldValue;
10+
11+
public PToken(PContextVar var, Object oldValue, Object cls, Shape instanceShape) {
12+
super(cls, instanceShape);
13+
this.var = var;
14+
this.oldValue = oldValue;
15+
}
16+
17+
public PContextVar getVar() {
18+
return var;
19+
}
20+
21+
public Object getOldValue() {
22+
return oldValue;
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.oracle.graal.python.builtins.objects.contextvars;
2+
3+
import java.util.List;
4+
5+
import com.oracle.graal.python.builtins.Builtin;
6+
import com.oracle.graal.python.builtins.CoreFunctions;
7+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
8+
import com.oracle.graal.python.builtins.PythonBuiltins;
9+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
10+
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
11+
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
12+
import com.oracle.truffle.api.dsl.NodeFactory;
13+
import com.oracle.truffle.api.dsl.Specialization;
14+
15+
@CoreFunctions(extendClasses = PythonBuiltinClassType.ContextVarsToken)
16+
public class TokenBuiltins extends PythonBuiltins {
17+
18+
@Override
19+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
20+
return TokenBuiltinsFactory.getFactories();
21+
}
22+
23+
@Builtin(name = "var", isGetter = true, minNumOfPositionalArgs = 1)
24+
@GenerateNodeFactory
25+
public abstract static class VarAttr extends PythonBuiltinNode {
26+
@Specialization
27+
public Object doVar(PToken self) {
28+
return self.getVar();
29+
}
30+
}
31+
32+
@Builtin(name = "old_value", isGetter = true, minNumOfPositionalArgs = 1)
33+
@GenerateNodeFactory
34+
public abstract static class OldValueAttr extends PythonBuiltinNode {
35+
@Specialization
36+
public Object doOld(PToken self) {
37+
return self.getOldValue();
38+
}
39+
}
40+
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/ErrorMessages.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,10 +1440,12 @@ public abstract class ErrorMessages {
14401440
public static final TruffleString ATTEMPTING_SETTER_NO_NATIVE_SPACE = tsLiteral("Attempting to setter function but object has no associated native space.");
14411441

14421442
public static final TruffleString INSTANCE_OF_CONTEXTVAR_EXPECTED = tsLiteral("an instance of ContextVar was expected");
1443-
1443+
public static final TruffleString INSTANCE_OF_TOKEN_EXPECTED = tsLiteral("expected an instance of Token, got %s");
14441444
public static final TruffleString CONTEXTVAR_KEY_EXPECTED = tsLiteral("A ContextVar key was expected, got %s");
1445+
public static final TruffleString CANNOT_ENTER_CONTEXT_ALREADY_ENTERED = tsLiteral("cannot enter context: %s is already entered");
1446+
public static final TruffleString TOKEN_ONLY_BY_CONTEXTVAR = tsLiteral("Tokens can only be created by ContextVars");
1447+
public static final TruffleString TOKEN_FOR_DIFFERENT_CONTEXTVAR = tsLiteral("%s was created by a different ContextVar");
14451448

1446-
public static final TruffleString CANNOT_ENTER_CONTEXT_ALREADY_ENTERED = tsLiteral(" cannot enter context: %s is already entered");
14471449
public static final TruffleString CAPSULE_SETPOINTER_CALLED_WITH_NULL_POINTER = tsLiteral("PyCapsule_SetPointer called with null pointer");
14481450
public static final TruffleString CAPSULE_GETPOINTER_WITH_INVALID_CAPSULE = tsLiteral("HPyCapsule_GetPointer called with invalid PyCapsule object");
14491451
public static final TruffleString CAPSULE_GETCONTEXT_WITH_INVALID_CAPSULE = tsLiteral("HPyCapsule_GetContext called with invalid PyCapsule object");

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/object/PythonObjectFactory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
import com.oracle.graal.python.builtins.objects.complex.PComplex;
8181
import com.oracle.graal.python.builtins.objects.contextvars.PContext;
8282
import com.oracle.graal.python.builtins.objects.contextvars.PContextVar;
83+
import com.oracle.graal.python.builtins.objects.contextvars.PToken;
8384
import com.oracle.graal.python.builtins.objects.deque.PDeque;
8485
import com.oracle.graal.python.builtins.objects.deque.PDequeIter;
8586
import com.oracle.graal.python.builtins.objects.dict.PDefaultDict;
@@ -1450,4 +1451,8 @@ public final PContextVar createContextVar(TruffleString name, Object def) {
14501451
public final PContext createContextVarsContext() {
14511452
return trace(new PContext(PythonBuiltinClassType.ContextVarsContext, getShape(PythonBuiltinClassType.ContextVarsContext)));
14521453
}
1454+
1455+
public final PToken createContextVarsToken(PContextVar var, Object oldValue) {
1456+
return trace(new PToken(var, oldValue, PythonBuiltinClassType.ContextVarsToken, getShape(PythonBuiltinClassType.ContextVarsToken)));
1457+
}
14531458
}

0 commit comments

Comments
 (0)