Skip to content

Commit 46047ce

Browse files
committed
don't use guards for all native member types
1 parent d2d8d08 commit 46047ce

File tree

2 files changed

+82
-25
lines changed

2 files changed

+82
-25
lines changed

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

Lines changed: 75 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,18 +1268,60 @@ public String toString() {
12681268
}
12691269

12701270
@ExportMessage
1271-
protected boolean isMemberReadable(String member,
1272-
@CachedLibrary("this") PythonNativeWrapperLibrary lib,
1273-
@Cached GetLazyClassNode getClassNode,
1274-
@Cached GetNameNode getNameNode) {
1275-
return DynamicObjectNativeWrapper.GP_OBJECT.equals(member) || NativeMemberNames.isValid(member) ||
1276-
ReadObjectNativeMemberNode.isPyDateTimeCAPIType(getNameNode.execute(getClassNode.execute(lib.getDelegate(this))));
1271+
@ImportStatic({PGuards.class, NativeMemberNames.class, DynamicObjectNativeWrapper.class})
1272+
abstract static class IsMemberReadable {
1273+
1274+
@SuppressWarnings("unused")
1275+
@Specialization(guards = {"stringEquals(cachedName, name, stringProfile)", "isValid(cachedName)"})
1276+
static boolean isReadableNativeMembers(PythonObjectNativeWrapper receiver, String name,
1277+
@Cached("createBinaryProfile()") ConditionProfile stringProfile,
1278+
@Cached(value = "name", allowUncached = true) String cachedName) {
1279+
return true;
1280+
}
1281+
1282+
@SuppressWarnings("unused")
1283+
@Specialization(guards = "stringEquals(GP_OBJECT, name, stringProfile)")
1284+
static boolean isReadableCachedGP(PythonObjectNativeWrapper receiver, String name,
1285+
@Cached("createBinaryProfile()") ConditionProfile stringProfile) {
1286+
return true;
1287+
}
1288+
1289+
static boolean isPyTimeMemberReadable(PythonObjectNativeWrapper receiver, PythonNativeWrapperLibrary lib, GetLazyClassNode getClassNode, GetNameNode getNameNode) {
1290+
return ReadObjectNativeMemberNode.isPyDateTimeCAPIType(getNameNode.execute(getClassNode.execute(lib.getDelegate(receiver))));
1291+
}
1292+
1293+
@SuppressWarnings("unused")
1294+
@Specialization(guards = "isPyTimeMemberReadable(receiver, lib, getClassNode, getNameNode)")
1295+
static boolean isReadablePyTime(PythonObjectNativeWrapper receiver, String name,
1296+
@CachedLibrary("receiver") PythonNativeWrapperLibrary lib,
1297+
@Cached GetLazyClassNode getClassNode,
1298+
@Cached GetNameNode getNameNode) {
1299+
return true;
1300+
}
1301+
1302+
@Specialization
1303+
@TruffleBoundary
1304+
static boolean isReadableFallback(PythonObjectNativeWrapper receiver, String name,
1305+
@CachedLibrary("receiver") PythonNativeWrapperLibrary lib,
1306+
@Cached GetLazyClassNode getClassNode,
1307+
@Cached GetNameNode getNameNode) {
1308+
return DynamicObjectNativeWrapper.GP_OBJECT.equals(name) || NativeMemberNames.isValid(name) ||
1309+
ReadObjectNativeMemberNode.isPyDateTimeCAPIType(getNameNode.execute(getClassNode.execute(lib.getDelegate(receiver))));
1310+
}
12771311
}
12781312

12791313
@ExportMessage
1280-
@Override
1281-
public boolean isMemberModifiable(String member) {
1282-
return NativeMemberNames.isValid(member);
1314+
@ImportStatic({PGuards.class, NativeMemberNames.class, DynamicObjectNativeWrapper.class})
1315+
abstract static class IsMemberModifiable {
1316+
1317+
@SuppressWarnings("unused")
1318+
@Specialization(guards = "stringEquals(cachedName, name, stringProfile)")
1319+
static boolean isModifiableCached(PythonObjectNativeWrapper receiver, String name,
1320+
@Cached("createBinaryProfile()") ConditionProfile stringProfile,
1321+
@Cached(value = "name", allowUncached = true) String cachedName,
1322+
@Cached(value = "isValid(name)", allowUncached = true) boolean isValid) {
1323+
return isValid;
1324+
}
12831325
}
12841326
}
12851327

@@ -1398,10 +1440,31 @@ public static PrimitiveNativeWrapper createDouble(double val) {
13981440
return new PrimitiveNativeWrapper(val);
13991441
}
14001442

1401-
@Override
14021443
@ExportMessage
1403-
protected boolean isMemberReadable(String member) {
1404-
return member.equals(DynamicObjectNativeWrapper.GP_OBJECT) || NativeMemberNames.isValid(member);
1444+
@ImportStatic({PGuards.class, NativeMemberNames.class, DynamicObjectNativeWrapper.class})
1445+
abstract static class IsMemberReadable {
1446+
1447+
@SuppressWarnings("unused")
1448+
@Specialization(guards = {"stringEquals(cachedName, name, stringProfile)", "isValid(cachedName)"})
1449+
static boolean isReadableNativeMembers(PrimitiveNativeWrapper receiver, String name,
1450+
@Cached("createBinaryProfile()") ConditionProfile stringProfile,
1451+
@Cached(value = "name", allowUncached = true) String cachedName) {
1452+
return true;
1453+
}
1454+
1455+
@SuppressWarnings("unused")
1456+
@Specialization(guards = "stringEquals(GP_OBJECT, name, stringProfile)")
1457+
static boolean isReadableCachedGP(PrimitiveNativeWrapper receiver, String name,
1458+
@Cached("createBinaryProfile()") ConditionProfile stringProfile) {
1459+
return true;
1460+
}
1461+
1462+
@Specialization
1463+
@TruffleBoundary
1464+
static boolean isReadableFallback(@SuppressWarnings("unused") PrimitiveNativeWrapper receiver, String name) {
1465+
return DynamicObjectNativeWrapper.GP_OBJECT.equals(name) || NativeMemberNames.isValid(name);
1466+
}
1467+
14051468
}
14061469

14071470
@ExportMessage

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

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,9 @@
4141
package com.oracle.graal.python.builtins.objects.cext;
4242

4343
import java.lang.reflect.Field;
44+
import java.util.HashSet;
4445

45-
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
46-
import com.oracle.truffle.api.nodes.ExplodeLoop;
47-
import com.oracle.truffle.api.nodes.ExplodeLoop.LoopExplosionKind;
46+
import com.oracle.truffle.api.CompilerAsserts;
4847

4948
public final class NativeMemberNames {
5049
public static final String OB_BASE = "ob_base";
@@ -140,28 +139,23 @@ public final class NativeMemberNames {
140139
public static final String SET_USED = "used";
141140
public static final String MMAP_DATA = "data";
142141

143-
@CompilationFinal(dimensions = 1) private static final String[] values;
142+
private static final HashSet<String> values = new HashSet<>();
143+
144144
static {
145145
Field[] declaredFields = NativeMemberNames.class.getDeclaredFields();
146-
values = new String[declaredFields.length - 1]; // omit the values field
147146
for (int i = 0; i < declaredFields.length; i++) {
148147
Field s = declaredFields[i];
149148
if (s.getType() == String.class) {
150149
try {
151-
values[i] = (String) s.get(NativeMemberNames.class);
150+
values.add((String) s.get(NativeMemberNames.class));
152151
} catch (IllegalArgumentException | IllegalAccessException e) {
153152
}
154153
}
155154
}
156155
}
157156

158-
@ExplodeLoop(kind = LoopExplosionKind.FULL_UNROLL)
159157
public static boolean isValid(String name) {
160-
for (int i = 0; i < values.length; i++) {
161-
if (name.equals(values[i])) {
162-
return true;
163-
}
164-
}
165-
return false;
158+
CompilerAsserts.neverPartOfCompilation();
159+
return values.contains(name);
166160
}
167161
}

0 commit comments

Comments
 (0)