Skip to content

Commit 3acab65

Browse files
committed
restrict API for IsSubtypeNode to clear up when you do and do not need a frame
1 parent 8f09174 commit 3acab65

File tree

3 files changed

+30
-31
lines changed

3 files changed

+30
-31
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/PythonAbstractObject.java

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@
118118
import com.oracle.truffle.api.dsl.GenerateUncached;
119119
import com.oracle.truffle.api.dsl.ReportPolymorphism;
120120
import com.oracle.truffle.api.dsl.Specialization;
121-
import com.oracle.truffle.api.frame.VirtualFrame;
122121
import com.oracle.truffle.api.interop.ArityException;
123122
import com.oracle.truffle.api.interop.InteropLibrary;
124123
import com.oracle.truffle.api.interop.InvalidArrayIndexException;
@@ -727,26 +726,14 @@ public Object asIndexWithState(ThreadState state,
727726
throw raise.raiseIntegerInterpretationError(this);
728727
}
729728

730-
VirtualFrame frameForCall = null;
731-
732729
Object result;
733730
if (gotState.profile(state == null)) {
734731
result = callNode.execute(indexAttr, this);
735732
} else {
736-
frameForCall = PArguments.frameForCall(state);
737-
result = callNode.execute(frameForCall, indexAttr, this);
738-
}
739-
740-
boolean isInteger;
741-
LazyPythonClass resultClass = lib.getLazyPythonClass(result);
742-
if (gotState.profile(state == null)) {
743-
isInteger = isSubtype.execute(resultClass, PythonBuiltinClassType.PInt);
744-
} else {
745-
assert frameForCall != null;
746-
isInteger = isSubtype.execute(frameForCall, resultClass, PythonBuiltinClassType.PInt);
733+
result = callNode.execute(PArguments.frameForCall(state), indexAttr, this);
747734
}
748735

