|
26 | 26 |
|
27 | 27 | package com.oracle.graal.python.builtins.objects.method;
|
28 | 28 |
|
| 29 | +import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__; |
29 | 30 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
|
| 31 | +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; |
30 | 32 |
|
31 | 33 | import java.util.List;
|
32 | 34 |
|
33 | 35 | import com.oracle.graal.python.builtins.Builtin;
|
34 | 36 | import com.oracle.graal.python.builtins.CoreFunctions;
|
35 | 37 | import com.oracle.graal.python.builtins.PythonBuiltinClassType;
|
36 | 38 | 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; |
37 | 41 | import com.oracle.graal.python.builtins.objects.module.PythonModule;
|
38 | 42 | import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
|
39 | 43 | import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
|
40 | 44 | import com.oracle.graal.python.nodes.object.GetClassNode;
|
41 | 45 | import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
|
42 | 46 | import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
|
43 | 47 | import com.oracle.truffle.api.dsl.Cached;
|
| 48 | +import com.oracle.truffle.api.dsl.Fallback; |
44 | 49 | import com.oracle.truffle.api.dsl.GenerateNodeFactory;
|
45 | 50 | import com.oracle.truffle.api.dsl.NodeFactory;
|
46 | 51 | import com.oracle.truffle.api.dsl.Specialization;
|
@@ -86,4 +91,26 @@ Object reprBuiltinMethod(PBuiltinMethod self,
|
86 | 91 | return String.format("<built-in method %s of %s object at 0x%x>", self.getName(), getClassNode.execute(self.getSelf()).getName(), self.hashCode());
|
87 | 92 | }
|
88 | 93 | }
|
| 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 | + } |
89 | 116 | }
|
0 commit comments