Skip to content

Commit a1ec2f4

Browse files
committed
Add magic method '__reduce__' to function/method type.
1 parent da038ac commit a1ec2f4

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828

2929
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DEFAULTS__;
3030
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
31+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__;
3132
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
33+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
3234

3335
import java.util.ArrayList;
3436
import java.util.List;
@@ -178,4 +180,14 @@ public static GetFunctionDefaultsNode create() {
178180
return GetFunctionDefaultsNodeFactory.create();
179181
}
180182
}
183+
184+
@Builtin(name = __REDUCE__, fixedNumOfPositionalArgs = 1)
185+
@GenerateNodeFactory
186+
public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
187+
@Specialization
188+
Object doGeneric(@SuppressWarnings("unused") Object obj) {
189+
throw raise(TypeError, "can't pickle function objects");
190+
}
191+
}
192+
181193
}

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,26 @@
2626

2727
package com.oracle.graal.python.builtins.objects.method;
2828

29+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__;
2930
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
31+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
3032

3133
import java.util.List;
3234

3335
import com.oracle.graal.python.builtins.Builtin;
3436
import com.oracle.graal.python.builtins.CoreFunctions;
3537
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
3638
import com.oracle.graal.python.builtins.PythonBuiltins;
39+
import com.oracle.graal.python.builtins.objects.PNone;
40+
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
3741
import com.oracle.graal.python.builtins.objects.module.PythonModule;
3842
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
3943
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
4044
import com.oracle.graal.python.nodes.object.GetClassNode;
4145
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
4246
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
4347
import com.oracle.truffle.api.dsl.Cached;
48+
import com.oracle.truffle.api.dsl.Fallback;
4449
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
4550
import com.oracle.truffle.api.dsl.NodeFactory;
4651
import com.oracle.truffle.api.dsl.Specialization;
@@ -86,4 +91,26 @@ Object reprBuiltinMethod(PBuiltinMethod self,
8691
return String.format("<built-in method %s of %s object at 0x%x>", self.getName(), getClassNode.execute(self.getSelf()).getName(), self.hashCode());
8792
}
8893
}
94+
95+
@Builtin(name = __REDUCE__, fixedNumOfPositionalArgs = 1)
96+
@GenerateNodeFactory
97+
public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
98+
@Specialization
99+
String doBuiltinFunction(PBuiltinFunction self) {
100+
return self.getName();
101+
}
102+
103+
@Specialization
104+
String doBuiltinMethod(PBuiltinMethod self) {
105+
if (self.getSelf() == null || self.getSelf() == PNone.NONE || self.getSelf() instanceof PythonModule) {
106+
return self.getName();
107+
}
108+
return (String) doGeneric(self);
109+
}
110+
111+
@Fallback
112+
Object doGeneric(@SuppressWarnings("unused") Object obj) {
113+
throw raise(TypeError, "can't pickle function objects");
114+
}
115+
}
89116
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@
2929
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__CODE__;
3030
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DEFAULTS__;
3131
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__FUNC__;
32+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__;
3233
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
34+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
3335

3436
import java.util.List;
3537

@@ -105,4 +107,13 @@ Object defaults(PMethod self,
105107
return getFunctionDefaultsNode.execute(self.getFunction(), PNone.NO_VALUE);
106108
}
107109
}
110+
111+
@Builtin(name = __REDUCE__, fixedNumOfPositionalArgs = 1)
112+
@GenerateNodeFactory
113+
public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
114+
@Specialization
115+
Object doGeneric(@SuppressWarnings("unused") Object obj) {
116+
throw raise(TypeError, "can't pickle function objects");
117+
}
118+
}
108119
}

0 commit comments

Comments
 (0)