749-
if (resultProfile.profile(!isInteger)) {
736+
if (resultProfile.profile(!isSubtype.execute(lib.getLazyPythonClass(result), PythonBuiltinClassType.PInt))) {
750737
throw raise.raise(PythonBuiltinClassType.TypeError, "__index__ returned non-int (type %p)", result);
751738
}
752739
return result;
@@ -797,6 +784,17 @@ public final boolean isContextManager(@Exclusive @Cached HasInheritedAttributeNo
797784
private static final String DATETIME_TYPE = "datetime";
798785
private static final String TIME_TYPE = "time";
799786
private static final String STRUCT_TIME_TYPE = "struct_time";
787+
private static final PythonBuiltinClass fallbackClass = new PythonBuiltinClass(null, null);
788+
789+
private static LazyPythonClass readType(ReadAttributeFromObjectNode readTypeNode, Object module, String typename) {
790+
Object type = readTypeNode.execute(module, typename);
791+
if (type instanceof LazyPythonClass) {
792+
return (LazyPythonClass) type;
793+
} else {
794+
// this means someone messed with the builtin modules, we don't know anything and nothing will match this type
795+
return fallbackClass;
796+
}
797+
}
800798

801799
@ExportMessage
802800
public boolean isDate(@Shared("getClassNode") @Cached GetLazyClassNode getClassNode,
@@ -808,13 +806,13 @@ public boolean isDate(@Shared("getClassNode") @Cached GetLazyClassNode getClassN
808806
PDict importedModules = PythonLanguage.getContext().getImportedModules();
809807
Object module = importedModules.getItem(DATETIME_MODULE_NAME);
810808
if (dateTimeModuleLoaded.profile(module != null)) {
811-
if (isSubtypeNode.execute(objType, readTypeNode.execute(module, DATETIME_TYPE)) || isSubtypeNode.execute(objType, readTypeNode.execute(module, DATE_TYPE))) {
809+
if (isSubtypeNode.execute(objType, readType(readTypeNode, module, DATETIME_TYPE)) || isSubtypeNode.execute(objType, readType(readTypeNode, module, DATE_TYPE))) {
812810
return true;
813811
}
814812
}
815813
module = importedModules.getItem(TIME_MODULE_NAME);
816814
if (timeModuleLoaded.profile(module != null)) {
817-
if (isSubtypeNode.execute(objType, readTypeNode.execute(module, STRUCT_TIME_TYPE))) {
815+
if (isSubtypeNode.execute(objType, readType(readTypeNode, module, STRUCT_TIME_TYPE))) {
818816
return true;
819817
}
820818
}
@@ -833,7 +831,7 @@ public LocalDate asDate(@Shared("getClassNode") @Cached GetLazyClassNode getClas
833831
PDict importedModules = PythonLanguage.getContext().getImportedModules();
834832
Object module = importedModules.getItem(DATETIME_MODULE_NAME);
835833
if (dateTimeModuleLoaded.profile(module != null)) {
836-
if (isSubtypeNode.execute(objType, readTypeNode.execute(module, DATETIME_TYPE)) || isSubtypeNode.execute(objType, readTypeNode.execute(module, DATE_TYPE))) {
834+
if (isSubtypeNode.execute(objType, readType(readTypeNode, module, DATETIME_TYPE)) || isSubtypeNode.execute(objType, readType(readTypeNode, module, DATE_TYPE))) {
837835
try {
838836
int year = castToIntNode.execute(lib.readMember(this, "year"));
839837
int month = castToIntNode.execute(lib.readMember(this, "month"));
@@ -846,7 +844,7 @@ public LocalDate asDate(@Shared("getClassNode") @Cached GetLazyClassNode getClas
846844
}
847845
module = importedModules.getItem(TIME_MODULE_NAME);
848846
if (timeModuleLoaded.profile(module != null)) {
849-
if (isSubtypeNode.execute(objType, readTypeNode.execute(module, STRUCT_TIME_TYPE))) {
847+
if (isSubtypeNode.execute(objType, readType(readTypeNode, module, STRUCT_TIME_TYPE))) {
850848
try {
851849
int year = castToIntNode.execute(lib.readMember(this, "tm_year"));
852850
int month = castToIntNode.execute(lib.readMember(this, "tm_mon"));
@@ -870,13 +868,13 @@ public boolean isTime(@Shared("getClassNode") @Cached GetLazyClassNode getClassN
870868
PDict importedModules = PythonLanguage.getContext().getImportedModules();
871869
Object module = importedModules.getItem(DATETIME_MODULE_NAME);
872870
if (dateTimeModuleLoaded.profile(module != null)) {
873-
if (isSubtype.execute(objType, readTypeNode.execute(module, DATETIME_TYPE)) || isSubtype.execute(objType, readTypeNode.execute(module, TIME_TYPE))) {
871+
if (isSubtype.execute(objType, readType(readTypeNode, module, DATETIME_TYPE)) || isSubtype.execute(objType, readType(readTypeNode, module, TIME_TYPE))) {
874872
return true;
875873
}
876874
}
877875
module = importedModules.getItem(TIME_MODULE_NAME);
878876
if (timeModuleLoaded.profile(module != null)) {
879-
if (isSubtype.execute(objType, readTypeNode.execute(module, STRUCT_TIME_TYPE))) {
877+
if (isSubtype.execute(objType, readType(readTypeNode, module, STRUCT_TIME_TYPE))) {
880878
return true;
881879
}
882880
}
@@ -895,7 +893,7 @@ public LocalTime asTime(@Shared("getClassNode") @Cached GetLazyClassNode getClas
895893
PDict importedModules = PythonLanguage.getContext().getImportedModules();
896894
Object module = importedModules.getItem(DATETIME_MODULE_NAME);
897895
if (dateTimeModuleLoaded.profile(module != null)) {
898-
if (isSubtypeNode.execute(objType, readTypeNode.execute(module, DATETIME_TYPE)) || isSubtypeNode.execute(objType, readTypeNode.execute(module, TIME_TYPE))) {
896+
if (isSubtypeNode.execute(objType, readType(readTypeNode, module, DATETIME_TYPE)) || isSubtypeNode.execute(objType, readType(readTypeNode, module, TIME_TYPE))) {
899897
try {
900898
int hour = castToIntNode.execute(lib.readMember(this, "hour"));
901899
int min = castToIntNode.execute(lib.readMember(this, "minute"));
@@ -909,7 +907,7 @@ public LocalTime asTime(@Shared("getClassNode") @Cached GetLazyClassNode getClas
909907
}
910908
module = importedModules.getItem(TIME_MODULE_NAME);
911909
if (timeModuleLoaded.profile(module != null)) {
912-
if (isSubtypeNode.execute(objType, readTypeNode.execute(module, STRUCT_TIME_TYPE))) {
910+
if (isSubtypeNode.execute(objType, readType(readTypeNode, module, STRUCT_TIME_TYPE))) {
913911
try {
914912
int hour = castToIntNode.execute(lib.readMember(this, "tm_hour"));
915913
int min = castToIntNode.execute(lib.readMember(this, "tm_min"));
@@ -934,7 +932,7 @@ public boolean isTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCl
934932
PDict importedModules = PythonLanguage.getContext().getImportedModules();
935933
Object module = importedModules.getItem(DATETIME_MODULE_NAME);
936934
if (dateTimeModuleLoaded.profile(module != null)) {
937-
if (isSubtype.execute(objType, readTypeNode.execute(module, DATETIME_TYPE))) {
935+
if (isSubtype.execute(objType, readType(readTypeNode, module, DATETIME_TYPE))) {
938936
try {
939937
Object tzinfo = lib.readMember(this, "tzinfo");
940938
if (tzinfo != PNone.NONE) {
@@ -946,7 +944,7 @@ public boolean isTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCl
946944
} catch (UnsupportedMessageException | UnknownIdentifierException | ArityException | UnsupportedTypeException ex) {
947945
return false;
948946
}
949-
} else if (isSubtype.execute(objType, readTypeNode.execute(module, TIME_TYPE))) {
947+
} else if (isSubtype.execute(objType, readType(readTypeNode, module, TIME_TYPE))) {
950948
try {
951949
Object tzinfo = lib.readMember(this, "tzinfo");
952950
if (tzinfo != PNone.NONE) {
@@ -962,7 +960,7 @@ public boolean isTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCl
962960
}
963961
module = importedModules.getItem(TIME_MODULE_NAME);
964962
if (timeModuleLoaded.profile(module != null)) {
965-
if (isSubtype.execute(objType, readTypeNode.execute(module, STRUCT_TIME_TYPE))) {
963+
if (isSubtype.execute(objType, readType(readTypeNode, module, STRUCT_TIME_TYPE))) {
966964
try {
967965
Object tm_zone = lib.readMember(this, "tm_zone");
968966
if (tm_zone != PNone.NONE) {
@@ -991,7 +989,7 @@ public ZoneId asTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCla
991989
PDict importedModules = PythonLanguage.getContext().getImportedModules();
992990
Object module = importedModules.getItem(DATETIME_MODULE_NAME);
993991
if (dateTimeModuleLoaded.profile(module != null)) {
994-
if (isSubtypeNode.execute(objType, readTypeNode.execute(module, "datetime"))) {
992+
if (isSubtypeNode.execute(objType, readType(readTypeNode, module, "datetime"))) {
995993
try {
996994
Object tzinfo = lib.readMember(this, "tzinfo");
997995
if (tzinfo != PNone.NONE) {
@@ -1004,7 +1002,7 @@ public ZoneId asTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCla
10041002
} catch (UnsupportedMessageException | UnknownIdentifierException | ArityException | UnsupportedTypeException ex) {
10051003
throw UnsupportedMessageException.create();
10061004
}
1007-
} else if (isSubtypeNode.execute(objType, readTypeNode.execute(module, "time"))) {
1005+
} else if (isSubtypeNode.execute(objType, readType(readTypeNode, module, "time"))) {
10081006
try {
10091007
Object tzinfo = lib.readMember(this, "tzinfo");
10101008
if (tzinfo != PNone.NONE) {
@@ -1021,7 +1019,7 @@ public ZoneId asTimeZone(@Shared("getClassNode") @Cached GetLazyClassNode getCla
10211019
}
10221020
module = importedModules.getItem(TIME_MODULE_NAME);
10231021
if (timeModuleLoaded.profile(module != null)) {
1024-
if (isSubtypeNode.execute(objType, readTypeNode.execute(module, "struct_time"))) {
1022+
if (isSubtypeNode.execute(objType, readType(readTypeNode, module, "struct_time"))) {
10251023
try {
10261024
Object tm_zone = lib.readMember(this, "tm_zone");
10271025
if (tm_zone != PNone.NONE) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import com.oracle.graal.python.builtins.objects.str.PString;
7373
import com.oracle.graal.python.builtins.objects.str.StringNodes.StringLenNode;
7474
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
75+
import com.oracle.graal.python.builtins.objects.type.LazyPythonClass;
7576
import com.oracle.graal.python.nodes.PGuards;
7677
import com.oracle.graal.python.nodes.SpecialMethodNames;
7778
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode.LookupAndCallUnaryDynamicNode;
@@ -857,7 +858,7 @@ static ParserState doObject(ParserState state, Object kwds, @SuppressWarnings("u
857858
Object typeObject = typeToJavaNode.execute(getVaArgNode.execute(varargs, state.outIndex));
858859
state = state.incrementOutIndex();
859860
assert PGuards.isClass(typeObject);
860-
if (!isSubtypeNode.execute(getClassNode.execute(arg), typeObject)) {
861+
if (!isSubtypeNode.execute(getClassNode.execute(arg), (LazyPythonClass) typeObject)) {
861862
raiseNode.raiseIntWithoutFrame(0, TypeError, "expected object of type %s, got %p", typeObject, arg);
862863
throw ParseArgumentsException.raise();
863864
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/IsSubtypeNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public final boolean execute(VirtualFrame frame, Object derived, Object cls) {
7575
return executeInternal(frame, derived, cls);
7676
}
7777

78-
public final boolean execute(Object derived, Object cls) {
78+
public final boolean execute(LazyPythonClass derived, LazyPythonClass cls) {
7979
return executeInternal(null, derived, cls);
8080
}
8181

0 commit comments

Comments
 (0)