Skip to content

Commit debfbeb

Browse files
committed
define getter for __objclass__ to lazily convert builtin class types to classes
1 parent 8f54997 commit debfbeb

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinFunctionBuiltins.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,12 @@
3434
import com.oracle.graal.python.builtins.CoreFunctions;
3535
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
3636
import com.oracle.graal.python.builtins.PythonBuiltins;
37+
import com.oracle.graal.python.builtins.objects.type.LazyPythonClass;
38+
import com.oracle.graal.python.builtins.objects.type.PythonClass;
3739
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
3840
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
3941
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
42+
import com.oracle.graal.python.runtime.exception.PythonErrorType;
4043
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
4144
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
4245
import com.oracle.truffle.api.dsl.NodeFactory;
@@ -68,4 +71,25 @@ Object reprClassFunction(PBuiltinFunction self) {
6871
return String.format("<method '%s' of '%s' objects>", self.getName(), self.getEnclosingType().getName());
6972
}
7073
}
74+
75+
@Builtin(name = "__objclass__", fixedNumOfPositionalArgs = 1, isGetter = true)
76+
@TypeSystemReference(PythonArithmeticTypes.class)
77+
@GenerateNodeFactory
78+
public abstract static class ObjclassNode extends PythonUnaryBuiltinNode {
79+
@Specialization(guards = "self.getEnclosingType() == null")
80+
Object objclassMissing(@SuppressWarnings("unused") PBuiltinFunction self) {
81+
throw raise(PythonErrorType.AttributeError, "'builtin_function_or_method' object has no attribute '__objclass__'");
82+
}
83+
84+
@Specialization(guards = "self.getEnclosingType() != null")
85+
@TruffleBoundary
86+
PythonClass objclass(PBuiltinFunction self) {
87+
LazyPythonClass enclosingType = self.getEnclosingType();
88+
if (enclosingType instanceof PythonBuiltinClassType) {
89+
return getCore().lookupType((PythonBuiltinClassType) enclosingType);
90+
} else {
91+
return (PythonClass) enclosingType;
92+
}
93+
}
94+
}
7195
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PBuiltinFunction.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ public PBuiltinFunction(LazyPythonClass clazz, String name, LazyPythonClass encl
5858
this.arity = arity;
5959
this.getStorage().define(__NAME__, name);
6060
if (enclosingType != null) {
61-
this.getStorage().define("__objclass__", enclosingType);
6261
this.getStorage().define(__QUALNAME__, enclosingType.getName() + "." + name);
6362
} else {
6463
this.getStorage().define(__QUALNAME__, name);

0 commit comments

Comments
 (0)