Skip to content

Commit e41e01a

Browse files
committed
[GR-72726] Fix: properly setup call location where necessary.
PullRequest: graalpython/4211
2 parents adde3b7 + 9b83bd9 commit e41e01a

17 files changed

Lines changed: 190 additions & 172 deletions

File tree

graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/Parser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23967,7 +23967,7 @@ private boolean genLookahead__tmp_328_rule(boolean match) {
2396723967
return (result != null) == match;
2396823968
}
2396923969

23970-
23970+
2397123971
@Override
2397223972
protected SSTNode runParser(InputType inputType) {
2397323973
SSTNode result = null;

graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/SlotsMapping.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2024, 2026, 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
@@ -51,7 +51,7 @@ private static String getSuffix(boolean isComplex) {
5151

5252
static String getSlotBaseClass(Slot s) {
5353
return switch (s.value()) {
54-
case nb_bool -> "TpSlotInquiry.TpSlotInquiryBuiltin";
54+
case nb_bool -> "TpSlotInquiry.TpSlotInquiryBuiltin" + getSuffix(s.isComplex());
5555
case nb_index, nb_int, nb_float, nb_absolute, nb_positive, nb_negative, nb_invert,
5656
tp_iter, tp_str, tp_repr, am_aiter, am_anext, am_await ->
5757
"TpSlotUnaryFunc.TpSlotUnaryFuncBuiltin";
@@ -128,10 +128,7 @@ static String getUncachedExecuteSignature(SlotKind s) {
128128
}
129129

130130
static boolean supportsComplex(SlotKind s) {
131-
return switch (s) {
132-
case nb_bool -> false;
133-
default -> true;
134-
};
131+
return true;
135132
}
136133

137134
static boolean supportsSimple(SlotKind s) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,10 +1050,10 @@ public long cacheKeyForBytecode(byte[] code) {
10501050
.build();
10511051
@CompilationFinal private Object cachedTRegexLineBreakRegex;
10521052

1053-
public Object getCachedTRegexLineBreakRegex(PythonContext context) {
1053+
public Object getCachedTRegexLineBreakRegex(Node location, PythonContext context) {
10541054
if (cachedTRegexLineBreakRegex == null) {
10551055
CompilerDirectives.transferToInterpreterAndInvalidate();
1056-
cachedTRegexLineBreakRegex = context.getEnv().parseInternal(LINEBREAK_REGEX_SOURCE).call();
1056+
cachedTRegexLineBreakRegex = context.getEnv().parseInternal(LINEBREAK_REGEX_SOURCE).call(location);
10571057
}
10581058
return cachedTRegexLineBreakRegex;
10591059
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,11 +1389,11 @@ static PTuple doCreate(long arrowArrayAddr, long arrowSchemaAddr,
13891389
@Cached PythonCextCapsuleBuiltins.PyCapsuleNewNode pyCapsuleNewNode) {
13901390
var ctx = getContext(inliningTarget);
13911391

1392-
long arrayDestructor = ctx.arrowSupport.getArrowArrayDestructor();
1392+
long arrayDestructor = ctx.arrowSupport.getArrowArrayDestructor(inliningTarget);
13931393
var arrayCapsuleName = new CArrayWrappers.CByteArrayWrapper(ArrowArray.CAPSULE_NAME);
13941394
PyCapsule arrowArrayCapsule = pyCapsuleNewNode.execute(inliningTarget, arrowArrayAddr, arrayCapsuleName, arrayDestructor);
13951395

1396-
long schemaDestructor = ctx.arrowSupport.getArrowSchemaDestructor();
1396+
long schemaDestructor = ctx.arrowSupport.getArrowSchemaDestructor(inliningTarget);
13971397
var schemaCapsuleName = new CArrayWrappers.CByteArrayWrapper(ArrowSchema.CAPSULE_NAME);
13981398
PyCapsule arrowSchemaCapsule = pyCapsuleNewNode.execute(inliningTarget, arrowSchemaAddr, schemaCapsuleName, schemaDestructor);
13991399
return PFactory.createTuple(ctx.getLanguage(inliningTarget), new Object[]{arrowSchemaCapsule, arrowArrayCapsule});

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import static com.oracle.graal.python.util.PythonUtils.EMPTY_BYTE_ARRAY;
6969
import static com.oracle.graal.python.util.PythonUtils.EMPTY_OBJECT_ARRAY;
7070
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
71+
import static com.oracle.graal.python.util.PythonUtils.callCallTarget;
7172
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
7273

7374
import java.io.IOException;
@@ -82,8 +83,8 @@
8283
import com.oracle.graal.python.builtins.Python3Core;
8384
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
8485
import com.oracle.graal.python.builtins.PythonBuiltins;
85-
import com.oracle.graal.python.builtins.modules.PolyglotModuleBuiltinsClinicProviders.RegisterInteropTypeNodeClinicProviderGen;
8686
import com.oracle.graal.python.builtins.modules.PolyglotModuleBuiltinsClinicProviders.EnterForeignCriticalRegionNodeClinicProviderGen;
87+
import com.oracle.graal.python.builtins.modules.PolyglotModuleBuiltinsClinicProviders.RegisterInteropTypeNodeClinicProviderGen;
8788
import com.oracle.graal.python.builtins.objects.PNone;
8889
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
8990
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
@@ -287,7 +288,7 @@ Object eval(Object pathObj, Object stringObj, Object languageObj) {
287288
if (mimeType != null) {
288289
builder = builder.mimeType(mimeType);
289290
}
290-
Object result = env.parsePublic(builder.build()).call();
291+
Object result = callCallTarget(env.parsePublic(builder.build()), this);
291292
return PForeignToPTypeNode.getUncached().executeConvert(result);
292293
} catch (AbstractTruffleException e) {
293294
throw e;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/TRegexCache.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,17 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules.re;
4242

43+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
44+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
45+
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
46+
import static com.oracle.graal.python.util.PythonUtils.callCallTarget;
47+
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
48+
49+
import java.nio.charset.StandardCharsets;
50+
import java.util.Objects;
51+
52+
import org.graalvm.collections.EconomicMap;
53+
4354
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
4455
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
4556
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -57,15 +68,6 @@
5768
import com.oracle.truffle.api.source.Source;
5869
import com.oracle.truffle.api.source.SourceSection;
5970
import com.oracle.truffle.api.strings.TruffleString;
60-
import org.graalvm.collections.EconomicMap;
61-
62-
import java.nio.charset.StandardCharsets;
63-
import java.util.Objects;
64-
65-
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
66-
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
67-
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
68-
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
6971

7072
public final class TRegexCache {
7173

@@ -302,7 +304,7 @@ public Object compile(Node node, PythonContext context, PythonMethod method, boo
302304
Object compiledRegex;
303305
try {
304306
Source regexSource = Source.newBuilder("regex", options + '/' + pattern + '/' + flags, "re").mimeType("application/tregex").internal(true).build();
305-
compiledRegex = context.getEnv().parseInternal(regexSource).call();
307+
compiledRegex = callCallTarget(context.getEnv().parseInternal(regexSource), node);
306308
assert !lib.isNull(compiledRegex) : "This shouldn't happen";
307309
} catch (RuntimeException e) {
308310
throw handleCompilationError(node, e, lib);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/weakref/ProxyTypeBuiltins.java

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules.weakref;
4242

43+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ReferenceError;
44+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
45+
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___BYTES__;
46+
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__;
47+
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___BYTES__;
48+
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DELITEM__;
49+
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REVERSED__;
50+
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETITEM__;
51+
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
52+
53+
import java.util.List;
54+
4355
import com.oracle.graal.python.PythonLanguage;
4456
import com.oracle.graal.python.annotations.Builtin;
4557
import com.oracle.graal.python.annotations.Slot;
@@ -133,18 +145,6 @@
133145
import com.oracle.truffle.api.object.Shape;
134146
import com.oracle.truffle.api.strings.TruffleString;
135147

136-
import java.util.List;
137-
138-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ReferenceError;
139-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
140-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___BYTES__;
141-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__;
142-
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___BYTES__;
143-
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DELITEM__;
144-
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REVERSED__;
145-
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETITEM__;
146-
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
147-
148148
@CoreFunctions(extendClasses = PythonBuiltinClassType.PProxyType)
149149
public final class ProxyTypeBuiltins extends PythonBuiltins {
150150

@@ -311,17 +311,15 @@ static Object richCmp(VirtualFrame frame, PProxyType self, Object other, RichCmp
311311
}
312312
}
313313

314-
@Slot(value = Slot.SlotKind.nb_bool)
314+
@Slot(value = Slot.SlotKind.nb_bool, isComplex = true)
315315
@GenerateUncached
316316
@GenerateNodeFactory
317317
public abstract static class BoolNode extends TpSlotInquiry.NbBoolBuiltinNode {
318-
319318
@Specialization
320-
@TruffleBoundary
321-
static boolean bool(PProxyType self,
322-
@Bind Node inliningTarget) {
323-
Object object = unwrap(self, inliningTarget);
324-
return PyObjectIsTrueNode.executeUncached(object);
319+
static boolean bool(VirtualFrame frame, PProxyType self,
320+
@Bind Node inliningTarget,
321+
@Cached PyObjectIsTrueNode isTrueNode) {
322+
return isTrueNode.execute(frame, unwrap(self, inliningTarget));
325323
}
326324
}
327325

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2025, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2026, Oracle and/or its affiliates.
33
* Copyright (c) 2013, Regents of the University of California
44
*
55
* All rights reserved.
@@ -1502,7 +1502,7 @@ static PList doStringKeepends(Node inliningTarget, TruffleString self, boolean k
15021502
@Cached TRegexUtil.InvokeGetGroupBoundariesMethodNode getEndNode,
15031503
@Cached TruffleString.SubstringByteIndexNode substringNode,
15041504
@Cached AppendNode appendNode) {
1505-
Object lineBreakRegex = PythonLanguage.get(inliningTarget).getCachedTRegexLineBreakRegex(PythonContext.get(inliningTarget));
1505+
Object lineBreakRegex = PythonLanguage.get(inliningTarget).getCachedTRegexLineBreakRegex(inliningTarget, PythonContext.get(inliningTarget));
15061506
CompilerAsserts.partialEvaluationConstant(lineBreakRegex);
15071507
PList list = PFactory.createList(PythonLanguage.get(inliningTarget));
15081508
int lastEnd = 0;

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

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2024, 2026, 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
@@ -41,25 +41,31 @@
4141
package com.oracle.graal.python.builtins.objects.type.slots;
4242

4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
44+
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___BOOL__;
4445
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___BOOL__;
4546

47+
import com.oracle.graal.python.PythonLanguage;
4648
import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.CheckInquiryResultNode;
4749
import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
4850
import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
4951
import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
5052
import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
53+
import com.oracle.graal.python.builtins.objects.function.PArguments;
5154
import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.UnaryPythonSlotDispatcherNode;
55+
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltinBase;
5256
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotNative;
5357
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
54-
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotSimpleBuiltinBase;
5558
import com.oracle.graal.python.lib.PyBoolCheckNode;
5659
import com.oracle.graal.python.lib.PyObjectIsTrueNode;
5760
import com.oracle.graal.python.nodes.ErrorMessages;
5861
import com.oracle.graal.python.nodes.PRaiseNode;
62+
import com.oracle.graal.python.nodes.call.CallDispatchers;
5963
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6064
import com.oracle.graal.python.runtime.PythonContext;
6165
import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
6266
import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
67+
import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
68+
import com.oracle.truffle.api.RootCallTarget;
6369
import com.oracle.truffle.api.dsl.Bind;
6470
import com.oracle.truffle.api.dsl.Cached;
6571
import com.oracle.truffle.api.dsl.GenerateCached;
@@ -74,16 +80,44 @@ public abstract class TpSlotInquiry {
7480
private TpSlotInquiry() {
7581
}
7682

77-
public abstract static class TpSlotInquiryBuiltin<T extends InquiryBuiltinNode> extends TpSlotSimpleBuiltinBase<T> {
83+
public abstract static sealed class TpSlotInquiryBuiltin<T extends InquiryBuiltinNode> extends
84+
TpSlotBuiltinBase<T> permits TpSlotInquiryBuiltinSimple, TpSlotInquiryBuiltinComplex {
85+
static final BuiltinSlotWrapperSignature SIGNATURE = BuiltinSlotWrapperSignature.UNARY;
86+
7887
protected TpSlotInquiryBuiltin(NodeFactory<T> nodeFactory) {
79-
super(nodeFactory, BuiltinSlotWrapperSignature.UNARY, PExternalFunctionWrapper.INQUIRY);
88+
super(nodeFactory, SIGNATURE, PExternalFunctionWrapper.INQUIRY);
8089
}
8190

8291
final InquiryBuiltinNode createSlotNode() {
8392
return createNode();
8493
}
94+
}
95+
96+
public abstract static non-sealed class TpSlotInquiryBuiltinSimple<T extends InquiryBuiltinNode> extends TpSlotInquiryBuiltin<T> {
97+
protected TpSlotInquiryBuiltinSimple(NodeFactory<T> nodeFactory) {
98+
super(nodeFactory);
99+
}
85100

86101
protected abstract boolean executeUncached(Object self);
102+
103+
@Override
104+
public final void initialize(PythonLanguage language) {
105+
// nop
106+
}
107+
}
108+
109+
public abstract static non-sealed class TpSlotInquiryBuiltinComplex<T extends InquiryBuiltinNode> extends TpSlotInquiryBuiltin<T> {
110+
private final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
111+
112+
protected TpSlotInquiryBuiltinComplex(NodeFactory<T> nodeFactory) {
113+
super(nodeFactory);
114+
}
115+
116+
@Override
117+
public final void initialize(PythonLanguage language) {
118+
RootCallTarget callTarget = createSlotCallTarget(language, SIGNATURE, getNodeFactory(), J___BOOL__);
119+
language.setBuiltinSlotCallTarget(callTargetIndex, callTarget);
120+
}
87121
}
88122

89123
@GenerateInline(value = false, inherit = true)
@@ -116,13 +150,6 @@ static boolean callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused")
116150
return slotNode.executeBool(frame, self);
117151
}
118152

119-
@Specialization(replaces = "callCachedBuiltin")
120-
static boolean callGenericSimpleBuiltin(TpSlotInquiryBuiltin slot, Object self) {
121-
// All nb_bool builtins are known to be simple enough to not require PE for good
122-
// performance, so we call them uncached
123-
return slot.executeUncached(self);
124-
}
125-
126153
@Specialization
127154
static boolean callPython(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
128155
@Cached(inline = false) CallNbBoolPythonNode callSlotNode) {
@@ -140,6 +167,23 @@ static boolean callNative(VirtualFrame frame, Node inliningTarget, TpSlotNative
140167
Object result = externalInvokeNode.call(frame, inliningTarget, threadState, C_API_TIMING, T___BOOL__, slot.callable, toNativeNode.execute(self));
141168
return checkResultNode.executeBool(threadState, T___BOOL__, result);
142169
}
170+
171+
@Specialization(replaces = "callCachedBuiltin")
172+
static boolean callGenericSimpleBuiltin(TpSlotInquiryBuiltinSimple<?> slot, Object self) {
173+
// Most nb_bool builtins are known to be simple enough to not require PE for good
174+
// performance, so we call them uncached
175+
return slot.executeUncached(self);
176+
}
177+
178+
@Specialization(replaces = "callCachedBuiltin")
179+
@InliningCutoff
180+
static boolean callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotInquiryBuiltinComplex<?> slot, Object self,
181+
@Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
182+
Object[] arguments = PArguments.create(1);
183+
PArguments.setArgument(arguments, 0, self);
184+
RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
185+
return (boolean) invoke.execute(frame, inliningTarget, callTarget, arguments);
186+
}
143187
}
144188

145189
@GenerateUncached

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/InvokeArrowReleaseCallbackNode.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2025, 2026, 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
@@ -70,7 +70,7 @@ public final void executeCached(long releaseCallback, long baseStructure) {
7070
@Specialization
7171
static void doIt(Node inliningTarget, long releaseCallback, long baseStructure,
7272
@Bind("getContext(inliningTarget)") PythonContext ctx,
73-
@Cached(value = "createReleaseCallbackSignature(ctx)", allowUncached = true) Object callbackSignature,
73+
@Cached(value = "createReleaseCallbackSignature($node, ctx)", allowUncached = true) Object callbackSignature,
7474
@CachedLibrary(limit = "1") SignatureLibrary signatureLibrary) {
7575
try {
7676
signatureLibrary.call(callbackSignature, new NativePointer(releaseCallback), baseStructure);
@@ -80,8 +80,8 @@ static void doIt(Node inliningTarget, long releaseCallback, long baseStructure,
8080
}
8181

8282
@NeverDefault
83-
static Object createReleaseCallbackSignature(PythonContext context) {
84-
return ArrowUtil.createNfiSignature("(UINT64):VOID", context);
83+
static Object createReleaseCallbackSignature(Node location, PythonContext context) {
84+
return ArrowUtil.createNfiSignature(location, "(UINT64):VOID", context);
8585
}
8686

8787
@GenerateCached(false)

0 commit comments

Comments
 (0)