Skip to content

Commit 4c26b08

Browse files
committed
let's mark classmethods and staticmethods directly on the builtins now
1 parent 3c4054d commit 4c26b08

File tree

7 files changed

+23
-47
lines changed

7 files changed

+23
-47
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Builtin.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@
5959

6060
boolean isPublic() default true;
6161

62+
boolean isClassmethod() default false;
63+
64+
boolean isStaticmethod() default false;
65+
6266
/**
6367
* By default the caller frame bit is set on-demand, but for some builtins it might be useful to
6468
* always force passing the caller frame.

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ private static final String[] initializeCoreFiles() {
207207
"_codecs",
208208
"bytes",
209209
"bytearray",
210-
"float",
211210
"time",
212211
"unicodedata",
213212
"_locale",

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltins.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public void initialize(PythonCore core) {
7373
RootCallTarget callTarget = core.getLanguage().builtinCallTargetCache.computeIfAbsent(factory.getNodeClass(),
7474
(b) -> Truffle.getRuntime().createCallTarget(new BuiltinFunctionRootNode(core.getLanguage(), builtin, factory, declaresExplicitSelf)));
7575
if (builtin.constructsClass().length > 0) {
76+
assert !builtin.isGetter() && !builtin.isSetter() && !builtin.isClassmethod() && !builtin.isStaticmethod();
7677
PBuiltinFunction newFunc = core.factory().createBuiltinFunction(__NEW__, null, createArity(builtin, declaresExplicitSelf), callTarget);
7778
for (PythonBuiltinClassType type : builtin.constructsClass()) {
7879
PythonBuiltinClass builtinClass = core.lookupType(type);
@@ -84,9 +85,15 @@ public void initialize(PythonCore core) {
8485
function.setAttribute(__DOC__, builtin.doc());
8586
BoundBuiltinCallable<?> callable = function;
8687
if (builtin.isGetter() || builtin.isSetter()) {
88+
assert !builtin.isClassmethod() && !builtin.isStaticmethod();
8789
PythonCallable get = builtin.isGetter() ? function : null;
8890
PythonCallable set = builtin.isSetter() ? function : null;
8991
callable = core.factory().createGetSetDescriptor(get, set, builtin.name(), null);
92+
} else if (builtin.isClassmethod()) {
93+
assert !builtin.isStaticmethod();
94+
callable = core.factory().createClassmethod(function);
95+
} else if (builtin.isStaticmethod()) {
96+
callable = core.factory().createStaticmethod(function);
9097
}
9198
setBuiltinFunction(builtin.name(), callable);
9299
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ PNotImplemented doGeneric(Object left, Object right) {
515515
}
516516
}
517517

518-
@Builtin(name = "fromhex", fixedNumOfPositionalArgs = 2)
518+
@Builtin(name = "fromhex", fixedNumOfPositionalArgs = 2, isClassmethod = true)
519519
@GenerateNodeFactory
520520
@TypeSystemReference(PythonArithmeticTypes.class)
521521
public abstract static class FromHexNode extends PythonBuiltinNode {
@@ -1154,7 +1154,7 @@ int trunc(PFloat pValue,
11541154

11551155
}
11561156

1157-
@Builtin(name = __GETFORMAT__, fixedNumOfPositionalArgs = 2)
1157+
@Builtin(name = __GETFORMAT__, fixedNumOfPositionalArgs = 2, isClassmethod = true)
11581158
@GenerateNodeFactory
11591159
@TypeSystemReference(PythonArithmeticTypes.class)
11601160
abstract static class GetFormatNode extends PythonBinaryBuiltinNode {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/PDecoratedMethod.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,16 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.method;
4242

43+
import com.oracle.graal.python.builtins.BoundBuiltinCallable;
44+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4345
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
4446
import com.oracle.graal.python.builtins.objects.type.LazyPythonClass;
47+
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
4548

4649
/**
4750
* Storage for both classmethods and staticmethods
4851
*/
49-
public class PDecoratedMethod extends PythonBuiltinObject {
52+
public class PDecoratedMethod extends PythonBuiltinObject implements BoundBuiltinCallable<Object> {
5053
private Object callable;
5154

5255
public PDecoratedMethod(LazyPythonClass cls) {
@@ -65,4 +68,8 @@ public Object getCallable() {
6568
public void setCallable(Object callable) {
6669
this.callable = callable;
6770
}
71+
72+
public Object boundToObject(PythonBuiltinClassType binding, PythonObjectFactory factory) {
73+
return this;
74+
}
6875
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/object/PythonObjectFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,15 +398,15 @@ public PDecoratedMethod createClassmethod(LazyPythonClass cls) {
398398
return trace(new PDecoratedMethod(cls));
399399
}
400400

401-
public Object createClassmethod(Object callable) {
401+
public PDecoratedMethod createClassmethod(Object callable) {
402402
return trace(new PDecoratedMethod(PythonBuiltinClassType.PClassmethod, callable));
403403
}
404404

405405
public PDecoratedMethod createStaticmethod(LazyPythonClass cls) {
406406
return trace(new PDecoratedMethod(cls));
407407
}
408408

409-
public Object createStaticmethod(Object callable) {
409+
public PDecoratedMethod createStaticmethod(Object callable) {
410410
return trace(new PDecoratedMethod(PythonBuiltinClassType.PStaticmethod, callable));
411411
}
412412

graalpython/lib-graalpython/float.py

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)