Skip to content

Commit 79032be

Browse files
committed
[GR-23218] Make test_descr pass - test_qualname.
PullRequest: graalpython/1375
2 parents 6f6484d + dcaf1f3 commit 79032be

File tree

3 files changed

+134
-12
lines changed

3 files changed

+134
-12
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_type.py

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,4 +329,66 @@ class C():
329329

330330
class C(tuple):
331331
__itemsize__ = 42
332-
assert C.__itemsize__ == 8
332+
assert C.__itemsize__ == 8
333+
334+
def test_descr_name_qualname():
335+
assert float.real.__qualname__ == 'float.real'
336+
assert float.real.__name__ == 'real'
337+
class C: __slots__ = ['a']
338+
assert C.a.__name__ == 'a'
339+
assert C.a.__qualname__ == 'test_descr_name_qualname.<locals>.C.a'
340+
raised = False
341+
try:
342+
C.a.__qualname__ = 'b'
343+
except AttributeError:
344+
raised = True
345+
assert raised
346+
raised = False
347+
try:
348+
C.a.__name__ = 'b'
349+
except AttributeError:
350+
raised = True
351+
assert raised
352+
353+
def test_cant_set_builtin_attributes():
354+
raised = False
355+
try:
356+
float.__name__ = 'b'
357+
except TypeError:
358+
raised = True
359+
assert raised
360+
361+
raised = False
362+
try:
363+
float.__qualname__ = 'b'
364+
except TypeError:
365+
raised = True
366+
assert raised
367+
368+
raised = False
369+
try:
370+
float.__dictoffset__ = 'b'
371+
except TypeError:
372+
raised = True
373+
assert raised
374+
375+
raised = False
376+
try:
377+
float.__module__ = 'b'
378+
except TypeError:
379+
raised = True
380+
assert raised
381+
382+
raised = False
383+
try:
384+
float.__itemsize__ = 'b'
385+
except TypeError:
386+
raised = True
387+
assert raised
388+
389+
raised = False
390+
try:
391+
float.__basicsize__ = 'b'
392+
except TypeError:
393+
raised = True
394+
assert raised

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/GetSetDescriptorTypeBuiltins.java

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@
6262
import com.oracle.graal.python.nodes.PGuards;
6363
import com.oracle.graal.python.nodes.PNodeWithContext;
6464
import com.oracle.graal.python.nodes.PRaiseNode;
65+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
66+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__QUALNAME__;
67+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__OBJCLASS__;
68+
import com.oracle.graal.python.nodes.attributes.GetAttributeNode.GetFixedAttributeNode;
6569
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
6670
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
6771
import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode;
@@ -96,13 +100,59 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
96100
@GenerateNodeFactory
97101
abstract static class GetSetReprNode extends PythonUnaryBuiltinNode {
98102
@Specialization
99-
Object repr(GetSetDescriptor descr) {
100-
return PythonUtils.format("<attribute '%s' of '%s' objects>", descr.getName(), GetNameNode.doSlowPath(descr.getType()));
103+
Object repr(GetSetDescriptor descr,
104+
@Cached GetNameNode getName) {
105+
return PythonUtils.format("<attribute '%s' of '%s' objects>", descr.getName(), getName.execute(descr.getType()));
101106
}
102107

103108
@Specialization
104-
Object repr(HiddenKeyDescriptor descr) {
105-
return PythonUtils.format("<attribute '%s' of '%s' objects>", descr.getKey(), GetNameNode.doSlowPath(descr.getType()));
109+
Object repr(HiddenKeyDescriptor descr,
110+
@Cached GetNameNode getName) {
111+
return PythonUtils.format("<attribute '%s' of '%s' objects>", descr.getKey(), getName.execute(descr.getType()));
112+
}
113+
}
114+
115+
@Builtin(name = __OBJCLASS__, minNumOfPositionalArgs = 1, isGetter = true)
116+
@GenerateNodeFactory
117+
public abstract static class ObjclassNode extends PythonUnaryBuiltinNode {
118+
@Specialization
119+
Object objclass(GetSetDescriptor self) {
120+
return self;
121+
}
122+
123+
@Specialization
124+
Object objclass(HiddenKeyDescriptor self) {
125+
return self;
126+
}
127+
}
128+
129+
@Builtin(name = __QUALNAME__, minNumOfPositionalArgs = 1, isGetter = true)
130+
@GenerateNodeFactory
131+
public abstract static class QualnameNode extends PythonUnaryBuiltinNode {
132+
@Specialization
133+
Object qualname(VirtualFrame frame, GetSetDescriptor self,
134+
@Cached("create(__QUALNAME__)") GetFixedAttributeNode readQualNameNode) {
135+
return PythonUtils.format("%s.%s", readQualNameNode.executeObject(frame, self.getType()), self.getName());
136+
}
137+
138+
@Specialization
139+
Object qualname(VirtualFrame frame, HiddenKeyDescriptor self,
140+
@Cached("create(__QUALNAME__)") GetFixedAttributeNode readQualNameNode) {
141+
return PythonUtils.format("%s.%s", readQualNameNode.executeObject(frame, self.getType()), self.getKey().getName());
142+
}
143+
}
144+
145+
@Builtin(name = __NAME__, minNumOfPositionalArgs = 1, isGetter = true)
146+
@GenerateNodeFactory
147+
public abstract static class NameNode extends PythonUnaryBuiltinNode {
148+
@Specialization
149+
Object qualname(GetSetDescriptor self) {
150+
return self.getName();
151+
}
152+
153+
@Specialization
154+
Object qualname(HiddenKeyDescriptor self) {
155+
return self.getKey().getName();
106156
}
107157
}
108158

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

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -852,12 +852,12 @@ static String getNameBuiltin(PythonManagedClass cls, @SuppressWarnings("unused")
852852

853853
@Specialization(guards = "!isNoValue(value)")
854854
Object setName(@SuppressWarnings("unused") PythonBuiltinClassType cls, @SuppressWarnings("unused") Object value) {
855-
throw raise(PythonErrorType.RuntimeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
855+
throw raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
856856
}
857857

858858
@Specialization(guards = "!isNoValue(value)")
859859
Object setName(@SuppressWarnings("unused") PythonBuiltinClass cls, @SuppressWarnings("unused") Object value) {
860-
throw raise(PythonErrorType.RuntimeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
860+
throw raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
861861
}
862862

863863
@Specialization(guards = {"!isNoValue(value)", "!isPythonBuiltinClass(cls)"})
@@ -943,6 +943,16 @@ Object setNative(@SuppressWarnings("unused") PythonNativeClass cls, @SuppressWar
943943
throw raise(PythonErrorType.RuntimeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "native type");
944944
}
945945

946+
@Specialization(guards = "!isNoValue(value)")
947+
Object setModuleType(@SuppressWarnings("unused") PythonBuiltinClassType cls, @SuppressWarnings("unused") Object value) {
948+
throw raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
949+
}
950+
951+
@Specialization(guards = "!isNoValue(value)")
952+
Object setModuleBuiltin(@SuppressWarnings("unused") PythonBuiltinClass cls, @SuppressWarnings("unused") Object value) {
953+
throw raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
954+
}
955+
946956
@TruffleBoundary
947957
private static Object getModuleName(String fqname) {
948958
int firstDotIdx = fqname.indexOf('.');
@@ -967,7 +977,7 @@ static String getName(PythonManagedClass cls, @SuppressWarnings("unused") PNone
967977

968978
@Specialization(guards = "!isNoValue(value)")
969979
Object setName(@SuppressWarnings("unused") PythonBuiltinClass cls, @SuppressWarnings("unused") Object value) {
970-
throw raise(PythonErrorType.RuntimeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
980+
throw raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
971981
}
972982

973983
@Specialization(guards = {"!isNoValue(value)", "!isPythonBuiltinClass(cls)"})
@@ -1026,12 +1036,12 @@ static Object getDictoffsetManaged(PythonManagedClass cls, @SuppressWarnings("un
10261036

10271037
@Specialization(guards = "!isNoValue(value)")
10281038
Object setDictoffsetType(@SuppressWarnings("unused") PythonBuiltinClassType cls, @SuppressWarnings("unused") Object value) {
1029-
throw raise(PythonErrorType.RuntimeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
1039+
throw raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
10301040
}
10311041

10321042
@Specialization(guards = "!isNoValue(value)")
10331043
Object setDictoffsetBuiltin(@SuppressWarnings("unused") PythonBuiltinClass cls, @SuppressWarnings("unused") Object value) {
1034-
throw raise(PythonErrorType.RuntimeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
1044+
throw raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
10351045
}
10361046

10371047
@Specialization(guards = {"!isNoValue(value)", "!isPythonBuiltinClass(cls)"})
@@ -1118,12 +1128,12 @@ static Object getBasicsizeManaged(PythonManagedClass cls, @SuppressWarnings("unu
11181128

11191129
@Specialization(guards = "!isNoValue(value)")
11201130
Object setBasicsizeType(@SuppressWarnings("unused") PythonBuiltinClassType cls, @SuppressWarnings("unused") Object value) {
1121-
throw raise(PythonErrorType.RuntimeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
1131+
throw raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
11221132
}
11231133

11241134
@Specialization(guards = "!isNoValue(value)")
11251135
Object setBasicsizeBuiltin(@SuppressWarnings("unused") PythonBuiltinClass cls, @SuppressWarnings("unused") Object value) {
1126-
throw raise(PythonErrorType.RuntimeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
1136+
throw raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
11271137
}
11281138

11291139
@Specialization(guards = {"!isNoValue(value)", "!isPythonBuiltinClass(cls)"})

0 commit comments

Comments
 (0)