|
28 | 28 |
|
29 | 29 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__CODE__;
|
30 | 30 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DEFAULTS__;
|
| 31 | +import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__; |
31 | 32 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__FUNC__;
|
32 | 33 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__KWDEFAULTS__;
|
| 34 | +import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTRIBUTE__; |
33 | 35 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__GET__;
|
34 | 36 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__;
|
35 | 37 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
|
|
43 | 45 | import com.oracle.graal.python.builtins.PythonBuiltins;
|
44 | 46 | import com.oracle.graal.python.builtins.objects.PNone;
|
45 | 47 | import com.oracle.graal.python.builtins.objects.function.PKeyword;
|
| 48 | +import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; |
46 | 49 | import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
|
47 | 50 | import com.oracle.graal.python.nodes.SpecialAttributeNames;
|
48 | 51 | import com.oracle.graal.python.nodes.attributes.GetAttributeNode;
|
|
54 | 57 | import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
|
55 | 58 | import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
|
56 | 59 | import com.oracle.graal.python.nodes.object.GetLazyClassNode;
|
| 60 | +import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile; |
| 61 | +import com.oracle.graal.python.runtime.exception.PException; |
57 | 62 | import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
|
58 | 63 | import com.oracle.truffle.api.dsl.Cached;
|
59 | 64 | import com.oracle.truffle.api.dsl.GenerateNodeFactory;
|
@@ -93,6 +98,32 @@ protected Object doIt(VirtualFrame frame, PMethod self,
|
93 | 98 | }
|
94 | 99 | }
|
95 | 100 |
|
| 101 | + @Builtin(name = __DICT__, minNumOfPositionalArgs = 1, isGetter = true) |
| 102 | + @GenerateNodeFactory |
| 103 | + public abstract static class DictNode extends PythonBuiltinNode { |
| 104 | + @Specialization |
| 105 | + protected Object doIt(VirtualFrame frame, PMethod self, |
| 106 | + @Cached("create(__GETATTRIBUTE__)") LookupAndCallBinaryNode getDict) { |
| 107 | + return getDict.executeObject(frame, self.getFunction(), __DICT__); |
| 108 | + } |
| 109 | + } |
| 110 | + |
| 111 | + @Builtin(name = __GETATTRIBUTE__, minNumOfPositionalArgs = 2) |
| 112 | + @GenerateNodeFactory |
| 113 | + public abstract static class GetattributeNode extends PythonBuiltinNode { |
| 114 | + @Specialization |
| 115 | + protected Object doIt(VirtualFrame frame, PMethod self, Object key, |
| 116 | + @Cached("create()") ObjectBuiltins.GetAttributeNode objectGetattrNode, |
| 117 | + @Cached("create()") IsBuiltinClassProfile errorProfile) { |
| 118 | + try { |
| 119 | + return objectGetattrNode.execute(frame, self, key); |
| 120 | + } catch (PException e) { |
| 121 | + e.expectAttributeError(errorProfile); |
| 122 | + return objectGetattrNode.execute(frame, self.getFunction(), key); |
| 123 | + } |
| 124 | + } |
| 125 | + } |
| 126 | + |
96 | 127 | @Builtin(name = __REPR__, minNumOfPositionalArgs = 1)
|
97 | 128 | @GenerateNodeFactory
|
98 | 129 | public abstract static class ReprNode extends PythonUnaryBuiltinNode {
|
|
0 commit comments