Skip to content

Commit c3040f8

Browse files
steve-scosminbasca
authored andcommitted
Annotate methods with @idempotent or @NonIdempotent
1 parent 9450de5 commit c3040f8

23 files changed

+85
-13
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
import com.oracle.truffle.api.TruffleLanguage;
105105
import com.oracle.truffle.api.TruffleLogger;
106106
import com.oracle.truffle.api.debug.DebuggerTags;
107+
import com.oracle.truffle.api.dsl.Idempotent;
107108
import com.oracle.truffle.api.frame.VirtualFrame;
108109
import com.oracle.truffle.api.instrumentation.ProvidedTags;
109110
import com.oracle.truffle.api.instrumentation.StandardTags;
@@ -229,6 +230,7 @@ public final class PythonLanguage extends TruffleLanguage<PythonContext> {
229230

230231
@CompilationFinal private boolean singleContext = true;
231232

233+
@Idempotent
232234
public boolean isSingleContext() {
233235
return singleContext;
234236
}
@@ -366,6 +368,7 @@ protected PythonContext createContext(Env env) {
366368
return context;
367369
}
368370

371+
@Idempotent
369372
public <T> T getEngineOption(OptionKey<T> key) {
370373
assert engineOptions != null;
371374
if (CompilerDirectives.inInterpreter()) {
@@ -681,6 +684,7 @@ public String getHome() {
681684
/**
682685
* If this object can be cached in the AST.
683686
*/
687+
@Idempotent
684688
public static boolean canCache(Object value) {
685689
CompilerAsserts.neverPartOfCompilation();
686690
// We cache strings with at most 16 characters. This corresponds to byte length of 64 for

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@
268268
import com.oracle.truffle.api.dsl.GenerateCached;
269269
import com.oracle.truffle.api.dsl.GenerateInline;
270270
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
271+
import com.oracle.truffle.api.dsl.Idempotent;
271272
import com.oracle.truffle.api.dsl.ImportStatic;
272273
import com.oracle.truffle.api.dsl.NeverDefault;
273274
import com.oracle.truffle.api.dsl.ReportPolymorphism;
@@ -1410,6 +1411,7 @@ protected RecursiveBinaryCheckBaseNode createRecursive(@SuppressWarnings("unused
14101411
throw new AbstractMethodError(); // Cannot be really abstract b/c Truffle DSL...
14111412
}
14121413

1414+
@Idempotent
14131415
protected int getMaxExplodeLoop() {
14141416
return MAX_EXPLODE_LOOP >> depth;
14151417
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMANodes.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@
134134
import com.oracle.truffle.api.dsl.GenerateInline;
135135
import com.oracle.truffle.api.dsl.ImportStatic;
136136
import com.oracle.truffle.api.dsl.NeverDefault;
137+
import com.oracle.truffle.api.dsl.NonIdempotent;
137138
import com.oracle.truffle.api.dsl.Specialization;
138139
import com.oracle.truffle.api.frame.Frame;
139140
import com.oracle.truffle.api.frame.VirtualFrame;
@@ -1201,6 +1202,7 @@ public abstract static class IsCheckSupported extends PNodeWithRaise {
12011202

12021203
public abstract boolean execute(int checkId);
12031204

1205+
@NonIdempotent
12041206
protected boolean useNativeContext() {
12051207
return PythonContext.get(this).getNFILZMASupport().isAvailable();
12061208
}
@@ -1227,6 +1229,7 @@ public abstract static class EncodeFilterProperties extends PNodeWithRaise {
12271229

12281230
public abstract byte[] execute(VirtualFrame frame, Object filter);
12291231

1232+
@NonIdempotent
12301233
protected boolean useNativeContext() {
12311234
return PythonContext.get(this).getNFILZMASupport().isAvailable();
12321235
}
@@ -1268,6 +1271,7 @@ public abstract static class DecodeFilterProperties extends PNodeWithRaise {
12681271

12691272
public abstract void execute(VirtualFrame frame, long id, byte[] encoded, PDict dict);
12701273

1274+
@NonIdempotent
12711275
protected boolean useNativeContext() {
12721276
return PythonContext.get(this).getNFILZMASupport().isAvailable();
12731277
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibModuleBuiltins.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
import com.oracle.truffle.api.dsl.ImportStatic;
101101
import com.oracle.truffle.api.dsl.NeverDefault;
102102
import com.oracle.truffle.api.dsl.NodeFactory;
103+
import com.oracle.truffle.api.dsl.NonIdempotent;
103104
import com.oracle.truffle.api.dsl.Specialization;
104105
import com.oracle.truffle.api.dsl.TypeSystemReference;
105106
import com.oracle.truffle.api.frame.VirtualFrame;
@@ -326,6 +327,7 @@ protected ArgumentClinicProvider getArgumentClinic() {
326327
return ZLibModuleBuiltinsClinicProviders.Crc32NodeClinicProviderGen.INSTANCE;
327328
}
328329

330+
@NonIdempotent
329331
protected boolean useNative() {
330332
return PythonContext.get(this).getNFIZlibSupport().isAvailable();
331333
}
@@ -403,6 +405,7 @@ protected ArgumentClinicProvider getArgumentClinic() {
403405
return ZLibModuleBuiltinsClinicProviders.Adler32NodeClinicProviderGen.INSTANCE;
404406
}
405407

408+
@NonIdempotent
406409
protected boolean useNative() {
407410
return getContext().getNFIZlibSupport().isAvailable();
408411
}
@@ -489,6 +492,7 @@ protected ArgumentClinicProvider getArgumentClinic() {
489492
return ZLibModuleBuiltinsClinicProviders.CompressNodeClinicProviderGen.INSTANCE;
490493
}
491494

495+
@NonIdempotent
492496
protected boolean useNative() {
493497
return getContext().getNFIZlibSupport().isAvailable();
494498
}
@@ -560,6 +564,7 @@ protected ArgumentClinicProvider getArgumentClinic() {
560564
return ZLibModuleBuiltinsClinicProviders.DecompressNodeClinicProviderGen.INSTANCE;
561565
}
562566

567+
@NonIdempotent
563568
protected boolean useNative() {
564569
return PythonContext.get(this).getNFIZlibSupport().isAvailable();
565570
}
@@ -647,6 +652,7 @@ protected ArgumentClinicProvider getArgumentClinic() {
647652
return ZLibModuleBuiltinsClinicProviders.CompressObjNodeClinicProviderGen.INSTANCE;
648653
}
649654

655+
@NonIdempotent
650656
protected boolean useNative() {
651657
return PythonContext.get(this).getNFIZlibSupport().isAvailable();
652658
}
@@ -720,6 +726,7 @@ protected ArgumentClinicProvider getArgumentClinic() {
720726
return ZLibModuleBuiltinsClinicProviders.DecompressObjNodeClinicProviderGen.INSTANCE;
721727
}
722728

729+
@NonIdempotent
723730
protected boolean useNative() {
724731
return PythonContext.get(this).getNFIZlibSupport().isAvailable();
725732
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CExtParseArgumentsNode.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
import com.oracle.truffle.api.dsl.Cached.Exclusive;
9696
import com.oracle.truffle.api.dsl.Cached.Shared;
9797
import com.oracle.truffle.api.dsl.Fallback;
98+
import com.oracle.truffle.api.dsl.Idempotent;
9899
import com.oracle.truffle.api.dsl.ImportStatic;
99100
import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic;
100101
import com.oracle.truffle.api.dsl.Specialization;
@@ -150,8 +151,13 @@ public abstract static class ParseTupleAndKeywordsNode extends Node {
150151

151152
public abstract int execute(TruffleString funName, Object argv, Object kwds, Object format, Object kwdnames, Object varargs);
152153

154+
@Idempotent
155+
static int tsLength(TruffleString.CodePointLengthNode lengthNode, TruffleString s) {
156+
return lengthNode.execute(s, TS_ENCODING);
157+
}
158+
153159
@ExplodeLoop(kind = LoopExplosionKind.FULL_UNROLL_UNTIL_RETURN)
154-
@Specialization(guards = {"isDictOrNull(kwds)", "eqNode.execute(cachedFormat, format, TS_ENCODING)", "lengthNode.execute(cachedFormat, TS_ENCODING) <= 8"}, limit = "5")
160+
@Specialization(guards = {"isDictOrNull(kwds)", "eqNode.execute(cachedFormat, format, TS_ENCODING)", "tsLength(lengthNode, cachedFormat) <= 8"}, limit = "5")
155161
int doSpecial(TruffleString funName, PTuple argv, Object kwds, @SuppressWarnings("unused") TruffleString format, Object kwdnames, Object varargs,
156162
@Cached(value = "format", allowUncached = true) @SuppressWarnings("unused") TruffleString cachedFormat,
157163
@Cached TruffleString.CodePointLengthNode lengthNode,

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/PBuiltinMethod.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2022, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2023, Oracle and/or its affiliates.
33
* Copyright (c) 2013, Regents of the University of California
44
*
55
* All rights reserved.
@@ -28,6 +28,7 @@
2828
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
2929
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
3030
import com.oracle.truffle.api.CompilerAsserts;
31+
import com.oracle.truffle.api.dsl.Idempotent;
3132
import com.oracle.truffle.api.interop.InteropLibrary;
3233
import com.oracle.truffle.api.library.ExportLibrary;
3334
import com.oracle.truffle.api.library.ExportMessage;
@@ -61,6 +62,7 @@ public PBuiltinMethod(Object clazz, Shape instanceShape, Object self, PBuiltinFu
6162
this.classObject = classObject;
6263
}
6364

65+
@Idempotent
6466
public PBuiltinFunction getFunction() {
6567
return function;
6668
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectBuiltins.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@
142142
import com.oracle.truffle.api.dsl.Cached.Shared;
143143
import com.oracle.truffle.api.dsl.Fallback;
144144
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
145+
import com.oracle.truffle.api.dsl.Idempotent;
145146
import com.oracle.truffle.api.dsl.ImportStatic;
146147
import com.oracle.truffle.api.dsl.NeverDefault;
147148
import com.oracle.truffle.api.dsl.NodeFactory;
@@ -407,6 +408,7 @@ public abstract static class GetAttributeNode extends PythonBinaryBuiltinNode {
407408
@Child private ReadAttributeFromObjectNode attrRead;
408409
@Child private GetClassNode getDescClassNode;
409410

411+
@Idempotent
410412
protected static int tsLen(TruffleString ts) {
411413
CompilerAsserts.neverPartOfCompilation();
412414
return TruffleString.CodePointLengthNode.getUncached().execute(ts, TS_ENCODING) + 1;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/superobject/SuperBuiltins.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
import com.oracle.truffle.api.dsl.Cached;
105105
import com.oracle.truffle.api.dsl.Fallback;
106106
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
107+
import com.oracle.truffle.api.dsl.Idempotent;
107108
import com.oracle.truffle.api.dsl.NeverDefault;
108109
import com.oracle.truffle.api.dsl.NodeFactory;
109110
import com.oracle.truffle.api.dsl.Specialization;
@@ -224,6 +225,7 @@ PNone init(VirtualFrame frame, SuperObject self, Object cls, Object obj) {
224225
return PNone.NONE;
225226
}
226227

228+
@Idempotent
227229
protected boolean isInBuiltinFunctionRoot() {
228230
return getRootNode() instanceof BuiltinFunctionRootNode;
229231
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/SpecialMethodSlot.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -146,6 +146,7 @@
146146
import com.oracle.truffle.api.CompilerAsserts;
147147
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
148148
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
149+
import com.oracle.truffle.api.dsl.Idempotent;
149150
import com.oracle.truffle.api.dsl.NodeFactory;
150151
import com.oracle.truffle.api.object.DynamicObject;
151152
import com.oracle.truffle.api.object.DynamicObjectLibrary;
@@ -334,6 +335,7 @@ public Object getValue(PythonManagedClass klass) {
334335
return klass.specialMethodSlots[ordinal()];
335336
}
336337

338+
@Idempotent
337339
public Object getValue(PythonBuiltinClassType klassType) {
338340
// should not be called during initialization
339341
return klassType.getSpecialMethodSlots()[ordinal()];

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
import com.oracle.graal.python.util.OverflowException;
112112
import com.oracle.truffle.api.CompilerDirectives;
113113
import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
114+
import com.oracle.truffle.api.dsl.Idempotent;
114115
import com.oracle.truffle.api.frame.VirtualFrame;
115116
import com.oracle.truffle.api.interop.InteropLibrary;
116117
import com.oracle.truffle.api.interop.UnsupportedMessageException;
@@ -202,14 +203,17 @@ public static boolean isStgDict(Object dict) {
202203
return dict instanceof StgDictObject;
203204
}
204205

206+
@Idempotent
205207
public static boolean isFunction(Object value) {
206208
return value instanceof PBuiltinFunction || value instanceof PFunction;
207209
}
208210

211+
@Idempotent
209212
public static boolean isPBuiltinFunction(Object value) {
210213
return value instanceof PBuiltinFunction;
211214
}
212215

216+
@Idempotent
213217
public static boolean isPFunction(Object value) {
214218
return value instanceof PFunction;
215219
}

0 commit comments

Comments
 (0)