Skip to content

Commit f563b33

Browse files
committed
Specify tp_dictoffset for exceptions
1 parent ac57445 commit f563b33

File tree

1 file changed

+13
-2
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type

1 file changed

+13
-2
lines changed

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.type;
4242

43+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBaseException;
4344
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
4445
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
4546
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_SUBCLASS_CHECK;
@@ -2637,13 +2638,23 @@ public abstract static class GetDictOffsetNode extends Node {
26372638
@Specialization
26382639
long lookup(Object cls,
26392640
@Cached CExtNodes.LookupNativeMemberInMRONode lookup) {
2640-
// TODO properly implement 'tp_dictoffset' for builtin classes
2641-
Object value = lookup.execute(cls, NativeMember.TP_DICTOFFSET, TYPE_DICTOFFSET);
2641+
Object value = lookup.execute(cls, NativeMember.TP_DICTOFFSET, TYPE_DICTOFFSET, GetDictOffsetNode::getBuiltinTypeItemsize);
26422642
if (value != PNone.NO_VALUE) {
26432643
return (long) value;
26442644
}
26452645
return 0;
26462646
}
2647+
2648+
private static long getBuiltinTypeItemsize(PythonBuiltinClassType cls) {
2649+
// TODO properly specify for all builtin classes
2650+
PythonBuiltinClassType current = cls;
2651+
do {
2652+
if (current == PBaseException) {
2653+
return 16;
2654+
}
2655+
} while ((current = current.getBase()) != null);
2656+
return 0;
2657+
}
26472658
}
26482659

26492660
@GenerateUncached

0 commit comments

Comments
 (0)